@awesomate/platform-sdk 0.1.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 (45) hide show
  1. package/README.md +92 -0
  2. package/dist/cjs/client.d.ts +128 -0
  3. package/dist/cjs/client.js +257 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/http.d.ts +27 -0
  6. package/dist/cjs/http.js +127 -0
  7. package/dist/cjs/http.js.map +1 -0
  8. package/dist/cjs/index.d.ts +9 -0
  9. package/dist/cjs/index.js +35 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/package.json +1 -0
  12. package/dist/cjs/service.d.ts +140 -0
  13. package/dist/cjs/service.js +216 -0
  14. package/dist/cjs/service.js.map +1 -0
  15. package/dist/cjs/sign.d.ts +11 -0
  16. package/dist/cjs/sign.js +41 -0
  17. package/dist/cjs/sign.js.map +1 -0
  18. package/dist/cjs/sse.d.ts +27 -0
  19. package/dist/cjs/sse.js +130 -0
  20. package/dist/cjs/sse.js.map +1 -0
  21. package/dist/cjs/types.d.ts +517 -0
  22. package/dist/cjs/types.js +4 -0
  23. package/dist/cjs/types.js.map +1 -0
  24. package/dist/esm/client.d.ts +128 -0
  25. package/dist/esm/client.js +251 -0
  26. package/dist/esm/client.js.map +1 -0
  27. package/dist/esm/http.d.ts +27 -0
  28. package/dist/esm/http.js +116 -0
  29. package/dist/esm/http.js.map +1 -0
  30. package/dist/esm/index.d.ts +9 -0
  31. package/dist/esm/index.js +6 -0
  32. package/dist/esm/index.js.map +1 -0
  33. package/dist/esm/service.d.ts +140 -0
  34. package/dist/esm/service.js +210 -0
  35. package/dist/esm/service.js.map +1 -0
  36. package/dist/esm/sign.d.ts +11 -0
  37. package/dist/esm/sign.js +36 -0
  38. package/dist/esm/sign.js.map +1 -0
  39. package/dist/esm/sse.d.ts +27 -0
  40. package/dist/esm/sse.js +125 -0
  41. package/dist/esm/sse.js.map +1 -0
  42. package/dist/esm/types.d.ts +517 -0
  43. package/dist/esm/types.js +3 -0
  44. package/dist/esm/types.js.map +1 -0
  45. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,517 @@
1
+ /**
2
+ * Every call resolves to one of three outcomes and never throws on the request path:
3
+ * a 2xx with typed data; a 4xx with the platform's error envelope; or `unavailable`
4
+ * (5xx, timeout, network failure, missing config) so callers can answer 503/202 cleanly.
5
+ */
6
+ export type PlatformResult<T> = {
7
+ ok: true;
8
+ status: number;
9
+ data: T;
10
+ } | {
11
+ ok: false;
12
+ status: number;
13
+ error: string;
14
+ message?: string;
15
+ requestId?: string;
16
+ retryAfter?: string;
17
+ } | {
18
+ ok: false;
19
+ reason: "unavailable";
20
+ };
21
+ export type PlatformFailure = Exclude<PlatformResult<never>, {
22
+ ok: true;
23
+ }>;
24
+ export type KeyClass = "q" | "p" | "i" | "a" | "s" | "u";
25
+ export type AnswerStatus = "ok" | "no_results" | "failed_validation" | "error";
26
+ export type AgentName = "knowledge" | "content" | "social" | "assistant" | (string & {});
27
+ export interface AnswerRequest {
28
+ /** ≤ 2000 chars. */
29
+ question: string;
30
+ /** ≤ 128 chars, end-user session id; omitted → the platform generates one and echoes it. */
31
+ session?: string;
32
+ /** Default = the tenant's `default_agent`. */
33
+ agent?: AgentName;
34
+ /** 1–10, default 3. */
35
+ max_sources?: number;
36
+ /** v2: run a published agent by id with the v1 response shape. */
37
+ agent_id?: string;
38
+ }
39
+ export interface AnswerSource {
40
+ ref: number;
41
+ doc_id: string;
42
+ title: string;
43
+ kind: string;
44
+ section_path: string;
45
+ locator: string | null;
46
+ url: string | null;
47
+ excerpt: string;
48
+ }
49
+ export interface Citation {
50
+ doc_id: string;
51
+ section_path: string;
52
+ }
53
+ export interface Answer {
54
+ tenant: string;
55
+ status: AnswerStatus;
56
+ /** Internal form with `[[doc_id#Section]]` markers; empty unless status is `ok`. */
57
+ answer: string;
58
+ /** End-user form: markers replaced by [1], [2]…; the tenant's `no_answer_message` when status ≠ ok. */
59
+ answer_plain: string;
60
+ sources: AnswerSource[];
61
+ citations: Citation[];
62
+ score: number;
63
+ attempts: number;
64
+ mode: string;
65
+ retrieved: Citation[];
66
+ tools: string[];
67
+ session: string;
68
+ }
69
+ /** The `meta` SSE event — the validated result minus the text that already streamed. */
70
+ export interface AnswerMeta {
71
+ status: AnswerStatus;
72
+ citations: Citation[];
73
+ score: number;
74
+ attempts: number;
75
+ mode: string;
76
+ retrieved: Array<Citation & Record<string, unknown>>;
77
+ tools: string[];
78
+ sources: Array<Record<string, unknown>>;
79
+ thread?: string;
80
+ repaired?: "stripped_uncited" | "regenerated" | "truncated" | (string & {});
81
+ /** v2 grounded_chat agents: the one documented client-side retraction. */
82
+ reply_override?: string;
83
+ [extra: string]: unknown;
84
+ }
85
+ export type AnswerStreamEvent = {
86
+ event: "sources";
87
+ sources: Array<Record<string, unknown>>;
88
+ } | {
89
+ event: "answer";
90
+ text: string;
91
+ } | {
92
+ event: "reply";
93
+ text: string;
94
+ } | {
95
+ event: "meta";
96
+ meta: AnswerMeta;
97
+ } | {
98
+ event: "done";
99
+ } | {
100
+ event: "error";
101
+ message: string;
102
+ };
103
+ export interface QueryHit {
104
+ doc_id: string;
105
+ section_path: string;
106
+ title: string;
107
+ kind: string | null;
108
+ excerpt: string;
109
+ score: number | null;
110
+ url: string | null;
111
+ locator: string | null;
112
+ }
113
+ export interface QueryResponse {
114
+ tenant: string;
115
+ query: string;
116
+ hits: QueryHit[];
117
+ }
118
+ export interface QueryParams {
119
+ q: string;
120
+ /** 1–20, default 8. */
121
+ limit?: number;
122
+ kind?: string;
123
+ /** One dataset (`knowledge`, `content`, `social`, …); omitted → fan-out over everything enabled. */
124
+ dataset?: string;
125
+ }
126
+ export interface Whoami {
127
+ tenant: string;
128
+ display_name: string;
129
+ status: string;
130
+ plan: string;
131
+ key: {
132
+ id: string;
133
+ class: string;
134
+ scope?: string;
135
+ scopes?: string[];
136
+ expires_at?: string | null;
137
+ };
138
+ datasets: string[];
139
+ counts: {
140
+ sources: number;
141
+ chunks: number;
142
+ indexed: number;
143
+ };
144
+ last_indexed_at: string | null;
145
+ }
146
+ export interface Status {
147
+ tenant?: string;
148
+ jobs: {
149
+ queued: number;
150
+ running: number;
151
+ failed: number;
152
+ };
153
+ time_to_searchable_p50_min: number | null;
154
+ sources_by_kind: Record<string, number>;
155
+ }
156
+ export interface Feedback {
157
+ session?: string;
158
+ /** 1–10, the `sources[].ref` being rated. */
159
+ ref?: number;
160
+ rating: "up" | "down";
161
+ /** ≤ 500 chars. */
162
+ comment?: string;
163
+ }
164
+ export type IngestKind = "markdown" | "pdf" | "facebook-export" | "html-url" | "html-sitemap" | "video" | "audio" | "image" | "data-import" | (string & {});
165
+ export type JobStatus = "queued" | "running" | "succeeded" | "failed" | "cancelled";
166
+ /** One entry of `IngestJob.stages`, as the worker pipeline writes it. */
167
+ export interface JobStage {
168
+ status: string;
169
+ at?: string;
170
+ error?: string | null;
171
+ [extra: string]: unknown;
172
+ }
173
+ export interface IngestJob {
174
+ job_id: string;
175
+ kind: IngestKind;
176
+ status: JobStatus;
177
+ /** Keyed by stage name (`fetch`, `parse`, `upsert`, `enrich`, `index`, `finalize`, …), not an array. */
178
+ stages?: Record<string, JobStage>;
179
+ result_summary?: Record<string, unknown> | null;
180
+ error?: string | null;
181
+ cost?: Record<string, unknown> | null;
182
+ created_at: string;
183
+ started_at?: string | null;
184
+ finished_at?: string | null;
185
+ }
186
+ export interface UploadTicket {
187
+ upload_id: string;
188
+ key: string;
189
+ put_url?: string;
190
+ multipart?: {
191
+ upload_id: string;
192
+ part_urls: string[];
193
+ };
194
+ expires_at: string;
195
+ }
196
+ export interface CreateUploadBody {
197
+ filename: string;
198
+ mime: string;
199
+ size_bytes: number;
200
+ sha256?: string;
201
+ }
202
+ export interface CompleteUploadBody {
203
+ sha256?: string;
204
+ parts?: Array<{
205
+ etag: string;
206
+ part: number;
207
+ }>;
208
+ }
209
+ export type CreateJobBody = {
210
+ kind: IngestKind;
211
+ upload_id: string;
212
+ options?: Record<string, unknown>;
213
+ } | {
214
+ kind: IngestKind;
215
+ url: string;
216
+ options?: Record<string, unknown>;
217
+ };
218
+ export interface Enqueued {
219
+ job_id: string;
220
+ status: JobStatus;
221
+ position?: number;
222
+ }
223
+ export interface JobsPage {
224
+ jobs: IngestJob[];
225
+ next_cursor: string | null;
226
+ }
227
+ export interface DatasetSummary {
228
+ dataset_id: string;
229
+ name: string;
230
+ description?: string | null;
231
+ grain?: string | null;
232
+ status: string;
233
+ record_count: number;
234
+ period_from?: string | null;
235
+ period_to?: string | null;
236
+ updated_at: string;
237
+ }
238
+ export interface DataQuery {
239
+ dataset: string;
240
+ measures: Array<{
241
+ column: string;
242
+ agg: "sum" | "avg" | "min" | "max" | "count" | "last";
243
+ }>;
244
+ dimensions?: string[];
245
+ time?: {
246
+ grain?: string;
247
+ preset?: string;
248
+ from?: string;
249
+ to?: string;
250
+ };
251
+ filters?: Array<{
252
+ column: string;
253
+ op: "eq" | "neq" | "in" | "gte" | "lte" | "contains";
254
+ value: unknown;
255
+ }>;
256
+ compare?: "previous_period" | "previous_year" | null;
257
+ order_by?: Array<{
258
+ field: string;
259
+ dir: "asc" | "desc";
260
+ }>;
261
+ limit?: number;
262
+ }
263
+ export interface DataQueryResult {
264
+ dataset_id: string;
265
+ columns: Array<Record<string, unknown>>;
266
+ rows: Array<Record<string, unknown>>;
267
+ data_ref: string;
268
+ truncated: boolean;
269
+ elapsed_ms: number;
270
+ applied_defaults?: string[];
271
+ }
272
+ export type CreateImportBody = {
273
+ upload_id: string;
274
+ } | {
275
+ rows: unknown[];
276
+ dataset_id?: string;
277
+ mode?: "auto" | "append" | "new";
278
+ answers?: Record<string, string>;
279
+ };
280
+ export interface Tenant {
281
+ id: string;
282
+ contact_id: number;
283
+ display_name: string;
284
+ plan: string;
285
+ status: "active" | "suspended" | "deleted" | (string & {});
286
+ config?: Record<string, unknown>;
287
+ datasets?: string[];
288
+ }
289
+ export interface UpsertTenantBody {
290
+ contact_id: number;
291
+ display_name: string;
292
+ plan: string;
293
+ status?: string;
294
+ config?: Record<string, unknown>;
295
+ datasets?: string[];
296
+ }
297
+ export interface MintKeyBody {
298
+ class: "q" | "p" | "i";
299
+ name: string;
300
+ expires_in_s?: number;
301
+ allowed_origins?: string[];
302
+ }
303
+ export interface MintedKey {
304
+ key_id: string;
305
+ key_prefix: string;
306
+ /** Plaintext — returned by the platform exactly ONCE. Hand it to its destination and discard. */
307
+ key: string;
308
+ }
309
+ export interface TenantKeyMeta {
310
+ key_id: string;
311
+ key_prefix: string;
312
+ class?: string;
313
+ scopes?: string[];
314
+ expires_at?: string | null;
315
+ }
316
+ /** The `entities.resolve` job the tenant detail reports (null when none has ever run). */
317
+ export interface ResolutionJobMeta {
318
+ job_id: string;
319
+ status: JobStatus | (string & {});
320
+ started_at: string | null;
321
+ finished_at: string | null;
322
+ }
323
+ /**
324
+ * Entity-layer fields arrive together once the platform deploys the layer (always present,
325
+ * 0/null, from then on). `people_named` doubles as the capability probe: `'people_named' in
326
+ * counts` → the layer exists.
327
+ */
328
+ export interface TenantCounts {
329
+ sources: number;
330
+ chunks: number;
331
+ jobs_queued: number;
332
+ jobs_running: number;
333
+ storage_bytes: number;
334
+ people_named?: number;
335
+ people_unknown?: number;
336
+ aliases_pending?: number;
337
+ entities_place?: number;
338
+ entities_topic?: number;
339
+ last_resolution_at?: string | null;
340
+ resolution_job?: ResolutionJobMeta | null;
341
+ }
342
+ export interface TenantDetail {
343
+ tenant: Tenant;
344
+ keys?: TenantKeyMeta[];
345
+ counts?: TenantCounts;
346
+ }
347
+ export interface PurgeJob {
348
+ purge_job_id?: string;
349
+ tenant_id?: string;
350
+ state: "running" | "done" | "failed";
351
+ purged: {
352
+ pg: number | boolean;
353
+ meili: number | boolean;
354
+ media: number | boolean;
355
+ memory: number | boolean;
356
+ };
357
+ error?: string;
358
+ started_at?: string;
359
+ finished_at?: string;
360
+ }
361
+ export interface UsageRow {
362
+ tenant_id: string;
363
+ day: string;
364
+ kind: string;
365
+ quantity: number;
366
+ unit: string;
367
+ cost_usd: number;
368
+ }
369
+ /** Metadata-only source row — content fields are omitted by construction on the platform side. */
370
+ export interface SourceMeta {
371
+ source_id: string;
372
+ kind: string;
373
+ title: string;
374
+ url?: string | null;
375
+ size_bytes?: number | null;
376
+ segments: number;
377
+ chunks: number;
378
+ indexed_chunks: number;
379
+ status: "indexing" | "ready" | "failed";
380
+ created_at: string;
381
+ updated_at: string;
382
+ tags?: string[];
383
+ }
384
+ export interface SourcesPage {
385
+ sources: SourceMeta[];
386
+ next_cursor: string | null;
387
+ }
388
+ /** `GET /v1/admin/tenants/:id/sources/summary` — whole-library counts in one call. */
389
+ export interface SourceSummary {
390
+ total: number;
391
+ by_kind: Record<string, number>;
392
+ chunks: number;
393
+ indexed_chunks: number;
394
+ failed_sources: number;
395
+ last_indexed_at: string | null;
396
+ }
397
+ /** Job as GET /v1/ingest/jobs/:id plus the admin channel's dead-lettered webhook state. */
398
+ export interface IngestJobMeta extends IngestJob {
399
+ webhook?: {
400
+ delivered: boolean;
401
+ dead: boolean;
402
+ attempts: number;
403
+ };
404
+ }
405
+ export interface AdminJobsPage {
406
+ jobs: IngestJobMeta[];
407
+ next_cursor: string | null;
408
+ }
409
+ export type CreateSourceBody = {
410
+ url: string;
411
+ } | {
412
+ sitemap: string;
413
+ since?: string;
414
+ } | {
415
+ upload_token: string;
416
+ kind?: IngestKind;
417
+ filename?: string;
418
+ options?: Record<string, unknown>;
419
+ };
420
+ export type PersonStatus = "named" | "unknown" | "hidden";
421
+ export type EntityKind = "person" | "place" | "topic";
422
+ /** One row of `GET …/people`. `display_name` is null for unnamed clusters; the handle is the
423
+ * platform's opaque per-tenant label, never a name. */
424
+ export interface PersonMeta {
425
+ person_id: string;
426
+ handle: string;
427
+ display_name: string | null;
428
+ status: PersonStatus;
429
+ face_count: number;
430
+ text_mentions: number;
431
+ docs: number;
432
+ aliases: number;
433
+ merged_into?: string | null;
434
+ }
435
+ export interface PeoplePage {
436
+ people: PersonMeta[];
437
+ next_cursor: string | null;
438
+ }
439
+ export interface PersonAlias {
440
+ alias: string;
441
+ alias_norm: string;
442
+ decided_by: "rule" | "embed" | "llm" | "human" | (string & {});
443
+ confidence: number | null;
444
+ mention_count: number;
445
+ }
446
+ export interface CoMention {
447
+ entity_id: string;
448
+ kind: EntityKind;
449
+ label: string;
450
+ shared_docs: number;
451
+ }
452
+ /** Witness document, metadata only (title/locator/url — never body text). */
453
+ export interface EntityDocRef {
454
+ doc_id: string;
455
+ kind: string;
456
+ title: string;
457
+ locator: string;
458
+ url?: string | null;
459
+ }
460
+ export interface PersonDetail {
461
+ person: PersonMeta;
462
+ aliases: PersonAlias[];
463
+ co_mentions: CoMention[];
464
+ docs: EntityDocRef[];
465
+ }
466
+ export type PersonPatchBody = {
467
+ display_name: string;
468
+ } | {
469
+ status: "hidden" | "unknown";
470
+ };
471
+ export interface MergeResult {
472
+ person_id: string;
473
+ into_person_id: string;
474
+ faces_moved: number;
475
+ aliases_moved: number;
476
+ merge_id: number | string;
477
+ job_id: string | null;
478
+ }
479
+ export interface AliasSuggestion {
480
+ kind: EntityKind;
481
+ alias: string;
482
+ alias_norm: string;
483
+ status?: "pending" | "accepted" | "rejected";
484
+ mention_count: number;
485
+ sample_docs: Array<{
486
+ doc_id: string;
487
+ title: string;
488
+ locator: string;
489
+ }>;
490
+ suggested_entity_id?: string | null;
491
+ suggested_label?: string | null;
492
+ confidence: number | null;
493
+ decided_by: string | null;
494
+ rationale?: string | null;
495
+ }
496
+ export interface AliasesPage {
497
+ aliases: AliasSuggestion[];
498
+ next_cursor: string | null;
499
+ }
500
+ /** Alias identity is (kind, alias_norm) — there is no alias_id. */
501
+ export interface AliasDecisionBody {
502
+ kind: EntityKind;
503
+ alias_norm: string;
504
+ decision: "accept" | "reject";
505
+ entity_id?: string;
506
+ create_person?: {
507
+ display_name: string;
508
+ };
509
+ }
510
+ export interface LiveSourceTotals {
511
+ total: number;
512
+ failed: number;
513
+ /** only when the platform served the summary route */
514
+ by_kind?: Record<string, number>;
515
+ /** the paged fallback stopped at its cap — total is a floor, not a count */
516
+ truncated: boolean;
517
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Shapes from docs/api-v1.md. Additive changes only — anything breaking goes to /v2.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA,qFAAqF"}
@@ -0,0 +1,128 @@
1
+ import type { FetchLike } from "./http.js";
2
+ import type { CollectedAnswer } from "./sse.js";
3
+ import type { Answer, AnswerRequest, AnswerStreamEvent, CompleteUploadBody, CreateImportBody, CreateJobBody, CreateUploadBody, DataQuery, DataQueryResult, DatasetSummary, Enqueued, Feedback, IngestJob, JobsPage, KeyClass, PlatformResult, QueryParams, QueryResponse, Status, UploadTicket, Whoami } from "./types.js";
4
+ export interface PlatformClientConfig {
5
+ /** Tenant API base, e.g. `https://knowledge.awesomate.ai` (dev: `https://api.dev.awesomate.dev`). */
6
+ baseUrl: string;
7
+ /** A tenant key: `amk_q_` (server), `amk_p_` (browser, origin-locked), `amk_i_` (ingest), `amk_u_` (user token). */
8
+ apiKey: string;
9
+ /** Control-plane budget; answers and uploads have their own. Default 10 s. */
10
+ timeoutMs?: number;
11
+ /** Long-running answer budget. Default 5 min. */
12
+ answerTimeoutMs?: number;
13
+ /** Byte-upload budget. Default 10 min. */
14
+ uploadTimeoutMs?: number;
15
+ fetchImpl?: FetchLike;
16
+ }
17
+ export type AnswerStreamResult = {
18
+ ok: true;
19
+ status: number;
20
+ contentType: string;
21
+ /** The raw SSE body — pipe it straight through to your own response. */
22
+ body: ReadableStream<Uint8Array>;
23
+ /** Typed events over the same body; consume either `body` or `events()`, not both. */
24
+ events: () => AsyncGenerator<AnswerStreamEvent>;
25
+ /** Drain to the final text + meta. */
26
+ collect: () => Promise<CollectedAnswer>;
27
+ } | Exclude<PlatformResult<never>, {
28
+ ok: true;
29
+ }>;
30
+ /** Class of a platform key, or null when the string is not a well-formed key. */
31
+ export declare function keyClass(key: string): KeyClass | null;
32
+ /**
33
+ * Client for the tenant API (`/v1/*`). One instance = one key = one tenant; the platform
34
+ * scopes every call server-side. Never throws on the request path — see PlatformResult.
35
+ */
36
+ export declare class PlatformClient {
37
+ private readonly baseUrl;
38
+ private readonly apiKey;
39
+ private readonly timeoutMs;
40
+ private readonly answerTimeoutMs;
41
+ private readonly uploadTimeoutMs;
42
+ private readonly fetchImpl;
43
+ constructor(config: PlatformClientConfig);
44
+ isConfigured(): boolean;
45
+ private headers;
46
+ private request;
47
+ /** `POST /v1/answer`, JSON: the validated answer with numbered sources. */
48
+ answer(body: AnswerRequest, opts?: {
49
+ signal?: AbortSignal;
50
+ }): Promise<PlatformResult<Answer>>;
51
+ /** `POST /v1/answer` with `Accept: text/event-stream`: sources first, then gated sentences, then meta. */
52
+ answerStream(body: AnswerRequest, opts?: {
53
+ signal?: AbortSignal;
54
+ }): Promise<AnswerStreamResult>;
55
+ /** v2 `POST /v1/agents/:agent_id/chat` streamed (Phase 1; `404 not_found` until it lands). */
56
+ agentChatStream(agentId: string, body: {
57
+ message: string;
58
+ session_id?: string;
59
+ include_media?: boolean;
60
+ metadata?: Record<string, unknown>;
61
+ }, opts?: {
62
+ signal?: AbortSignal;
63
+ }): Promise<AnswerStreamResult>;
64
+ private stream;
65
+ /** `GET /v1/query` — raw hybrid-search passages (bypass the citation gate). */
66
+ query(params: QueryParams, opts?: {
67
+ signal?: AbortSignal;
68
+ }): Promise<PlatformResult<QueryResponse>>;
69
+ whoami(): Promise<PlatformResult<Whoami>>;
70
+ status(): Promise<PlatformResult<Status>>;
71
+ feedback(body: Feedback): Promise<PlatformResult<void>>;
72
+ /**
73
+ * `GET /v1/media/<key>`: the platform 302s to a 10-minute presigned URL. `fetch` follows
74
+ * it, so the Response carries the bytes. Prefer presigned URLs from answer sources where
75
+ * the platform supplies them; use this when you hold only a media key.
76
+ */
77
+ media(key: string, init?: {
78
+ range?: string;
79
+ signal?: AbortSignal;
80
+ }): Promise<PlatformResult<Response>>;
81
+ createUpload(body: CreateUploadBody): Promise<PlatformResult<UploadTicket>>;
82
+ completeUpload(uploadId: string, body?: CompleteUploadBody): Promise<PlatformResult<{
83
+ upload_id: string;
84
+ status: string;
85
+ }>>;
86
+ /**
87
+ * PUT the staged bytes to `put_url` EXACTLY as the platform returned it. A presigned S3 URL
88
+ * is its own credential and gets no headers of ours. On FsStore deployments the platform
89
+ * hands back its own `/v1/ingest/uploads/:id/content` route instead, which sits behind the
90
+ * same ingest-key auth as every `/v1/ingest/*` call, so that one carries the Bearer key.
91
+ * A relative `put_url` resolves against `baseUrl`.
92
+ */
93
+ uploadBytes(putUrl: string, body: BodyInit | ReadableStream<Uint8Array>, sizeBytes?: number): Promise<PlatformResult<void>>;
94
+ /** `POST /v1/ingest/jobs`; pass `idempotencyKey` so a retry returns the same job. */
95
+ createJob(body: CreateJobBody, opts?: {
96
+ idempotencyKey?: string;
97
+ }): Promise<PlatformResult<Enqueued>>;
98
+ getJob(jobId: string): Promise<PlatformResult<IngestJob>>;
99
+ listJobs(params?: {
100
+ status?: string;
101
+ limit?: number;
102
+ cursor?: string;
103
+ }): Promise<PlatformResult<JobsPage>>;
104
+ cancelJob(jobId: string): Promise<PlatformResult<{
105
+ job_id: string;
106
+ status: string;
107
+ }>>;
108
+ retryJob(jobId: string): Promise<PlatformResult<Enqueued>>;
109
+ listDatasets(): Promise<PlatformResult<{
110
+ datasets: DatasetSummary[];
111
+ }>>;
112
+ getDataset(datasetId: string): Promise<PlatformResult<DatasetSummary & Record<string, unknown>>>;
113
+ queryData(dsl: DataQuery, opts?: {
114
+ signal?: AbortSignal;
115
+ }): Promise<PlatformResult<DataQueryResult>>;
116
+ createImport(body: CreateImportBody, opts?: {
117
+ idempotencyKey?: string;
118
+ }): Promise<PlatformResult<Enqueued & {
119
+ import_id: string | null;
120
+ }>>;
121
+ getImport(id: string): Promise<PlatformResult<Record<string, unknown>>>;
122
+ }
123
+ /**
124
+ * Shared by the tenant and service clients: a PUT of raw bytes to the platform's `put_url`.
125
+ * `headers` is empty for presigned URLs (the URL is the credential) and carries the Bearer
126
+ * key only for the platform's own auth-gated upload route.
127
+ */
128
+ export declare function uploadTo(fetchImpl: FetchLike, url: string, body: BodyInit | ReadableStream<Uint8Array>, sizeBytes: number | undefined, timeoutMs: number, headers?: Record<string, string>): Promise<PlatformResult<void>>;