@polymorfa/sdk 0.1.0-dev.20260923115544 → 0.1.0-dev.20260923132258

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.
@@ -0,0 +1,175 @@
1
+ import { CursorPage } from "../pagination.js";
2
+ import { HttpTransport } from "../transport/http.js";
3
+ import type { ApiResponse, RequestOptions } from "../transport/types.js";
4
+ import type { ClientOwner } from "./developer-types.js";
5
+ export type CallDirection = "inbound" | "outbound";
6
+ /** How the number connects to WhatsApp. */
7
+ export type CallUpstream = "linked_device" | "cloud_api";
8
+ /**
9
+ * How the call went. `answered`: media connected, including answered calls
10
+ * still in progress. `declined`: declined by a participant or the other
11
+ * party, or the line was busy. `missed`: nobody answered before ringing
12
+ * stopped or the caller hung up. `failed`: ended before it connected for any
13
+ * other reason. `in_progress`: still ringing.
14
+ */
15
+ export type CallOutcome = "answered" | "missed" | "declined" | "failed" | "in_progress";
16
+ /** Call state. `offered` and `accepted` calls may still be live. */
17
+ export type CallRecordState = "offered" | "accepted" | "rejected" | "missed" | "ended";
18
+ export type CallStatsGroupBy = "day" | "hour" | "session" | "outcome";
19
+ export type CallExportFormat = "csv" | "ndjson";
20
+ /** One call detail record. The other party appears only as `peerRef`. */
21
+ export interface CallRecord {
22
+ readonly callId: string;
23
+ /** Owning project when known, preserved after the number is deleted. */
24
+ readonly projectId: string | null;
25
+ /** Session name of the number that placed or received the call. */
26
+ readonly sessionId: string;
27
+ readonly direction: CallDirection;
28
+ readonly upstream: CallUpstream;
29
+ readonly outcome: CallOutcome;
30
+ readonly state: CallRecordState;
31
+ readonly hasVideo: boolean;
32
+ /**
33
+ * Team-specific pseudonym of the other party: the same party has the same
34
+ * value across your team's calls. Never a phone number. `null` when unknown.
35
+ */
36
+ readonly peerRef: string | null;
37
+ readonly startedAt: string;
38
+ readonly connectedAt: string | null;
39
+ readonly endedAt: string | null;
40
+ /** Connected seconds; 0 for a call that never connected, `null` until it ends. */
41
+ readonly durationSeconds: number | null;
42
+ /** Such as `user_hangup` or `ring_timeout`; `null` until the call ends. */
43
+ readonly endReason: string | null;
44
+ }
45
+ export interface CallStatsMetrics {
46
+ /** Calls that started in the range. */
47
+ readonly calls: number;
48
+ readonly answered: number;
49
+ readonly missed: number;
50
+ readonly declined: number;
51
+ readonly failed: number;
52
+ /** Calls still ringing. */
53
+ readonly inProgress: number;
54
+ /** `answered` divided by calls no longer ringing (four decimals), or `null` when there are none. */
55
+ readonly answerRate: number | null;
56
+ /** Connected seconds of answered calls. */
57
+ readonly totalDurationSeconds: number;
58
+ /** Mean connected seconds of ended answered calls (one decimal), or `null` when there are none. */
59
+ readonly averageDurationSeconds: number | null;
60
+ }
61
+ export interface CallStatsGroup extends CallStatsMetrics {
62
+ /**
63
+ * Local date (`2026-09-18`) for `day`, local hour (`2026-09-18T14:00`) for
64
+ * `hour`, session name for `session`, or the outcome for `outcome`.
65
+ */
66
+ readonly key: string;
67
+ /** Start of the day or hour bucket; `null` for `session` and `outcome` groups. */
68
+ readonly start: string | null;
69
+ }
70
+ export interface CallStatsHeatmapCell {
71
+ /** ISO day of week in `timezone`: 1 is Monday, 7 is Sunday. */
72
+ readonly dayOfWeek: number;
73
+ /** Hour of day in `timezone`, 0 to 23. */
74
+ readonly hour: number;
75
+ readonly calls: number;
76
+ readonly answered: number;
77
+ }
78
+ export interface CallStats {
79
+ readonly since: string;
80
+ readonly until: string;
81
+ readonly timezone: string;
82
+ readonly groupBy: CallStatsGroupBy;
83
+ readonly totals: CallStatsMetrics;
84
+ readonly groups: readonly CallStatsGroup[];
85
+ /** True when a `session` grouping left out numbers beyond the first 500. Totals still count every call. */
86
+ readonly groupsTruncated: boolean;
87
+ /** 168 cells, Monday 00:00 first. */
88
+ readonly heatmap: readonly CallStatsHeatmapCell[];
89
+ }
90
+ /** Filters shared by call statistics, call records and the export. */
91
+ export interface CallFilters {
92
+ /** Session name of one number (1 to 128 characters). */
93
+ readonly sessionId?: string;
94
+ readonly direction?: CallDirection;
95
+ readonly upstream?: CallUpstream;
96
+ readonly outcome?: CallOutcome;
97
+ /** Include calls that started at or after this time. */
98
+ readonly since?: string | Date;
99
+ /** Include calls that started before this time. */
100
+ readonly until?: string | Date;
101
+ }
102
+ export interface CallStatsParams extends CallFilters {
103
+ /** Defaults to `day`. `day` covers at most 366 days, `hour` at most 31. */
104
+ readonly groupBy?: CallStatsGroupBy;
105
+ /** IANA time zone name for day and hour buckets and the heatmap. Defaults to `UTC`. */
106
+ readonly timezone?: string;
107
+ }
108
+ export interface ListCallRecordsParams extends CallFilters {
109
+ /** 1 to 100; the API default is 25. */
110
+ readonly limit?: number;
111
+ readonly cursor?: string;
112
+ }
113
+ export interface ExportCallRecordsParams extends CallFilters {
114
+ /** Defaults to `csv`. */
115
+ readonly format?: CallExportFormat;
116
+ /** Records per page, 1 to 1,000; the API default is 1,000. */
117
+ readonly limit?: number;
118
+ /** The `nextCursor` of the previous page. Send the same filters. */
119
+ readonly cursor?: string;
120
+ }
121
+ /** Team clients may name a project; omitting it covers every project. */
122
+ interface TeamProjectFilter {
123
+ readonly projectId?: string;
124
+ }
125
+ type ParamsFor<O extends ClientOwner, P> = O extends "project" ? P : P & TeamProjectFilter;
126
+ export type CallStatsParamsFor<O extends ClientOwner> = ParamsFor<O, CallStatsParams>;
127
+ export type ListCallRecordsParamsFor<O extends ClientOwner> = ParamsFor<O, ListCallRecordsParams>;
128
+ export type ExportCallRecordsParamsFor<O extends ClientOwner> = ParamsFor<O, ExportCallRecordsParams>;
129
+ /** One page of exported call records. */
130
+ export interface CallRecordExportPage {
131
+ readonly format: CallExportFormat;
132
+ /**
133
+ * CSV with a header row and CRLF line endings, or one JSON call record per
134
+ * line for `ndjson`.
135
+ */
136
+ readonly body: string;
137
+ /** Cursor of the next page, or `null` on the last page. */
138
+ readonly nextCursor: string | null;
139
+ }
140
+ /**
141
+ * Call analytics and call detail records (`sessions:read`). Team clients
142
+ * cover every project unless they pass `projectId`; project clients read
143
+ * their own project.
144
+ */
145
+ export declare class PlatformCallsResource<O extends ClientOwner> {
146
+ #private;
147
+ private readonly transport;
148
+ private readonly projectId;
149
+ constructor(transport: HttpTransport, projectId: string | null);
150
+ /**
151
+ * Call volume, outcomes, answer rate and connected duration for a time
152
+ * range, grouped by day, hour, number or outcome, with an hour-of-week
153
+ * heatmap. Without `since` and `until` the range is the last 7 days.
154
+ */
155
+ stats(params?: CallStatsParamsFor<O>, options?: RequestOptions): Promise<ApiResponse<CallStats>>;
156
+ /**
157
+ * Call detail records, newest first. Iterate the returned page with
158
+ * `for await` to read every matching record.
159
+ */
160
+ list(params?: ListCallRecordsParamsFor<O>, options?: RequestOptions): Promise<CursorPage<CallRecord>>;
161
+ /**
162
+ * One page of up to 1,000 call records as CSV or newline-delimited JSON.
163
+ * Pass `nextCursor` back as `cursor`, with the same filters, for the next
164
+ * page. `exportAll` walks every page for you.
165
+ */
166
+ export(params?: ExportCallRecordsParamsFor<O>, options?: RequestOptions): Promise<ApiResponse<CallRecordExportPage>>;
167
+ /**
168
+ * Yields the body of every export page in order, starting at
169
+ * `params.cursor` when given. CSV pages after the first omit their header
170
+ * row, so the concatenated chunks form one CSV document.
171
+ */
172
+ exportAll(params?: ExportCallRecordsParamsFor<O>, options?: RequestOptions): AsyncGenerator<string, void, undefined>;
173
+ }
174
+ export {};
175
+ //# sourceMappingURL=calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../src/platform/calls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,261 @@
1
+ import { PolymorfaConfigurationError, PolymorfaServerError, } from "../errors.js";
2
+ import { CursorPage } from "../pagination.js";
3
+ import { RawClient } from "../raw.js";
4
+ import { HttpTransport } from "../transport/http.js";
5
+ import { decodeCursorPage, unwrapResponse, } from "./response.js";
6
+ const DIRECTIONS = ["inbound", "outbound"];
7
+ const UPSTREAMS = ["linked_device", "cloud_api"];
8
+ const OUTCOMES = [
9
+ "answered",
10
+ "missed",
11
+ "declined",
12
+ "failed",
13
+ "in_progress",
14
+ ];
15
+ const GROUP_BY = [
16
+ "day",
17
+ "hour",
18
+ "session",
19
+ "outcome",
20
+ ];
21
+ const FORMATS = ["csv", "ndjson"];
22
+ const CONTENT_TYPES = {
23
+ csv: "text/csv",
24
+ ndjson: "application/x-ndjson",
25
+ };
26
+ /**
27
+ * Call analytics and call detail records (`sessions:read`). Team clients
28
+ * cover every project unless they pass `projectId`; project clients read
29
+ * their own project.
30
+ */
31
+ export class PlatformCallsResource {
32
+ transport;
33
+ projectId;
34
+ #raw;
35
+ constructor(transport, projectId) {
36
+ this.transport = transport;
37
+ this.projectId = projectId;
38
+ this.#raw = new RawClient(transport);
39
+ }
40
+ /**
41
+ * Call volume, outcomes, answer rate and connected duration for a time
42
+ * range, grouped by day, hour, number or outcome, with an hour-of-week
43
+ * heatmap. Without `since` and `until` the range is the last 7 days.
44
+ */
45
+ stats(params = {}, options = {}) {
46
+ const query = this.#filters(params);
47
+ const { groupBy, timezone } = params;
48
+ if (groupBy !== undefined) {
49
+ query.groupBy = oneOf(groupBy, GROUP_BY, "groupBy");
50
+ }
51
+ if (timezone !== undefined) {
52
+ query.timezone = text(timezone, "timezone", 64);
53
+ }
54
+ return this.transport
55
+ .request({
56
+ method: "GET",
57
+ path: "/platform/calls/stats",
58
+ query,
59
+ ...options,
60
+ })
61
+ .then(unwrapResponse);
62
+ }
63
+ /**
64
+ * Call detail records, newest first. Iterate the returned page with
65
+ * `for await` to read every matching record.
66
+ */
67
+ list(params = {}, options = {}) {
68
+ const query = this.#filters(params);
69
+ const { limit, cursor } = params;
70
+ if (limit !== undefined)
71
+ query.limit = integer(limit, "limit", 1, 100);
72
+ if (cursor !== undefined)
73
+ query.cursor = text(cursor, "cursor", 256);
74
+ return this.#raw.paginate({ method: "GET", path: "/platform/calls", query, ...options }, (decodeCursorPage));
75
+ }
76
+ /**
77
+ * One page of up to 1,000 call records as CSV or newline-delimited JSON.
78
+ * Pass `nextCursor` back as `cursor`, with the same filters, for the next
79
+ * page. `exportAll` walks every page for you.
80
+ */
81
+ export(params = {}, options = {}) {
82
+ const query = this.#filters(params);
83
+ const { format, limit, cursor } = params;
84
+ const resolved = format === undefined ? "csv" : oneOf(format, FORMATS, "format");
85
+ query.format = resolved;
86
+ if (limit !== undefined)
87
+ query.limit = integer(limit, "limit", 1, 1000);
88
+ if (cursor !== undefined)
89
+ query.cursor = text(cursor, "cursor", 256);
90
+ return this.transport
91
+ .requestText({ method: "GET", path: "/platform/calls/export", query, ...options }, CONTENT_TYPES[resolved])
92
+ .then((response) => {
93
+ const contentType = response.metadata.headers["content-type"];
94
+ if (contentType?.split(";", 1)[0]?.trim().toLowerCase() !==
95
+ CONTENT_TYPES[resolved]) {
96
+ throw new PolymorfaServerError("The Polymorfa API returned an unexpected call export content type.", {
97
+ code: "invalid_response",
98
+ status: response.metadata.status,
99
+ ...(response.metadata.requestId === undefined
100
+ ? {}
101
+ : { requestId: response.metadata.requestId }),
102
+ metadata: response.metadata,
103
+ });
104
+ }
105
+ if (typeof response.data !== "string") {
106
+ throw new PolymorfaServerError("The Polymorfa API returned an invalid export body.", {
107
+ code: "invalid_response",
108
+ status: response.metadata.status,
109
+ ...(response.metadata.requestId === undefined
110
+ ? {}
111
+ : { requestId: response.metadata.requestId }),
112
+ metadata: response.metadata,
113
+ });
114
+ }
115
+ const next = response.metadata.headers["polymorfa-next-cursor"];
116
+ return Object.freeze({
117
+ data: Object.freeze({
118
+ format: resolved,
119
+ body: response.data,
120
+ nextCursor: next === undefined || next === "" ? null : next,
121
+ }),
122
+ metadata: response.metadata,
123
+ });
124
+ });
125
+ }
126
+ /**
127
+ * Yields the body of every export page in order, starting at
128
+ * `params.cursor` when given. CSV pages after the first omit their header
129
+ * row, so the concatenated chunks form one CSV document.
130
+ */
131
+ async *exportAll(params = {}, options = {}) {
132
+ let cursor = params.cursor;
133
+ let first = true;
134
+ // Cursors already requested. A page whose next cursor is one of these is
135
+ // rejected before its body is yielded, so a replayed page never reaches
136
+ // the consumer's output.
137
+ const seen = new Set(cursor === undefined ? [] : [cursor]);
138
+ while (true) {
139
+ const { data, metadata } = await this.export({ ...params, ...(cursor === undefined ? {} : { cursor }) }, options);
140
+ if (data.nextCursor !== null && seen.has(data.nextCursor)) {
141
+ throw new PolymorfaServerError("The Polymorfa API repeated an export cursor.", {
142
+ code: "invalid_response",
143
+ status: metadata.status,
144
+ ...(metadata.requestId === undefined
145
+ ? {}
146
+ : { requestId: metadata.requestId }),
147
+ metadata,
148
+ });
149
+ }
150
+ const body = !first && data.format === "csv" ? withoutHeader(data.body) : data.body;
151
+ first = false;
152
+ if (body.length > 0)
153
+ yield body;
154
+ if (data.nextCursor === null)
155
+ return;
156
+ seen.add(data.nextCursor);
157
+ cursor = data.nextCursor;
158
+ }
159
+ }
160
+ #filters(params) {
161
+ if (typeof params !== "object" || params === null) {
162
+ throw new PolymorfaConfigurationError("Call filters must be an object.", "params");
163
+ }
164
+ const query = {};
165
+ if (this.projectId !== null) {
166
+ if (params.projectId !== undefined &&
167
+ params.projectId !== this.projectId) {
168
+ throw new PolymorfaConfigurationError("A project client reads only its own project's calls.", "projectId");
169
+ }
170
+ query.projectId = this.projectId;
171
+ }
172
+ else if (params.projectId !== undefined) {
173
+ query.projectId = text(params.projectId, "projectId", 64);
174
+ }
175
+ if (params.sessionId !== undefined) {
176
+ query.sessionId = text(params.sessionId, "sessionId", 128);
177
+ }
178
+ if (params.direction !== undefined) {
179
+ query.direction = oneOf(params.direction, DIRECTIONS, "direction");
180
+ }
181
+ if (params.upstream !== undefined) {
182
+ query.upstream = oneOf(params.upstream, UPSTREAMS, "upstream");
183
+ }
184
+ if (params.outcome !== undefined) {
185
+ query.outcome = oneOf(params.outcome, OUTCOMES, "outcome");
186
+ }
187
+ if (params.since !== undefined) {
188
+ query.since = timestamp(params.since, "since");
189
+ }
190
+ if (params.until !== undefined) {
191
+ query.until = timestamp(params.until, "until");
192
+ }
193
+ return query;
194
+ }
195
+ }
196
+ function withoutHeader(body) {
197
+ const end = body.indexOf("\n");
198
+ return end === -1 ? "" : body.slice(end + 1);
199
+ }
200
+ function oneOf(value, allowed, field) {
201
+ if (typeof value !== "string" || !allowed.includes(value)) {
202
+ throw new PolymorfaConfigurationError(`${field} must be one of ${allowed.join(", ")}.`, field);
203
+ }
204
+ return value;
205
+ }
206
+ function text(value, field, maxLength) {
207
+ if (typeof value !== "string" ||
208
+ value.trim().length === 0 ||
209
+ value.length > maxLength) {
210
+ throw new PolymorfaConfigurationError(`${field} must be a non-empty string of at most ${maxLength} characters.`, field);
211
+ }
212
+ return value;
213
+ }
214
+ function integer(value, field, minimum, maximum) {
215
+ if (typeof value !== "number" ||
216
+ !Number.isInteger(value) ||
217
+ value < minimum ||
218
+ value > maximum) {
219
+ throw new PolymorfaConfigurationError(`${field} must be an integer from ${minimum} to ${maximum}.`, field);
220
+ }
221
+ return value;
222
+ }
223
+ function timestamp(value, field) {
224
+ if (value instanceof Date) {
225
+ if (Number.isNaN(value.getTime())) {
226
+ throw new PolymorfaConfigurationError(`${field} must be a valid date.`, field);
227
+ }
228
+ return value.toISOString();
229
+ }
230
+ if (typeof value !== "string" || !isIsoDateTime(value)) {
231
+ throw new PolymorfaConfigurationError(`${field} must be an ISO 8601 date-time with a time zone, such as 2026-09-01T00:00:00Z, or a Date.`, field);
232
+ }
233
+ return value;
234
+ }
235
+ const ISO_DATE_TIME = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,9})?(?:Z|[+-](\d{2}):(\d{2}))$/;
236
+ /**
237
+ * An RFC 3339 date-time (`2026-09-01T00:00:00Z`, `2026-09-01T09:30:00.5+03:00`)
238
+ * naming a real calendar instant. Date-only values and other strings that
239
+ * `Date.parse` tolerates are refused, as the API refuses them.
240
+ */
241
+ function isIsoDateTime(value) {
242
+ const match = ISO_DATE_TIME.exec(value);
243
+ if (!match)
244
+ return false;
245
+ const part = (index) => Number(match[index] ?? 0);
246
+ const [year, month, day] = [part(1), part(2), part(3)];
247
+ const [hour, minute, second] = [part(4), part(5), part(6)];
248
+ const [offsetHour, offsetMinute] = [part(7), part(8)];
249
+ if (month < 1 || month > 12 || day < 1)
250
+ return false;
251
+ const lastDay = new Date(0);
252
+ lastDay.setUTCFullYear(year, month, 0);
253
+ const daysInMonth = lastDay.getUTCDate();
254
+ return (day <= daysInMonth &&
255
+ hour <= 23 &&
256
+ minute <= 59 &&
257
+ second <= 59 &&
258
+ offsetHour <= 23 &&
259
+ offsetMinute <= 59);
260
+ }
261
+ //# sourceMappingURL=calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../src/platform/calls.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAOrD,OAAO,EAEL,gBAAgB,EAChB,cAAc,GACf,MAAM,eAAe,CAAC;AAoKvB,MAAM,UAAU,GAA6B,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACrE,MAAM,SAAS,GAA4B,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;AAC1E,MAAM,QAAQ,GAA2B;IACvC,UAAU;IACV,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,aAAa;CACd,CAAC;AACF,MAAM,QAAQ,GAAgC;IAC5C,KAAK;IACL,MAAM;IACN,SAAS;IACT,SAAS;CACV,CAAC;AACF,MAAM,OAAO,GAAgC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/D,MAAM,aAAa,GAA+C;IAChE,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,sBAAsB;CAC/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IAIb;IACA;IAJV,IAAI,CAAY;IAEzB,YACmB,SAAwB,EACxB,SAAwB;QADxB,cAAS,GAAT,SAAS,CAAe;QACxB,cAAS,GAAT,SAAS,CAAe;QAEzC,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,KAAK,CACH,SAAgC,EAA2B,EAC3D,UAA0B,EAAE;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAyB,CAAC;QACxD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,SAAS;aAClB,OAAO,CAA0B;YAChC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,uBAAuB;YAC7B,KAAK;YACL,GAAG,OAAO;SACX,CAAC;aACD,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAI,CACF,SAAsC,EAAiC,EACvE,UAA0B,EAAE;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAA+B,CAAC;QAC1D,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,SAAS;YAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CACvB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,EAC7D,CAAA,gBAA4B,CAAA,CAC7B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,MAAM,CACJ,SAAwC,EAAmC,EAC3E,UAA0B,EAAE;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAiC,CAAC;QACpE,MAAM,QAAQ,GACZ,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClE,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACxE,IAAI,MAAM,KAAK,SAAS;YAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,SAAS;aAClB,WAAW,CACV,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,EACpE,aAAa,CAAC,QAAQ,CAAC,CACxB;aACA,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC9D,IACE,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnD,aAAa,CAAC,QAAQ,CAAC,EACvB,CAAC;gBACD,MAAM,IAAI,oBAAoB,CAC5B,oEAAoE,EACpE;oBACE,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;oBAChC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS;wBAC3C,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC/C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;iBAC5B,CACF,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,IAAI,oBAAoB,CAC5B,oDAAoD,EACpD;oBACE,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;oBAChC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS;wBAC3C,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC/C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;iBAC5B,CACF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;YAChE,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;oBAClB,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,UAAU,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;iBAC5D,CAAC;gBACF,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,SAAS,CACd,SAAwC,EAAmC,EAC3E,UAA0B,EAAE;QAE5B,IAAI,MAAM,GAAI,MAAkC,CAAC,MAAM,CAAC;QACxD,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,yEAAyE;QACzE,wEAAwE;QACxE,yBAAyB;QACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAC1C,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAC1D,OAAO,CACR,CAAC;YACF,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1D,MAAM,IAAI,oBAAoB,CAC5B,8CAA8C,EAC9C;oBACE,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS;wBAClC,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;oBACtC,QAAQ;iBACT,CACF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GACR,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACzE,KAAK,GAAG,KAAK,CAAC;YACd,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,CAAC;YAChC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;gBAAE,OAAO;YACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,QAAQ,CACN,MAAuC;QAEvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,IAAI,2BAA2B,CACnC,iCAAiC,EACjC,QAAQ,CACT,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAA+B,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,IACE,MAAM,CAAC,SAAS,KAAK,SAAS;gBAC9B,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EACnC,CAAC;gBACD,MAAM,IAAI,2BAA2B,CACnC,sDAAsD,EACtD,WAAW,CACZ,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACnC,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1C,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,KAAK,CACZ,KAAc,EACd,OAAqB,EACrB,KAAa;IAEb,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAU,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,2BAA2B,CACnC,GAAG,KAAK,mBAAmB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAChD,KAAK,CACN,CAAC;IACJ,CAAC;IACD,OAAO,KAAU,CAAC;AACpB,CAAC;AAED,SAAS,IAAI,CAAC,KAAc,EAAE,KAAa,EAAE,SAAiB;IAC5D,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QACzB,KAAK,CAAC,MAAM,GAAG,SAAS,EACxB,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,GAAG,KAAK,0CAA0C,SAAS,cAAc,EACzE,KAAK,CACN,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CACd,KAAc,EACd,KAAa,EACb,OAAe,EACf,OAAe;IAEf,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QACxB,KAAK,GAAG,OAAO;QACf,KAAK,GAAG,OAAO,EACf,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,GAAG,KAAK,4BAA4B,OAAO,OAAO,OAAO,GAAG,EAC5D,KAAK,CACN,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,KAAa;IAC9C,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,2BAA2B,CACnC,GAAG,KAAK,wBAAwB,EAChC,KAAK,CACN,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,2BAA2B,CACnC,GAAG,KAAK,2FAA2F,EACnG,KAAK,CACN,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,aAAa,GACjB,0FAA0F,CAAC;AAE7F;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACzC,OAAO,CACL,GAAG,IAAI,WAAW;QAClB,IAAI,IAAI,EAAE;QACV,MAAM,IAAI,EAAE;QACZ,MAAM,IAAI,EAAE;QACZ,UAAU,IAAI,EAAE;QAChB,YAAY,IAAI,EAAE,CACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,156 @@
1
+ import { HttpTransport } from "../transport/http.js";
2
+ import type { ApiResponse, RequestOptions } from "../transport/types.js";
3
+ /**
4
+ * What was measured. Calls record `call.duration` (seconds) and, for outgoing
5
+ * Cloud API calls, `call.cloud_pulses` (6-second pulses). The other meters
6
+ * belong to voice automation and have no records yet.
7
+ */
8
+ export type UsageMeter = "call.duration" | "call.cloud_pulses" | "campaign.call" | "tts.characters" | "tts.seconds" | "stt.seconds" | "agent.seconds" | "agent.tokens" | "agent.provider_cost" | "channels.peak" | "storage.byte_days";
9
+ export type UsageUnit = "second" | "pulse" | "call" | "character" | "token" | "provider_unit" | "channel" | "byte_day";
10
+ /** Whose provider key produced the usage. `none` for calls. */
11
+ export type UsageKeySource = "none" | "managed" | "customer";
12
+ export type UsagePricingState = "unpriced" | "priced" | "waived" | "settled";
13
+ export type UsageSourceKind = "call" | "attempt" | "flow_run" | "conversation" | "asset" | "team";
14
+ /** Dimensions of `call.duration` and `call.cloud_pulses` records. */
15
+ export interface CallUsageDimensions {
16
+ readonly direction: "inbound" | "outbound";
17
+ readonly upstream: "linked_device" | "cloud_api";
18
+ readonly origin: "direct" | "campaign" | "flow" | "agent" | "inbound_automation";
19
+ readonly participants: number;
20
+ readonly connections: number;
21
+ readonly sipLegs: number;
22
+ readonly video: boolean;
23
+ }
24
+ export interface UsageRecord {
25
+ readonly id: string;
26
+ readonly meter: UsageMeter;
27
+ readonly quantity: number;
28
+ readonly unit: UsageUnit;
29
+ /** Closed, per-meter attributes. See {@link CallUsageDimensions} for calls. */
30
+ readonly dimensions: Readonly<Record<string, string | number | boolean>>;
31
+ readonly keySource: UsageKeySource;
32
+ readonly sourceKind: UsageSourceKind;
33
+ /** The call id for call meters. */
34
+ readonly sourceId: string;
35
+ readonly projectId: string | null;
36
+ /** The number (session name) the usage belongs to. */
37
+ readonly session: string | null;
38
+ readonly occurredAt: string;
39
+ readonly recordedAt: string;
40
+ /** Increases when a later observation corrects the record. Keep the highest. */
41
+ readonly revision: number;
42
+ /** `unpriced` while usage is measured but not charged. */
43
+ readonly pricingState: UsagePricingState;
44
+ readonly rateCard: {
45
+ readonly id: string;
46
+ readonly version: number;
47
+ } | null;
48
+ readonly pricedCredits: number | null;
49
+ }
50
+ export interface UsageRecordPage {
51
+ readonly records: readonly UsageRecord[];
52
+ /** Pass as `cursor` for the next page; `null` on the last page. */
53
+ readonly nextCursor: string | null;
54
+ }
55
+ export interface UsageMeterTotal {
56
+ readonly meter: UsageMeter;
57
+ readonly unit: UsageUnit;
58
+ readonly keySource: UsageKeySource;
59
+ readonly quantity: number;
60
+ readonly records: number;
61
+ }
62
+ export interface UsageSummary {
63
+ /** Calendar month in UTC, `YYYY-MM`. */
64
+ readonly period: string;
65
+ readonly start: string;
66
+ readonly end: string;
67
+ readonly projectId: string | null;
68
+ readonly session: string | null;
69
+ /** Always `false` while usage is measured but not charged. */
70
+ readonly billingEnabled: boolean;
71
+ readonly meters: readonly UsageMeterTotal[];
72
+ /** Totals per number, most call time first (at most 100). */
73
+ readonly numbers: readonly {
74
+ readonly session: string;
75
+ readonly projectId: string | null;
76
+ readonly meters: readonly UsageMeterTotal[];
77
+ }[];
78
+ readonly numbersTruncated: boolean;
79
+ }
80
+ export type UsageGateKey = "calls.outbound_monthly" | "voice.campaigns" | "voice.campaigns.recipients" | "voice.campaigns.calls_monthly" | "voice.channels.concurrent" | "voice.audio_library" | "voice.audio_library.assets" | "voice.flows" | "voice.agents.elevenlabs" | "voice.agents.openai_realtime" | "voice.providers.managed" | "voice.providers.customer_key" | "voice.agent_minutes_monthly" | "voice.tts_characters_monthly" | "voice.stt_minutes_monthly" | "voice.storage.recordings" | "voice.storage.transcripts";
81
+ /**
82
+ * For an active gate, `record` counts actions over the limit without refusing
83
+ * them; `enforce` refuses them with `gate_limit_reached` (HTTP 402). `off`
84
+ * does not check. An inactive gate's configured mode does not enforce a limit.
85
+ */
86
+ export type UsageGateMode = "off" | "record" | "enforce";
87
+ export interface UsageGate {
88
+ readonly key: UsageGateKey;
89
+ readonly kind: "capability" | "quota" | "limit" | "concurrency";
90
+ readonly subject: "team" | "number" | "project" | "campaign";
91
+ readonly mode: UsageGateMode;
92
+ /** Whether an action checks this gate today. */
93
+ readonly active: boolean;
94
+ /** `-1` for no limit; `null` when the limit applies per number and no `session` was given. */
95
+ readonly limit: number | null;
96
+ readonly used: number | null;
97
+ readonly unit: UsageUnit | "count" | "minute" | null;
98
+ readonly overLimit: boolean | null;
99
+ /** Checks over the limit in the last 30 days (UTC). */
100
+ readonly decisions: {
101
+ readonly wouldBlock: number;
102
+ readonly blocked: number;
103
+ readonly evaluationError: number;
104
+ };
105
+ }
106
+ export interface UsageGateList {
107
+ readonly session: string | null;
108
+ readonly gates: readonly UsageGate[];
109
+ }
110
+ export interface UsageSummaryParams {
111
+ /** Organization keys only; a project client always reads its own project. */
112
+ readonly projectId?: string;
113
+ /** One number (session name). */
114
+ readonly session?: string;
115
+ /** Calendar month in UTC, `YYYY-MM`. Defaults to the current month. */
116
+ readonly period?: string;
117
+ }
118
+ export interface UsageRecordParams extends UsageSummaryParams {
119
+ /** Calendar month in UTC, `YYYY-MM`. Omit it to list records from every month. */
120
+ readonly period?: string;
121
+ /** One call's records. */
122
+ readonly callId?: string;
123
+ readonly meter?: UsageMeter;
124
+ /** 1 to 100; defaults to 25. */
125
+ readonly limit?: number;
126
+ readonly cursor?: string;
127
+ }
128
+ export interface UsageGateParams {
129
+ readonly projectId?: string;
130
+ /** Include limits that apply per number. */
131
+ readonly session?: string;
132
+ }
133
+ /**
134
+ * Metered usage and usage gates. Usage is measured, not charged. Requires the
135
+ * `sessions:read` scope; a project token reads only its own project's usage,
136
+ * and gate state needs an organization key.
137
+ */
138
+ export declare class UsageResource {
139
+ private readonly transport;
140
+ private readonly projectId;
141
+ constructor(transport: HttpTransport, projectId: string | null);
142
+ /** `GET /platform/usage`: totals for one calendar month, by meter and by number. */
143
+ summary(params?: UsageSummaryParams, options?: RequestOptions): Promise<ApiResponse<UsageSummary>>;
144
+ /** `GET /platform/usage/records`: records newest first, one page. */
145
+ listRecords(params?: UsageRecordParams, options?: RequestOptions): Promise<ApiResponse<UsageRecordPage>>;
146
+ /** Iterates every matching record across pages. */
147
+ iterateRecords(params?: Omit<UsageRecordParams, "cursor">, options?: RequestOptions): AsyncGenerator<UsageRecord, void, undefined>;
148
+ /**
149
+ * `GET /platform/gates`: every usage gate with its mode, limit and usage.
150
+ * Gate state covers the whole team, so this needs an organization client;
151
+ * the API refuses project credentials with 403.
152
+ */
153
+ listGates(params?: UsageGateParams, options?: RequestOptions): Promise<ApiResponse<UsageGateList>>;
154
+ private get;
155
+ }
156
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/platform/usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EACV,WAAW,EAEX,cAAc,EACf,MAAM,uBAAuB,CAAC;AAG/B;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAClB,eAAe,GACf,mBAAmB,GACnB,eAAe,GACf,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,eAAe,GACf,cAAc,GACd,qBAAqB,GACrB,eAAe,GACf,mBAAmB,CAAC;AAExB,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,OAAO,GACP,MAAM,GACN,WAAW,GACX,OAAO,GACP,eAAe,GACf,SAAS,GACT,UAAU,CAAC;AAEf,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAC7D,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC7E,MAAM,MAAM,eAAe,GACzB,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtE,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,WAAW,CAAC;IACjD,QAAQ,CAAC,MAAM,EACb,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,oBAAoB,CAAC;IAClE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5E,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;KAC7C,EAAE,CAAC;IACJ,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,MAAM,YAAY,GACpB,wBAAwB,GACxB,iBAAiB,GACjB,4BAA4B,GAC5B,+BAA+B,GAC/B,2BAA2B,GAC3B,qBAAqB,GACrB,4BAA4B,GAC5B,aAAa,GACb,yBAAyB,GACzB,8BAA8B,GAC9B,yBAAyB,GACzB,8BAA8B,GAC9B,6BAA6B,GAC7B,8BAA8B,GAC9B,2BAA2B,GAC3B,0BAA0B,GAC1B,2BAA2B,CAAC;AAEhC;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IAC7D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,kFAAkF;IAClF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0BAA0B;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,MAAM,GAAG,IAAI;IAG3C,oFAAoF;IAC9E,OAAO,CACX,MAAM,GAAE,kBAAuB,EAC/B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAMrC,qEAAqE;IAC/D,WAAW,CACf,MAAM,GAAE,iBAAsB,EAC9B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAUxC,mDAAmD;IAC5C,cAAc,CACnB,MAAM,GAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAM,EAC9C,OAAO,GAAE,cAAmB,GAC3B,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC;IA6B/C;;;;OAIG;IACG,SAAS,CACb,MAAM,GAAE,eAAoB,EAC5B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAMtC,OAAO,CAAC,GAAG;CAiBZ"}