@tryhakim/voice 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/LICENSE +21 -0
- package/README.md +188 -0
- package/dist/audio/speech-stream-ws.d.ts +40 -0
- package/dist/audio/speech-stream-ws.d.ts.map +1 -0
- package/dist/audio/speech-stream-ws.js +565 -0
- package/dist/audio/speech-stream-ws.js.map +1 -0
- package/dist/audio/speech.d.ts +46 -0
- package/dist/audio/speech.d.ts.map +1 -0
- package/dist/audio/speech.js +125 -0
- package/dist/audio/speech.js.map +1 -0
- package/dist/audio/stream.d.ts +38 -0
- package/dist/audio/stream.d.ts.map +1 -0
- package/dist/audio/stream.js +452 -0
- package/dist/audio/stream.js.map +1 -0
- package/dist/audio/to-blob.d.ts +10 -0
- package/dist/audio/to-blob.d.ts.map +1 -0
- package/dist/audio/to-blob.js +78 -0
- package/dist/audio/to-blob.js.map +1 -0
- package/dist/audio/transcriptions.d.ts +35 -0
- package/dist/audio/transcriptions.d.ts.map +1 -0
- package/dist/audio/transcriptions.js +105 -0
- package/dist/audio/transcriptions.js.map +1 -0
- package/dist/audio/translate-stream-ws.d.ts +37 -0
- package/dist/audio/translate-stream-ws.d.ts.map +1 -0
- package/dist/audio/translate-stream-ws.js +665 -0
- package/dist/audio/translate-stream-ws.js.map +1 -0
- package/dist/audio/translate.d.ts +36 -0
- package/dist/audio/translate.d.ts.map +1 -0
- package/dist/audio/translate.js +39 -0
- package/dist/audio/translate.js.map +1 -0
- package/dist/audio/voices.d.ts +47 -0
- package/dist/audio/voices.d.ts.map +1 -0
- package/dist/audio/voices.js +91 -0
- package/dist/audio/voices.js.map +1 -0
- package/dist/chat/completions.d.ts +76 -0
- package/dist/chat/completions.d.ts.map +1 -0
- package/dist/chat/completions.js +114 -0
- package/dist/chat/completions.js.map +1 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +2 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/sse.d.ts +12 -0
- package/dist/chat/sse.d.ts.map +1 -0
- package/dist/chat/sse.js +142 -0
- package/dist/chat/sse.js.map +1 -0
- package/dist/client.d.ts +63 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +80 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +158 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +34 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +62 -0
- package/dist/jobs.js.map +1 -0
- package/dist/observability.d.ts +28 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +107 -0
- package/dist/observability.js.map +1 -0
- package/dist/settings.d.ts +49 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +84 -0
- package/dist/settings.js.map +1 -0
- package/dist/transport.d.ts +82 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +289 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +969 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/usage.d.ts +43 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +85 -0
- package/dist/usage.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +13 -0
- package/dist/version.js.map +1 -0
- package/dist/webhooks.d.ts +84 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +157 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +57 -0
package/dist/jobs.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `jobs` — public `/v1/jobs` list + retrieve.
|
|
3
|
+
*
|
|
4
|
+
* GET /v1/jobs → paginated list for the caller's org
|
|
5
|
+
* GET /v1/jobs/:id → fetch one job (result_url on success)
|
|
6
|
+
*
|
|
7
|
+
* The server cursor-paginates on `(createdAt desc, id desc)` so
|
|
8
|
+
* `has_more` + `next_cursor` ride alongside the data array.
|
|
9
|
+
*
|
|
10
|
+
* The SDK does NOT auto-download `result_url`. Callers get a fresh
|
|
11
|
+
* signed URL on every `retrieve()` call (TTL is 24 h server-side);
|
|
12
|
+
* downloading is a plain `fetch(result_url)` away. The `iter()`
|
|
13
|
+
* helper below walks all pages and is the canonical "fetch everything
|
|
14
|
+
* newer than my bookmark" affordance.
|
|
15
|
+
*/
|
|
16
|
+
import type { Transport } from './transport.js';
|
|
17
|
+
import type { Job, JobsListQuery, JobsListResponse } from './types.js';
|
|
18
|
+
export declare class JobsAPI {
|
|
19
|
+
private readonly transport;
|
|
20
|
+
constructor(transport: Transport);
|
|
21
|
+
list(query?: JobsListQuery, opts?: {
|
|
22
|
+
signal?: AbortSignal;
|
|
23
|
+
}): Promise<JobsListResponse>;
|
|
24
|
+
retrieve(id: string, opts?: {
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
}): Promise<Job>;
|
|
27
|
+
/** Walk every job page-by-page. Stops once the server reports
|
|
28
|
+
* `has_more: false`. Passes the original filter + limit through
|
|
29
|
+
* unchanged; only `cursor` advances. */
|
|
30
|
+
iter(query?: JobsListQuery, opts?: {
|
|
31
|
+
signal?: AbortSignal;
|
|
32
|
+
}): AsyncIterable<Job>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEvE,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE3C,IAAI,CACR,KAAK,GAAE,aAAkB,EACzB,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAClC,OAAO,CAAC,gBAAgB,CAAC;IAgBtB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAS7E;;6CAEyC;IAClC,IAAI,CAAC,KAAK,GAAE,aAAkB,EAAE,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,aAAa,CAAC,GAAG,CAAC;CAShG"}
|
package/dist/jobs.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `jobs` — public `/v1/jobs` list + retrieve.
|
|
3
|
+
*
|
|
4
|
+
* GET /v1/jobs → paginated list for the caller's org
|
|
5
|
+
* GET /v1/jobs/:id → fetch one job (result_url on success)
|
|
6
|
+
*
|
|
7
|
+
* The server cursor-paginates on `(createdAt desc, id desc)` so
|
|
8
|
+
* `has_more` + `next_cursor` ride alongside the data array.
|
|
9
|
+
*
|
|
10
|
+
* The SDK does NOT auto-download `result_url`. Callers get a fresh
|
|
11
|
+
* signed URL on every `retrieve()` call (TTL is 24 h server-side);
|
|
12
|
+
* downloading is a plain `fetch(result_url)` away. The `iter()`
|
|
13
|
+
* helper below walks all pages and is the canonical "fetch everything
|
|
14
|
+
* newer than my bookmark" affordance.
|
|
15
|
+
*/
|
|
16
|
+
export class JobsAPI {
|
|
17
|
+
transport;
|
|
18
|
+
constructor(transport) {
|
|
19
|
+
this.transport = transport;
|
|
20
|
+
}
|
|
21
|
+
async list(query = {}, opts = {}) {
|
|
22
|
+
const q = {};
|
|
23
|
+
if (query.status !== undefined)
|
|
24
|
+
q.status = query.status;
|
|
25
|
+
if (query.type !== undefined)
|
|
26
|
+
q.type = query.type;
|
|
27
|
+
if (query.limit !== undefined)
|
|
28
|
+
q.limit = query.limit;
|
|
29
|
+
if (query.cursor !== undefined)
|
|
30
|
+
q.cursor = query.cursor;
|
|
31
|
+
const res = await this.transport.request({
|
|
32
|
+
method: 'GET',
|
|
33
|
+
path: '/v1/jobs',
|
|
34
|
+
query: q,
|
|
35
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
36
|
+
});
|
|
37
|
+
return (await res.json());
|
|
38
|
+
}
|
|
39
|
+
async retrieve(id, opts = {}) {
|
|
40
|
+
const res = await this.transport.request({
|
|
41
|
+
method: 'GET',
|
|
42
|
+
path: `/v1/jobs/${encodeURIComponent(id)}`,
|
|
43
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
44
|
+
});
|
|
45
|
+
return (await res.json());
|
|
46
|
+
}
|
|
47
|
+
/** Walk every job page-by-page. Stops once the server reports
|
|
48
|
+
* `has_more: false`. Passes the original filter + limit through
|
|
49
|
+
* unchanged; only `cursor` advances. */
|
|
50
|
+
async *iter(query = {}, opts = {}) {
|
|
51
|
+
let cursor = query.cursor;
|
|
52
|
+
while (true) {
|
|
53
|
+
const page = await this.list({ ...query, ...(cursor !== undefined ? { cursor } : {}) }, opts);
|
|
54
|
+
for (const j of page.data)
|
|
55
|
+
yield j;
|
|
56
|
+
if (!page.has_more || !page.next_cursor)
|
|
57
|
+
return;
|
|
58
|
+
cursor = page.next_cursor;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=jobs.js.map
|
package/dist/jobs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,MAAM,OAAO,OAAO;IACW;IAA7B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAErD,KAAK,CAAC,IAAI,CACR,QAAuB,EAAE,EACzB,OAAiC,EAAE;QAEnC,MAAM,CAAC,GAAgD,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACxD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAClD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACrD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAExD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,CAAC;YACR,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqB,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,OAAiC,EAAE;QAC5D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,EAAE;YAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAQ,CAAC;IACnC,CAAC;IAED;;6CAEyC;IACzC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAuB,EAAE,EAAE,OAAiC,EAAE;QACxE,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9F,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO;YAChD,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `observability` — parse the `x-hakim-*` response headers into typed
|
|
3
|
+
* shapes mirroring `@hakim/schemas/observability.ts`.
|
|
4
|
+
*
|
|
5
|
+
* The server stamps every successful TTS / STT response with the
|
|
6
|
+
* canonical observability header set. Customers integrating with
|
|
7
|
+
* `Snowpipe`/`BigQuery`/`Splunk` can copy the headers into a warehouse
|
|
8
|
+
* directly, but in-process callers usually want a typed object on the
|
|
9
|
+
* response · these helpers do that lift without forcing every caller
|
|
10
|
+
* to remember the header names.
|
|
11
|
+
*
|
|
12
|
+
* The header names are the contract; we intentionally hard-code them
|
|
13
|
+
* here (rather than importing `OBSERVABILITY_HEADERS` from
|
|
14
|
+
* `@hakim/schemas`) so the SDK stays publishable stand-alone. The
|
|
15
|
+
* drift test in `openapi-drift.test.ts` keeps the header surface in
|
|
16
|
+
* lockstep with the Zod source.
|
|
17
|
+
*/
|
|
18
|
+
import type { SpeechResponseLimits, UsageBlock } from './types.js';
|
|
19
|
+
/** Decode the `x-hakim-usage-*` family into a `UsageBlock`. Returns
|
|
20
|
+
* `undefined` when any required header is missing · the server emits
|
|
21
|
+
* the full set atomically, so a partial set means we're talking to a
|
|
22
|
+
* pre-observability API (or a non-billable surface). */
|
|
23
|
+
export declare function parseUsageBlockFromHeaders(headers: Headers): UsageBlock | undefined;
|
|
24
|
+
/** Decode the period + credits + concurrency snapshot a response
|
|
25
|
+
* carries on its headers. The rate-limit dimension is dropped on
|
|
26
|
+
* purpose · see `SpeechResponseLimits` docblock. */
|
|
27
|
+
export declare function parseLimitsFromHeaders(headers: Headers): SpeechResponseLimits | undefined;
|
|
28
|
+
//# sourceMappingURL=observability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAKV,oBAAoB,EACpB,UAAU,EAEX,MAAM,YAAY,CAAC;AAEpB;;;yDAGyD;AACzD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAkCnF;AAED;;qDAEqD;AACrD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAsCzF"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/** Decode the `x-hakim-usage-*` family into a `UsageBlock`. Returns
|
|
2
|
+
* `undefined` when any required header is missing · the server emits
|
|
3
|
+
* the full set atomically, so a partial set means we're talking to a
|
|
4
|
+
* pre-observability API (or a non-billable surface). */
|
|
5
|
+
export function parseUsageBlockFromHeaders(headers) {
|
|
6
|
+
const kind = readKind(headers.get('x-hakim-usage-kind'));
|
|
7
|
+
const units = readInt(headers.get('x-hakim-usage-units'));
|
|
8
|
+
const unitType = readUnitType(headers.get('x-hakim-usage-unit-type'));
|
|
9
|
+
const credits = readInt(headers.get('x-hakim-usage-credits'));
|
|
10
|
+
const cost = headers.get('x-hakim-usage-cost-usd');
|
|
11
|
+
const requestId = headers.get('x-request-id');
|
|
12
|
+
const periodStart = headers.get('x-hakim-period-start');
|
|
13
|
+
const periodEnd = headers.get('x-hakim-period-end');
|
|
14
|
+
if (kind === undefined ||
|
|
15
|
+
units === undefined ||
|
|
16
|
+
unitType === undefined ||
|
|
17
|
+
credits === undefined ||
|
|
18
|
+
cost === null ||
|
|
19
|
+
requestId === null ||
|
|
20
|
+
periodStart === null ||
|
|
21
|
+
periodEnd === null) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
request_id: requestId,
|
|
26
|
+
kind,
|
|
27
|
+
units,
|
|
28
|
+
unit_type: unitType,
|
|
29
|
+
credits,
|
|
30
|
+
cost_usd: cost,
|
|
31
|
+
model: headers.get('x-hakim-model'),
|
|
32
|
+
billing_period_start: periodStart,
|
|
33
|
+
billing_period_end: periodEnd,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Decode the period + credits + concurrency snapshot a response
|
|
37
|
+
* carries on its headers. The rate-limit dimension is dropped on
|
|
38
|
+
* purpose · see `SpeechResponseLimits` docblock. */
|
|
39
|
+
export function parseLimitsFromHeaders(headers) {
|
|
40
|
+
const planId = headers.get('x-hakim-plan-id');
|
|
41
|
+
const periodStart = headers.get('x-hakim-period-start');
|
|
42
|
+
const periodEnd = headers.get('x-hakim-period-end');
|
|
43
|
+
const included = readInt(headers.get('x-hakim-credits-included'));
|
|
44
|
+
const used = readInt(headers.get('x-hakim-credits-used'));
|
|
45
|
+
const remaining = readInt(headers.get('x-hakim-credits-remaining'));
|
|
46
|
+
const effective = readInt(headers.get('x-hakim-credits-effective-limit'));
|
|
47
|
+
const concLimit = readInt(headers.get('x-hakim-concurrency-limit'));
|
|
48
|
+
const concCurrent = readInt(headers.get('x-hakim-concurrency-current'));
|
|
49
|
+
if (!planId ||
|
|
50
|
+
!periodStart ||
|
|
51
|
+
!periodEnd ||
|
|
52
|
+
included === undefined ||
|
|
53
|
+
used === undefined ||
|
|
54
|
+
remaining === undefined ||
|
|
55
|
+
effective === undefined ||
|
|
56
|
+
concLimit === undefined ||
|
|
57
|
+
concCurrent === undefined) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const plan = {
|
|
61
|
+
id: planId,
|
|
62
|
+
name: planId,
|
|
63
|
+
// The header set doesn't carry the overage-mode literal · use
|
|
64
|
+
// `topup` (the current default) so the shape parses cleanly.
|
|
65
|
+
// Callers that need the authoritative overage-mode should call
|
|
66
|
+
// `usage.limits()`.
|
|
67
|
+
overage_mode: 'topup',
|
|
68
|
+
};
|
|
69
|
+
const period = { start: periodStart, end: periodEnd };
|
|
70
|
+
const credits = { included, used, remaining, effective_limit: effective };
|
|
71
|
+
const concurrency = { limit: concLimit, current: concCurrent };
|
|
72
|
+
return { plan, period, credits, concurrency };
|
|
73
|
+
}
|
|
74
|
+
function readInt(raw) {
|
|
75
|
+
if (raw === null)
|
|
76
|
+
return undefined;
|
|
77
|
+
const n = Number(raw);
|
|
78
|
+
if (!Number.isFinite(n) || n < 0)
|
|
79
|
+
return undefined;
|
|
80
|
+
return Math.floor(n);
|
|
81
|
+
}
|
|
82
|
+
const KIND_VALUES = new Set([
|
|
83
|
+
'tts',
|
|
84
|
+
'stt_batch',
|
|
85
|
+
'stt_realtime',
|
|
86
|
+
'voice_clone',
|
|
87
|
+
'video_studio',
|
|
88
|
+
'llm_chat',
|
|
89
|
+
]);
|
|
90
|
+
function readKind(raw) {
|
|
91
|
+
if (raw === null)
|
|
92
|
+
return undefined;
|
|
93
|
+
return KIND_VALUES.has(raw) ? raw : undefined;
|
|
94
|
+
}
|
|
95
|
+
const UNIT_TYPE_VALUES = new Set([
|
|
96
|
+
'characters',
|
|
97
|
+
'seconds',
|
|
98
|
+
'count',
|
|
99
|
+
'credits',
|
|
100
|
+
'tokens',
|
|
101
|
+
]);
|
|
102
|
+
function readUnitType(raw) {
|
|
103
|
+
if (raw === null)
|
|
104
|
+
return undefined;
|
|
105
|
+
return UNIT_TYPE_VALUES.has(raw) ? raw : undefined;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `client.settings.*` + `client.notifications.*` — M2 follow-up surface.
|
|
3
|
+
*
|
|
4
|
+
* Thin fetch wrappers around the public `/v1/settings/*` and
|
|
5
|
+
* `/v1/notifications` endpoints. Both hang off the same bearer-auth
|
|
6
|
+
* transport as the rest of the SDK; the server scopes reads to
|
|
7
|
+
* `settings:read` and writes to `settings:write`.
|
|
8
|
+
*
|
|
9
|
+
* The "profile" and "notifications" endpoints target the API-key
|
|
10
|
+
* creator user, while "organization" targets the key's org. The
|
|
11
|
+
* resulting DX is:
|
|
12
|
+
*
|
|
13
|
+
* const me = await hakim.settings.getProfile();
|
|
14
|
+
* const org = await hakim.settings.getOrganization();
|
|
15
|
+
* const prefs = await hakim.notifications.get();
|
|
16
|
+
*
|
|
17
|
+
* await hakim.settings.updateProfile({ locale: 'en' });
|
|
18
|
+
* await hakim.settings.updateOrganization({ name: 'Acme Corp' });
|
|
19
|
+
* await hakim.notifications.update({ product_updates: true });
|
|
20
|
+
*/
|
|
21
|
+
import type { Transport } from './transport.js';
|
|
22
|
+
import type { NotificationPreferences, NotificationPreferencesUpdateRequest, OrganizationSettings, OrganizationSettingsUpdateRequest, Profile, ProfileUpdateRequest } from './types.js';
|
|
23
|
+
export declare class SettingsAPI {
|
|
24
|
+
private readonly transport;
|
|
25
|
+
constructor(transport: Transport);
|
|
26
|
+
getProfile(opts?: {
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
}): Promise<Profile>;
|
|
29
|
+
updateProfile(patch: ProfileUpdateRequest, opts?: {
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}): Promise<Profile>;
|
|
32
|
+
getOrganization(opts?: {
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
}): Promise<OrganizationSettings>;
|
|
35
|
+
updateOrganization(patch: OrganizationSettingsUpdateRequest, opts?: {
|
|
36
|
+
signal?: AbortSignal;
|
|
37
|
+
}): Promise<OrganizationSettings>;
|
|
38
|
+
}
|
|
39
|
+
export declare class NotificationsAPI {
|
|
40
|
+
private readonly transport;
|
|
41
|
+
constructor(transport: Transport);
|
|
42
|
+
get(opts?: {
|
|
43
|
+
signal?: AbortSignal;
|
|
44
|
+
}): Promise<NotificationPreferences>;
|
|
45
|
+
update(patch: NotificationPreferencesUpdateRequest, opts?: {
|
|
46
|
+
signal?: AbortSignal;
|
|
47
|
+
}): Promise<NotificationPreferences>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,uBAAuB,EACvB,oCAAoC,EACpC,oBAAoB,EACpB,iCAAiC,EACjC,OAAO,EACP,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE3C,UAAU,CAAC,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IASjE,aAAa,CACjB,KAAK,EAAE,oBAAoB,EAC3B,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAClC,OAAO,CAAC,OAAO,CAAC;IAUb,eAAe,CAAC,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IASnF,kBAAkB,CACtB,KAAK,EAAE,iCAAiC,EACxC,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAClC,OAAO,CAAC,oBAAoB,CAAC;CASjC;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE3C,GAAG,CAAC,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAS1E,MAAM,CACV,KAAK,EAAE,oCAAoC,EAC3C,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAClC,OAAO,CAAC,uBAAuB,CAAC;CASpC"}
|
package/dist/settings.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `client.settings.*` + `client.notifications.*` — M2 follow-up surface.
|
|
3
|
+
*
|
|
4
|
+
* Thin fetch wrappers around the public `/v1/settings/*` and
|
|
5
|
+
* `/v1/notifications` endpoints. Both hang off the same bearer-auth
|
|
6
|
+
* transport as the rest of the SDK; the server scopes reads to
|
|
7
|
+
* `settings:read` and writes to `settings:write`.
|
|
8
|
+
*
|
|
9
|
+
* The "profile" and "notifications" endpoints target the API-key
|
|
10
|
+
* creator user, while "organization" targets the key's org. The
|
|
11
|
+
* resulting DX is:
|
|
12
|
+
*
|
|
13
|
+
* const me = await hakim.settings.getProfile();
|
|
14
|
+
* const org = await hakim.settings.getOrganization();
|
|
15
|
+
* const prefs = await hakim.notifications.get();
|
|
16
|
+
*
|
|
17
|
+
* await hakim.settings.updateProfile({ locale: 'en' });
|
|
18
|
+
* await hakim.settings.updateOrganization({ name: 'Acme Corp' });
|
|
19
|
+
* await hakim.notifications.update({ product_updates: true });
|
|
20
|
+
*/
|
|
21
|
+
export class SettingsAPI {
|
|
22
|
+
transport;
|
|
23
|
+
constructor(transport) {
|
|
24
|
+
this.transport = transport;
|
|
25
|
+
}
|
|
26
|
+
async getProfile(opts = {}) {
|
|
27
|
+
const res = await this.transport.request({
|
|
28
|
+
method: 'GET',
|
|
29
|
+
path: '/v1/settings/profile',
|
|
30
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
31
|
+
});
|
|
32
|
+
return (await res.json());
|
|
33
|
+
}
|
|
34
|
+
async updateProfile(patch, opts = {}) {
|
|
35
|
+
const res = await this.transport.request({
|
|
36
|
+
method: 'PATCH',
|
|
37
|
+
path: '/v1/settings/profile',
|
|
38
|
+
json: patch,
|
|
39
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
40
|
+
});
|
|
41
|
+
return (await res.json());
|
|
42
|
+
}
|
|
43
|
+
async getOrganization(opts = {}) {
|
|
44
|
+
const res = await this.transport.request({
|
|
45
|
+
method: 'GET',
|
|
46
|
+
path: '/v1/settings/organization',
|
|
47
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
48
|
+
});
|
|
49
|
+
return (await res.json());
|
|
50
|
+
}
|
|
51
|
+
async updateOrganization(patch, opts = {}) {
|
|
52
|
+
const res = await this.transport.request({
|
|
53
|
+
method: 'PATCH',
|
|
54
|
+
path: '/v1/settings/organization',
|
|
55
|
+
json: patch,
|
|
56
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
57
|
+
});
|
|
58
|
+
return (await res.json());
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class NotificationsAPI {
|
|
62
|
+
transport;
|
|
63
|
+
constructor(transport) {
|
|
64
|
+
this.transport = transport;
|
|
65
|
+
}
|
|
66
|
+
async get(opts = {}) {
|
|
67
|
+
const res = await this.transport.request({
|
|
68
|
+
method: 'GET',
|
|
69
|
+
path: '/v1/notifications',
|
|
70
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
71
|
+
});
|
|
72
|
+
return (await res.json());
|
|
73
|
+
}
|
|
74
|
+
async update(patch, opts = {}) {
|
|
75
|
+
const res = await this.transport.request({
|
|
76
|
+
method: 'PATCH',
|
|
77
|
+
path: '/v1/notifications',
|
|
78
|
+
json: patch,
|
|
79
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
80
|
+
});
|
|
81
|
+
return (await res.json());
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP transport for the SDK.
|
|
3
|
+
*
|
|
4
|
+
* Contract:
|
|
5
|
+
* - Uses native `fetch` (Node 18+ builds it in). No `axios` / `undici`
|
|
6
|
+
* dependency so the SDK bundle stays small.
|
|
7
|
+
* - Every call attaches Authorization + User-Agent + X-Request-Id.
|
|
8
|
+
* - Mutating calls (POST) auto-generate an `Idempotency-Key` unless
|
|
9
|
+
* the caller supplied one (T39).
|
|
10
|
+
* - Retries on transient failures: 5xx, 429, 408, 503, and low-level
|
|
11
|
+
* connection errors. Back-off is exponential with jitter, honoring
|
|
12
|
+
* the server's `Retry-After` when present. Max 3 attempts by default.
|
|
13
|
+
* - 4xx (except 408 / 429) is NOT retried — those are caller errors.
|
|
14
|
+
* - Stream responses (TTS streaming, raw binary) are returned as a
|
|
15
|
+
* `Response` object so callers can `body.getReader()` or iterate
|
|
16
|
+
* via our adapter without us buffering the entire audio in memory.
|
|
17
|
+
*
|
|
18
|
+
* Error shape: every non-2xx raises a `HakimError` subclass built from
|
|
19
|
+
* the server's uniform `ApiError` JSON body. Network-level
|
|
20
|
+
* failures raise `ConnectionError`.
|
|
21
|
+
*/
|
|
22
|
+
export interface TransportOptions {
|
|
23
|
+
apiKey: string;
|
|
24
|
+
baseURL: string;
|
|
25
|
+
timeoutMs: number;
|
|
26
|
+
maxRetries: number;
|
|
27
|
+
userAgentSuffix?: string | undefined;
|
|
28
|
+
/** Injected for tests — defaults to globalThis.fetch. */
|
|
29
|
+
fetchImpl?: typeof fetch;
|
|
30
|
+
/** Injected for tests — overrides the Math.random used for jitter. */
|
|
31
|
+
random?: () => number;
|
|
32
|
+
/** Injected for tests — overrides setTimeout used between retries. */
|
|
33
|
+
sleep?: (ms: number) => Promise<void>;
|
|
34
|
+
/** Injected for tests — overrides idempotency key generation. */
|
|
35
|
+
generateIdempotencyKey?: () => string;
|
|
36
|
+
}
|
|
37
|
+
export interface RequestOptions {
|
|
38
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
39
|
+
path: string;
|
|
40
|
+
/** JSON body. Mutually exclusive with `formData` / `body`. */
|
|
41
|
+
json?: unknown;
|
|
42
|
+
/** Multipart body. Mutually exclusive with `json` / `body`. */
|
|
43
|
+
formData?: FormData;
|
|
44
|
+
/** Raw body. Mutually exclusive with `json` / `formData`. */
|
|
45
|
+
body?: BodyInit | undefined;
|
|
46
|
+
query?: Record<string, string | number | boolean | undefined> | undefined;
|
|
47
|
+
headers?: Record<string, string> | undefined;
|
|
48
|
+
/** Client-supplied idempotency key. Overrides auto-generation. */
|
|
49
|
+
idempotencyKey?: string | undefined;
|
|
50
|
+
/** When true the response body is returned untouched for the caller
|
|
51
|
+
* to stream. The transport still validates the HTTP status + parses
|
|
52
|
+
* error bodies for non-2xx. */
|
|
53
|
+
stream?: boolean;
|
|
54
|
+
/** Override the request timeout on a per-call basis. */
|
|
55
|
+
timeoutMs?: number;
|
|
56
|
+
/** When set, the server returned `Accept` header. Default:
|
|
57
|
+
* `application/json` for non-stream, omitted for stream/binary. */
|
|
58
|
+
accept?: string;
|
|
59
|
+
/** External AbortSignal. When aborted, the in-flight request is cancelled. */
|
|
60
|
+
signal?: AbortSignal;
|
|
61
|
+
}
|
|
62
|
+
export declare class Transport {
|
|
63
|
+
/** Exposed for the realtime WSS helper which needs to build a `wss://`
|
|
64
|
+
* URL and set the Authorization header on a raw WebSocket. Treat as
|
|
65
|
+
* read-only; regular HTTP calls should never touch this directly. */
|
|
66
|
+
readonly apiKey: string;
|
|
67
|
+
readonly baseURL: string;
|
|
68
|
+
private readonly timeoutMs;
|
|
69
|
+
private readonly maxRetries;
|
|
70
|
+
private readonly userAgent;
|
|
71
|
+
private readonly fetchImpl;
|
|
72
|
+
private readonly random;
|
|
73
|
+
private readonly sleep;
|
|
74
|
+
private readonly generateIdempotencyKey;
|
|
75
|
+
constructor(options: TransportOptions);
|
|
76
|
+
request(opts: RequestOptions): Promise<Response>;
|
|
77
|
+
private buildURL;
|
|
78
|
+
private buildHeaders;
|
|
79
|
+
/** Base backoff: 200ms, 600ms, 1400ms; with ±25% jitter. Cap at 10s. */
|
|
80
|
+
private backoffMs;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,iEAAiE;IACjE,sBAAsB,CAAC,EAAE,MAAM,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;oCAEgC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;wEACoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAMD,qBAAa,SAAS;IACpB;;0EAEsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAe;gBAE1C,OAAO,EAAE,gBAAgB;IAuB/B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IA4FtD,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,YAAY;IA+BpB,wEAAwE;IACxE,OAAO,CAAC,SAAS;CAKlB"}
|