@zephytiju/juntai-usage-cost-ui 1.0.0

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 ADDED
@@ -0,0 +1,35 @@
1
+ # Juntai Usage & Cost UI
2
+
3
+ Owning-service Console Micro-UI for Usage search/window detail and Cost-record search/detail. The browser uses only the public `JuntaiUsageCostService` read contracts; tenant identity and `usage.read`/`cost.read` authorization remain server-side.
4
+
5
+ Canonical Console routes:
6
+
7
+ - `/services/platform.cost-and-usage/usage`
8
+ - `/services/platform.cost-and-usage/usage/windows/{windowId}?revision={revision}`
9
+ - `/services/platform.cost-and-usage/cost`
10
+ - `/services/platform.cost-and-usage/cost/records/{recordId}?revision={revision}`
11
+
12
+ The package is independently owned by this repository. It has no source,
13
+ build, test, or release dependency on `JuntaiUsageCostService`; protected reads
14
+ continue to use that service's public same-origin API contract.
15
+
16
+ ## Verification
17
+
18
+ ```bash
19
+ npm ci
20
+ npm audit
21
+ npm run verify
22
+ ```
23
+
24
+ `npm run verify` enforces the repository boundary, TypeScript contract,
25
+ behavior and accessibility suites, package allowlist, and an anonymous clean
26
+ consumer install that registers all four lazy routes. See
27
+ [`MIGRATION.md`](MIGRATION.md) for source traceability.
28
+
29
+ ## Release
30
+
31
+ An immutable `vX.Y.Z` tag must exactly match `package.json`. The release
32
+ workflow verifies the tag is on `main`, re-runs every gate, packs the exact
33
+ tarball, publishes through npm trusted publishing when the version is absent,
34
+ and compares the public registry tarball byte-for-byte before recording the
35
+ GitHub release receipt.
@@ -0,0 +1,16 @@
1
+ import type { ConsolePageContext } from "@zephytiju/console-sdk";
2
+ import type { ApiFailure, CostRecordDetail, CostRecordSummary, Envelope, UsageWindowDetail, UsageWindowSummary } from "./contracts.js";
3
+ export declare class UsageCostApiError extends Error implements ApiFailure {
4
+ readonly state: ApiFailure["state"];
5
+ readonly correlationId?: string;
6
+ constructor(failure: ApiFailure);
7
+ }
8
+ export declare function listUsageWindows(context: ConsolePageContext, signal?: AbortSignal): Promise<Envelope<{
9
+ readonly items: readonly UsageWindowSummary[];
10
+ }>>;
11
+ export declare function getUsageWindow(context: ConsolePageContext, windowId: string, revision?: string, signal?: AbortSignal): Promise<Envelope<UsageWindowDetail>>;
12
+ export declare function listCostRecords(context: ConsolePageContext, signal?: AbortSignal): Promise<Envelope<{
13
+ readonly items: readonly CostRecordSummary[];
14
+ }>>;
15
+ export declare function getCostRecord(context: ConsolePageContext, recordId: string, revision?: string, signal?: AbortSignal): Promise<Envelope<CostRecordDetail>>;
16
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIvI,qBAAa,iBAAkB,SAAQ,KAAM,YAAW,UAAU;IAChE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;gBACpB,OAAO,EAAE,UAAU;CAMhC;AAwDD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,WAAW;oBASlD,SAAS,kBAAkB,EAAE;IAC5D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,wCAGpH;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,WAAW;oBAUjD,SAAS,iBAAiB,EAAE;IAC3D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,uCAGnH"}
package/dist/client.js ADDED
@@ -0,0 +1,93 @@
1
+ const BASE = "/api/usage-cost/v1";
2
+ export class UsageCostApiError extends Error {
3
+ state;
4
+ correlationId;
5
+ constructor(failure) {
6
+ super(failure.message);
7
+ this.name = "UsageCostApiError";
8
+ this.state = failure.state;
9
+ this.correlationId = failure.correlationId;
10
+ }
11
+ }
12
+ function scalar(value) {
13
+ return typeof value === "string" && value ? value : undefined;
14
+ }
15
+ function isRecord(value) {
16
+ return typeof value === "object" && value !== null && !Array.isArray(value);
17
+ }
18
+ function hasArray(value, property) {
19
+ return isRecord(value) && Array.isArray(value[property]);
20
+ }
21
+ function isReadMeta(value) {
22
+ return isRecord(value)
23
+ && ["authoritative", "empty", "partial", "stale", "superseded"].includes(String(value.state))
24
+ && (value.nextCursor === null || typeof value.nextCursor === "string")
25
+ && typeof value.returnedAt === "string"
26
+ && Number.isInteger(value.partialCount)
27
+ && Number(value.partialCount) >= 0;
28
+ }
29
+ function unreadable(correlationId) {
30
+ return new UsageCostApiError({
31
+ state: "failed",
32
+ message: "The owning service returned an unreadable response.",
33
+ ...(correlationId ? { correlationId } : {}),
34
+ });
35
+ }
36
+ async function read(context, path, validateData, signal) {
37
+ const response = await context.fetch(path, {
38
+ headers: { "X-Correlation-ID": context.correlationIds.create(), "Accept": "application/json" },
39
+ signal,
40
+ });
41
+ const body = await response.json().catch(() => undefined);
42
+ const record = isRecord(body) ? body : undefined;
43
+ const correlationId = typeof record?.correlationId === "string" ? record.correlationId : undefined;
44
+ if (!response.ok) {
45
+ const state = response.status === 401 || response.status === 403 ? "forbidden" : response.status === 404 ? "not-found" : response.status === 502 || response.status === 503 || response.status === 504 ? "dependency" : "failed";
46
+ const error = isRecord(record?.error) ? record.error : undefined;
47
+ const message = typeof error?.message === "string" ? error.message : "The owning service could not complete the request.";
48
+ throw new UsageCostApiError({ state, message, ...(correlationId ? { correlationId } : {}) });
49
+ }
50
+ if (!record || !validateData(record.data) || !isReadMeta(record.meta) || !correlationId)
51
+ throw unreadable(correlationId);
52
+ return record;
53
+ }
54
+ function queryString(values) {
55
+ const query = new URLSearchParams();
56
+ for (const [name, value] of Object.entries(values))
57
+ if (value)
58
+ query.set(name, value);
59
+ query.set("page_size", "100");
60
+ return query.toString();
61
+ }
62
+ export function listUsageWindows(context, signal) {
63
+ const query = queryString({
64
+ occurred_from: scalar(context.route.query.from),
65
+ occurred_to: scalar(context.route.query.to),
66
+ meter: scalar(context.route.query.meter),
67
+ service: scalar(context.route.query.service),
68
+ resource_id: scalar(context.route.query.resource),
69
+ cursor: scalar(context.route.query.cursor),
70
+ });
71
+ return read(context, `${BASE}/usage/windows?${query}`, (value) => hasArray(value, "items"), signal);
72
+ }
73
+ export function getUsageWindow(context, windowId, revision, signal) {
74
+ const query = revision ? `?revision=${encodeURIComponent(revision)}` : "";
75
+ return read(context, `${BASE}/usage/windows/${encodeURIComponent(windowId)}${query}`, (value) => hasArray(value, "dimensions") && hasArray(value, "revisions") && hasArray(value, "calculations"), signal);
76
+ }
77
+ export function listCostRecords(context, signal) {
78
+ const query = queryString({
79
+ calculated_from: scalar(context.route.query.from),
80
+ calculated_to: scalar(context.route.query.to),
81
+ service: scalar(context.route.query.service),
82
+ record_id: scalar(context.route.query.record),
83
+ currency: scalar(context.route.query.currency),
84
+ status: scalar(context.route.query.status),
85
+ cursor: scalar(context.route.query.cursor),
86
+ });
87
+ return read(context, `${BASE}/cost-records?${query}`, (value) => hasArray(value, "items"), signal);
88
+ }
89
+ export function getCostRecord(context, recordId, revision, signal) {
90
+ const query = revision ? `?revision=${encodeURIComponent(revision)}` : "";
91
+ return read(context, `${BASE}/cost-records/${encodeURIComponent(recordId)}${query}`, (value) => hasArray(value, "lineItems") && hasArray(value, "revisions"), signal);
92
+ }
93
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAElC,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,KAAK,CAAsB;IAC3B,aAAa,CAAU;IAChC,YAAY,OAAmB;QAC7B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC7C,CAAC;CACF;AAED,SAAS,MAAM,CAAC,KAA6C;IAC3D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,QAAgB;IAChD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,QAAQ,CAAC,KAAK,CAAC;WACjB,CAAC,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;WAC1F,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC;WACnE,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;WACpC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC;WACpC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,aAAsB;IACxC,OAAO,IAAI,iBAAiB,CAAC;QAC3B,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,qDAAqD;QAC9D,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI,CAAI,OAA2B,EAAE,IAAY,EAAE,YAAyC,EAAE,MAAoB;IAC/H,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;QACzC,OAAO,EAAE,EAAE,kBAAkB,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE;QAC9F,MAAM;KACP,CAAC,CAAC;IACH,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjD,MAAM,aAAa,GAAG,OAAO,MAAM,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IACnG,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjO,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oDAAoD,CAAC;QAC1H,MAAM,IAAI,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa;QAAE,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC;IACzH,OAAO,MAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,MAAoD;IACvE,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,KAAK;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtF,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA2B,EAAE,MAAoB;IAChF,MAAM,KAAK,GAAG,WAAW,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/C,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5C,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjD,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;KAC3C,CAAC,CAAC;IACH,OAAO,IAAI,CAAoD,OAAO,EAAE,GAAG,IAAI,kBAAkB,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AACzJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA2B,EAAE,QAAgB,EAAE,QAAiB,EAAE,MAAoB;IACnH,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,OAAO,IAAI,CAAoB,OAAO,EAAE,GAAG,IAAI,kBAAkB,kBAAkB,CAAC,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;AAChO,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA2B,EAAE,MAAoB;IAC/E,MAAM,KAAK,GAAG,WAAW,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACjD,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5C,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QAC7C,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9C,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1C,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;KAC3C,CAAC,CAAC;IACH,OAAO,IAAI,CAAmD,OAAO,EAAE,GAAG,IAAI,iBAAiB,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AACvJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA2B,EAAE,QAAgB,EAAE,QAAiB,EAAE,MAAoB;IAClH,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,OAAO,IAAI,CAAmB,OAAO,EAAE,GAAG,IAAI,iBAAiB,kBAAkB,CAAC,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1L,CAAC"}
@@ -0,0 +1,90 @@
1
+ export type ReadState = "authoritative" | "empty" | "partial" | "stale" | "superseded";
2
+ export interface ReadMeta {
3
+ readonly state: ReadState;
4
+ readonly nextCursor: string | null;
5
+ readonly returnedAt: string;
6
+ readonly partialCount: number;
7
+ }
8
+ export interface Envelope<T> {
9
+ readonly data: T;
10
+ readonly meta: ReadMeta;
11
+ readonly correlationId: string;
12
+ }
13
+ export interface UsageWindowSummary {
14
+ readonly windowId: string;
15
+ readonly revision: number;
16
+ readonly state: "authoritative" | "partial" | "stale";
17
+ readonly meter: string;
18
+ readonly quantity: string;
19
+ readonly unit: string;
20
+ readonly windowStart: string;
21
+ readonly windowEnd: string;
22
+ readonly service: string;
23
+ readonly resourceId: string | null;
24
+ readonly sourceId: string;
25
+ readonly acceptedAt: string;
26
+ readonly latestWindowId: string | null;
27
+ }
28
+ export interface UsageWindowDetail extends UsageWindowSummary {
29
+ readonly producerId: string;
30
+ readonly payloadDigest: string;
31
+ readonly dimensions: readonly {
32
+ readonly name: string;
33
+ readonly value: string | null;
34
+ readonly state: "authoritative" | "partial";
35
+ }[];
36
+ readonly revisions: readonly {
37
+ readonly revision: number;
38
+ readonly eventId: string;
39
+ readonly digest: string;
40
+ readonly acceptedAt: string;
41
+ readonly state: "current" | "superseded";
42
+ }[];
43
+ readonly calculations: readonly Record<string, unknown>[];
44
+ }
45
+ export interface CostRecordSummary {
46
+ readonly recordId: string;
47
+ readonly revision: number;
48
+ readonly state: "authoritative" | "partial" | "superseded";
49
+ readonly status: string;
50
+ readonly amount: string | null;
51
+ readonly currency: string;
52
+ readonly usageWindowId: string;
53
+ readonly rateCardId: string;
54
+ readonly rateRevision: number;
55
+ readonly service: string | null;
56
+ readonly calculatedAt: string;
57
+ readonly sealedAt: string | null;
58
+ readonly currentRevision: number;
59
+ }
60
+ export interface CostRecordDetail extends CostRecordSummary {
61
+ readonly usagePayloadDigest: string;
62
+ readonly rateContentDigest: string;
63
+ readonly calculatorVersion: string;
64
+ readonly outputDigest: string;
65
+ readonly supersedesRevision: number | null;
66
+ readonly lineItems: readonly {
67
+ readonly lineNumber: number;
68
+ readonly ruleId: string;
69
+ readonly normalizedQuantity: string;
70
+ readonly coefficient: string;
71
+ readonly preRoundAmount: string;
72
+ readonly amount: string;
73
+ readonly currency: string;
74
+ readonly lineDigest: string;
75
+ }[];
76
+ readonly revisions: readonly {
77
+ readonly revision: number;
78
+ readonly status: string;
79
+ readonly amount: string | null;
80
+ readonly currency: string;
81
+ readonly outputDigest: string;
82
+ readonly calculatedAt: string;
83
+ }[];
84
+ }
85
+ export interface ApiFailure {
86
+ readonly state: "forbidden" | "not-found" | "dependency" | "failed";
87
+ readonly message: string;
88
+ readonly correlationId?: string;
89
+ }
90
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export { default, usageCostModule, USAGE_COST_MODULE_ID } from "./module.js";
2
+ export { costRecordTarget, costSearchTarget, requireDomainIdentifier, requireRevision, usageSearchTarget, usageWindowTarget, USAGE_COST_SERVICE_ID } from "./routing.js";
3
+ export type { CostRecordDetail, CostRecordSummary, ReadMeta, ReadState, UsageWindowDetail, UsageWindowSummary } from "./contracts.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACzK,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { default, usageCostModule, USAGE_COST_MODULE_ID } from "./module.js";
2
+ export { costRecordTarget, costSearchTarget, requireDomainIdentifier, requireRevision, usageSearchTarget, usageWindowTarget, USAGE_COST_SERVICE_ID } from "./routing.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const USAGE_COST_MODULE_ID = "juntai-usage-cost-ui";
2
+ export declare const usageCostModule: {
3
+ readonly id: "juntai-usage-cost-ui";
4
+ readonly version: "1.0.0";
5
+ readonly owner: {
6
+ readonly team: "data-intel-platform";
7
+ readonly repository: "zephytiju/JuntaiUsageCostUI";
8
+ };
9
+ readonly compatibility: {
10
+ readonly console: "^1.0.0";
11
+ readonly sdk: ">=2.1.0 <=2.1.0";
12
+ readonly react: "^19.0.0";
13
+ };
14
+ readonly register: (registrar: import("@zephytiju/console-sdk").ConsoleRegistrar) => void;
15
+ };
16
+ export default usageCostModule;
17
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AA+C3D,eAAO,MAAM,eAAe;;;;;;;;;;;;;CAM1B,CAAC;AAEH,eAAe,eAAe,CAAC"}
package/dist/module.js ADDED
@@ -0,0 +1,56 @@
1
+ import { defineConsoleModule, defineService } from "@zephytiju/console-sdk";
2
+ import { USAGE_COST_SERVICE_ID } from "./routing.js";
3
+ export const USAGE_COST_MODULE_ID = "juntai-usage-cost-ui";
4
+ const service = defineService({
5
+ id: USAGE_COST_SERVICE_ID,
6
+ ownerModuleId: USAGE_COST_MODULE_ID,
7
+ displayName: { defaultMessage: "Cost & Usage" },
8
+ summary: { defaultMessage: "Inspect authoritative usage windows and server-calculated cost records." },
9
+ category: "Data & Analytics",
10
+ tags: ["usage", "cost", "metering", "account"],
11
+ icon: { name: "cost" },
12
+ discoveryPermissions: [{ resource: "usage", action: "read" }, { resource: "cost", action: "read" }],
13
+ pages: [
14
+ {
15
+ id: "usage.search",
16
+ kind: "overview",
17
+ path: "/usage",
18
+ label: { defaultMessage: "Usage" },
19
+ permissions: [{ resource: "usage", action: "read" }],
20
+ load: () => import("./pages.js").then(({ UsageSearchPage: defaultPage }) => ({ default: defaultPage })),
21
+ },
22
+ {
23
+ id: "usage.window",
24
+ kind: "manage",
25
+ path: "/usage/windows/:windowId",
26
+ label: { defaultMessage: "Usage window" },
27
+ permissions: [{ resource: "usage", action: "read" }],
28
+ load: () => import("./pages.js").then(({ UsageWindowPage: defaultPage }) => ({ default: defaultPage })),
29
+ },
30
+ {
31
+ id: "cost.search",
32
+ kind: "overview",
33
+ path: "/cost",
34
+ label: { defaultMessage: "Cost records" },
35
+ permissions: [{ resource: "cost", action: "read" }],
36
+ load: () => import("./pages.js").then(({ CostSearchPage: defaultPage }) => ({ default: defaultPage })),
37
+ },
38
+ {
39
+ id: "cost.record",
40
+ kind: "manage",
41
+ path: "/cost/records/:recordId",
42
+ label: { defaultMessage: "Cost record" },
43
+ permissions: [{ resource: "cost", action: "read" }],
44
+ load: () => import("./pages.js").then(({ CostRecordPage: defaultPage }) => ({ default: defaultPage })),
45
+ },
46
+ ],
47
+ });
48
+ export const usageCostModule = defineConsoleModule({
49
+ id: USAGE_COST_MODULE_ID,
50
+ version: "1.0.0",
51
+ owner: { team: "data-intel-platform", repository: "zephytiju/JuntaiUsageCostUI" },
52
+ compatibility: { console: "^1.0.0", sdk: ">=2.1.0 <=2.1.0", react: "^19.0.0" },
53
+ register(registrar) { registrar.registerService(service); },
54
+ });
55
+ export default usageCostModule;
56
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ConsolePageProps } from "@zephytiju/console-sdk";
2
+ export declare function toLocalDateTime(value: string): string;
3
+ export declare function toUtcBoundary(value: string): string;
4
+ export declare function UsageSearchPage({ context }: ConsolePageProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function UsageWindowPage({ context }: ConsolePageProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function CostSearchPage({ context }: ConsolePageProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function CostRecordPage({ context }: ConsolePageProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../src/pages.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAYnF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAyGD,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAS5D;AAYD,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAe5D;AAiCD,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAK3D;AAOD,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAQ3D"}
package/dist/pages.js ADDED
@@ -0,0 +1,175 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import { getCostRecord, getUsageWindow, listCostRecords, listUsageWindows, UsageCostApiError } from "./client.js";
4
+ import { costRecordTarget, costSearchTarget, requireDomainIdentifier, requireRevision, usageSearchTarget, usageWindowTarget } from "./routing.js";
5
+ function queryValue(context, key) {
6
+ const value = context.route.query[key];
7
+ return typeof value === "string" ? value : "";
8
+ }
9
+ export function toLocalDateTime(value) {
10
+ if (!value)
11
+ return "";
12
+ const date = new Date(value);
13
+ if (Number.isNaN(date.valueOf()))
14
+ return "";
15
+ const local = new Date(date.valueOf() - date.getTimezoneOffset() * 60_000);
16
+ return local.toISOString().slice(0, 16);
17
+ }
18
+ export function toUtcBoundary(value) {
19
+ if (!value)
20
+ return "";
21
+ const date = new Date(value);
22
+ if (Number.isNaN(date.valueOf()))
23
+ throw new Error("Search boundaries must be valid local date-times.");
24
+ return date.toISOString();
25
+ }
26
+ function useOwnedRequest(load, dependencies) {
27
+ const [state, setState] = useState({ status: "loading" });
28
+ useEffect(() => {
29
+ const controller = new AbortController();
30
+ setState({ status: "loading" });
31
+ void load(controller.signal).then((value) => {
32
+ if (!controller.signal.aborted)
33
+ setState({ status: "ready", value });
34
+ }).catch((error) => {
35
+ if (controller.signal.aborted)
36
+ return;
37
+ if (error instanceof UsageCostApiError)
38
+ setState({ status: "error", failure: error });
39
+ else
40
+ setState({ status: "error", failure: { state: "failed", message: "The owning service returned an unreadable response." } });
41
+ });
42
+ return () => controller.abort();
43
+ // The calling page supplies immutable route-derived dependencies.
44
+ // eslint-disable-next-line react-hooks/exhaustive-deps
45
+ }, dependencies);
46
+ return state;
47
+ }
48
+ function PageHeader({ title, description, section }) {
49
+ return _jsxs("header", { className: "uc-page-header", children: [_jsxs("div", { children: [_jsxs("p", { className: "uc-eyebrow", children: ["Cost & Usage \u00B7 ", section] }), _jsx("h1", { children: title }), _jsx("p", { children: description })] }), _jsx("span", { className: "uc-owner-badge", children: "Owned by Cost & Usage" })] });
50
+ }
51
+ function StatePanel({ failure }) {
52
+ const content = {
53
+ forbidden: ["Access denied", "The owning service did not grant the required usage.read or cost.read permission."],
54
+ "not-found": ["Record not found", "The identifier or requested revision does not exist in the authoritative service."],
55
+ dependency: ["Owning service unavailable", "Your filters and route are preserved. Retry when the dependency is healthy."],
56
+ failed: ["Unable to load this destination", "The response could not be verified. No values are being inferred in the browser."],
57
+ }[failure.state];
58
+ return _jsxs("section", { className: `uc-state uc-state--${failure.state}`, role: "alert", "data-state": failure.state, children: [_jsx("span", { "aria-hidden": "true", children: failure.state === "forbidden" ? "⊘" : failure.state === "not-found" ? "?" : "!" }), _jsxs("div", { children: [_jsx("h2", { children: content[0] }), _jsx("p", { children: failure.message || content[1] }), failure.correlationId && _jsxs("p", { className: "uc-mono", children: ["Correlation ", failure.correlationId] })] })] });
59
+ }
60
+ function Loading() {
61
+ return _jsxs("section", { className: "uc-state", role: "status", children: [_jsx("span", { className: "uc-spinner" }), _jsxs("div", { children: [_jsx("h2", { children: "Loading authoritative data" }), _jsx("p", { children: "Requesting the owning service contract." })] })] });
62
+ }
63
+ function StateBadge({ state }) {
64
+ return _jsx("span", { className: `uc-badge uc-badge--${state.replaceAll("_", "-")}`, children: state.replaceAll("_", " ") });
65
+ }
66
+ function Metric({ label, value, detail }) {
67
+ return _jsxs("div", { className: "uc-metric", children: [_jsx("dt", { children: label }), _jsxs("dd", { children: [value, detail && _jsx("small", { children: detail })] })] });
68
+ }
69
+ function dateTime(value, locale) {
70
+ const date = new Date(value);
71
+ return Number.isNaN(date.valueOf()) ? value : new Intl.DateTimeFormat(locale, { dateStyle: "medium", timeStyle: "short" }).format(date);
72
+ }
73
+ function SearchNotice({ hasQuery, count, partialCount }) {
74
+ if (!count)
75
+ return _jsxs("section", { className: "uc-empty", role: "status", "data-state": hasQuery ? "no-matches" : "empty-query", children: [_jsx("h2", { children: hasQuery ? "No matching records" : "Start with the latest records" }), _jsx("p", { children: hasQuery ? "No authoritative records matched these filters. Adjust them and try again." : "No records are currently available. Add filters when data arrives." })] });
76
+ return _jsx("div", { className: `uc-notice${partialCount ? " uc-notice--warning" : ""}`, role: "status", "data-state": partialCount ? "partial" : hasQuery ? "authoritative" : "empty-query", children: partialCount ? `${partialCount} result${partialCount === 1 ? " is" : "s are"} partial or stale; values remain explicitly labelled.` : hasQuery ? "Authoritative results returned for the selected filters." : "Empty query: showing the latest authoritative records." });
77
+ }
78
+ function nextUsagePage(context, cursor) {
79
+ return usageSearchTarget({
80
+ from: queryValue(context, "from"), to: queryValue(context, "to"), meter: queryValue(context, "meter"),
81
+ service: queryValue(context, "service"), resource: queryValue(context, "resource"), cursor,
82
+ });
83
+ }
84
+ function nextCostPage(context, cursor) {
85
+ return costSearchTarget({
86
+ from: queryValue(context, "from"), to: queryValue(context, "to"), service: queryValue(context, "service"),
87
+ record: queryValue(context, "record"), currency: queryValue(context, "currency"), status: queryValue(context, "status"), cursor,
88
+ });
89
+ }
90
+ function NextPage({ cursor, onNext }) {
91
+ return cursor ? _jsx("nav", { className: "uc-filter-actions", "aria-label": "Search result pages", children: _jsx("button", { type: "button", onClick: () => onNext(cursor), children: "Next page" }) }) : null;
92
+ }
93
+ function UsageFilterForm({ context }) {
94
+ const routeKey = JSON.stringify(context.route.query);
95
+ const initial = useMemo(() => ({ from: toLocalDateTime(queryValue(context, "from")), to: toLocalDateTime(queryValue(context, "to")), meter: queryValue(context, "meter"), service: queryValue(context, "service"), resource: queryValue(context, "resource") }), [routeKey, context]);
96
+ const [filters, setFilters] = useState(initial);
97
+ useEffect(() => setFilters(initial), [initial]);
98
+ const change = (name, value) => setFilters((current) => ({ ...current, [name]: value }));
99
+ const submit = (event) => {
100
+ event.preventDefault();
101
+ context.navigate(usageSearchTarget({ ...filters, from: toUtcBoundary(filters.from), to: toUtcBoundary(filters.to) }));
102
+ };
103
+ return _jsxs("form", { className: "uc-filter-panel", "aria-label": "Usage search filters", onSubmit: submit, children: [_jsxs("label", { children: ["From", _jsx("input", { type: "datetime-local", value: filters.from, onChange: (event) => change("from", event.currentTarget.value) })] }), _jsxs("label", { children: ["To", _jsx("input", { type: "datetime-local", value: filters.to, onChange: (event) => change("to", event.currentTarget.value) })] }), _jsxs("label", { children: ["Meter", _jsx("input", { value: filters.meter, onChange: (event) => change("meter", event.currentTarget.value), placeholder: "compute.cpu" })] }), _jsxs("label", { children: ["Service", _jsx("input", { value: filters.service, onChange: (event) => change("service", event.currentTarget.value), placeholder: "compute" })] }), _jsxs("label", { children: ["Resource", _jsx("input", { value: filters.resource, onChange: (event) => change("resource", event.currentTarget.value), placeholder: "Immutable ID" })] }), _jsxs("div", { className: "uc-filter-actions", children: [_jsx("button", { type: "submit", children: "Apply filters" }), _jsx("button", { type: "button", className: "uc-secondary", onClick: () => context.navigate(usageSearchTarget()), children: "Clear" })] })] });
104
+ }
105
+ export function UsageSearchPage({ context }) {
106
+ const routeKey = JSON.stringify(context.route.query);
107
+ const state = useOwnedRequest((signal) => listUsageWindows(context, signal), [routeKey, context.fetch]);
108
+ const hasQuery = Object.values(context.route.query).some((value) => typeof value === "string" ? Boolean(value) : value.length > 0);
109
+ return _jsxs("main", { className: "uc-page", "data-page": "usage-search", children: [_jsx(PageHeader, { section: "Usage", title: "Usage windows", description: "Search metered usage exactly as accepted by the owning service." }), _jsx(UsageFilterForm, { context: context }), state.status === "loading" ? _jsx(Loading, {}) : state.status === "error" ? _jsx(StatePanel, { failure: state.failure }) : _jsx(UsageResults, { context: context, response: state.value, hasQuery: hasQuery })] });
110
+ }
111
+ function UsageResults({ context, response, hasQuery }) {
112
+ const items = response.data.items;
113
+ return _jsxs(_Fragment, { children: [_jsx(SearchNotice, { hasQuery: hasQuery, count: items.length, partialCount: response.meta.partialCount }), _jsxs("dl", { className: "uc-metrics", children: [_jsx(Metric, { label: "Windows on this page", value: items.length }), _jsx(Metric, { label: "Meters represented", value: new Set(items.map(({ meter }) => meter)).size, detail: "No cross-unit aggregation in the browser" }), _jsx(Metric, { label: "Response state", value: _jsx(StateBadge, { state: response.meta.state }) }), _jsx(Metric, { label: "Returned", value: dateTime(response.meta.returnedAt, context.locale) })] }), items.length > 0 && _jsx("div", { className: "uc-table-wrap", children: _jsxs("table", { children: [_jsx("caption", { className: "uc-sr-only", children: "Usage windows" }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Window" }), _jsx("th", { children: "Service / resource" }), _jsx("th", { children: "Meter" }), _jsx("th", { children: "Quantity" }), _jsx("th", { children: "Period" }), _jsx("th", { children: "State" })] }) }), _jsx("tbody", { children: items.map((item) => _jsxs("tr", { children: [_jsxs("td", { children: [_jsx("button", { className: "uc-link", type: "button", onClick: () => context.navigate(usageWindowTarget(item.windowId, item.revision)), children: item.windowId }), _jsxs("small", { children: ["Revision ", item.revision] })] }), _jsxs("td", { children: [item.service, _jsx("small", { children: item.resourceId ?? "No resource dimension" })] }), _jsx("td", { children: item.meter }), _jsxs("td", { className: "uc-number", children: [item.quantity, " ", item.unit] }), _jsxs("td", { children: [dateTime(item.windowStart, context.locale), _jsxs("small", { children: ["to ", dateTime(item.windowEnd, context.locale)] })] }), _jsx("td", { children: _jsx(StateBadge, { state: item.state }) })] }, `${item.windowId}:${item.revision}`)) })] }) }), _jsx(NextPage, { cursor: response.meta.nextCursor, onNext: (cursor) => context.navigate(nextUsagePage(context, cursor)) })] });
114
+ }
115
+ export function UsageWindowPage({ context }) {
116
+ let windowId = "";
117
+ let revision;
118
+ let invalid;
119
+ try {
120
+ windowId = requireDomainIdentifier(context.route.params.windowId ?? "", "usage window identifier");
121
+ const candidate = queryValue(context, "revision");
122
+ revision = candidate ? requireRevision(candidate) : undefined;
123
+ }
124
+ catch (error) {
125
+ invalid = { state: "not-found", message: error instanceof Error ? error.message : "Invalid route." };
126
+ }
127
+ const key = `${windowId}:${revision ?? "latest"}`;
128
+ const state = useOwnedRequest((signal) => invalid ? Promise.reject(new UsageCostApiError(invalid)) : getUsageWindow(context, windowId, revision, signal), [key, context.fetch]);
129
+ return _jsxs("main", { className: "uc-page", "data-page": "usage-window", children: [_jsx(PageHeader, { section: "Usage", title: `Usage window ${windowId || "unknown"}`, description: "Inspect dimensions, lineage, source quality, and immutable revisions." }), state.status === "loading" ? _jsx(Loading, {}) : state.status === "error" ? _jsx(StatePanel, { failure: state.failure }) : _jsx(UsageWindowDetailView, { context: context, response: state.value })] });
130
+ }
131
+ function UsageWindowDetailView({ context, response }) {
132
+ const value = response.data;
133
+ const latestRevision = Math.max(...value.revisions.map(({ revision }) => revision));
134
+ return _jsxs(_Fragment, { children: [(value.state === "stale" || value.revision < latestRevision) && _jsxs("div", { className: "uc-notice uc-notice--warning", role: "status", "data-state": "stale", children: ["This revision is stale. ", _jsxs("button", { className: "uc-link", type: "button", onClick: () => context.navigate(usageWindowTarget(value.windowId, latestRevision)), children: ["Open revision ", latestRevision] }), "."] }), _jsxs("dl", { className: "uc-metrics", children: [_jsx(Metric, { label: "State", value: _jsx(StateBadge, { state: value.state }) }), _jsx(Metric, { label: "Quantity", value: `${value.quantity} ${value.unit}` }), _jsx(Metric, { label: "Revision", value: value.revision, detail: `Latest ${latestRevision}` }), _jsx(Metric, { label: "Accepted", value: dateTime(value.acceptedAt, context.locale) })] }), _jsxs("section", { className: "uc-card", children: [_jsx("h2", { children: "Dimensions and lineage" }), _jsx("div", { className: "uc-table-wrap", children: _jsxs("table", { children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Dimension" }), _jsx("th", { children: "Value" }), _jsx("th", { children: "Quality" })] }) }), _jsx("tbody", { children: value.dimensions.map((dimension) => _jsxs("tr", { children: [_jsx("td", { children: dimension.name }), _jsx("td", { className: "uc-mono", children: dimension.value ?? "Unavailable" }), _jsx("td", { children: _jsx(StateBadge, { state: dimension.state }) })] }, dimension.name)) })] }) }), _jsxs("dl", { className: "uc-key-values", children: [_jsxs("div", { children: [_jsx("dt", { children: "Producer" }), _jsx("dd", { children: value.producerId })] }), _jsxs("div", { children: [_jsx("dt", { children: "Payload digest" }), _jsx("dd", { children: value.payloadDigest })] }), _jsxs("div", { children: [_jsx("dt", { children: "Source" }), _jsx("dd", { children: value.sourceId })] })] })] }), _jsxs("section", { className: "uc-card", children: [_jsx("h2", { children: "Revision history" }), _jsx("div", { className: "uc-revisions", children: value.revisions.map((item) => _jsxs("button", { type: "button", "aria-current": item.revision === value.revision ? "page" : undefined, onClick: () => context.navigate(usageWindowTarget(value.windowId, item.revision)), children: [_jsxs("strong", { children: ["Revision ", item.revision] }), _jsx("span", { children: dateTime(item.acceptedAt, context.locale) }), _jsx(StateBadge, { state: item.state })] }, item.revision)) })] })] });
135
+ }
136
+ function CostFilterForm({ context }) {
137
+ const routeKey = JSON.stringify(context.route.query);
138
+ const initial = useMemo(() => ({ from: toLocalDateTime(queryValue(context, "from")), to: toLocalDateTime(queryValue(context, "to")), service: queryValue(context, "service"), record: queryValue(context, "record"), currency: queryValue(context, "currency"), status: queryValue(context, "status") }), [routeKey, context]);
139
+ const [filters, setFilters] = useState(initial);
140
+ useEffect(() => setFilters(initial), [initial]);
141
+ const change = (name, value) => setFilters((current) => ({ ...current, [name]: value }));
142
+ const submit = (event) => { event.preventDefault(); context.navigate(costSearchTarget({ ...filters, from: toUtcBoundary(filters.from), to: toUtcBoundary(filters.to) })); };
143
+ return _jsxs("form", { className: "uc-filter-panel uc-filter-panel--cost", "aria-label": "Cost record search filters", onSubmit: submit, children: [_jsxs("label", { children: ["From", _jsx("input", { type: "datetime-local", value: filters.from, onChange: (event) => change("from", event.currentTarget.value) })] }), _jsxs("label", { children: ["To", _jsx("input", { type: "datetime-local", value: filters.to, onChange: (event) => change("to", event.currentTarget.value) })] }), _jsxs("label", { children: ["Service", _jsx("input", { value: filters.service, onChange: (event) => change("service", event.currentTarget.value), placeholder: "compute" })] }), _jsxs("label", { children: ["Record ID", _jsx("input", { value: filters.record, onChange: (event) => change("record", event.currentTarget.value), placeholder: "Immutable ID" })] }), _jsxs("label", { children: ["Currency", _jsx("input", { maxLength: 3, value: filters.currency, onChange: (event) => change("currency", event.currentTarget.value.toUpperCase()), placeholder: "USD" })] }), _jsxs("label", { children: ["Status", _jsxs("select", { value: filters.status, onChange: (event) => change("status", event.currentTarget.value), children: [_jsx("option", { value: "", children: "All states" }), _jsx("option", { value: "sealed", children: "Sealed" }), _jsx("option", { value: "pending", children: "Pending" }), _jsx("option", { value: "missing_rate", children: "Missing rate" }), _jsx("option", { value: "ambiguous_rate", children: "Ambiguous rate" }), _jsx("option", { value: "failed", children: "Failed" })] })] }), _jsxs("div", { className: "uc-filter-actions", children: [_jsx("button", { type: "submit", children: "Apply filters" }), _jsx("button", { type: "button", className: "uc-secondary", onClick: () => context.navigate(costSearchTarget()), children: "Clear" })] })] });
144
+ }
145
+ export function CostSearchPage({ context }) {
146
+ const routeKey = JSON.stringify(context.route.query);
147
+ const state = useOwnedRequest((signal) => listCostRecords(context, signal), [routeKey, context.fetch]);
148
+ const hasQuery = Object.values(context.route.query).some((value) => typeof value === "string" ? Boolean(value) : value.length > 0);
149
+ return _jsxs("main", { className: "uc-page", "data-page": "cost-search", children: [_jsx(PageHeader, { section: "Cost", title: "Cost records", description: "Search immutable server-calculated records. This destination is not a bill." }), _jsx(CostFilterForm, { context: context }), state.status === "loading" ? _jsx(Loading, {}) : state.status === "error" ? _jsx(StatePanel, { failure: state.failure }) : _jsx(CostResults, { context: context, response: state.value, hasQuery: hasQuery })] });
150
+ }
151
+ function CostResults({ context, response, hasQuery }) {
152
+ const items = response.data.items;
153
+ return _jsxs(_Fragment, { children: [_jsx(SearchNotice, { hasQuery: hasQuery, count: items.length, partialCount: response.meta.partialCount }), _jsxs("dl", { className: "uc-metrics", children: [_jsx(Metric, { label: "Records on this page", value: items.length }), _jsx(Metric, { label: "Sealed records", value: items.filter(({ status }) => status === "sealed").length, detail: "Totals remain server-owned per record" }), _jsx(Metric, { label: "Response state", value: _jsx(StateBadge, { state: response.meta.state }) }), _jsx(Metric, { label: "Returned", value: dateTime(response.meta.returnedAt, context.locale) })] }), items.length > 0 && _jsx("div", { className: "uc-table-wrap", children: _jsxs("table", { children: [_jsx("caption", { className: "uc-sr-only", children: "Cost records" }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Record" }), _jsx("th", { children: "Service" }), _jsx("th", { children: "Amount" }), _jsx("th", { children: "Usage window" }), _jsx("th", { children: "Calculated" }), _jsx("th", { children: "State" })] }) }), _jsx("tbody", { children: items.map((item) => _jsxs("tr", { children: [_jsxs("td", { children: [_jsx("button", { className: "uc-link", type: "button", onClick: () => context.navigate(costRecordTarget(item.recordId, item.revision)), children: item.recordId }), _jsxs("small", { children: ["Revision ", item.revision] })] }), _jsx("td", { children: item.service ?? "Unavailable" }), _jsx("td", { className: "uc-number", children: item.amount === null ? "Incomplete" : `${item.amount} ${item.currency}` }), _jsx("td", { children: _jsx("button", { className: "uc-link", type: "button", onClick: () => context.navigate(usageWindowTarget(item.usageWindowId)), children: item.usageWindowId }) }), _jsx("td", { children: dateTime(item.calculatedAt, context.locale) }), _jsx("td", { children: _jsx(StateBadge, { state: item.state }) })] }, `${item.recordId}:${item.revision}`)) })] }) }), _jsx(NextPage, { cursor: response.meta.nextCursor, onNext: (cursor) => context.navigate(nextCostPage(context, cursor)) })] });
154
+ }
155
+ export function CostRecordPage({ context }) {
156
+ let recordId = "";
157
+ let revision;
158
+ let invalid;
159
+ try {
160
+ recordId = requireDomainIdentifier(context.route.params.recordId ?? "", "cost record identifier");
161
+ const candidate = queryValue(context, "revision");
162
+ revision = candidate ? requireRevision(candidate) : undefined;
163
+ }
164
+ catch (error) {
165
+ invalid = { state: "not-found", message: error instanceof Error ? error.message : "Invalid route." };
166
+ }
167
+ const key = `${recordId}:${revision ?? "latest"}`;
168
+ const state = useOwnedRequest((signal) => invalid ? Promise.reject(new UsageCostApiError(invalid)) : getCostRecord(context, recordId, revision, signal), [key, context.fetch]);
169
+ return _jsxs("main", { className: "uc-page", "data-page": "cost-record", children: [_jsx(PageHeader, { section: "Cost", title: `Cost record ${recordId || "unknown"}`, description: "Inspect exact server math, provenance, and immutable revision history." }), state.status === "loading" ? _jsx(Loading, {}) : state.status === "error" ? _jsx(StatePanel, { failure: state.failure }) : _jsx(CostRecordDetailView, { context: context, response: state.value })] });
170
+ }
171
+ function CostRecordDetailView({ context, response }) {
172
+ const value = response.data;
173
+ return _jsxs(_Fragment, { children: [value.state === "superseded" && _jsxs("div", { className: "uc-notice uc-notice--warning", role: "status", "data-state": "superseded", children: ["This revision is superseded. ", _jsxs("button", { type: "button", className: "uc-link", onClick: () => context.navigate(costRecordTarget(value.recordId, value.currentRevision)), children: ["Open revision ", value.currentRevision] }), "."] }), _jsxs("dl", { className: "uc-metrics", children: [_jsx(Metric, { label: "Amount", value: value.amount === null ? "Incomplete" : `${value.amount} ${value.currency}` }), _jsx(Metric, { label: "Status", value: _jsx(StateBadge, { state: value.status }) }), _jsx(Metric, { label: "Revision", value: value.revision, detail: `Current ${value.currentRevision}` }), _jsx(Metric, { label: "Usage window", value: _jsx("button", { className: "uc-link", type: "button", onClick: () => context.navigate(usageWindowTarget(value.usageWindowId)), children: value.usageWindowId }) })] }), _jsxs("section", { className: "uc-card", children: [_jsx("h2", { children: "Allocation and server math" }), value.lineItems.length ? _jsx("div", { className: "uc-table-wrap", children: _jsxs("table", { children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Rule" }), _jsx("th", { children: "Quantity" }), _jsx("th", { children: "Coefficient" }), _jsx("th", { children: "Pre-round" }), _jsx("th", { children: "Amount" })] }) }), _jsx("tbody", { children: value.lineItems.map((item) => _jsxs("tr", { children: [_jsxs("td", { children: [item.ruleId, _jsxs("small", { children: ["Line ", item.lineNumber] })] }), _jsx("td", { className: "uc-number", children: item.normalizedQuantity }), _jsx("td", { className: "uc-number", children: item.coefficient }), _jsx("td", { className: "uc-number", children: item.preRoundAmount }), _jsxs("td", { className: "uc-number", children: [item.amount, " ", item.currency] })] }, item.lineNumber)) })] }) }) : _jsx("p", { className: "uc-muted", children: "No allocation lines are present; incomplete values are not displayed as zero." }), _jsxs("dl", { className: "uc-key-values", children: [_jsxs("div", { children: [_jsx("dt", { children: "Rate card" }), _jsxs("dd", { children: [value.rateCardId, "@", value.rateRevision] })] }), _jsxs("div", { children: [_jsx("dt", { children: "Calculator" }), _jsx("dd", { children: value.calculatorVersion })] }), _jsxs("div", { children: [_jsx("dt", { children: "Rate digest" }), _jsx("dd", { children: value.rateContentDigest })] }), _jsxs("div", { children: [_jsx("dt", { children: "Output digest" }), _jsx("dd", { children: value.outputDigest })] })] })] }), _jsxs("section", { className: "uc-card", children: [_jsx("h2", { children: "Revision history" }), _jsx("div", { className: "uc-revisions", children: value.revisions.map((item) => _jsxs("button", { type: "button", "aria-current": item.revision === value.revision ? "page" : undefined, onClick: () => context.navigate(costRecordTarget(value.recordId, item.revision)), children: [_jsxs("strong", { children: ["Revision ", item.revision] }), _jsx("span", { children: item.amount === null ? "Incomplete" : `${item.amount} ${item.currency}` }), _jsx(StateBadge, { state: item.status })] }, item.revision)) })] }), _jsx("div", { className: "uc-notice", role: "note", "data-state": "evidence-reference", children: "Evidence content remains owned by its source system. Digest references stay visible even when that dependency is unavailable. This cost record is not a bill." })] });
174
+ }
175
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../src/pages.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ConsoleNavigationTarget } from "@zephytiju/console-sdk";
2
+ export declare const USAGE_COST_SERVICE_ID = "platform.cost-and-usage";
3
+ export interface UsageSearchQuery {
4
+ readonly from?: string;
5
+ readonly to?: string;
6
+ readonly meter?: string;
7
+ readonly service?: string;
8
+ readonly resource?: string;
9
+ readonly cursor?: string;
10
+ }
11
+ export interface CostSearchQuery {
12
+ readonly from?: string;
13
+ readonly to?: string;
14
+ readonly service?: string;
15
+ readonly record?: string;
16
+ readonly currency?: string;
17
+ readonly status?: string;
18
+ readonly cursor?: string;
19
+ }
20
+ export declare function requireDomainIdentifier(value: string, label: string): string;
21
+ export declare function requireRevision(value: number | string): string;
22
+ export declare function usageSearchTarget(values?: UsageSearchQuery): ConsoleNavigationTarget;
23
+ export declare function usageWindowTarget(windowId: string, revision?: number | string): ConsoleNavigationTarget;
24
+ export declare function costSearchTarget(values?: CostSearchQuery): ConsoleNavigationTarget;
25
+ export declare function costRecordTarget(recordId: string, revision?: number | string): ConsoleNavigationTarget;
26
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAK/D,MAAM,WAAW,gBAAgB;IAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAC5L,MAAM,WAAW,eAAe;IAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAQtN,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG5E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAI9D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,uBAAuB,CAEpF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,uBAAuB,CAOvG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,uBAAuB,CAElF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,uBAAuB,CAQtG"}
@@ -0,0 +1,46 @@
1
+ export const USAGE_COST_SERVICE_ID = "platform.cost-and-usage";
2
+ const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,2047}$/;
3
+ const QUERY_VALUE = /^[^\u0000-\u001f\u007f]{1,256}$/;
4
+ const CURSOR_VALUE = /^[A-Za-z0-9._~-]{1,4096}$/;
5
+ function query(value) {
6
+ const entries = Object.entries(value).filter(([, item]) => item !== undefined && item !== "");
7
+ if (entries.some(([name, item]) => typeof item !== "string" || !(name === "cursor" ? CURSOR_VALUE : QUERY_VALUE).test(item)))
8
+ throw new Error("Search query values must be bounded text.");
9
+ return Object.freeze(Object.fromEntries(entries));
10
+ }
11
+ export function requireDomainIdentifier(value, label) {
12
+ if (!IDENTIFIER.test(value))
13
+ throw new Error(`A valid immutable ${label} is required.`);
14
+ return value;
15
+ }
16
+ export function requireRevision(value) {
17
+ const raw = String(value);
18
+ if (!/^[1-9][0-9]{0,8}$/.test(raw))
19
+ throw new Error("A positive bounded revision is required.");
20
+ return raw;
21
+ }
22
+ export function usageSearchTarget(values) {
23
+ return { serviceId: USAGE_COST_SERVICE_ID, pageId: "usage.search", ...(values ? { query: query(values) } : {}) };
24
+ }
25
+ export function usageWindowTarget(windowId, revision) {
26
+ return {
27
+ serviceId: USAGE_COST_SERVICE_ID,
28
+ pageId: "usage.window",
29
+ params: { windowId: requireDomainIdentifier(windowId, "usage window identifier") },
30
+ ...(revision === undefined ? {} : { query: { revision: requireRevision(revision) } }),
31
+ };
32
+ }
33
+ export function costSearchTarget(values) {
34
+ return { serviceId: USAGE_COST_SERVICE_ID, pageId: "cost.search", ...(values ? { query: query(values) } : {}) };
35
+ }
36
+ export function costRecordTarget(recordId, revision) {
37
+ if (recordId.length > 128)
38
+ throw new Error("A valid immutable cost record identifier is required.");
39
+ return {
40
+ serviceId: USAGE_COST_SERVICE_ID,
41
+ pageId: "cost.record",
42
+ params: { recordId: requireDomainIdentifier(recordId, "cost record identifier") },
43
+ ...(revision === undefined ? {} : { query: { revision: requireRevision(revision) } }),
44
+ };
45
+ }
46
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ :root {
2
+ --uc-ink: #182230;
3
+ --uc-muted: #667085;
4
+ --uc-border: #d0d5dd;
5
+ --uc-surface: #ffffff;
6
+ --uc-subtle: #f8fafc;
7
+ --uc-brand: #155eef;
8
+ --uc-brand-dark: #004eeb;
9
+ --uc-success: #067647;
10
+ --uc-success-bg: #ecfdf3;
11
+ --uc-warning: #b54708;
12
+ --uc-warning-bg: #fffaeb;
13
+ --uc-danger: #b42318;
14
+ --uc-danger-bg: #fef3f2;
15
+ color: var(--uc-ink);
16
+ }
17
+
18
+ .uc-page { box-sizing: border-box; min-height: 100%; padding: 32px clamp(20px, 4vw, 56px) 64px; background: var(--uc-subtle); color: var(--uc-ink); font: 14px/1.45 Inter, ui-sans-serif, system-ui, sans-serif; }
19
+ .uc-page *, .uc-page *::before, .uc-page *::after { box-sizing: border-box; }
20
+ .uc-page-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; margin: 0 auto 24px; max-width: 1280px; }
21
+ .uc-page-header h1 { margin: 4px 0 6px; font-size: clamp(28px, 3vw, 36px); line-height: 1.2; letter-spacing: -.02em; }
22
+ .uc-page-header p { margin: 0; color: var(--uc-muted); }
23
+ .uc-eyebrow { color: var(--uc-brand) !important; font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
24
+ .uc-owner-badge { white-space: nowrap; border: 1px solid #b2ccff; border-radius: 999px; padding: 7px 12px; background: #eff4ff; color: #1849a9; font-size: 12px; font-weight: 700; }
25
+ .uc-filter-panel { display: grid; grid-template-columns: repeat(5, minmax(140px, 1fr)) auto; align-items: end; gap: 14px; max-width: 1280px; margin: 0 auto 20px; padding: 20px; border: 1px solid var(--uc-border); border-radius: 12px; background: var(--uc-surface); box-shadow: 0 1px 2px rgb(16 24 40 / 5%); }
26
+ .uc-filter-panel--cost { grid-template-columns: repeat(6, minmax(120px, 1fr)); }
27
+ .uc-filter-panel label { display: grid; gap: 6px; color: #344054; font-size: 12px; font-weight: 600; }
28
+ .uc-filter-panel input, .uc-filter-panel select { min-width: 0; height: 40px; border: 1px solid #98a2b3; border-radius: 8px; padding: 0 11px; background: white; color: var(--uc-ink); font: inherit; }
29
+ .uc-filter-panel input:focus, .uc-filter-panel select:focus, .uc-page button:focus-visible { outline: 3px solid #84adff; outline-offset: 2px; }
30
+ .uc-filter-actions { display: flex; gap: 8px; }
31
+ .uc-filter-panel button { min-height: 40px; border: 1px solid var(--uc-brand); border-radius: 8px; padding: 0 15px; background: var(--uc-brand); color: white; cursor: pointer; font-weight: 650; }
32
+ .uc-filter-panel .uc-secondary { border-color: var(--uc-border); background: white; color: #344054; }
33
+ .uc-notice, .uc-state, .uc-empty { max-width: 1280px; margin: 0 auto 20px; border: 1px solid #b2ccff; border-radius: 10px; padding: 14px 16px; background: #eff4ff; color: #1849a9; }
34
+ .uc-notice--warning { border-color: #fedf89; background: var(--uc-warning-bg); color: var(--uc-warning); }
35
+ .uc-state { display: flex; align-items: flex-start; gap: 14px; padding: 24px; background: white; color: var(--uc-ink); }
36
+ .uc-state > span { display: grid; width: 36px; height: 36px; place-items: center; flex: 0 0 auto; border-radius: 50%; background: #eff4ff; color: var(--uc-brand); font-size: 20px; font-weight: 700; }
37
+ .uc-state--forbidden, .uc-state--failed { border-color: #fecdca; background: var(--uc-danger-bg); }
38
+ .uc-state--forbidden > span, .uc-state--failed > span { background: #fee4e2; color: var(--uc-danger); }
39
+ .uc-state--dependency { border-color: #fedf89; background: var(--uc-warning-bg); }
40
+ .uc-state h2, .uc-empty h2 { margin: 0 0 4px; font-size: 18px; }
41
+ .uc-state p, .uc-empty p { margin: 0; color: var(--uc-muted); }
42
+ .uc-empty { padding: 38px; border-color: var(--uc-border); background: white; color: var(--uc-ink); text-align: center; }
43
+ .uc-spinner { border: 3px solid #d1e0ff !important; border-top-color: var(--uc-brand) !important; animation: uc-spin .8s linear infinite; }
44
+ @keyframes uc-spin { to { transform: rotate(360deg); } }
45
+ .uc-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; max-width: 1280px; margin: 0 auto 20px; }
46
+ .uc-metric { min-height: 112px; border: 1px solid var(--uc-border); border-radius: 12px; padding: 18px; background: var(--uc-surface); }
47
+ .uc-metric dt { color: var(--uc-muted); font-size: 12px; font-weight: 650; text-transform: uppercase; letter-spacing: .04em; }
48
+ .uc-metric dd { margin: 8px 0 2px; overflow-wrap: anywhere; font-size: 22px; font-weight: 700; }
49
+ .uc-metric dd small { display: block; margin-top: 2px; color: var(--uc-muted); font-size: 12px; font-weight: 400; }
50
+ .uc-table-wrap { max-width: 1280px; margin: 0 auto 20px; overflow-x: auto; border: 1px solid var(--uc-border); border-radius: 12px; background: white; }
51
+ .uc-table-wrap table { width: 100%; border-collapse: collapse; }
52
+ .uc-table-wrap th { background: #f2f4f7; color: #475467; font-size: 12px; letter-spacing: .03em; text-align: left; text-transform: uppercase; }
53
+ .uc-table-wrap th, .uc-table-wrap td { min-width: 120px; padding: 13px 16px; border-bottom: 1px solid #eaecf0; vertical-align: top; }
54
+ .uc-table-wrap tbody tr:last-child td { border-bottom: 0; }
55
+ .uc-table-wrap tbody tr:hover { background: #f9fafb; }
56
+ .uc-table-wrap td small { display: block; margin-top: 3px; color: var(--uc-muted); }
57
+ .uc-number { font-variant-numeric: tabular-nums; }
58
+ .uc-link { border: 0; padding: 0; background: transparent; color: var(--uc-brand-dark); cursor: pointer; font: inherit; font-weight: 650; text-decoration: underline; text-decoration-color: #b2ccff; text-underline-offset: 3px; }
59
+ .uc-badge { display: inline-flex; border-radius: 999px; padding: 3px 8px; background: #f2f4f7; color: #344054; font-size: 12px; font-weight: 700; text-transform: capitalize; }
60
+ .uc-badge--authoritative, .uc-badge--current, .uc-badge--sealed { background: var(--uc-success-bg); color: var(--uc-success); }
61
+ .uc-badge--partial, .uc-badge--stale, .uc-badge--superseded, .uc-badge--missing-rate, .uc-badge--ambiguous-rate, .uc-badge--pending { background: var(--uc-warning-bg); color: var(--uc-warning); }
62
+ .uc-badge--failed { background: var(--uc-danger-bg); color: var(--uc-danger); }
63
+ .uc-card { max-width: 1280px; margin: 0 auto 20px; border: 1px solid var(--uc-border); border-radius: 12px; padding: 22px; background: white; }
64
+ .uc-card h2 { margin: 0 0 16px; font-size: 19px; }
65
+ .uc-card .uc-table-wrap { margin-bottom: 18px; }
66
+ .uc-key-values { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 0; }
67
+ .uc-key-values div { min-width: 0; border-radius: 8px; padding: 12px; background: #f9fafb; }
68
+ .uc-key-values dt { color: var(--uc-muted); font-size: 12px; }
69
+ .uc-key-values dd { margin: 4px 0 0; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }
70
+ .uc-revisions { display: grid; gap: 8px; }
71
+ .uc-revisions > button { display: grid; grid-template-columns: 1fr 1fr auto; align-items: center; gap: 12px; width: 100%; border: 1px solid var(--uc-border); border-radius: 8px; padding: 11px 13px; background: white; color: var(--uc-ink); cursor: pointer; text-align: left; }
72
+ .uc-revisions > button[aria-current="page"] { border-color: #84adff; box-shadow: 0 0 0 2px #d1e0ff; }
73
+ .uc-muted { color: var(--uc-muted); }
74
+ .uc-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; overflow-wrap: anywhere; }
75
+ .uc-sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
76
+
77
+ @media (max-width: 1100px) { .uc-filter-panel, .uc-filter-panel--cost { grid-template-columns: repeat(3, minmax(0, 1fr)); } .uc-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
78
+ @media (max-width: 700px) { .uc-page { padding: 20px 14px 40px; } .uc-page-header { display: grid; } .uc-owner-badge { justify-self: start; } .uc-filter-panel, .uc-filter-panel--cost, .uc-metrics, .uc-key-values { grid-template-columns: 1fr; } .uc-filter-actions { justify-content: stretch; } .uc-filter-actions button { flex: 1; } .uc-revisions > button { grid-template-columns: 1fr auto; } .uc-revisions > button span:nth-child(2) { grid-column: 1 / -1; } }
79
+ @media (prefers-reduced-motion: reduce) { .uc-spinner { animation: none; } }
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@zephytiju/juntai-usage-cost-ui",
3
+ "version": "1.0.0",
4
+ "description": "Cost & Usage-owned Console search and revision-detail destinations",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/zephytiju/JuntaiUsageCostUI.git"
8
+ },
9
+ "homepage": "https://github.com/zephytiju/JuntaiUsageCostUI#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/zephytiju/JuntaiUsageCostUI/issues"
12
+ },
13
+ "type": "module",
14
+ "sideEffects": ["./dist/styles.css"],
15
+ "files": ["dist", "README.md"],
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ },
21
+ "./styles.css": "./dist/styles.css",
22
+ "./package.json": "./package.json"
23
+ },
24
+ "main": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "engines": {"node": ">=24.14.0"},
27
+ "publishConfig": {
28
+ "access": "public",
29
+ "registry": "https://registry.npmjs.org/"
30
+ },
31
+ "scripts": {
32
+ "build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc --project tsconfig.json && cp src/styles.css dist/styles.css",
33
+ "test": "vitest run",
34
+ "test:a11y": "vitest run tests/accessibility.test.tsx",
35
+ "test:visual": "vitest run tests/visual.test.tsx",
36
+ "typecheck": "tsc --project tsconfig.json --noEmit",
37
+ "test:boundary": "node scripts/verify-boundary.mjs",
38
+ "test:package": "node scripts/verify-package.mjs",
39
+ "test:consumer": "node scripts/verify-consumer.mjs",
40
+ "verify": "npm run test:boundary && npm run typecheck && npm run test && npm run build && npm run test:package && npm run test:consumer"
41
+ },
42
+ "dependencies": {
43
+ "@zephytiju/juntai-design-system": "0.1.0"
44
+ },
45
+ "peerDependencies": {
46
+ "@zephytiju/console-sdk": "2.1.0",
47
+ "react": "^19.0.0",
48
+ "react-dom": "^19.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@testing-library/react": "16.3.2",
52
+ "@types/node": "24.10.1",
53
+ "@types/react": "19.2.7",
54
+ "@types/react-dom": "19.2.3",
55
+ "@zephytiju/console-sdk": "2.1.0",
56
+ "axe-core": "4.13.0",
57
+ "jsdom": "27.0.1",
58
+ "react": "19.2.7",
59
+ "react-dom": "19.2.7",
60
+ "typescript": "5.7.3",
61
+ "vite": "8.1.5",
62
+ "vitest": "4.1.10"
63
+ },
64
+ "license": "UNLICENSED"
65
+ }