@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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -0
  3. package/dist/audio/speech-stream-ws.d.ts +40 -0
  4. package/dist/audio/speech-stream-ws.d.ts.map +1 -0
  5. package/dist/audio/speech-stream-ws.js +565 -0
  6. package/dist/audio/speech-stream-ws.js.map +1 -0
  7. package/dist/audio/speech.d.ts +46 -0
  8. package/dist/audio/speech.d.ts.map +1 -0
  9. package/dist/audio/speech.js +125 -0
  10. package/dist/audio/speech.js.map +1 -0
  11. package/dist/audio/stream.d.ts +38 -0
  12. package/dist/audio/stream.d.ts.map +1 -0
  13. package/dist/audio/stream.js +452 -0
  14. package/dist/audio/stream.js.map +1 -0
  15. package/dist/audio/to-blob.d.ts +10 -0
  16. package/dist/audio/to-blob.d.ts.map +1 -0
  17. package/dist/audio/to-blob.js +78 -0
  18. package/dist/audio/to-blob.js.map +1 -0
  19. package/dist/audio/transcriptions.d.ts +35 -0
  20. package/dist/audio/transcriptions.d.ts.map +1 -0
  21. package/dist/audio/transcriptions.js +105 -0
  22. package/dist/audio/transcriptions.js.map +1 -0
  23. package/dist/audio/translate-stream-ws.d.ts +37 -0
  24. package/dist/audio/translate-stream-ws.d.ts.map +1 -0
  25. package/dist/audio/translate-stream-ws.js +665 -0
  26. package/dist/audio/translate-stream-ws.js.map +1 -0
  27. package/dist/audio/translate.d.ts +36 -0
  28. package/dist/audio/translate.d.ts.map +1 -0
  29. package/dist/audio/translate.js +39 -0
  30. package/dist/audio/translate.js.map +1 -0
  31. package/dist/audio/voices.d.ts +47 -0
  32. package/dist/audio/voices.d.ts.map +1 -0
  33. package/dist/audio/voices.js +91 -0
  34. package/dist/audio/voices.js.map +1 -0
  35. package/dist/chat/completions.d.ts +76 -0
  36. package/dist/chat/completions.d.ts.map +1 -0
  37. package/dist/chat/completions.js +114 -0
  38. package/dist/chat/completions.js.map +1 -0
  39. package/dist/chat/index.d.ts +2 -0
  40. package/dist/chat/index.d.ts.map +1 -0
  41. package/dist/chat/index.js +2 -0
  42. package/dist/chat/index.js.map +1 -0
  43. package/dist/chat/sse.d.ts +12 -0
  44. package/dist/chat/sse.d.ts.map +1 -0
  45. package/dist/chat/sse.js +142 -0
  46. package/dist/chat/sse.js.map +1 -0
  47. package/dist/client.d.ts +63 -0
  48. package/dist/client.d.ts.map +1 -0
  49. package/dist/client.js +80 -0
  50. package/dist/client.js.map +1 -0
  51. package/dist/errors.d.ts +99 -0
  52. package/dist/errors.d.ts.map +1 -0
  53. package/dist/errors.js +158 -0
  54. package/dist/errors.js.map +1 -0
  55. package/dist/index.d.ts +27 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +25 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/jobs.d.ts +34 -0
  60. package/dist/jobs.d.ts.map +1 -0
  61. package/dist/jobs.js +62 -0
  62. package/dist/jobs.js.map +1 -0
  63. package/dist/observability.d.ts +28 -0
  64. package/dist/observability.d.ts.map +1 -0
  65. package/dist/observability.js +107 -0
  66. package/dist/observability.js.map +1 -0
  67. package/dist/settings.d.ts +49 -0
  68. package/dist/settings.d.ts.map +1 -0
  69. package/dist/settings.js +84 -0
  70. package/dist/settings.js.map +1 -0
  71. package/dist/transport.d.ts +82 -0
  72. package/dist/transport.d.ts.map +1 -0
  73. package/dist/transport.js +289 -0
  74. package/dist/transport.js.map +1 -0
  75. package/dist/types.d.ts +969 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +11 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/usage.d.ts +43 -0
  80. package/dist/usage.d.ts.map +1 -0
  81. package/dist/usage.js +85 -0
  82. package/dist/usage.js.map +1 -0
  83. package/dist/version.d.ts +13 -0
  84. package/dist/version.d.ts.map +1 -0
  85. package/dist/version.js +13 -0
  86. package/dist/version.js.map +1 -0
  87. package/dist/webhooks.d.ts +84 -0
  88. package/dist/webhooks.d.ts.map +1 -0
  89. package/dist/webhooks.js +157 -0
  90. package/dist/webhooks.js.map +1 -0
  91. 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
@@ -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"}
@@ -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"}