@carlonicora/nestjs-neo4jsonapi 2.6.0 → 2.7.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 (87) hide show
  1. package/dist/config/base.config.d.ts.map +1 -1
  2. package/dist/config/base.config.js +1 -0
  3. package/dist/config/base.config.js.map +1 -1
  4. package/dist/config/interfaces/config.ai.interface.d.ts +15 -0
  5. package/dist/config/interfaces/config.ai.interface.d.ts.map +1 -1
  6. package/dist/core/llm/services/audio.llm.service.d.ts +16 -8
  7. package/dist/core/llm/services/audio.llm.service.d.ts.map +1 -1
  8. package/dist/core/llm/services/audio.llm.service.js +41 -19
  9. package/dist/core/llm/services/audio.llm.service.js.map +1 -1
  10. package/dist/foundations/stripe-price/repositories/stripe-price.repository.js +8 -8
  11. package/dist/foundations/stripe-price/repositories/stripe-price.repository.js.map +1 -1
  12. package/dist/foundations/tokenusage/common/tokenusage.target-labels.d.ts +89 -0
  13. package/dist/foundations/tokenusage/common/tokenusage.target-labels.d.ts.map +1 -0
  14. package/dist/foundations/tokenusage/common/tokenusage.target-labels.js +79 -0
  15. package/dist/foundations/tokenusage/common/tokenusage.target-labels.js.map +1 -0
  16. package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.d.ts +1 -1
  17. package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.d.ts.map +1 -1
  18. package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.js +8 -3
  19. package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.js.map +1 -1
  20. package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.d.ts +35 -0
  21. package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.d.ts.map +1 -0
  22. package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.js +133 -0
  23. package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.js.map +1 -0
  24. package/dist/foundations/tokenusage/entities/tokenusage-admin-breakdown.d.ts +2 -7
  25. package/dist/foundations/tokenusage/entities/tokenusage-admin-breakdown.d.ts.map +1 -1
  26. package/dist/foundations/tokenusage/entities/tokenusage-admin-breakdown.js +2 -6
  27. package/dist/foundations/tokenusage/entities/tokenusage-admin-breakdown.js.map +1 -1
  28. package/dist/foundations/tokenusage/entities/tokenusage-admin-summary.d.ts +2 -7
  29. package/dist/foundations/tokenusage/entities/tokenusage-admin-summary.d.ts.map +1 -1
  30. package/dist/foundations/tokenusage/entities/tokenusage-admin-summary.js +2 -6
  31. package/dist/foundations/tokenusage/entities/tokenusage-admin-summary.js.map +1 -1
  32. package/dist/foundations/tokenusage/entities/tokenusage-admin-timeline.d.ts +2 -7
  33. package/dist/foundations/tokenusage/entities/tokenusage-admin-timeline.d.ts.map +1 -1
  34. package/dist/foundations/tokenusage/entities/tokenusage-admin-timeline.js +2 -6
  35. package/dist/foundations/tokenusage/entities/tokenusage-admin-timeline.js.map +1 -1
  36. package/dist/foundations/tokenusage/entities/tokenusage-report-breakdown.d.ts +20 -0
  37. package/dist/foundations/tokenusage/entities/tokenusage-report-breakdown.d.ts.map +1 -0
  38. package/dist/foundations/tokenusage/entities/tokenusage-report-breakdown.js +17 -0
  39. package/dist/foundations/tokenusage/entities/tokenusage-report-breakdown.js.map +1 -0
  40. package/dist/foundations/tokenusage/entities/tokenusage-report-breakdown.meta.d.ts +3 -0
  41. package/dist/foundations/tokenusage/entities/tokenusage-report-breakdown.meta.d.ts.map +1 -0
  42. package/dist/foundations/tokenusage/entities/tokenusage-report-breakdown.meta.js +10 -0
  43. package/dist/foundations/tokenusage/entities/tokenusage-report-breakdown.meta.js.map +1 -0
  44. package/dist/foundations/tokenusage/entities/tokenusage-report-summary.d.ts +19 -0
  45. package/dist/foundations/tokenusage/entities/tokenusage-report-summary.d.ts.map +1 -0
  46. package/dist/foundations/tokenusage/entities/tokenusage-report-summary.js +16 -0
  47. package/dist/foundations/tokenusage/entities/tokenusage-report-summary.js.map +1 -0
  48. package/dist/foundations/tokenusage/entities/tokenusage-report-summary.meta.d.ts +3 -0
  49. package/dist/foundations/tokenusage/entities/tokenusage-report-summary.meta.d.ts.map +1 -0
  50. package/dist/foundations/tokenusage/entities/tokenusage-report-summary.meta.js +10 -0
  51. package/dist/foundations/tokenusage/entities/tokenusage-report-summary.meta.js.map +1 -0
  52. package/dist/foundations/tokenusage/entities/tokenusage-report-timeline.d.ts +17 -0
  53. package/dist/foundations/tokenusage/entities/tokenusage-report-timeline.d.ts.map +1 -0
  54. package/dist/foundations/tokenusage/entities/tokenusage-report-timeline.js +17 -0
  55. package/dist/foundations/tokenusage/entities/tokenusage-report-timeline.js.map +1 -0
  56. package/dist/foundations/tokenusage/entities/tokenusage-report-timeline.meta.d.ts +3 -0
  57. package/dist/foundations/tokenusage/entities/tokenusage-report-timeline.meta.d.ts.map +1 -0
  58. package/dist/foundations/tokenusage/entities/tokenusage-report-timeline.meta.js +10 -0
  59. package/dist/foundations/tokenusage/entities/tokenusage-report-timeline.meta.js.map +1 -0
  60. package/dist/foundations/tokenusage/entities/usage-metric.fields.d.ts +48 -0
  61. package/dist/foundations/tokenusage/entities/usage-metric.fields.d.ts.map +1 -0
  62. package/dist/foundations/tokenusage/entities/usage-metric.fields.js +24 -0
  63. package/dist/foundations/tokenusage/entities/usage-metric.fields.js.map +1 -0
  64. package/dist/foundations/tokenusage/index.d.ts +11 -0
  65. package/dist/foundations/tokenusage/index.d.ts.map +1 -1
  66. package/dist/foundations/tokenusage/index.js +24 -1
  67. package/dist/foundations/tokenusage/index.js.map +1 -1
  68. package/dist/foundations/tokenusage/repositories/tokenusage.admin.repository.d.ts +13 -2
  69. package/dist/foundations/tokenusage/repositories/tokenusage.admin.repository.d.ts.map +1 -1
  70. package/dist/foundations/tokenusage/repositories/tokenusage.admin.repository.js +43 -2
  71. package/dist/foundations/tokenusage/repositories/tokenusage.admin.repository.js.map +1 -1
  72. package/dist/foundations/tokenusage/repositories/tokenusage.report.repository.d.ts +104 -0
  73. package/dist/foundations/tokenusage/repositories/tokenusage.report.repository.d.ts.map +1 -0
  74. package/dist/foundations/tokenusage/repositories/tokenusage.report.repository.js +286 -0
  75. package/dist/foundations/tokenusage/repositories/tokenusage.report.repository.js.map +1 -0
  76. package/dist/foundations/tokenusage/services/tokenusage.admin.service.d.ts +3 -1
  77. package/dist/foundations/tokenusage/services/tokenusage.admin.service.d.ts.map +1 -1
  78. package/dist/foundations/tokenusage/services/tokenusage.admin.service.js +1 -0
  79. package/dist/foundations/tokenusage/services/tokenusage.admin.service.js.map +1 -1
  80. package/dist/foundations/tokenusage/services/tokenusage.report.service.d.ts +43 -0
  81. package/dist/foundations/tokenusage/services/tokenusage.report.service.d.ts.map +1 -0
  82. package/dist/foundations/tokenusage/services/tokenusage.report.service.js +73 -0
  83. package/dist/foundations/tokenusage/services/tokenusage.report.service.js.map +1 -0
  84. package/dist/foundations/tokenusage/tokenusage.module.d.ts.map +1 -1
  85. package/dist/foundations/tokenusage/tokenusage.module.js +16 -2
  86. package/dist/foundations/tokenusage/tokenusage.module.js.map +1 -1
  87. package/package.json +1 -1
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TOKEN_USAGE_TARGET_LABELS = void 0;
4
+ exports.normaliseTargetLabel = normaliseTargetLabel;
5
+ exports.buildTargetGrouping = buildTargetGrouping;
6
+ /**
7
+ * The Neo4j labels a consuming application allows the token-usage breakdown to
8
+ * group by through the polymorphic USED_FOR edge.
9
+ *
10
+ * The label SELECTS A CYPHER CLAUSE — it is not a bound value — so it can never
11
+ * be taken from the request unchecked. The repository matches the requested
12
+ * label against this allowlist and throws BadRequestException on a miss; nothing
13
+ * that did not come from here ever reaches the query text.
14
+ *
15
+ * Supplied by the app from a @Global() module, mirroring
16
+ * ASSISTANT_SEED_CONTEXT_PROVIDERS: the library's TokenUsageModule cannot import
17
+ * an application feature module, and consumes this with
18
+ * @Optional() @Inject(TOKEN_USAGE_TARGET_LABELS). Absent → [] → dimension=target
19
+ * is rejected, which is the correct default for an app that has not opted in.
20
+ */
21
+ exports.TOKEN_USAGE_TARGET_LABELS = Symbol("TOKEN_USAGE_TARGET_LABELS");
22
+ /**
23
+ * Neo4j labels and relationship types are identifiers, not values, so they
24
+ * cannot be parameterised. Everything interpolated into a query is checked
25
+ * against this first — a second lock behind the allowlist, so a typo or a
26
+ * careless app config fails loudly instead of producing arbitrary Cypher.
27
+ */
28
+ const SAFE_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
29
+ /** Applies the defaults and rejects anything that is not a plain identifier. */
30
+ function normaliseTargetLabel(entry) {
31
+ const resolved = typeof entry === "string"
32
+ ? { label: entry, via: [], maxDepth: 0 }
33
+ : { label: entry.label, via: entry.via ?? [], maxDepth: entry.maxDepth ?? 1 };
34
+ if (!SAFE_IDENTIFIER.test(resolved.label))
35
+ throw new Error(`TOKEN_USAGE_TARGET_LABELS: "${resolved.label}" is not a valid Neo4j label`);
36
+ for (const relationship of resolved.via)
37
+ if (!SAFE_IDENTIFIER.test(relationship))
38
+ throw new Error(`TOKEN_USAGE_TARGET_LABELS: "${relationship}" is not a valid relationship type`);
39
+ return resolved;
40
+ }
41
+ /**
42
+ * The Cypher that binds `grp` to the entity a usage row is attributed to.
43
+ *
44
+ * Lives here rather than in either repository because the administrative and
45
+ * the self-service breakdowns must group identically — two copies of this
46
+ * traversal would drift, and the two surfaces would then report different
47
+ * totals for the same window.
48
+ *
49
+ * With no rollup it is the original direct match. With one, the traversal is
50
+ * `*0..maxDepth`: depth zero keeps rows that already point at the target label,
51
+ * so a campaign named directly and a campaign reached through its session land
52
+ * in the same bucket.
53
+ *
54
+ * `head(collect(...))` is deliberate. An entity reachable from two targets would
55
+ * otherwise multiply its row and be counted once per path, inflating the totals;
56
+ * collapsing to one target per usage record keeps the column summing to the same
57
+ * figure the by-operation panel reports. Ordering by id makes the pick stable
58
+ * across requests rather than dependent on traversal order.
59
+ *
60
+ * @param carried the variables that must survive into the grouping, in order —
61
+ * the admin query carries its company node, the report query does not.
62
+ */
63
+ function buildTargetGrouping(params) {
64
+ const { target, nodeName, carried } = params;
65
+ const carry = [nodeName, ...carried].join(", ");
66
+ if (target.via.length === 0 || target.maxDepth === 0)
67
+ return `MATCH (${nodeName})-[:USED_FOR]->(grp:${target.label})\n WITH ${carry}, grp`;
68
+ // One leading colon, then bare types: `:A|B`. Neo4j rejects the repeated-colon
69
+ // form `:A|:B` whenever a variable length is attached, which this always has.
70
+ const relationships = `:${target.via.join("|")}`;
71
+ return [
72
+ `MATCH (${nodeName})-[:USED_FOR]->(usageTarget)`,
73
+ ` OPTIONAL MATCH (usageTarget)-[${relationships}*0..${target.maxDepth}]->(rollup:${target.label})`,
74
+ ` WITH ${carry}, usageTarget, rollup ORDER BY rollup.id`,
75
+ ` WITH ${carry}, head(collect(rollup)) AS grp`,
76
+ ` WHERE grp IS NOT NULL`,
77
+ ].join("\n");
78
+ }
79
+ //# sourceMappingURL=tokenusage.target-labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenusage.target-labels.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/common/tokenusage.target-labels.ts"],"names":[],"mappings":";;;AA4EA,oDAcC;AAwBD,kDAsBC;AAxID;;;;;;;;;;;;;;GAcG;AACU,QAAA,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAoD7E;;;;;GAKG;AACH,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD,gFAAgF;AAChF,SAAgB,oBAAoB,CAAC,KAA4B;IAC/D,MAAM,QAAQ,GACZ,OAAO,KAAK,KAAK,QAAQ;QACvB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;QACxC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;IAElF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,KAAK,8BAA8B,CAAC,CAAC;IAE/F,KAAK,MAAM,YAAY,IAAI,QAAQ,CAAC,GAAG;QACrC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,+BAA+B,YAAY,oCAAoC,CAAC,CAAC;IAErG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,mBAAmB,CAAC,MAInC;IACC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC7C,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAClD,OAAO,UAAU,QAAQ,uBAAuB,MAAM,CAAC,KAAK,iBAAiB,KAAK,OAAO,CAAC;IAE5F,+EAA+E;IAC/E,8EAA8E;IAC9E,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAEjD,OAAO;QACL,UAAU,QAAQ,8BAA8B;QAChD,uCAAuC,aAAa,OAAO,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,KAAK,GAAG;QACvG,cAAc,KAAK,0CAA0C;QAC7D,cAAc,KAAK,gCAAgC;QACnD,6BAA6B;KAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -20,7 +20,7 @@ export declare class TokenUsageAdminController {
20
20
  constructor(service: TokenUsageAdminService);
21
21
  getSummary(reply: FastifyReply, from?: string, to?: string, companyId?: string): Promise<void>;
22
22
  getTimeline(reply: FastifyReply, from?: string, to?: string, granularity?: string, stackBy?: string, companyId?: string): Promise<void>;
23
- getBreakdown(reply: FastifyReply, from?: string, to?: string, dimension?: string, scope?: string, companyId?: string, limit?: string): Promise<void>;
23
+ getBreakdown(reply: FastifyReply, from?: string, to?: string, dimension?: string, scope?: string, companyId?: string, limit?: string, targetLabel?: string): Promise<void>;
24
24
  private _oneOf;
25
25
  private _range;
26
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tokenusage.admin.controller.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/controllers/tokenusage.admin.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAKvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAU9E;;;;;;;;;;;;;;GAcG;AACH,qBAEa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,sBAAsB;IAItD,UAAU,CACP,KAAK,EAAE,YAAY,EACX,IAAI,CAAC,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,MAAM,EACJ,SAAS,CAAC,EAAE,MAAM;IAQlC,WAAW,CACR,KAAK,EAAE,YAAY,EACX,IAAI,CAAC,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,MAAM,EACF,WAAW,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM;IAelC,YAAY,CACT,KAAK,EAAE,YAAY,EACX,IAAI,CAAC,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,MAAM,EACJ,SAAS,CAAC,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,MAAM,EACV,SAAS,CAAC,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,MAAM;IAkBhC,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,MAAM;CAWf"}
1
+ {"version":3,"file":"tokenusage.admin.controller.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/controllers/tokenusage.admin.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAKvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAU9E;;;;;;;;;;;;;;GAcG;AACH,qBAEa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,sBAAsB;IAItD,UAAU,CACP,KAAK,EAAE,YAAY,EACX,IAAI,CAAC,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,MAAM,EACJ,SAAS,CAAC,EAAE,MAAM;IAQlC,WAAW,CACR,KAAK,EAAE,YAAY,EACX,IAAI,CAAC,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,MAAM,EACF,WAAW,CAAC,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM;IAelC,YAAY,CACT,KAAK,EAAE,YAAY,EACX,IAAI,CAAC,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,MAAM,EACJ,SAAS,CAAC,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,MAAM,EACV,SAAS,CAAC,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,MAAM,EACR,WAAW,CAAC,EAAE,MAAM;IAsB5C,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,MAAM;CAWf"}
@@ -21,7 +21,7 @@ const tokenusage_meta_1 = require("../entities/tokenusage.meta");
21
21
  const tokenusage_admin_service_1 = require("../services/tokenusage.admin.service");
22
22
  const GRANULARITIES = ["day", "week", "month"];
23
23
  const STACK_BY = ["scope", "type", "company"];
24
- const DIMENSIONS = ["company", "user", "operation"];
24
+ const DIMENSIONS = ["company", "user", "operation", "target"];
25
25
  const SCOPES = ["customer", "platform"];
26
26
  const DEFAULT_WINDOW_DAYS = 30;
27
27
  const ONE_DAY_MS = 24 * 60 * 60 * 1000;
@@ -57,7 +57,7 @@ let TokenUsageAdminController = class TokenUsageAdminController {
57
57
  companyId,
58
58
  }));
59
59
  }
60
- async getBreakdown(reply, from, to, dimension, scope, companyId, limit) {
60
+ async getBreakdown(reply, from, to, dimension, scope, companyId, limit, targetLabel) {
61
61
  const range = this._range(from, to);
62
62
  const parsedLimit = limit === undefined ? 10 : Number(limit);
63
63
  if (!Number.isInteger(parsedLimit) || parsedLimit < 1 || parsedLimit > 100)
@@ -65,6 +65,10 @@ let TokenUsageAdminController = class TokenUsageAdminController {
65
65
  reply.send(await this.service.getBreakdown({
66
66
  ...range,
67
67
  dimension: this._oneOf(dimension, DIMENSIONS, "company"),
68
+ // Passed through raw on purpose: the allowlist is application-specific
69
+ // and injected into the repository, which is the single place that
70
+ // validates it. Do not add a second allowlist here.
71
+ targetLabel,
68
72
  scope: this._oneOf(scope, SCOPES, "customer"),
69
73
  companyId,
70
74
  limit: parsedLimit,
@@ -124,8 +128,9 @@ __decorate([
124
128
  __param(4, (0, common_1.Query)("scope")),
125
129
  __param(5, (0, common_1.Query)("companyId")),
126
130
  __param(6, (0, common_1.Query)("limit")),
131
+ __param(7, (0, common_1.Query)("targetLabel")),
127
132
  __metadata("design:type", Function),
128
- __metadata("design:paramtypes", [Object, String, String, String, String, String, String]),
133
+ __metadata("design:paramtypes", [Object, String, String, String, String, String, String, String]),
129
134
  __metadata("design:returntype", Promise)
130
135
  ], TokenUsageAdminController.prototype, "getBreakdown", null);
131
136
  exports.TokenUsageAdminController = TokenUsageAdminController = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"tokenusage.admin.controller.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/controllers/tokenusage.admin.controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenusage.admin.controller.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/controllers/tokenusage.admin.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { FastifyReply } from "fastify";
2
+ import { TokenUsageReportService } from "../services/tokenusage.report.service";
3
+ /**
4
+ * Self-service token-usage reporting: the caller's own company only.
5
+ *
6
+ * NO @Roles decorator anywhere — any authenticated user may read their own
7
+ * company's usage. Scoping is the repository's job (buildDefaultMatch injects
8
+ * the CLS company), and no route here accepts a companyId, so there is nothing
9
+ * for a caller to point at somebody else's data.
10
+ *
11
+ * `metric` is allowlisted to credits and tokens: COST IS DELIBERATELY ABSENT.
12
+ * Customers are billed in credits, and exposing the platform's monetary cost
13
+ * would leak margin — enforcing that only in the UI would leave it one query
14
+ * string away, so the boundary refuses it.
15
+ *
16
+ * Mounted at /tokenusages/reports/* — no overlap with /tokenusages,
17
+ * /tokenusages/summary, /tokenusages/aggregated (a consuming app's own routes)
18
+ * or /tokenusages/administration/*, so importing TokenUsageModule cannot
19
+ * duplicate a Fastify route.
20
+ *
21
+ * Enum query params are validated against closed allowlists here rather than in
22
+ * a DTO: DTOs are body validation for POST/PUT/PATCH, and GET filters use bare
23
+ * @Query params. The allowlist matters — granularity and dimension select a
24
+ * Cypher clause, they are not bound values.
25
+ */
26
+ export declare class TokenUsageReportController {
27
+ private readonly service;
28
+ constructor(service: TokenUsageReportService);
29
+ getSummary(reply: FastifyReply, from?: string, to?: string): Promise<void>;
30
+ getTimeline(reply: FastifyReply, from?: string, to?: string, granularity?: string): Promise<void>;
31
+ getBreakdown(reply: FastifyReply, from?: string, to?: string, dimension?: string, targetLabel?: string, metric?: string, limit?: string): Promise<void>;
32
+ private _oneOf;
33
+ private _range;
34
+ }
35
+ //# sourceMappingURL=tokenusage.report.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenusage.report.controller.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/controllers/tokenusage.report.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAShF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAEa,0BAA0B;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,uBAAuB;IAGvD,UAAU,CAAQ,KAAK,EAAE,YAAY,EAAiB,IAAI,CAAC,EAAE,MAAM,EAAe,EAAE,CAAC,EAAE,MAAM;IAK7F,WAAW,CACR,KAAK,EAAE,YAAY,EACX,IAAI,CAAC,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,MAAM,EACF,WAAW,CAAC,EAAE,MAAM;IActC,YAAY,CACT,KAAK,EAAE,YAAY,EACX,IAAI,CAAC,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,MAAM,EACJ,SAAS,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACzB,MAAM,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM;IAiBhC,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,MAAM;CAWf"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TokenUsageReportController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const jwt_auth_guard_1 = require("../../../common/guards/jwt.auth.guard");
18
+ const tokenusage_meta_1 = require("../entities/tokenusage.meta");
19
+ const tokenusage_report_service_1 = require("../services/tokenusage.report.service");
20
+ const GRANULARITIES = ["day", "week", "month"];
21
+ const DIMENSIONS = ["operation", "target"];
22
+ const METRICS = ["credits", "tokens"];
23
+ const DEFAULT_WINDOW_DAYS = 30;
24
+ const ONE_DAY_MS = 24 * 60 * 60 * 1000;
25
+ /**
26
+ * Self-service token-usage reporting: the caller's own company only.
27
+ *
28
+ * NO @Roles decorator anywhere — any authenticated user may read their own
29
+ * company's usage. Scoping is the repository's job (buildDefaultMatch injects
30
+ * the CLS company), and no route here accepts a companyId, so there is nothing
31
+ * for a caller to point at somebody else's data.
32
+ *
33
+ * `metric` is allowlisted to credits and tokens: COST IS DELIBERATELY ABSENT.
34
+ * Customers are billed in credits, and exposing the platform's monetary cost
35
+ * would leak margin — enforcing that only in the UI would leave it one query
36
+ * string away, so the boundary refuses it.
37
+ *
38
+ * Mounted at /tokenusages/reports/* — no overlap with /tokenusages,
39
+ * /tokenusages/summary, /tokenusages/aggregated (a consuming app's own routes)
40
+ * or /tokenusages/administration/*, so importing TokenUsageModule cannot
41
+ * duplicate a Fastify route.
42
+ *
43
+ * Enum query params are validated against closed allowlists here rather than in
44
+ * a DTO: DTOs are body validation for POST/PUT/PATCH, and GET filters use bare
45
+ * @Query params. The allowlist matters — granularity and dimension select a
46
+ * Cypher clause, they are not bound values.
47
+ */
48
+ let TokenUsageReportController = class TokenUsageReportController {
49
+ constructor(service) {
50
+ this.service = service;
51
+ }
52
+ async getSummary(reply, from, to) {
53
+ reply.send(await this.service.getSummary(this._range(from, to)));
54
+ }
55
+ async getTimeline(reply, from, to, granularity) {
56
+ reply.send(await this.service.getTimeline({
57
+ ...this._range(from, to),
58
+ granularity: this._oneOf(granularity, GRANULARITIES, "day"),
59
+ // Pinned, not accepted: scope and company stacking are meaningless
60
+ // inside a single tenant, so "type" is the only series this surface has.
61
+ stackBy: "type",
62
+ }));
63
+ }
64
+ async getBreakdown(reply, from, to, dimension, targetLabel, metric, limit) {
65
+ const parsedLimit = limit === undefined ? 10 : Number(limit);
66
+ if (!Number.isInteger(parsedLimit) || parsedLimit < 1 || parsedLimit > 100)
67
+ throw new common_1.BadRequestException("limit must be an integer between 1 and 100");
68
+ reply.send(await this.service.getBreakdown({
69
+ ...this._range(from, to),
70
+ dimension: this._oneOf(dimension, DIMENSIONS, "operation"),
71
+ targetLabel,
72
+ metric: this._oneOf(metric, METRICS, "credits"),
73
+ limit: parsedLimit,
74
+ }));
75
+ }
76
+ _oneOf(value, allowed, fallback) {
77
+ if (value === undefined)
78
+ return fallback;
79
+ if (!allowed.includes(value))
80
+ throw new common_1.BadRequestException(`Expected one of ${allowed.join(", ")}, received "${value}"`);
81
+ return value;
82
+ }
83
+ _range(from, to) {
84
+ const toDate = to ? new Date(to) : new Date();
85
+ if (Number.isNaN(toDate.getTime()))
86
+ throw new common_1.BadRequestException("`to` is not a valid date");
87
+ const fromDate = from ? new Date(from) : new Date(toDate.getTime() - DEFAULT_WINDOW_DAYS * ONE_DAY_MS);
88
+ if (Number.isNaN(fromDate.getTime()))
89
+ throw new common_1.BadRequestException("`from` is not a valid date");
90
+ if (fromDate > toDate)
91
+ throw new common_1.BadRequestException("`from` must not be later than `to`");
92
+ return { from: fromDate.toISOString(), to: toDate.toISOString() };
93
+ }
94
+ };
95
+ exports.TokenUsageReportController = TokenUsageReportController;
96
+ __decorate([
97
+ (0, common_1.Get)(`${tokenusage_meta_1.tokenUsageMeta.endpoint}/reports/summary`),
98
+ __param(0, (0, common_1.Res)()),
99
+ __param(1, (0, common_1.Query)("from")),
100
+ __param(2, (0, common_1.Query)("to")),
101
+ __metadata("design:type", Function),
102
+ __metadata("design:paramtypes", [Object, String, String]),
103
+ __metadata("design:returntype", Promise)
104
+ ], TokenUsageReportController.prototype, "getSummary", null);
105
+ __decorate([
106
+ (0, common_1.Get)(`${tokenusage_meta_1.tokenUsageMeta.endpoint}/reports/timeline`),
107
+ __param(0, (0, common_1.Res)()),
108
+ __param(1, (0, common_1.Query)("from")),
109
+ __param(2, (0, common_1.Query)("to")),
110
+ __param(3, (0, common_1.Query)("granularity")),
111
+ __metadata("design:type", Function),
112
+ __metadata("design:paramtypes", [Object, String, String, String]),
113
+ __metadata("design:returntype", Promise)
114
+ ], TokenUsageReportController.prototype, "getTimeline", null);
115
+ __decorate([
116
+ (0, common_1.Get)(`${tokenusage_meta_1.tokenUsageMeta.endpoint}/reports/breakdown`),
117
+ __param(0, (0, common_1.Res)()),
118
+ __param(1, (0, common_1.Query)("from")),
119
+ __param(2, (0, common_1.Query)("to")),
120
+ __param(3, (0, common_1.Query)("dimension")),
121
+ __param(4, (0, common_1.Query)("targetLabel")),
122
+ __param(5, (0, common_1.Query)("metric")),
123
+ __param(6, (0, common_1.Query)("limit")),
124
+ __metadata("design:type", Function),
125
+ __metadata("design:paramtypes", [Object, String, String, String, String, String, String]),
126
+ __metadata("design:returntype", Promise)
127
+ ], TokenUsageReportController.prototype, "getBreakdown", null);
128
+ exports.TokenUsageReportController = TokenUsageReportController = __decorate([
129
+ (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),
130
+ (0, common_1.Controller)(),
131
+ __metadata("design:paramtypes", [tokenusage_report_service_1.TokenUsageReportService])
132
+ ], TokenUsageReportController);
133
+ //# sourceMappingURL=tokenusage.report.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenusage.report.controller.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/controllers/tokenusage.report.controller.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Entity } from "../../../common/abstracts/entity";
2
+ import { UsageMetrics } from "./usage-metric.fields";
2
3
  /**
3
4
  * One ranked row of a breakdown. The same shape serves all three dimensions —
4
5
  * company, user and operation — which is why the three "by-X" endpoints
@@ -12,15 +13,9 @@ import { Entity } from "../../../common/abstracts/entity";
12
13
  export type TokenUsageAdminBreakdownEntity = Entity & {
13
14
  label: string;
14
15
  sublabel?: string;
15
- cost: number;
16
- credits: number;
17
- tokensIn: number;
18
- tokensOut: number;
19
- cached: number;
20
- calls: number;
21
16
  activeUsers?: number;
22
17
  monthlyCredits?: number;
23
18
  availableMonthlyCredits?: number;
24
- };
19
+ } & UsageMetrics;
25
20
  export declare const TokenUsageAdminBreakdownDescriptor: import("../../..").EntityDescriptor<TokenUsageAdminBreakdownEntity, {}>;
26
21
  //# sourceMappingURL=tokenusage-admin-breakdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenusage-admin-breakdown.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-breakdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAI1D;;;;;;;;;GASG;AACH,MAAM,MAAM,8BAA8B,GAAG,MAAM,GAAG;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,kCAAkC,yEAoB7C,CAAC"}
1
+ {"version":3,"file":"tokenusage-admin-breakdown.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-breakdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAG1D,OAAO,EAAqB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAExE;;;;;;;;;GASG;AACH,MAAM,MAAM,8BAA8B,GAAG,MAAM,GAAG;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,GAAG,YAAY,CAAC;AAEjB,eAAO,MAAM,kCAAkC,yEAe7C,CAAC"}
@@ -3,18 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TokenUsageAdminBreakdownDescriptor = void 0;
4
4
  const define_entity_1 = require("../../../common/helpers/define-entity");
5
5
  const tokenusage_admin_breakdown_meta_1 = require("./tokenusage-admin-breakdown.meta");
6
+ const usage_metric_fields_1 = require("./usage-metric.fields");
6
7
  exports.TokenUsageAdminBreakdownDescriptor = (0, define_entity_1.defineEntity)()({
7
8
  ...tokenusage_admin_breakdown_meta_1.tokenUsageAdminBreakdownMeta,
8
9
  isCompanyScoped: false,
9
10
  fields: {
10
11
  label: { type: "string", required: true },
11
12
  sublabel: { type: "string" },
12
- cost: { type: "number", required: true },
13
- credits: { type: "number", required: true },
14
- tokensIn: { type: "number", required: true },
15
- tokensOut: { type: "number", required: true },
16
- cached: { type: "number", required: true },
17
- calls: { type: "number", required: true },
13
+ ...usage_metric_fields_1.usageMetricFields,
18
14
  activeUsers: { type: "number" },
19
15
  monthlyCredits: { type: "number" },
20
16
  availableMonthlyCredits: { type: "number" },
@@ -1 +1 @@
1
- {"version":3,"file":"tokenusage-admin-breakdown.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-breakdown.ts"],"names":[],"mappings":";;;AACA,yEAAqE;AACrE,uFAAiF;AA0BpE,QAAA,kCAAkC,GAAG,IAAA,4BAAY,GAAkC,CAAC;IAC/F,GAAG,8DAA4B;IAE/B,eAAe,EAAE,KAAK;IAEtB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC7C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/B,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClC,uBAAuB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC5C;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
1
+ {"version":3,"file":"tokenusage-admin-breakdown.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-breakdown.ts"],"names":[],"mappings":";;;AACA,yEAAqE;AACrE,uFAAiF;AACjF,+DAAwE;AAoB3D,QAAA,kCAAkC,GAAG,IAAA,4BAAY,GAAkC,CAAC;IAC/F,GAAG,8DAA4B;IAE/B,eAAe,EAAE,KAAK;IAEtB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,GAAG,uCAAiB;QACpB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/B,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClC,uBAAuB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC5C;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { Entity } from "../../../common/abstracts/entity";
2
+ import { UsageMetrics } from "./usage-metric.fields";
2
3
  /**
3
4
  * One row of the admin summary: a cost centre observed over one time window.
4
5
  *
@@ -13,12 +14,6 @@ import { Entity } from "../../../common/abstracts/entity";
13
14
  export type TokenUsageAdminSummaryEntity = Entity & {
14
15
  scope: string;
15
16
  window: string;
16
- cost: number;
17
- credits: number;
18
- tokensIn: number;
19
- tokensOut: number;
20
- cached: number;
21
- calls: number;
22
- };
17
+ } & UsageMetrics;
23
18
  export declare const TokenUsageAdminSummaryDescriptor: import("../../..").EntityDescriptor<TokenUsageAdminSummaryEntity, {}>;
24
19
  //# sourceMappingURL=tokenusage-admin-summary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenusage-admin-summary.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAI1D;;;;;;;;;;GAUG;AACH,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,gCAAgC,uEAiB3C,CAAC"}
1
+ {"version":3,"file":"tokenusage-admin-summary.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAG1D,OAAO,EAAqB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAExE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,YAAY,CAAC;AAEjB,eAAO,MAAM,gCAAgC,uEAY3C,CAAC"}
@@ -3,18 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TokenUsageAdminSummaryDescriptor = void 0;
4
4
  const define_entity_1 = require("../../../common/helpers/define-entity");
5
5
  const tokenusage_admin_summary_meta_1 = require("./tokenusage-admin-summary.meta");
6
+ const usage_metric_fields_1 = require("./usage-metric.fields");
6
7
  exports.TokenUsageAdminSummaryDescriptor = (0, define_entity_1.defineEntity)()({
7
8
  ...tokenusage_admin_summary_meta_1.tokenUsageAdminSummaryMeta,
8
9
  isCompanyScoped: false,
9
10
  fields: {
10
11
  scope: { type: "string", required: true },
11
12
  window: { type: "string", required: true },
12
- cost: { type: "number", required: true },
13
- credits: { type: "number", required: true },
14
- tokensIn: { type: "number", required: true },
15
- tokensOut: { type: "number", required: true },
16
- cached: { type: "number", required: true },
17
- calls: { type: "number", required: true },
13
+ ...usage_metric_fields_1.usageMetricFields,
18
14
  },
19
15
  relationships: {},
20
16
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tokenusage-admin-summary.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-summary.ts"],"names":[],"mappings":";;;AACA,yEAAqE;AACrE,mFAA6E;AAwBhE,QAAA,gCAAgC,GAAG,IAAA,4BAAY,GAAgC,CAAC;IAC3F,GAAG,0DAA0B;IAE7B,eAAe,EAAE,KAAK;IAEtB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC7C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC1C;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
1
+ {"version":3,"file":"tokenusage-admin-summary.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-summary.ts"],"names":[],"mappings":";;;AACA,yEAAqE;AACrE,mFAA6E;AAC7E,+DAAwE;AAkB3D,QAAA,gCAAgC,GAAG,IAAA,4BAAY,GAAgC,CAAC;IAC3F,GAAG,0DAA0B;IAE7B,eAAe,EAAE,KAAK;IAEtB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,GAAG,uCAAiB;KACrB;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { Entity } from "../../../common/abstracts/entity";
2
+ import { UsageMetrics } from "./usage-metric.fields";
2
3
  /**
3
4
  * One (bucket, series) cell of the usage-over-time chart. Rows are flat; the
4
5
  * frontend pivots them into stacked columns.
@@ -11,12 +12,6 @@ import { Entity } from "../../../common/abstracts/entity";
11
12
  export type TokenUsageAdminTimelineEntity = Entity & {
12
13
  bucket: string;
13
14
  series: string;
14
- cost: number;
15
- credits: number;
16
- tokensIn: number;
17
- tokensOut: number;
18
- cached: number;
19
- calls: number;
20
- };
15
+ } & UsageMetrics;
21
16
  export declare const TokenUsageAdminTimelineDescriptor: import("../../..").EntityDescriptor<TokenUsageAdminTimelineEntity, {}>;
22
17
  //# sourceMappingURL=tokenusage-admin-timeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenusage-admin-timeline.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAI1D;;;;;;;;GAQG;AACH,MAAM,MAAM,6BAA6B,GAAG,MAAM,GAAG;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,iCAAiC,wEAiB5C,CAAC"}
1
+ {"version":3,"file":"tokenusage-admin-timeline.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAG1D,OAAO,EAAqB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAExE;;;;;;;;GAQG;AACH,MAAM,MAAM,6BAA6B,GAAG,MAAM,GAAG;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,YAAY,CAAC;AAEjB,eAAO,MAAM,iCAAiC,wEAY5C,CAAC"}
@@ -3,18 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TokenUsageAdminTimelineDescriptor = void 0;
4
4
  const define_entity_1 = require("../../../common/helpers/define-entity");
5
5
  const tokenusage_admin_timeline_meta_1 = require("./tokenusage-admin-timeline.meta");
6
+ const usage_metric_fields_1 = require("./usage-metric.fields");
6
7
  exports.TokenUsageAdminTimelineDescriptor = (0, define_entity_1.defineEntity)()({
7
8
  ...tokenusage_admin_timeline_meta_1.tokenUsageAdminTimelineMeta,
8
9
  isCompanyScoped: false,
9
10
  fields: {
10
11
  bucket: { type: "date", required: true },
11
12
  series: { type: "string", required: true },
12
- cost: { type: "number", required: true },
13
- credits: { type: "number", required: true },
14
- tokensIn: { type: "number", required: true },
15
- tokensOut: { type: "number", required: true },
16
- cached: { type: "number", required: true },
17
- calls: { type: "number", required: true },
13
+ ...usage_metric_fields_1.usageMetricFields,
18
14
  },
19
15
  relationships: {},
20
16
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tokenusage-admin-timeline.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-timeline.ts"],"names":[],"mappings":";;;AACA,yEAAqE;AACrE,qFAA+E;AAsBlE,QAAA,iCAAiC,GAAG,IAAA,4BAAY,GAAiC,CAAC;IAC7F,GAAG,4DAA2B;IAE9B,eAAe,EAAE,KAAK;IAEtB,MAAM,EAAE;QACN,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC7C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC1C;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
1
+ {"version":3,"file":"tokenusage-admin-timeline.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-admin-timeline.ts"],"names":[],"mappings":";;;AACA,yEAAqE;AACrE,qFAA+E;AAC/E,+DAAwE;AAgB3D,QAAA,iCAAiC,GAAG,IAAA,4BAAY,GAAiC,CAAC;IAC7F,GAAG,4DAA2B;IAE9B,eAAe,EAAE,KAAK;IAEtB,MAAM,EAAE;QACN,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,GAAG,uCAAiB;KACrB;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Entity } from "../../../common/abstracts/entity";
2
+ import { UsageMetrics } from "./usage-metric.fields";
3
+ /**
4
+ * One ranked row of a self-service breakdown. The same shape serves both
5
+ * dimensions — operation and target — which is why the two "by-X" panels
6
+ * collapse into a single `breakdown?dimension=` route.
7
+ *
8
+ * Deliberately WITHOUT the administrative breakdown's activeUsers /
9
+ * monthlyCredits / availableMonthlyCredits: those exist for the company
10
+ * dimension only, and the self-service page reads the caller's own balances from
11
+ * CurrentUserContext instead.
12
+ *
13
+ * NOT a Neo4j node — serialisation shape only.
14
+ */
15
+ export type TokenUsageReportBreakdownEntity = Entity & {
16
+ label: string;
17
+ sublabel?: string;
18
+ } & UsageMetrics;
19
+ export declare const TokenUsageReportBreakdownDescriptor: import("../../..").EntityDescriptor<TokenUsageReportBreakdownEntity, {}>;
20
+ //# sourceMappingURL=tokenusage-report-breakdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenusage-report-breakdown.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-report-breakdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAG1D,OAAO,EAAqB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAExE;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,+BAA+B,GAAG,MAAM,GAAG;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,YAAY,CAAC;AAEjB,eAAO,MAAM,mCAAmC,0EAY9C,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenUsageReportBreakdownDescriptor = void 0;
4
+ const define_entity_1 = require("../../../common/helpers/define-entity");
5
+ const tokenusage_report_breakdown_meta_1 = require("./tokenusage-report-breakdown.meta");
6
+ const usage_metric_fields_1 = require("./usage-metric.fields");
7
+ exports.TokenUsageReportBreakdownDescriptor = (0, define_entity_1.defineEntity)()({
8
+ ...tokenusage_report_breakdown_meta_1.tokenUsageReportBreakdownMeta,
9
+ isCompanyScoped: false,
10
+ fields: {
11
+ label: { type: "string", required: true },
12
+ sublabel: { type: "string" },
13
+ ...usage_metric_fields_1.usageMetricFields,
14
+ },
15
+ relationships: {},
16
+ });
17
+ //# sourceMappingURL=tokenusage-report-breakdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenusage-report-breakdown.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-report-breakdown.ts"],"names":[],"mappings":";;;AACA,yEAAqE;AACrE,yFAAmF;AACnF,+DAAwE;AAmB3D,QAAA,mCAAmC,GAAG,IAAA,4BAAY,GAAmC,CAAC;IACjG,GAAG,gEAA6B;IAEhC,eAAe,EAAE,KAAK;IAEtB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,GAAG,uCAAiB;KACrB;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DataMeta } from "../../../common/interfaces/datamodel.interface";
2
+ export declare const tokenUsageReportBreakdownMeta: DataMeta;
3
+ //# sourceMappingURL=tokenusage-report-breakdown.meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenusage-report-breakdown.meta.d.ts","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-report-breakdown.meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAE1E,eAAO,MAAM,6BAA6B,EAAE,QAK3C,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenUsageReportBreakdownMeta = void 0;
4
+ exports.tokenUsageReportBreakdownMeta = {
5
+ type: "tokenusage-report-breakdowns",
6
+ endpoint: "tokenusages/reports/breakdown",
7
+ nodeName: "tokenUsageReportBreakdown",
8
+ labelName: "TokenUsageReportBreakdown",
9
+ };
10
+ //# sourceMappingURL=tokenusage-report-breakdown.meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenusage-report-breakdown.meta.js","sourceRoot":"","sources":["../../../../src/foundations/tokenusage/entities/tokenusage-report-breakdown.meta.ts"],"names":[],"mappings":";;;AAEa,QAAA,6BAA6B,GAAa;IACrD,IAAI,EAAE,8BAA8B;IACpC,QAAQ,EAAE,+BAA+B;IACzC,QAAQ,EAAE,2BAA2B;IACrC,SAAS,EAAE,2BAA2B;CACvC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Entity } from "../../../common/abstracts/entity";
2
+ import { UsageMetrics } from "./usage-metric.fields";
3
+ /**
4
+ * One row of the self-service summary: the caller's own company observed over
5
+ * one time window.
6
+ *
7
+ * TWO rows are returned per request — window "current" and "previous" — which is
8
+ * what lets the KPI tile render both the value and its delta without a second
9
+ * call. There is no `scope` field: the administrative customer/platform split is
10
+ * meaningless inside a single tenant.
11
+ *
12
+ * NOT a Neo4j node: there is no TokenUsageReportSummary label. It is a
13
+ * serialisation shape only, exactly like TokenUsageAdminSummaryDescriptor.
14
+ */
15
+ export type TokenUsageReportSummaryEntity = Entity & {
16
+ window: string;
17
+ } & UsageMetrics;
18
+ export declare const TokenUsageReportSummaryDescriptor: import("../../..").EntityDescriptor<TokenUsageReportSummaryEntity, {}>;
19
+ //# sourceMappingURL=tokenusage-report-summary.d.ts.map