@anvailabs/proximadb-client 0.3.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 (65) hide show
  1. package/README.md +160 -0
  2. package/dist/client.d.ts +319 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +681 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/collection.d.ts +227 -0
  7. package/dist/collection.d.ts.map +1 -0
  8. package/dist/collection.js +436 -0
  9. package/dist/collection.js.map +1 -0
  10. package/dist/esm/client.js +674 -0
  11. package/dist/esm/client.js.map +1 -0
  12. package/dist/esm/collection.js +428 -0
  13. package/dist/esm/collection.js.map +1 -0
  14. package/dist/esm/filter.js +228 -0
  15. package/dist/esm/filter.js.map +1 -0
  16. package/dist/esm/generated/schema.js +6 -0
  17. package/dist/esm/generated/schema.js.map +1 -0
  18. package/dist/esm/graph.js +678 -0
  19. package/dist/esm/graph.js.map +1 -0
  20. package/dist/esm/index.js +86 -0
  21. package/dist/esm/index.js.map +1 -0
  22. package/dist/esm/search.js +317 -0
  23. package/dist/esm/search.js.map +1 -0
  24. package/dist/esm/transport.js +33 -0
  25. package/dist/esm/transport.js.map +1 -0
  26. package/dist/esm/types.js +181 -0
  27. package/dist/esm/types.js.map +1 -0
  28. package/dist/filter.d.ts +51 -0
  29. package/dist/filter.d.ts.map +1 -0
  30. package/dist/filter.js +241 -0
  31. package/dist/filter.js.map +1 -0
  32. package/dist/generated/schema.d.ts +4271 -0
  33. package/dist/generated/schema.d.ts.map +1 -0
  34. package/dist/generated/schema.js +7 -0
  35. package/dist/generated/schema.js.map +1 -0
  36. package/dist/graph.d.ts +350 -0
  37. package/dist/graph.d.ts.map +1 -0
  38. package/dist/graph.js +690 -0
  39. package/dist/graph.js.map +1 -0
  40. package/dist/index.d.ts +58 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +126 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/search.d.ts +160 -0
  45. package/dist/search.d.ts.map +1 -0
  46. package/dist/search.js +322 -0
  47. package/dist/search.js.map +1 -0
  48. package/dist/transport.d.ts +40 -0
  49. package/dist/transport.d.ts.map +1 -0
  50. package/dist/transport.js +39 -0
  51. package/dist/transport.js.map +1 -0
  52. package/dist/types.d.ts +632 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +185 -0
  55. package/dist/types.js.map +1 -0
  56. package/package.json +72 -0
  57. package/src/client.ts +856 -0
  58. package/src/collection.ts +578 -0
  59. package/src/filter.ts +280 -0
  60. package/src/generated/schema.ts +4271 -0
  61. package/src/graph.ts +811 -0
  62. package/src/index.ts +184 -0
  63. package/src/search.ts +401 -0
  64. package/src/transport.ts +52 -0
  65. package/src/types.ts +726 -0
@@ -0,0 +1,4271 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+
6
+ export interface paths {
7
+ "/api/v2/collections": {
8
+ parameters: {
9
+ query?: never;
10
+ header?: never;
11
+ path?: never;
12
+ cookie?: never;
13
+ };
14
+ /**
15
+ * List collections.
16
+ * @description List all collections with pagination.
17
+ *
18
+ * ## Query Parameters
19
+ *
20
+ * - `limit`: Maximum number of collections to return (default: 100)
21
+ * - `offset`: Offset for pagination (default: 0)
22
+ * - `include_stats`: Whether to include collection statistics
23
+ *
24
+ * ## Response
25
+ *
26
+ * Returns [`ListCollectionsV2Response`] with collection list.
27
+ *
28
+ * ## Errors
29
+ *
30
+ * - `500 Internal Server Error`: List operation failed
31
+ */
32
+ get: operations["listCollections"];
33
+ put?: never;
34
+ /**
35
+ * Create a collection with optional schema.
36
+ * @description Create a new collection with optional schema support.
37
+ *
38
+ * ## Request Body
39
+ *
40
+ * See [`CreateCollectionV2Request`] for the expected JSON format.
41
+ *
42
+ * ## Response
43
+ *
44
+ * Returns [`CreateCollectionV2Response`] with collection details.
45
+ *
46
+ * ## Errors
47
+ *
48
+ * - `400 Bad Request`: Invalid request or schema
49
+ * - `409 Conflict`: Collection already exists
50
+ * - `500 Internal Server Error`: Creation failed
51
+ */
52
+ post: operations["createCollection"];
53
+ delete?: never;
54
+ options?: never;
55
+ head?: never;
56
+ patch?: never;
57
+ trace?: never;
58
+ };
59
+ "/api/v2/collections/{collection_id}": {
60
+ parameters: {
61
+ query?: never;
62
+ header?: never;
63
+ path?: never;
64
+ cookie?: never;
65
+ };
66
+ /**
67
+ * Get collection details.
68
+ * @description Get collection details including schema and statistics.
69
+ *
70
+ * ## Path Parameters
71
+ *
72
+ * - `collection_id`: Collection name/ID
73
+ *
74
+ * ## Response
75
+ *
76
+ * Returns [`CollectionV2Response`] with collection details.
77
+ *
78
+ * ## Errors
79
+ *
80
+ * - `404 Not Found`: Collection does not exist
81
+ * - `500 Internal Server Error`: Retrieval failed
82
+ */
83
+ get: operations["getCollection"];
84
+ put?: never;
85
+ post?: never;
86
+ /**
87
+ * Delete a collection.
88
+ * @description Delete a collection by ID/name. This v2 route keeps SDK lifecycle methods on
89
+ * the ProximaRecord-era API while delegating to the existing collection control
90
+ * plane.
91
+ */
92
+ delete: operations["deleteCollection"];
93
+ options?: never;
94
+ head?: never;
95
+ patch?: never;
96
+ trace?: never;
97
+ };
98
+ "/api/v2/collections/{collection_id}/documents": {
99
+ parameters: {
100
+ query?: never;
101
+ header?: never;
102
+ path?: never;
103
+ cookie?: never;
104
+ };
105
+ get?: never;
106
+ put?: never;
107
+ /**
108
+ * Ingest documents for native server-side embedding.
109
+ * @description Canonical document-ingest surface (ADR-041, spec-driven-primary). Body `{records:[{id,text,metadata}]}`; the server embeds `text` natively under `X-Embed-Source=native` (default) when no per-record `vector` is supplied. `X-Tenant-ID` scopes records to a tenant; `X-Ingest-Mode` carries the billing mode.
110
+ */
111
+ post: operations["ingestDocuments"];
112
+ delete?: never;
113
+ options?: never;
114
+ head?: never;
115
+ patch?: never;
116
+ trace?: never;
117
+ };
118
+ "/api/v2/collections/{collection_id}/entities": {
119
+ parameters: {
120
+ query?: never;
121
+ header?: never;
122
+ path?: never;
123
+ cookie?: never;
124
+ };
125
+ get?: never;
126
+ put?: never;
127
+ post: operations["upsert_entity_v2"];
128
+ delete?: never;
129
+ options?: never;
130
+ head?: never;
131
+ patch?: never;
132
+ trace?: never;
133
+ };
134
+ "/api/v2/collections/{collection_id}/entities/search": {
135
+ parameters: {
136
+ query?: never;
137
+ header?: never;
138
+ path?: never;
139
+ cookie?: never;
140
+ };
141
+ get?: never;
142
+ put?: never;
143
+ post: operations["search_entities_v2"];
144
+ delete?: never;
145
+ options?: never;
146
+ head?: never;
147
+ patch?: never;
148
+ trace?: never;
149
+ };
150
+ "/api/v2/collections/{collection_id}/entities/{entity_id}": {
151
+ parameters: {
152
+ query?: never;
153
+ header?: never;
154
+ path?: never;
155
+ cookie?: never;
156
+ };
157
+ get: operations["get_entity_v2"];
158
+ put?: never;
159
+ post?: never;
160
+ delete: operations["delete_entity_v2"];
161
+ options?: never;
162
+ head?: never;
163
+ patch?: never;
164
+ trace?: never;
165
+ };
166
+ "/api/v2/collections/{collection_id}/records/batch": {
167
+ parameters: {
168
+ query?: never;
169
+ header?: never;
170
+ path?: never;
171
+ cookie?: never;
172
+ };
173
+ get?: never;
174
+ put?: never;
175
+ /**
176
+ * Insert or upsert ProximaRecord batches.
177
+ * @description Insert ProximaRecords into a collection with typed field support.
178
+ *
179
+ * ## Request Body
180
+ *
181
+ * See [`InsertRecordsRequest`] for the expected JSON format.
182
+ *
183
+ * ## Response
184
+ *
185
+ * Returns [`InsertRecordsResponse`] with counts and any errors.
186
+ *
187
+ * ## Errors
188
+ *
189
+ * - `400 Bad Request`: Invalid request format or validation error
190
+ * - `404 Not Found`: Collection does not exist
191
+ * - `500 Internal Server Error`: Storage or processing error
192
+ */
193
+ post: operations["insertRecords"];
194
+ delete?: never;
195
+ options?: never;
196
+ head?: never;
197
+ patch?: never;
198
+ trace?: never;
199
+ };
200
+ "/api/v2/collections/{collection_id}/records/scan": {
201
+ parameters: {
202
+ query?: never;
203
+ header?: never;
204
+ path?: never;
205
+ cookie?: never;
206
+ };
207
+ get?: never;
208
+ put?: never;
209
+ /**
210
+ * Paginated scan of records in a collection.
211
+ * @description Returns the next page of records (TD-099 acceptance 2 + 3, live).
212
+ * Cursor-based pagination: pass the response's `next_cursor` back as
213
+ * `cursor` to fetch the next page; a `null` cursor means the scan is
214
+ * exhausted. Cursors are minted and validated against the caller-facing
215
+ * collection id in the URL path, expire after 24h (HTTP 410), and reject
216
+ * cross-collection reuse (HTTP 400).
217
+ */
218
+ post: operations["scanRecords"];
219
+ delete?: never;
220
+ options?: never;
221
+ head?: never;
222
+ patch?: never;
223
+ trace?: never;
224
+ };
225
+ "/api/v2/collections/{collection_id}/records/{record_id}": {
226
+ parameters: {
227
+ query?: never;
228
+ header?: never;
229
+ path?: never;
230
+ cookie?: never;
231
+ };
232
+ /**
233
+ * Get a record by ID.
234
+ * @description Get a single record by ID.
235
+ *
236
+ * ## Path Parameters
237
+ *
238
+ * - `collection_id`: Collection name/ID
239
+ * - `record_id`: Record ID
240
+ *
241
+ * ## Query Parameters
242
+ *
243
+ * - `include_vector`: Whether to include the vector (default: true)
244
+ * - `include_text`: Whether to include TEXT fields (default: false)
245
+ *
246
+ * ## Response
247
+ *
248
+ * Returns [`RecordV2Response`] with record details.
249
+ *
250
+ * ## Errors
251
+ *
252
+ * - `404 Not Found`: Collection or record does not exist
253
+ * - `500 Internal Server Error`: Retrieval failed
254
+ */
255
+ get: operations["getRecord"];
256
+ put?: never;
257
+ post?: never;
258
+ /**
259
+ * Delete a record by ID.
260
+ * @description Delete a single record by writing a tombstone through the rich record path.
261
+ */
262
+ delete: operations["deleteRecord"];
263
+ options?: never;
264
+ head?: never;
265
+ patch?: never;
266
+ trace?: never;
267
+ };
268
+ "/api/v2/collections/{collection_id}/schema": {
269
+ parameters: {
270
+ query?: never;
271
+ header?: never;
272
+ path?: never;
273
+ cookie?: never;
274
+ };
275
+ /**
276
+ * Get collection schema.
277
+ * @description Retrieve the schema definition for a collection.
278
+ *
279
+ * ## Path Parameters
280
+ *
281
+ * - `collection_id`: Collection name/ID
282
+ *
283
+ * ## Response
284
+ *
285
+ * Returns [`SchemaResponse`] with full schema details.
286
+ *
287
+ * ## Errors
288
+ *
289
+ * - `404 Not Found`: Collection or schema does not exist
290
+ * - `500 Internal Server Error`: Retrieval failed
291
+ */
292
+ get: operations["getCollectionSchema"];
293
+ /**
294
+ * Update collection schema.
295
+ * @description Update the schema for a collection.
296
+ *
297
+ * ## Path Parameters
298
+ *
299
+ * - `collection_id`: Collection name/ID
300
+ *
301
+ * ## Request Body
302
+ *
303
+ * See [`UpdateSchemaRequest`] for the expected JSON format.
304
+ *
305
+ * ## Response
306
+ *
307
+ * Returns [`UpdateSchemaResponse`] with change details.
308
+ *
309
+ * ## Schema Evolution
310
+ *
311
+ * Schema updates must follow evolution rules to maintain data compatibility.
312
+ * See [`UpdateSchemaRequest`] for detailed rules.
313
+ *
314
+ * ## Errors
315
+ *
316
+ * - `400 Bad Request`: Invalid schema or evolution violation
317
+ * - `404 Not Found`: Collection does not exist
318
+ * - `409 Conflict`: Incompatible schema change
319
+ * - `500 Internal Server Error`: Update failed
320
+ */
321
+ put: operations["updateCollectionSchema"];
322
+ post?: never;
323
+ delete?: never;
324
+ options?: never;
325
+ head?: never;
326
+ patch?: never;
327
+ trace?: never;
328
+ };
329
+ "/api/v2/collections/{collection_id}/search": {
330
+ parameters: {
331
+ query?: never;
332
+ header?: never;
333
+ path?: never;
334
+ cookie?: never;
335
+ };
336
+ get?: never;
337
+ put?: never;
338
+ /**
339
+ * Search records with vector similarity and typed filters.
340
+ * @description Search a collection with typed filters.
341
+ *
342
+ * ## Request Body
343
+ *
344
+ * See [`TypedSearchRequest`] for the expected JSON format.
345
+ *
346
+ * ## Response
347
+ *
348
+ * Returns [`TypedSearchResponse`] with ranked results.
349
+ *
350
+ * ## Errors
351
+ *
352
+ * - `400 Bad Request`: Invalid request format or filter error
353
+ * - `404 Not Found`: Collection does not exist
354
+ * - `500 Internal Server Error`: Search execution error
355
+ */
356
+ post: operations["searchRecords"];
357
+ delete?: never;
358
+ options?: never;
359
+ head?: never;
360
+ patch?: never;
361
+ trace?: never;
362
+ };
363
+ "/api/v2/graphs/{graph_id}/fusion-search": {
364
+ parameters: {
365
+ query?: never;
366
+ header?: never;
367
+ path?: never;
368
+ cookie?: never;
369
+ };
370
+ get?: never;
371
+ put?: never;
372
+ /** `POST /api/v2/graphs/{graph_id}/fusion-search` — vector seed → graph expand → calibrated fuse-by-oid. */
373
+ post: operations["fusion_search_v2"];
374
+ delete?: never;
375
+ options?: never;
376
+ head?: never;
377
+ patch?: never;
378
+ trace?: never;
379
+ };
380
+ "/api/v2/graphs/{graph_id}/impact-analysis": {
381
+ parameters: {
382
+ query?: never;
383
+ header?: never;
384
+ path?: never;
385
+ cookie?: never;
386
+ };
387
+ get?: never;
388
+ put?: never;
389
+ /**
390
+ * `POST /api/v2/graphs/{graph_id}/impact-analysis` — forward/backward blast radius (TD-131). The
391
+ * server-side baseline for the embedded-parity gate; mirrors `GraphOperationsService::impact_analysis`.
392
+ */
393
+ post: operations["impact_analysis_v2"];
394
+ delete?: never;
395
+ options?: never;
396
+ head?: never;
397
+ patch?: never;
398
+ trace?: never;
399
+ };
400
+ "/api/v2/model-registries": {
401
+ parameters: {
402
+ query?: never;
403
+ header?: never;
404
+ path?: never;
405
+ cookie?: never;
406
+ };
407
+ get: operations["listModelRegistries"];
408
+ put?: never;
409
+ post: operations["createModelRegistry"];
410
+ delete?: never;
411
+ options?: never;
412
+ head?: never;
413
+ patch?: never;
414
+ trace?: never;
415
+ };
416
+ "/api/v2/model-registries/{name}": {
417
+ parameters: {
418
+ query?: never;
419
+ header?: never;
420
+ path?: never;
421
+ cookie?: never;
422
+ };
423
+ get: operations["getModelRegistry"];
424
+ put?: never;
425
+ post?: never;
426
+ delete?: never;
427
+ options?: never;
428
+ head?: never;
429
+ patch?: never;
430
+ trace?: never;
431
+ };
432
+ "/api/v2/model-registries/{name}/mutations": {
433
+ parameters: {
434
+ query?: never;
435
+ header?: never;
436
+ path?: never;
437
+ cookie?: never;
438
+ };
439
+ get?: never;
440
+ put?: never;
441
+ post: operations["applyModelRegistryMutation"];
442
+ delete?: never;
443
+ options?: never;
444
+ head?: never;
445
+ patch?: never;
446
+ trace?: never;
447
+ };
448
+ "/api/v2/model-registries/{name}/resolve": {
449
+ parameters: {
450
+ query?: never;
451
+ header?: never;
452
+ path?: never;
453
+ cookie?: never;
454
+ };
455
+ get?: never;
456
+ put?: never;
457
+ post: operations["resolveModelAlias"];
458
+ delete?: never;
459
+ options?: never;
460
+ head?: never;
461
+ patch?: never;
462
+ trace?: never;
463
+ };
464
+ "/api/v2/query": {
465
+ parameters: {
466
+ query?: never;
467
+ header?: never;
468
+ path?: never;
469
+ cookie?: never;
470
+ };
471
+ get?: never;
472
+ put?: never;
473
+ /**
474
+ * Execute AQL or UQL through the shared query facade.
475
+ * @description The canonical unified query surface: UQL (unified multi-modal), federated SQL
476
+ * extensions, and AQL. This is NOT plain SQL-over-REST and is NOT deprecated:
477
+ * UQL/AQL are non-SQL languages that pgwire and `/api/v2/sql` cannot serve, so
478
+ * this endpoint remains their canonical home. Authenticated programmatic SQL
479
+ * is available through both gRPC `ExecuteQuery` and `/api/v2/sql`; neither is a
480
+ * replacement for this UQL/federated surface.
481
+ */
482
+ post: operations["executeQuery"];
483
+ delete?: never;
484
+ options?: never;
485
+ head?: never;
486
+ patch?: never;
487
+ trace?: never;
488
+ };
489
+ "/api/v2/query/explain": {
490
+ parameters: {
491
+ query?: never;
492
+ header?: never;
493
+ path?: never;
494
+ cookie?: never;
495
+ };
496
+ get?: never;
497
+ put?: never;
498
+ /** Explain an AQL or UQL query through the shared query facade. */
499
+ post: operations["explainQuery"];
500
+ delete?: never;
501
+ options?: never;
502
+ head?: never;
503
+ patch?: never;
504
+ trace?: never;
505
+ };
506
+ "/api/v2/sql": {
507
+ parameters: {
508
+ query?: never;
509
+ header?: never;
510
+ path?: never;
511
+ cookie?: never;
512
+ };
513
+ get?: never;
514
+ put?: never;
515
+ /**
516
+ * Execute one authenticated SQL statement.
517
+ * @description The required foundation identity is inserted by the root tenant middleware
518
+ * after authentication. A router mounted without that middleware fails closed
519
+ * at extraction instead of constructing an anonymous authorization carrier.
520
+ */
521
+ post: operations["executeSql"];
522
+ delete?: never;
523
+ options?: never;
524
+ head?: never;
525
+ patch?: never;
526
+ trace?: never;
527
+ };
528
+ "/health": {
529
+ parameters: {
530
+ query?: never;
531
+ header?: never;
532
+ path?: never;
533
+ cookie?: never;
534
+ };
535
+ /** Get server health. */
536
+ get: operations["getHealth"];
537
+ put?: never;
538
+ post?: never;
539
+ delete?: never;
540
+ options?: never;
541
+ head?: never;
542
+ patch?: never;
543
+ trace?: never;
544
+ };
545
+ "/health/live": {
546
+ parameters: {
547
+ query?: never;
548
+ header?: never;
549
+ path?: never;
550
+ cookie?: never;
551
+ };
552
+ /** Kubernetes liveness probe. */
553
+ get: operations["getLiveness"];
554
+ put?: never;
555
+ post?: never;
556
+ delete?: never;
557
+ options?: never;
558
+ head?: never;
559
+ patch?: never;
560
+ trace?: never;
561
+ };
562
+ "/health/ready": {
563
+ parameters: {
564
+ query?: never;
565
+ header?: never;
566
+ path?: never;
567
+ cookie?: never;
568
+ };
569
+ /** Kubernetes readiness probe. */
570
+ get: operations["getReadiness"];
571
+ put?: never;
572
+ post?: never;
573
+ delete?: never;
574
+ options?: never;
575
+ head?: never;
576
+ patch?: never;
577
+ trace?: never;
578
+ };
579
+ "/api/v2/_meta/capabilities": {
580
+ parameters: {
581
+ query?: never;
582
+ header?: never;
583
+ path?: never;
584
+ cookie?: never;
585
+ };
586
+ /**
587
+ * Negotiate server capabilities.
588
+ * @description Advertises API version, supported features, limits, and the error- envelope contract so SDKs can adapt instead of hard-coding assumptions.
589
+ */
590
+ get: operations["getCapabilities"];
591
+ put?: never;
592
+ post?: never;
593
+ delete?: never;
594
+ options?: never;
595
+ head?: never;
596
+ patch?: never;
597
+ trace?: never;
598
+ };
599
+ "/api/v2/graphs": {
600
+ parameters: {
601
+ query?: never;
602
+ header?: never;
603
+ path?: never;
604
+ cookie?: never;
605
+ };
606
+ /** List graph collections. */
607
+ get: operations["listGraphs"];
608
+ put?: never;
609
+ /** Create a graph collection. */
610
+ post: operations["createGraph"];
611
+ delete?: never;
612
+ options?: never;
613
+ head?: never;
614
+ patch?: never;
615
+ trace?: never;
616
+ };
617
+ "/api/v2/graphs/{graph_id}": {
618
+ parameters: {
619
+ query?: never;
620
+ header?: never;
621
+ path: {
622
+ graph_id: components["parameters"]["GraphId"];
623
+ };
624
+ cookie?: never;
625
+ };
626
+ /** Get a graph collection by id. */
627
+ get: operations["getGraph"];
628
+ put?: never;
629
+ post?: never;
630
+ /** Delete a graph collection. */
631
+ delete: operations["deleteGraph"];
632
+ options?: never;
633
+ head?: never;
634
+ patch?: never;
635
+ trace?: never;
636
+ };
637
+ "/api/v2/graphs/{graph_id}/nodes": {
638
+ parameters: {
639
+ query?: never;
640
+ header?: never;
641
+ path: {
642
+ graph_id: components["parameters"]["GraphId"];
643
+ };
644
+ cookie?: never;
645
+ };
646
+ get?: never;
647
+ put?: never;
648
+ /** Create a node in a graph. */
649
+ post: operations["createNode"];
650
+ delete?: never;
651
+ options?: never;
652
+ head?: never;
653
+ patch?: never;
654
+ trace?: never;
655
+ };
656
+ "/api/v2/graphs/{graph_id}/nodes/{node_id}": {
657
+ parameters: {
658
+ query?: never;
659
+ header?: never;
660
+ path: {
661
+ graph_id: components["parameters"]["GraphId"];
662
+ node_id: components["parameters"]["NodeId"];
663
+ };
664
+ cookie?: never;
665
+ };
666
+ /** Get a node by id. */
667
+ get: operations["getNode"];
668
+ put?: never;
669
+ post?: never;
670
+ /** Delete a node by id. */
671
+ delete: operations["deleteNode"];
672
+ options?: never;
673
+ head?: never;
674
+ patch?: never;
675
+ trace?: never;
676
+ };
677
+ "/api/v2/graphs/{graph_id}/edges": {
678
+ parameters: {
679
+ query?: never;
680
+ header?: never;
681
+ path: {
682
+ graph_id: components["parameters"]["GraphId"];
683
+ };
684
+ cookie?: never;
685
+ };
686
+ get?: never;
687
+ put?: never;
688
+ /** Create an edge in a graph. */
689
+ post: operations["createEdge"];
690
+ delete?: never;
691
+ options?: never;
692
+ head?: never;
693
+ patch?: never;
694
+ trace?: never;
695
+ };
696
+ "/api/v2/graphs/{graph_id}/nodes/batch": {
697
+ parameters: {
698
+ query?: never;
699
+ header?: never;
700
+ path: {
701
+ graph_id: components["parameters"]["GraphId"];
702
+ };
703
+ cookie?: never;
704
+ };
705
+ get?: never;
706
+ put?: never;
707
+ /**
708
+ * Create multiple nodes in a single call.
709
+ * @description Batch counterpart to `createNode`. Use this on bulk-ingest paths
710
+ * where individual round-trips would dominate latency.
711
+ */
712
+ post: operations["batchCreateNodes"];
713
+ delete?: never;
714
+ options?: never;
715
+ head?: never;
716
+ patch?: never;
717
+ trace?: never;
718
+ };
719
+ "/api/v2/graphs/{graph_id}/edges/batch": {
720
+ parameters: {
721
+ query?: never;
722
+ header?: never;
723
+ path: {
724
+ graph_id: components["parameters"]["GraphId"];
725
+ };
726
+ cookie?: never;
727
+ };
728
+ get?: never;
729
+ put?: never;
730
+ /**
731
+ * Create multiple edges in a single call.
732
+ * @description Batch counterpart to `createEdge`.
733
+ */
734
+ post: operations["batchCreateEdges"];
735
+ delete?: never;
736
+ options?: never;
737
+ head?: never;
738
+ patch?: never;
739
+ trace?: never;
740
+ };
741
+ "/api/v2/graphs/{graph_id}/traverse": {
742
+ parameters: {
743
+ query?: never;
744
+ header?: never;
745
+ path: {
746
+ graph_id: components["parameters"]["GraphId"];
747
+ };
748
+ cookie?: never;
749
+ };
750
+ get?: never;
751
+ put?: never;
752
+ /** Traverse a graph from a start node. */
753
+ post: operations["traverseGraph"];
754
+ delete?: never;
755
+ options?: never;
756
+ head?: never;
757
+ patch?: never;
758
+ trace?: never;
759
+ };
760
+ "/api/v2/graphs/{graph_id}/stats": {
761
+ parameters: {
762
+ query?: never;
763
+ header?: never;
764
+ path: {
765
+ graph_id: components["parameters"]["GraphId"];
766
+ };
767
+ cookie?: never;
768
+ };
769
+ /** Get graph statistics. */
770
+ get: operations["getGraphStats"];
771
+ put?: never;
772
+ post?: never;
773
+ delete?: never;
774
+ options?: never;
775
+ head?: never;
776
+ patch?: never;
777
+ trace?: never;
778
+ };
779
+ "/api/v2/hybrid/search": {
780
+ parameters: {
781
+ query?: never;
782
+ header?: never;
783
+ path?: never;
784
+ cookie?: never;
785
+ };
786
+ get?: never;
787
+ put?: never;
788
+ /** BM25 + vector hybrid (fusion) search. */
789
+ post: operations["hybridSearch"];
790
+ delete?: never;
791
+ options?: never;
792
+ head?: never;
793
+ patch?: never;
794
+ trace?: never;
795
+ };
796
+ "/api/v2/hybrid/index": {
797
+ parameters: {
798
+ query?: never;
799
+ header?: never;
800
+ path?: never;
801
+ cookie?: never;
802
+ };
803
+ get?: never;
804
+ put?: never;
805
+ /** Index documents for BM25 full-text search. */
806
+ post: operations["hybridIndex"];
807
+ delete?: never;
808
+ options?: never;
809
+ head?: never;
810
+ patch?: never;
811
+ trace?: never;
812
+ };
813
+ "/api/v2/document-collections": {
814
+ parameters: {
815
+ query?: never;
816
+ header?: never;
817
+ path?: never;
818
+ cookie?: never;
819
+ };
820
+ /** List document collections. */
821
+ get: operations["listDocumentCollections"];
822
+ put?: never;
823
+ /** Create a document collection. */
824
+ post: operations["createDocumentCollection"];
825
+ delete?: never;
826
+ options?: never;
827
+ head?: never;
828
+ patch?: never;
829
+ trace?: never;
830
+ };
831
+ "/api/v2/document-collections/{collection}/documents": {
832
+ parameters: {
833
+ query?: never;
834
+ header?: never;
835
+ path: {
836
+ collection: string;
837
+ };
838
+ cookie?: never;
839
+ };
840
+ /** Query documents. */
841
+ get: operations["queryDocuments"];
842
+ put?: never;
843
+ /** Insert a document. */
844
+ post: operations["insertDocument"];
845
+ delete?: never;
846
+ options?: never;
847
+ head?: never;
848
+ patch?: never;
849
+ trace?: never;
850
+ };
851
+ "/api/v2/observability/namespaces/{namespace}/logs": {
852
+ parameters: {
853
+ query?: never;
854
+ header?: never;
855
+ path: {
856
+ namespace: string;
857
+ };
858
+ cookie?: never;
859
+ };
860
+ get?: never;
861
+ put?: never;
862
+ /** Ingest a log entry. */
863
+ post: operations["ingestLog"];
864
+ delete?: never;
865
+ options?: never;
866
+ head?: never;
867
+ patch?: never;
868
+ trace?: never;
869
+ };
870
+ "/api/v2/observability/namespaces/{namespace}/logs/search": {
871
+ parameters: {
872
+ query?: never;
873
+ header?: never;
874
+ path: {
875
+ namespace: string;
876
+ };
877
+ cookie?: never;
878
+ };
879
+ get?: never;
880
+ put?: never;
881
+ /** Query logs. */
882
+ post: operations["queryLogs"];
883
+ delete?: never;
884
+ options?: never;
885
+ head?: never;
886
+ patch?: never;
887
+ trace?: never;
888
+ };
889
+ }
890
+ export type webhooks = Record<string, never>;
891
+ export interface components {
892
+ schemas: {
893
+ ApplyModelRegistryMutationRequest: {
894
+ /**
895
+ * Format: int64
896
+ * @description Optimistic concurrency token returned by the previous read or mutation.
897
+ */
898
+ expected_revision: number;
899
+ /** @description Command-shaped mutation; whole-registry replacement is intentionally unsupported. */
900
+ mutation: components["schemas"]["CatalogModelRegistryMutation"];
901
+ };
902
+ /** @description Content-addressed reference to bytes held outside xCatalog. */
903
+ CatalogArtifactDescriptor: {
904
+ uri: string;
905
+ digest: string;
906
+ /** Format: int64 */
907
+ size_bytes: number;
908
+ media_type: string;
909
+ };
910
+ /** @description Mutable serving intent that always resolves to an immutable version/digest. */
911
+ CatalogDeploymentBinding: {
912
+ name: string;
913
+ /** Format: int64 */
914
+ version: number;
915
+ artifact_digest: string;
916
+ runtime: string;
917
+ endpoint: string;
918
+ /** Format: int64 */
919
+ updated_at_ms: number;
920
+ };
921
+ CatalogDimensionPolicy: "fixed" | "discrete" | {
922
+ range: components["schemas"]["CatalogDimensionRange"];
923
+ };
924
+ CatalogDimensionRange: {
925
+ /** Format: int32 */
926
+ minimum: number;
927
+ };
928
+ /** @description Exact rendered-input and tokenizer budget consumed by an embedding runtime. */
929
+ CatalogEmbeddingInputContract: {
930
+ model_revision: string;
931
+ tokenizer_id: string;
932
+ tokenizer_revision: string;
933
+ tokenizer_fingerprint: string;
934
+ /** Format: int32 */
935
+ declared_context_limit: number;
936
+ /** Format: int32 */
937
+ effective_context_limit: number;
938
+ /** Format: int32 */
939
+ special_token_count: number;
940
+ document_template: string;
941
+ query_template: string;
942
+ document_parameters?: {
943
+ [key: string]: string;
944
+ };
945
+ query_parameters?: {
946
+ [key: string]: string;
947
+ };
948
+ };
949
+ /**
950
+ * @description Registered embedding model: immutable versions plus separately mutable or
951
+ * append-only lifecycle records.
952
+ */
953
+ CatalogEmbeddingModelRegistry: {
954
+ /** Format: int32 */
955
+ schema_version: number;
956
+ /**
957
+ * Format: int64
958
+ * @description Optimistic concurrency token for catalog/API mutations. Old rows default
959
+ * to zero; every successful command increments it.
960
+ */
961
+ revision?: number;
962
+ name: string;
963
+ versions?: {
964
+ [key: string]: components["schemas"]["CatalogEmbeddingModelVersion"];
965
+ };
966
+ aliases?: {
967
+ [key: string]: number;
968
+ };
969
+ evidence?: components["schemas"]["CatalogEvaluationEvidence"][];
970
+ decisions?: components["schemas"]["CatalogModelDecision"][];
971
+ deployments?: {
972
+ [key: string]: components["schemas"]["CatalogDeploymentBinding"];
973
+ };
974
+ tags?: {
975
+ [key: string]: string;
976
+ };
977
+ };
978
+ /** @description Immutable executable contract for one registered model version. */
979
+ CatalogEmbeddingModelVersion: {
980
+ /** Format: int64 */
981
+ version: number;
982
+ provider_model_id: string;
983
+ artifact: components["schemas"]["CatalogArtifactDescriptor"];
984
+ input: components["schemas"]["CatalogEmbeddingInputContract"];
985
+ output: components["schemas"]["CatalogEmbeddingOutputContract"];
986
+ governance?: components["schemas"]["CatalogModelGovernance"];
987
+ lineage?: components["schemas"]["CatalogModelLineage"];
988
+ /** Format: int64 */
989
+ created_at_ms: number;
990
+ source_run_id?: string | null;
991
+ };
992
+ CatalogEmbeddingOutputContract: {
993
+ /** Format: int32 */
994
+ native_dimension: number;
995
+ dimension_policy: components["schemas"]["CatalogDimensionPolicy"];
996
+ supported_dimensions: number[];
997
+ normalized: boolean;
998
+ pooling: string;
999
+ };
1000
+ /** @description Append-only evaluation summary. Large row-level results remain external. */
1001
+ CatalogEvaluationEvidence: {
1002
+ evidence_id: string;
1003
+ /** Format: int64 */
1004
+ version: number;
1005
+ dataset_name: string;
1006
+ dataset_digest: string;
1007
+ evaluator: string;
1008
+ metrics: {
1009
+ [key: string]: number;
1010
+ };
1011
+ /** Format: int64 */
1012
+ created_at_ms: number;
1013
+ };
1014
+ /** @description Digest-pinned input consumed by the execution that produced a model. */
1015
+ CatalogLineageInput: {
1016
+ kind: components["schemas"]["CatalogLineageInputKind"];
1017
+ name: string;
1018
+ digest: string;
1019
+ };
1020
+ /** @enum {string} */
1021
+ CatalogLineageInputKind: "dataset" | "feature_set" | "model" | "artifact";
1022
+ /** @enum {string} */
1023
+ CatalogModelAccess: "open" | "gated" | "unreviewed";
1024
+ CatalogModelAliasMutation: {
1025
+ alias: string;
1026
+ /** Format: int64 */
1027
+ version: number;
1028
+ };
1029
+ /** @description Append-only policy/audit decision, intentionally separate from evidence. */
1030
+ CatalogModelDecision: {
1031
+ decision_id: string;
1032
+ /** Format: int64 */
1033
+ version: number;
1034
+ decision: components["schemas"]["CatalogModelDecisionKind"];
1035
+ evidence_ids: string[];
1036
+ principal: string;
1037
+ /** Format: int64 */
1038
+ created_at_ms: number;
1039
+ };
1040
+ /** @enum {string} */
1041
+ CatalogModelDecisionKind: "approved" | "rejected" | "deprecated";
1042
+ /**
1043
+ * @description Supply-chain and runtime policy declared for an immutable model version.
1044
+ * Approval decisions remain separate append-only audit records.
1045
+ */
1046
+ CatalogModelGovernance: {
1047
+ license_id?: string;
1048
+ access?: components["schemas"]["CatalogModelAccess"];
1049
+ requires_remote_code?: boolean;
1050
+ approved_runtimes?: string[];
1051
+ };
1052
+ /** @description MLMD/OpenLineage-shaped producer execution and its declared inputs. */
1053
+ CatalogModelLineage: {
1054
+ producer_execution_id?: string | null;
1055
+ code_revision?: string | null;
1056
+ inputs?: components["schemas"]["CatalogLineageInput"][];
1057
+ };
1058
+ /**
1059
+ * @description Command-shaped mutations preserve version/evidence/decision immutability at
1060
+ * the persistence boundary. API adapters lower into these commands instead
1061
+ * of replacing a whole registry document.
1062
+ */
1063
+ CatalogModelRegistryMutation: {
1064
+ payload: components["schemas"]["CatalogEmbeddingModelVersion"];
1065
+ /** @enum {string} */
1066
+ operation: "register_version";
1067
+ } | {
1068
+ payload: components["schemas"]["CatalogModelAliasMutation"];
1069
+ /** @enum {string} */
1070
+ operation: "set_alias";
1071
+ } | {
1072
+ payload: components["schemas"]["CatalogEvaluationEvidence"];
1073
+ /** @enum {string} */
1074
+ operation: "append_evidence";
1075
+ } | {
1076
+ payload: components["schemas"]["CatalogModelDecision"];
1077
+ /** @enum {string} */
1078
+ operation: "record_decision";
1079
+ } | {
1080
+ payload: components["schemas"]["CatalogDeploymentBinding"];
1081
+ /** @enum {string} */
1082
+ operation: "upsert_deployment";
1083
+ };
1084
+ /** @description Collection statistics for v2 API */
1085
+ CollectionStatsV2: {
1086
+ /**
1087
+ * Format: int64
1088
+ * @description Total number of records, or `null` when the server does not know.
1089
+ *
1090
+ * `null` is a real answer here, not a gap. The counter is maintained by
1091
+ * `MetadataStore::update_stats`, which the record write path does not call,
1092
+ * so a collection that has never had stats written carries none. Reporting
1093
+ * `0` in that case is a *confident wrong answer* — indistinguishable from a
1094
+ * genuinely empty collection, and it cost one downstream project a false
1095
+ * durability bug report before the cause was found (#1527).
1096
+ */
1097
+ record_count?: number | null;
1098
+ /**
1099
+ * Format: int64
1100
+ * @description Total storage size in bytes
1101
+ */
1102
+ storage_size_bytes: number;
1103
+ /**
1104
+ * Format: int32
1105
+ * @description Number of indexed fields
1106
+ */
1107
+ indexed_fields: number;
1108
+ /**
1109
+ * Format: int32
1110
+ * @description Number of TEXT fields with dedicated storage
1111
+ */
1112
+ text_field_count: number;
1113
+ };
1114
+ /** @description Collection details response */
1115
+ CollectionV2Response: {
1116
+ /** @description Collection ID */
1117
+ collection_id: string;
1118
+ /** @description Collection name */
1119
+ name: string;
1120
+ /**
1121
+ * Format: int32
1122
+ * @description Vector dimension
1123
+ */
1124
+ dimension: number;
1125
+ /** @description Storage engine */
1126
+ engine: string;
1127
+ /** @description Distance metric */
1128
+ distance_metric: string;
1129
+ /** @description Whether ProximaRecord is enabled */
1130
+ proxima_record_enabled: boolean;
1131
+ /**
1132
+ * @description Canonical embedding precision label for stored vectors.
1133
+ *
1134
+ * Stable string matching the proto `EmbeddingPrecision::as_str_name()`
1135
+ * (e.g. "EMBEDDING_PRECISION_FP16"). `None` when the collection didn't
1136
+ * set a non-default (Unspecified/Fp32) precision.
1137
+ */
1138
+ canonical_embedding_precision?: string | null;
1139
+ schema?: null | components["schemas"]["SchemaDefinition"];
1140
+ /** @description Collection statistics */
1141
+ stats: components["schemas"]["CollectionStatsV2"];
1142
+ /**
1143
+ * Format: int64
1144
+ * @description Monotonic server-owned content revision for cache revalidation.
1145
+ */
1146
+ content_revision: number;
1147
+ /** @description Opaque validator that also fences server restarts. */
1148
+ content_revision_token: string;
1149
+ /**
1150
+ * @description Per-index config (HNSW/IVF params, is_primary) as persisted at create
1151
+ * time. Mirrors the gRPC-v2 `GetCollection` `index_specs` (TD-122 parity).
1152
+ */
1153
+ index_specs: components["schemas"]["IndexSpecOutput"][];
1154
+ quantization?: null | components["schemas"]["QuantizationConfigOutput"];
1155
+ /** @description Creation timestamp */
1156
+ created_at: string;
1157
+ /** @description Last update timestamp */
1158
+ updated_at?: string | null;
1159
+ };
1160
+ /** @description Summary of a collection for list operations */
1161
+ CollectionV2Summary: {
1162
+ /** @description Collection ID */
1163
+ collection_id: string;
1164
+ /** @description Collection name */
1165
+ name: string;
1166
+ /**
1167
+ * Format: int32
1168
+ * @description Vector dimension
1169
+ */
1170
+ dimension: number;
1171
+ /** @description Storage engine */
1172
+ engine: string;
1173
+ /** @description Whether ProximaRecord is enabled */
1174
+ proxima_record_enabled: boolean;
1175
+ /**
1176
+ * Format: int64
1177
+ * @description Record count (if include_stats is true)
1178
+ */
1179
+ record_count?: number | null;
1180
+ };
1181
+ /**
1182
+ * @description Request to create a collection with schema support
1183
+ *
1184
+ * ## Example JSON
1185
+ *
1186
+ * ```json
1187
+ * {
1188
+ * "name": "products",
1189
+ * "dimension": 768,
1190
+ * "engine": "sst",
1191
+ * "schema": {
1192
+ * "columns": [
1193
+ * {"name": "category", "data_type": "text", "indexed": true},
1194
+ * {"name": "price", "data_type": "float", "filterable": true},
1195
+ * {"name": "description", "data_type": "text", "max_length": 10000}
1196
+ * ],
1197
+ * "enforcement": "hybrid",
1198
+ * "allow_additional_fields": true
1199
+ * },
1200
+ * "enable_proxima_record": true
1201
+ * }
1202
+ * ```
1203
+ */
1204
+ CreateCollectionV2Request: {
1205
+ /** @description Collection name (required) */
1206
+ name: string;
1207
+ /**
1208
+ * Format: int32
1209
+ * @description Vector dimension (required)
1210
+ */
1211
+ dimension: number;
1212
+ /**
1213
+ * @description Storage engine selection
1214
+ *
1215
+ * Options: "auto", "sst", "helix", "viper", "swift", "nova", "raptor", "tst"
1216
+ * Default: "auto" (system selects optimal engine)
1217
+ */
1218
+ engine?: string | null;
1219
+ schema?: null | components["schemas"]["SchemaDefinition"];
1220
+ /**
1221
+ * @description Enable ProximaRecord support for this collection
1222
+ *
1223
+ * When enabled:
1224
+ * - Records can use rich props and text_fields
1225
+ * - Schema validation is applied at insert time
1226
+ * - TEXT columns are stored in dedicated columnar format
1227
+ *
1228
+ * Default: false (backward compatible with v1)
1229
+ */
1230
+ enable_proxima_record?: boolean | null;
1231
+ /**
1232
+ * @description Distance metric for vector similarity
1233
+ *
1234
+ * Options: "cosine", "euclidean", "dot_product"
1235
+ * Default: "cosine"
1236
+ */
1237
+ distance_metric?: string | null;
1238
+ /**
1239
+ * Format: int64
1240
+ * @description Initial capacity hint for pre-allocation
1241
+ */
1242
+ initial_capacity?: number | null;
1243
+ /**
1244
+ * @description Canonical embedding precision for stored vectors
1245
+ *
1246
+ * Options: "fp32" (default), "fp16", "bf16", "int8", "uint8".
1247
+ * Accepts the same string forms as the gRPC / Arrow Flight surfaces
1248
+ * (e.g. "half", "float16", "EMBEDDING_PRECISION_FP16"). The DDL
1249
+ * service applies the same normalisation, so SDKs and pgwire
1250
+ * converge on the same enum discriminant.
1251
+ */
1252
+ canonical_embedding_precision?: string | null;
1253
+ /**
1254
+ * @description Index configurations (e.g. an explicit IVF or HNSW index).
1255
+ *
1256
+ * Restores v1 parity: the v1 proto create accepted `index_configs`, which
1257
+ * drive `active_algorithm_for` (e.g. an IVF index → recall-tune dispatches
1258
+ * to the IVF arm). When omitted, the engine selects a default (HNSW).
1259
+ */
1260
+ index_configs?: components["schemas"]["IndexConfigInput"][] | null;
1261
+ /**
1262
+ * @description Operator metadata tags, e.g. `"recall_target:0.95"`,
1263
+ * `"target_vector_count:1000"`, `"modalities:text,image"`. Consumed by the
1264
+ * recall advisor / route-health (`services/collection/recall_target.rs`).
1265
+ */
1266
+ tags?: string[] | null;
1267
+ quantization?: null | components["schemas"]["QuantizationConfigInput"];
1268
+ index_policy?: null | components["schemas"]["IndexPolicyInput"];
1269
+ };
1270
+ /** @description Response for collection creation */
1271
+ CreateCollectionV2Response: {
1272
+ /** @description Collection ID (same as name) */
1273
+ collection_id: string;
1274
+ /** @description Collection name */
1275
+ name: string;
1276
+ /**
1277
+ * Format: int32
1278
+ * @description Vector dimension
1279
+ */
1280
+ dimension: number;
1281
+ /** @description Selected storage engine */
1282
+ engine: string;
1283
+ /** @description Whether ProximaRecord is enabled */
1284
+ proxima_record_enabled: boolean;
1285
+ /** @description Schema ID (if schema was defined) */
1286
+ schema_id?: string | null;
1287
+ /** @description Creation timestamp */
1288
+ created_at: string;
1289
+ };
1290
+ CreateModelRegistryRequest: {
1291
+ /** @description Tenant-local registry name. Must be one traversal-free catalog segment. */
1292
+ name: string;
1293
+ };
1294
+ /** @description Response for deleting a collection through the v2 API. */
1295
+ DeleteCollectionV2Response: {
1296
+ /** @description Whether the delete request was accepted. */
1297
+ success: boolean;
1298
+ /** @description Deleted collection ID. */
1299
+ collection_id: string;
1300
+ };
1301
+ /** @description Response for deleting a single record. */
1302
+ DeleteRecordV2Response: {
1303
+ /** @description Whether the delete tombstone was accepted. */
1304
+ success: boolean;
1305
+ /** @description Deleted record ID. */
1306
+ id: string;
1307
+ /**
1308
+ * Format: int64
1309
+ * @description Processing latency in microseconds.
1310
+ */
1311
+ processing_time_us: number;
1312
+ };
1313
+ EntityDto: {
1314
+ id: string;
1315
+ collection_id: string;
1316
+ flexible_metadata: {
1317
+ [key: string]: unknown;
1318
+ };
1319
+ };
1320
+ EntityEmbeddingInput: {
1321
+ model_id: string;
1322
+ modality?: string | null;
1323
+ vector: number[];
1324
+ /** Format: int32 */
1325
+ dimension?: number;
1326
+ };
1327
+ EntityProvenanceInput: {
1328
+ source_id?: string;
1329
+ chunk_id?: string;
1330
+ /** Format: int32 */
1331
+ chunk_position?: number;
1332
+ extraction_method?: string;
1333
+ metadata?: {
1334
+ [key: string]: string;
1335
+ };
1336
+ };
1337
+ EntityRelationInput: {
1338
+ source_entity_id: string;
1339
+ target_entity_id: string;
1340
+ relation_type: string;
1341
+ /** Format: float */
1342
+ weight?: number;
1343
+ properties?: {
1344
+ [key: string]: string;
1345
+ };
1346
+ };
1347
+ EntitySearchResult: {
1348
+ entity: components["schemas"]["EntityDto"];
1349
+ /** Format: float */
1350
+ score: number;
1351
+ };
1352
+ /** @description Inner body of [`ErrorResponse`]. */
1353
+ ErrorBody: {
1354
+ /**
1355
+ * @description Stable machine-readable error code (snake_case).
1356
+ * @example collection_not_found
1357
+ */
1358
+ type: string;
1359
+ message: string;
1360
+ /**
1361
+ * Format: int32
1362
+ * @description HTTP status code.
1363
+ */
1364
+ code: number;
1365
+ /** @description Correlation id (matches the X-Request-ID header). */
1366
+ request_id?: string | null;
1367
+ /** @description Optional structured context (e.g. migration hints). */
1368
+ details?: Record<string, never> | null;
1369
+ };
1370
+ /**
1371
+ * @description Canonical ProximaDB error envelope (`{ error: { type, message, code } }`).
1372
+ *
1373
+ * `request_id` (also returned in the `X-Request-ID` response header) is present
1374
+ * whenever the request passed through the request-id middleware; quote it in
1375
+ * bug reports.
1376
+ */
1377
+ ErrorResponse: {
1378
+ error: components["schemas"]["ErrorBody"];
1379
+ };
1380
+ ExplainQueryRequest: {
1381
+ language: components["schemas"]["QueryLanguage"];
1382
+ query: string;
1383
+ collection?: string | null;
1384
+ };
1385
+ FusionHit: {
1386
+ oid: string;
1387
+ /** Format: float */
1388
+ score: number;
1389
+ source_count: number;
1390
+ /**
1391
+ * @description Graph node label(s) of the reached node. Exposed so cross-modal-joint
1392
+ * consumers can correlate a fused hit by its graph label without a separate
1393
+ * node lookup (#485). The expansion already reaches the node, so this is
1394
+ * near-free to fill. Additive + back-compat (empty until populated).
1395
+ */
1396
+ labels?: string[];
1397
+ };
1398
+ FusionSearchRequest: {
1399
+ /** @description Vector collection to seed from (its records co-indexed with this graph by `oid`). */
1400
+ vector_collection: string;
1401
+ /** @description Query embedding for the ANN seed. */
1402
+ query_vector: number[];
1403
+ limit?: number;
1404
+ /**
1405
+ * Format: int32
1406
+ * @description k-hop expansion depth (bounded; default 1 — the validated sweet spot).
1407
+ */
1408
+ max_depth?: number;
1409
+ edge_types?: string[];
1410
+ /** @description How many of the top vector seeds to expand from (bounded expansion). */
1411
+ max_seeds?: number;
1412
+ /** Format: float */
1413
+ vector_weight?: number | null;
1414
+ /** Format: float */
1415
+ graph_weight?: number | null;
1416
+ /** @description Use the rank-based RRF fallback instead of PIT-calibrated linear. */
1417
+ rrf?: boolean;
1418
+ /**
1419
+ * Format: float
1420
+ * @description Consensus boost added to any `oid` present in ≥2 sources.
1421
+ */
1422
+ consensus_beta?: number | null;
1423
+ /** @description Graph contribution grain: `"nodes"` (default), `"edges"`, or `"both"`. */
1424
+ grain?: string | null;
1425
+ /**
1426
+ * Format: float
1427
+ * @description Cost-routing policy inputs (TD-141): drop negligible modalities (weight fraction) and budget each.
1428
+ * When absent, fusion is unbounded.
1429
+ */
1430
+ min_weight_fraction?: number | null;
1431
+ total_budget?: number | null;
1432
+ /**
1433
+ * @description Optional BM25/full-text query (TD-138). When present (and non-empty), fusion also searches the
1434
+ * collection's document index and merges BM25 hits into the result by shared `oid` — tri-modal
1435
+ * (vector + graph + document) fusion. Absent ⇒ vector+graph only (unchanged).
1436
+ */
1437
+ text_query?: string | null;
1438
+ /**
1439
+ * @description Collection whose document index to BM25-search. Defaults to `vector_collection` (documents
1440
+ * co-indexed with the vectors share the record `oid`, so they merge by `oid`).
1441
+ */
1442
+ document_collection?: string | null;
1443
+ /**
1444
+ * Format: float
1445
+ * @description Document modality weight (mirrors `vector_weight` / `graph_weight`). Defaults to 1.0.
1446
+ */
1447
+ document_weight?: number | null;
1448
+ };
1449
+ FusionSearchResponse: {
1450
+ results: components["schemas"]["FusionHit"][];
1451
+ stats: components["schemas"]["FusionStatsDto"];
1452
+ };
1453
+ FusionStatsDto: {
1454
+ sources_fused: number;
1455
+ sources_skipped: number;
1456
+ candidates_in: number;
1457
+ items_out: number;
1458
+ };
1459
+ /** @description REST input for HNSW index params (mirrors proto `HnswConfig`). */
1460
+ HnswConfigInput: {
1461
+ /** Format: int32 */
1462
+ m?: number | null;
1463
+ /** Format: int32 */
1464
+ ef_construction?: number | null;
1465
+ /** Format: int32 */
1466
+ ef_search?: number | null;
1467
+ };
1468
+ /** @description REST output for HNSW params (mirrors gRPC `V2HnswConfig`). */
1469
+ HnswConfigOutput: {
1470
+ /** Format: int32 */
1471
+ m?: number | null;
1472
+ /** Format: int32 */
1473
+ ef_construction?: number | null;
1474
+ /** Format: int32 */
1475
+ ef_search?: number | null;
1476
+ };
1477
+ ImpactAnalysisRequest: {
1478
+ /** @description Start symbol node id. */
1479
+ node_id: string;
1480
+ /** @description `"forward"` (default — what X impacts) or `"backward"` (what impacts X). */
1481
+ direction?: string | null;
1482
+ edge_types?: string[];
1483
+ /** Format: int32 */
1484
+ max_depth?: number;
1485
+ limit?: number;
1486
+ };
1487
+ ImpactAnalysisResponse: {
1488
+ /** @description Reached node ids (canonical `oid` = `graph/{graph_id}/node/{id}`). */
1489
+ node_ids: string[];
1490
+ edge_count: number;
1491
+ /** Format: int32 */
1492
+ max_depth_reached: number;
1493
+ };
1494
+ /** @description REST input for a single index config (mirrors proto `IndexConfig`). */
1495
+ IndexConfigInput: {
1496
+ /** @description Optional index name (defaults to `index_<n>`). */
1497
+ index_name?: string | null;
1498
+ /** @description Algorithm: "hnsw", "ivf", "pq", "flat", "annoy", "lsh". */
1499
+ algorithm: string;
1500
+ /** @description Free-form algorithm parameters. */
1501
+ parameters?: {
1502
+ [key: string]: string;
1503
+ };
1504
+ hnsw_config?: null | components["schemas"]["HnswConfigInput"];
1505
+ ivf_config?: null | components["schemas"]["IvfConfigInput"];
1506
+ /** @description Mark this index as the collection's primary ANN index (gRPC-v2 parity). */
1507
+ is_primary?: boolean | null;
1508
+ };
1509
+ /**
1510
+ * @description REST input for the per-collection index routing policy (mirrors proto
1511
+ * `IndexPolicy`; ADR-028).
1512
+ */
1513
+ IndexPolicyInput: {
1514
+ /**
1515
+ * @description Routing mode: "auto" (default) | "exact" | "ivf" | "hnsw" | "helix".
1516
+ * "auto"/omitted ⇒ cost-derived. "exact" ⇒ always brute-force (no index).
1517
+ * The engine modes force the collection onto that engine/route.
1518
+ */
1519
+ mode?: string | null;
1520
+ /**
1521
+ * @description Cold-start index warming: "auto" (default) | "eager" | "lazy" | "never".
1522
+ * Index/auto modes only — rejected when `mode = "exact"`.
1523
+ */
1524
+ rehydrate?: string | null;
1525
+ /**
1526
+ * Format: int64
1527
+ * @description Exact-scan byte budget override (bytes). 0/omitted ⇒ cost-model default
1528
+ * for the storage class.
1529
+ */
1530
+ byte_budget?: number | null;
1531
+ /**
1532
+ * Format: int32
1533
+ * @description nprobe override for index modes. 0/omitted ⇒ cost-derived. Rejected when
1534
+ * `mode = "exact"`.
1535
+ */
1536
+ nprobe?: number | null;
1537
+ };
1538
+ /** @description REST output for a single index config (mirrors gRPC `V2IndexSpec`). */
1539
+ IndexSpecOutput: {
1540
+ /** @description Algorithm: "hnsw" | "ivf" | "pq" | "flat" | "annoy" | "lsh". */
1541
+ algorithm: string;
1542
+ hnsw?: null | components["schemas"]["HnswConfigOutput"];
1543
+ ivf?: null | components["schemas"]["IvfConfigOutput"];
1544
+ /** @description Whether this is the collection's primary ANN index. */
1545
+ is_primary: boolean;
1546
+ };
1547
+ /** @description A single record submitted for native embedding + indexing. */
1548
+ IngestDocument: {
1549
+ id: string;
1550
+ /**
1551
+ * @description Raw text content. Required when `X-Embed-Source: native` (default);
1552
+ * optional when the client also supplied a vector.
1553
+ */
1554
+ text?: string | null;
1555
+ /**
1556
+ * @description Optional client-provided vector. When present, the server skips
1557
+ * embedding for this record. Use case: SDK that already embedded
1558
+ * locally (legacy path).
1559
+ */
1560
+ vector?: number[] | null;
1561
+ /** @description Arbitrary metadata fields. Stored as ProximaRecord props. */
1562
+ metadata?: {
1563
+ [key: string]: unknown;
1564
+ };
1565
+ };
1566
+ IngestDocumentsRequest: {
1567
+ records: components["schemas"]["IngestDocument"][];
1568
+ };
1569
+ IngestDocumentsResponse: {
1570
+ mode: string;
1571
+ records: components["schemas"]["IngestedRecord"][];
1572
+ /** Format: int64 */
1573
+ retry_after_ms?: number | null;
1574
+ };
1575
+ IngestedRecord: {
1576
+ id: string;
1577
+ /** Format: int32 */
1578
+ dim: number;
1579
+ };
1580
+ /** @description Error details for a failed record insertion */
1581
+ InsertError: {
1582
+ /** @description Index of the record in the request */
1583
+ index: number;
1584
+ /** @description Record ID (if provided) */
1585
+ id?: string | null;
1586
+ /** @description Error message */
1587
+ error: string;
1588
+ };
1589
+ /**
1590
+ * @description Request to insert ProximaRecords
1591
+ *
1592
+ * ## Example JSON
1593
+ *
1594
+ * ```json
1595
+ * {
1596
+ * "records": [
1597
+ * {
1598
+ * "id": "doc_1",
1599
+ * "vector": [0.1, 0.2, 0.3],
1600
+ * "props": {
1601
+ * "category": "electronics",
1602
+ * "price": 299.99,
1603
+ * "in_stock": true
1604
+ * },
1605
+ * "text_fields": [
1606
+ * {
1607
+ * "name": "description",
1608
+ * "content": "A detailed product description...",
1609
+ * "storage_hint": "adaptive"
1610
+ * }
1611
+ * ],
1612
+ * "source": "catalog_import"
1613
+ * }
1614
+ * ],
1615
+ * "validate_schema": true
1616
+ * }
1617
+ * ```
1618
+ * Not supported in v0.2: optimistic versioning, conditional-write predicates,
1619
+ * update-by-filter, delete-by-filter, and patch / partial-record update. The
1620
+ * live contract is exposed via `WriteContractHealth` on the route-health
1621
+ * diagnostic endpoint (`GET /api/v2/_diagnostics/collections/{id}/route-health`);
1622
+ * see also `docs/SUPPORTED_SURFACE.adoc` "Not Supported in v0.2".
1623
+ */
1624
+ InsertRecordsRequest: {
1625
+ /** @description Records to insert */
1626
+ records: components["schemas"]["ProximaRecordInput"][];
1627
+ /** @description Whether to validate against collection schema (default: true) */
1628
+ validate_schema?: boolean | null;
1629
+ /**
1630
+ * @description Whether existing records with the same ID should be replaced.
1631
+ *
1632
+ * The current durable record write path is idempotent/upsert-oriented; this
1633
+ * field is accepted so SDKs can expose explicit upsert intent without
1634
+ * leaving the OpenAPI contract.
1635
+ */
1636
+ upsert?: boolean | null;
1637
+ };
1638
+ /** @description Response for insert operation */
1639
+ InsertRecordsResponse: {
1640
+ /** @description Number of successfully inserted records */
1641
+ inserted_count: number;
1642
+ /** @description Number of failed records */
1643
+ failed_count: number;
1644
+ /** @description Detailed errors for failed records */
1645
+ errors: components["schemas"]["InsertError"][];
1646
+ /** @description IDs of successfully inserted records */
1647
+ inserted_ids: string[];
1648
+ };
1649
+ /** @description REST input for IVF index params (mirrors proto `IvfConfig`). */
1650
+ IvfConfigInput: {
1651
+ /** Format: int32 */
1652
+ n_lists?: number | null;
1653
+ /** Format: int32 */
1654
+ n_probe?: number | null;
1655
+ };
1656
+ /** @description REST output for IVF params (mirrors gRPC `V2IvfConfig`). */
1657
+ IvfConfigOutput: {
1658
+ /** Format: int32 */
1659
+ n_lists?: number | null;
1660
+ /** Format: int32 */
1661
+ n_probe?: number | null;
1662
+ };
1663
+ /** @description Response for listing collections */
1664
+ ListCollectionsV2Response: {
1665
+ /** @description List of collections */
1666
+ collections: components["schemas"]["CollectionV2Summary"][];
1667
+ /**
1668
+ * Format: int64
1669
+ * @description Total count of collections
1670
+ */
1671
+ total: number;
1672
+ /**
1673
+ * Format: int32
1674
+ * @description Limit used in this request
1675
+ */
1676
+ limit: number;
1677
+ /**
1678
+ * Format: int32
1679
+ * @description Offset used in this request
1680
+ */
1681
+ offset: number;
1682
+ /** @description Whether there are more results */
1683
+ has_more: boolean;
1684
+ };
1685
+ ListModelRegistriesResponse: {
1686
+ registries: components["schemas"]["ModelRegistryRecordResponse"][];
1687
+ };
1688
+ /**
1689
+ * @description REST uses a decimal string for stable catalog IDs so JavaScript clients do
1690
+ * not lose precision. gRPC exposes the same value as `uint64`.
1691
+ */
1692
+ ModelRegistryRecordResponse: {
1693
+ tenant_id: string;
1694
+ asset_id: string;
1695
+ registry: components["schemas"]["CatalogEmbeddingModelRegistry"];
1696
+ };
1697
+ /**
1698
+ * @description TD-064: predicate-aware recall shortfall (REST wire shape).
1699
+ *
1700
+ * Mirrors `observability::search_plan_trace::PredicateShortfall` as an
1701
+ * explicit REST/OpenAPI schema so the field is typed and documented on the
1702
+ * wire without forcing the observability type (or the slim `IndexQueryResult`
1703
+ * DTO) to derive `ToSchema`.
1704
+ */
1705
+ PredicateShortfallWire: {
1706
+ /**
1707
+ * Format: int32
1708
+ * @description The `top_k` value the caller asked for.
1709
+ */
1710
+ requested_k: number;
1711
+ /**
1712
+ * Format: int32
1713
+ * @description Results actually returned after predicate filtering + merge.
1714
+ */
1715
+ returned_k: number;
1716
+ /**
1717
+ * Format: int32
1718
+ * @description Candidate pool size considered before the predicate (oversample budget).
1719
+ */
1720
+ oversample_pool: number;
1721
+ /**
1722
+ * @description ADR-011 mode that produced the shortfall (`post_filter`, `inline`, or
1723
+ * `pre_filter`).
1724
+ */
1725
+ ann_filtering_mode: string;
1726
+ };
1727
+ /**
1728
+ * @description Input format for ProximaRecord (JSON-friendly)
1729
+ *
1730
+ * This is the JSON-serializable input format for ProximaRecord.
1731
+ * It uses serde_json::Value for typed fields to support dynamic typing
1732
+ * at the API boundary, with validation happening during conversion.
1733
+ */
1734
+ ProximaRecordInput: {
1735
+ /** @description Record ID (optional, will be auto-generated if not provided) */
1736
+ id?: string | null;
1737
+ /** @description Vector embedding (required) */
1738
+ vector: number[];
1739
+ /** @description Canonical rich property map. */
1740
+ props?: {
1741
+ [key: string]: unknown;
1742
+ } | null;
1743
+ /** @description Dedicated TEXT fields with storage hints */
1744
+ text_fields?: components["schemas"]["TextFieldInput"][] | null;
1745
+ };
1746
+ /**
1747
+ * @description REST input for quantization config (mirrors proto `QuantizationConfig`;
1748
+ * gRPC-v2 parity with `V2QuantizationConfig`).
1749
+ */
1750
+ QuantizationConfigInput: {
1751
+ /** @description Enable quantization for this collection. */
1752
+ enabled?: boolean | null;
1753
+ /** @description Strategy: "smart_defaults" (default) | "minimal" | "aggressive" | "custom_levels". */
1754
+ strategy?: string | null;
1755
+ };
1756
+ /** @description REST output for quantization config (mirrors gRPC `V2QuantizationConfig`). */
1757
+ QuantizationConfigOutput: {
1758
+ enabled: boolean;
1759
+ /** @description Strategy label, e.g. "smart_defaults" | "minimal" | "aggressive". */
1760
+ strategy: string;
1761
+ };
1762
+ /** @enum {string} */
1763
+ QueryLanguage: "uql" | "aql" | "federated";
1764
+ QueryRequest: {
1765
+ language: components["schemas"]["QueryLanguage"];
1766
+ query: string;
1767
+ parameters?: Record<string, never>[] | null;
1768
+ collection?: string | null;
1769
+ /** Format: int32 */
1770
+ limit?: number | null;
1771
+ };
1772
+ /**
1773
+ * @description Query facade result. Implementations return records, total_count, metrics,
1774
+ * plan, or diagnostics depending on language and endpoint, so the body is a
1775
+ * free-form JSON object.
1776
+ */
1777
+ QueryResponse: Record<string, never>;
1778
+ /** @description Response for getting a single record */
1779
+ RecordV2Response: {
1780
+ /** @description Record ID */
1781
+ id: string;
1782
+ /** @description Vector embedding (if requested) */
1783
+ vector?: number[] | null;
1784
+ /** @description Rich properties from the record */
1785
+ props: {
1786
+ [key: string]: unknown;
1787
+ };
1788
+ /** @description TEXT fields (if include_text is true) */
1789
+ text_fields?: components["schemas"]["TextFieldOutput"][] | null;
1790
+ /**
1791
+ * Format: int64
1792
+ * @description Record version
1793
+ */
1794
+ version?: number | null;
1795
+ /**
1796
+ * Format: int64
1797
+ * @description Record timestamp
1798
+ */
1799
+ timestamp?: number | null;
1800
+ };
1801
+ ResolveModelAliasRequest: {
1802
+ alias: string;
1803
+ /** Format: int32 */
1804
+ dimension: number;
1805
+ /** @description Runtime implementation that will execute the immutable contract. */
1806
+ runtime?: string | null;
1807
+ /** @description Require the latest append-only decision to approve the selected version. */
1808
+ require_approved?: boolean;
1809
+ };
1810
+ ResolvedEmbeddingModelResponse: {
1811
+ asset_id: string;
1812
+ registry_name: string;
1813
+ /** Format: int64 */
1814
+ registry_revision: number;
1815
+ contract_sha256: string;
1816
+ model: components["schemas"]["CatalogEmbeddingModelVersion"];
1817
+ };
1818
+ ResolvedModelBindingResponse: {
1819
+ model: string;
1820
+ /** Format: int32 */
1821
+ dimension: number;
1822
+ model_asset_id: string;
1823
+ /** Format: int64 */
1824
+ model_version: number;
1825
+ contract_sha256: string;
1826
+ snapshot: components["schemas"]["ResolvedEmbeddingModelResponse"];
1827
+ };
1828
+ /** @description Column definition for schema */
1829
+ RestColumnDefinition: {
1830
+ /** @description Column name */
1831
+ name: string;
1832
+ /**
1833
+ * @description Data type
1834
+ *
1835
+ * Supported types:
1836
+ * - "text": Variable-length UTF-8 text
1837
+ * - "text_large": Large text with sidecar storage
1838
+ * - "integer": 64-bit signed integer
1839
+ * - "float": 64-bit floating point
1840
+ * - "decimal": 128-bit decimal (precision, scale)
1841
+ * - "boolean": True/false
1842
+ * - "timestamp": Microseconds since epoch
1843
+ * - "timestamp_tz": Timestamp with timezone
1844
+ * - "date": Days since epoch
1845
+ * - "time": Microseconds since midnight
1846
+ * - "uuid": RFC 4122 UUID
1847
+ * - "binary": Raw bytes
1848
+ * - "json": Validated JSON
1849
+ * - "array_text", "array_integer", "array_float", "array_boolean"
1850
+ * - "map_string_string", "map_string_any"
1851
+ * - "geo_point": Latitude/longitude point
1852
+ * - "vector": Fixed-dimension vector (specify dimension)
1853
+ */
1854
+ data_type: string;
1855
+ /**
1856
+ * @description Whether null values are allowed
1857
+ *
1858
+ * Default: true
1859
+ */
1860
+ nullable?: boolean | null;
1861
+ /**
1862
+ * @description Create secondary index for this column
1863
+ *
1864
+ * Improves query performance for equality/range filters.
1865
+ * Default: false
1866
+ */
1867
+ indexed?: boolean | null;
1868
+ /**
1869
+ * @description Enable filtering on this column
1870
+ *
1871
+ * When true, the column can be used in WHERE clauses.
1872
+ * Default: true for indexed columns, false otherwise
1873
+ */
1874
+ filterable?: boolean | null;
1875
+ /**
1876
+ * Format: int32
1877
+ * @description Maximum length for TEXT/BINARY columns
1878
+ *
1879
+ * Default: no limit
1880
+ */
1881
+ max_length?: number | null;
1882
+ /**
1883
+ * Format: int32
1884
+ * @description Precision for DECIMAL type (1-38)
1885
+ */
1886
+ precision?: number | null;
1887
+ /**
1888
+ * Format: int32
1889
+ * @description Scale for DECIMAL type (0-precision)
1890
+ */
1891
+ scale?: number | null;
1892
+ /**
1893
+ * Format: int32
1894
+ * @description Dimension for VECTOR type
1895
+ */
1896
+ vector_dimension?: number | null;
1897
+ };
1898
+ /**
1899
+ * @description Body of `POST /records/scan`. Mirrors the OpenAPI `ScanRecordsRequest`
1900
+ * schema; all fields optional so an empty `{}` returns the first page.
1901
+ */
1902
+ ScanRecordsRequest: {
1903
+ /**
1904
+ * @description Opaque continuation token returned as `next_cursor` from a
1905
+ * prior page. Omit / null to start from the beginning.
1906
+ */
1907
+ cursor?: string | null;
1908
+ /**
1909
+ * Format: int32
1910
+ * @description Max records to return in this page. Server enforces upper bound.
1911
+ */
1912
+ limit?: number | null;
1913
+ /**
1914
+ * @description Metadata filter applied (before the limit) to the scanned page.
1915
+ * Accepts either the typed list form `[{field,op,value}]` (mirrors
1916
+ * `searchRecords.filters`) or a simple equality map `{field: value}`.
1917
+ */
1918
+ filter?: unknown;
1919
+ include_vector?: boolean | null;
1920
+ include_text?: boolean | null;
1921
+ };
1922
+ /**
1923
+ * @description Response shape for `scanRecords`. Empty `records` + null
1924
+ * `next_cursor` signals end-of-scan. Each record matches the OpenAPI
1925
+ * `RecordResponse` schema (same shape used by `getRecord`).
1926
+ */
1927
+ ScanRecordsResponse: {
1928
+ records: components["schemas"]["RecordV2Response"][];
1929
+ /** Format: int64 */
1930
+ content_revision: number;
1931
+ content_revision_token: string;
1932
+ next_cursor?: string | null;
1933
+ /** Format: int64 */
1934
+ scanned_count?: number | null;
1935
+ };
1936
+ /** @description Description of a schema change */
1937
+ SchemaChange: {
1938
+ /** @description Type of change */
1939
+ change_type: string;
1940
+ /** @description Affected column (if applicable) */
1941
+ column?: string | null;
1942
+ /** @description Description of the change */
1943
+ description: string;
1944
+ };
1945
+ /**
1946
+ * @description Schema definition for a collection
1947
+ *
1948
+ * Defines the typed columns and enforcement rules for ProximaRecord support.
1949
+ */
1950
+ SchemaDefinition: {
1951
+ /** @description Column definitions */
1952
+ columns: components["schemas"]["RestColumnDefinition"][];
1953
+ /**
1954
+ * @description Schema enforcement mode
1955
+ *
1956
+ * - "strict": All columns must match schema exactly
1957
+ * - "flexible": Schema on read, no validation at insert
1958
+ * - "hybrid": Core columns enforced, additional fields allowed (default)
1959
+ */
1960
+ enforcement?: string | null;
1961
+ /**
1962
+ * @description Allow additional fields not defined in schema
1963
+ *
1964
+ * Only applies in "hybrid" mode.
1965
+ * Default: true
1966
+ */
1967
+ allow_additional_fields?: boolean | null;
1968
+ };
1969
+ /** @description Schema response with metadata */
1970
+ SchemaResponse: {
1971
+ /** @description Schema ID (UUID) */
1972
+ schema_id: string;
1973
+ /** @description Schema version (semantic versioning) */
1974
+ schema_version: string;
1975
+ /** @description Collection this schema belongs to */
1976
+ collection_id: string;
1977
+ /** @description Schema definition */
1978
+ schema: components["schemas"]["SchemaDefinition"];
1979
+ /** @description Creation timestamp */
1980
+ created_at: string;
1981
+ /** @description Last update timestamp */
1982
+ updated_at?: string | null;
1983
+ /** @description Parent schema ID (for evolution tracking) */
1984
+ parent_schema_id?: string | null;
1985
+ };
1986
+ SearchEntitiesRequest: {
1987
+ /** @description Query embedding for vector similarity search. Omit for metadata-only search. */
1988
+ query_vector?: number[];
1989
+ /** @description Equality metadata filters as a `{field: value}` JSON object. */
1990
+ filters?: {
1991
+ [key: string]: unknown;
1992
+ };
1993
+ /** Format: int32 */
1994
+ top_k?: number;
1995
+ };
1996
+ SearchEntitiesResponse: {
1997
+ results: components["schemas"]["EntitySearchResult"][];
1998
+ /** Format: int32 */
1999
+ total: number;
2000
+ };
2001
+ /**
2002
+ * @description One SQL statement executed through the shared SQL authority.
2003
+ *
2004
+ * Parameter binding is intentionally not advertised yet: the relational
2005
+ * execution port currently has no typed binding contract. Callers must not be
2006
+ * offered a field that an adapter would silently ignore or interpolate.
2007
+ */
2008
+ SqlRequest: {
2009
+ query: string;
2010
+ /** @description Optional collection context used by vector/graph SQL extensions. */
2011
+ collection?: string | null;
2012
+ /**
2013
+ * Format: int64
2014
+ * @description Per-request deadline. Defaults to 30 seconds and is capped at 5 minutes.
2015
+ */
2016
+ timeout_ms?: number | null;
2017
+ };
2018
+ /**
2019
+ * @description Stable JSON envelope for SQL reads and writes.
2020
+ *
2021
+ * For reads, `rows_returned` is the row count. For DDL/DML, the shared SQL
2022
+ * authority reports the affected count in `rows_returned` and `rows` is empty.
2023
+ */
2024
+ SqlResponse: {
2025
+ rows: Record<string, never>[];
2026
+ columns: string[];
2027
+ column_types: string[];
2028
+ /** Format: int64 */
2029
+ rows_returned: number;
2030
+ /** Format: int64 */
2031
+ rows_scanned: number;
2032
+ /** Format: int64 */
2033
+ execution_time_ms: number;
2034
+ request_id: string;
2035
+ };
2036
+ /**
2037
+ * @description Input format for TEXT fields
2038
+ *
2039
+ * TEXT fields are stored in dedicated columns with optional chunking
2040
+ * for large content. The storage hint helps optimize storage strategy.
2041
+ */
2042
+ TextFieldInput: {
2043
+ /** @description Field name */
2044
+ name: string;
2045
+ /** @description Text content */
2046
+ content: string;
2047
+ /**
2048
+ * @description Storage strategy hint
2049
+ *
2050
+ * - "inline": Store inline in main column (<4KB)
2051
+ * - "chunked": Split into chunks with embeddings (4KB-1MB)
2052
+ * - "sidecar": Store in separate sidecar file (>1MB)
2053
+ * - "adaptive": Auto-select based on content size (default)
2054
+ */
2055
+ storage_hint?: string | null;
2056
+ };
2057
+ /** @description Output format for TEXT fields */
2058
+ TextFieldOutput: {
2059
+ /** @description Field name */
2060
+ name: string;
2061
+ /** @description Text content (may be truncated for large content) */
2062
+ content: string;
2063
+ /**
2064
+ * Format: int32
2065
+ * @description Number of chunks (for chunked storage)
2066
+ */
2067
+ chunk_count?: number | null;
2068
+ /** @description Whether content was truncated */
2069
+ truncated: boolean;
2070
+ };
2071
+ /**
2072
+ * @description A typed filter for search operations
2073
+ *
2074
+ * Supports various comparison operators with type-safe values.
2075
+ */
2076
+ TypedFilter: {
2077
+ /** @description Field name to filter on */
2078
+ field: string;
2079
+ /**
2080
+ * @description Comparison operator
2081
+ *
2082
+ * Supported operators:
2083
+ * - "eq": Equals
2084
+ * - "neq": Not equals
2085
+ * - "gt": Greater than
2086
+ * - "gte": Greater than or equal
2087
+ * - "lt": Less than
2088
+ * - "lte": Less than or equal
2089
+ * - "contains": String/array contains
2090
+ * - "between": Value is between two bounds (requires value_upper)
2091
+ * - "in": Value is in a list
2092
+ * - "starts_with": String starts with prefix
2093
+ * - "ends_with": String ends with suffix
2094
+ */
2095
+ op: string;
2096
+ /** @description Filter value (type depends on field type) */
2097
+ value: unknown;
2098
+ /** @description Upper bound for "between" operator */
2099
+ value_upper?: unknown;
2100
+ };
2101
+ /**
2102
+ * @description Search request with typed filters
2103
+ *
2104
+ * ## Example JSON
2105
+ *
2106
+ * ```json
2107
+ * {
2108
+ * "vector": [0.1, 0.2, 0.3],
2109
+ * "top_k": 10,
2110
+ * "filters": [
2111
+ * {"field": "category", "op": "eq", "value": "electronics"},
2112
+ * {"field": "price", "op": "lt", "value": 500},
2113
+ * {"field": "in_stock", "op": "eq", "value": true}
2114
+ * ],
2115
+ * "include_text": true
2116
+ * }
2117
+ * ```
2118
+ */
2119
+ TypedSearchRequest: {
2120
+ /** @description Query vector */
2121
+ vector: number[];
2122
+ /** @description Number of results to return */
2123
+ top_k: number;
2124
+ /** @description Typed filters with operator support */
2125
+ filters?: components["schemas"]["TypedFilter"][] | null;
2126
+ /**
2127
+ * @description Whether to include TEXT fields in results (default: false)
2128
+ *
2129
+ * TEXT fields can be large, so they are excluded by default.
2130
+ * Set to true to include them in the response.
2131
+ */
2132
+ include_text?: boolean | null;
2133
+ /**
2134
+ * @description Whether to include the vector in results (default: false)
2135
+ *
2136
+ * Vector data can be large, so it is excluded by default.
2137
+ */
2138
+ include_vector?: boolean | null;
2139
+ /**
2140
+ * @description Return the SearchPlanTrace + a human-readable route explain
2141
+ * in the response (LLD §1 contract). Defaults to `false` so
2142
+ * non-debug requests don't pay the JSON serialization cost of
2143
+ * the ~30-field trace envelope.
2144
+ */
2145
+ debug?: boolean | null;
2146
+ };
2147
+ /** @description Search response with typed results */
2148
+ TypedSearchResponse: {
2149
+ /** @description Search results */
2150
+ results: components["schemas"]["TypedSearchResult"][];
2151
+ /**
2152
+ * Format: int64
2153
+ * @description Total number of matching documents (before top_k limit)
2154
+ */
2155
+ total_matches?: number | null;
2156
+ /**
2157
+ * Format: int64
2158
+ * @description Search latency in milliseconds
2159
+ */
2160
+ latency_ms: number;
2161
+ /** @description Request ID for tracing */
2162
+ request_id: string;
2163
+ predicate_shortfall?: null | components["schemas"]["PredicateShortfallWire"];
2164
+ /**
2165
+ * @description SearchPlanTrace (LLD §10) — the per-query telemetry envelope that
2166
+ * upstream gateways consume for metering and planner-v2 training.
2167
+ * Phase 0 emits a stub trace populated from request_id + latency; later
2168
+ * phases fill in the per-stage counters. Only emitted when the request
2169
+ * sets `debug=true` (LLD §1 contract).
2170
+ */
2171
+ search_plan_trace?: unknown;
2172
+ /**
2173
+ * @description Human-readable explain summary derived from the SearchPlanTrace.
2174
+ * Only emitted when the request sets `debug=true` — gives an on-call
2175
+ * operator a one-glance view of the plan, cache result, and any
2176
+ * actionable hints (high scan fraction, repair triggered, ...).
2177
+ */
2178
+ explain?: unknown;
2179
+ };
2180
+ /** @description Search result with typed fields */
2181
+ TypedSearchResult: {
2182
+ /** @description Record ID */
2183
+ id: string;
2184
+ /**
2185
+ * Format: float
2186
+ * @description Similarity score (0.0 - 1.0 for cosine, distance for L2)
2187
+ */
2188
+ score: number;
2189
+ /** @description Vector embedding (if requested) */
2190
+ vector?: number[] | null;
2191
+ /** @description Rich properties from the record */
2192
+ props: {
2193
+ [key: string]: unknown;
2194
+ };
2195
+ /** @description TEXT fields (if include_text is true) */
2196
+ text_fields?: components["schemas"]["TextFieldOutput"][] | null;
2197
+ };
2198
+ /**
2199
+ * @description Request to update schema
2200
+ *
2201
+ * ## Schema Evolution Rules
2202
+ *
2203
+ * 1. **Adding Columns**: New columns must be nullable or have defaults
2204
+ * 2. **Type Changes**: Not allowed (except compatible widening like int32->int64)
2205
+ * 3. **Removing Columns**: Not allowed (use deprecation instead)
2206
+ * 4. **Enforcement Mode**: Can be changed, but strict->flexible may lose validation
2207
+ *
2208
+ * ## Example JSON
2209
+ *
2210
+ * ```json
2211
+ * {
2212
+ * "columns": [
2213
+ * {"name": "category", "data_type": "text", "indexed": true},
2214
+ * {"name": "price", "data_type": "float", "filterable": true},
2215
+ * {"name": "tags", "data_type": "array_text", "nullable": true}
2216
+ * ],
2217
+ * "enforcement": "hybrid",
2218
+ * "allow_additional_fields": true
2219
+ * }
2220
+ * ```
2221
+ */
2222
+ UpdateSchemaRequest: components["schemas"]["SchemaDefinition"] & {
2223
+ /**
2224
+ * @description Force update even if validation warnings exist
2225
+ *
2226
+ * Use with caution - may cause data compatibility issues.
2227
+ */
2228
+ force?: boolean | null;
2229
+ };
2230
+ /** @description Schema update response */
2231
+ UpdateSchemaResponse: {
2232
+ /** @description Updated schema ID */
2233
+ schema_id: string;
2234
+ /** @description New schema version */
2235
+ schema_version: string;
2236
+ /** @description Previous schema ID (for rollback) */
2237
+ previous_schema_id: string;
2238
+ /** @description List of applied changes */
2239
+ changes: components["schemas"]["SchemaChange"][];
2240
+ /** @description Warnings about the update */
2241
+ warnings: string[];
2242
+ /** @description Update timestamp */
2243
+ updated_at: string;
2244
+ };
2245
+ UpsertEntityRequest: {
2246
+ /** @description Empty ⇒ the server generates a UUID. */
2247
+ id?: string;
2248
+ flexible_metadata?: {
2249
+ [key: string]: unknown;
2250
+ };
2251
+ embeddings?: components["schemas"]["EntityEmbeddingInput"][];
2252
+ provenance?: null | components["schemas"]["EntityProvenanceInput"];
2253
+ relations?: components["schemas"]["EntityRelationInput"][];
2254
+ };
2255
+ UpsertEntityResponse: {
2256
+ success: boolean;
2257
+ entity_id: string;
2258
+ message: string;
2259
+ };
2260
+ HealthResponse: {
2261
+ status?: string;
2262
+ version?: string;
2263
+ uptime_seconds?: number;
2264
+ } & {
2265
+ [key: string]: unknown;
2266
+ };
2267
+ ProbeResponse: {
2268
+ status: string;
2269
+ };
2270
+ CapabilitiesResponse: {
2271
+ api_version?: string;
2272
+ surface?: string;
2273
+ features?: string[];
2274
+ limits?: {
2275
+ [key: string]: unknown;
2276
+ };
2277
+ error_envelope?: {
2278
+ [key: string]: unknown;
2279
+ };
2280
+ } & {
2281
+ [key: string]: unknown;
2282
+ };
2283
+ CreateGraphRequest: {
2284
+ /** @description Unique identifier for the new graph collection. */
2285
+ graph_id: string;
2286
+ /** @description Optional human-readable name (defaults to graph_id). */
2287
+ name?: string | null;
2288
+ description?: string | null;
2289
+ };
2290
+ /**
2291
+ * @description Server returns a `GraphResponse<T>` envelope around graph
2292
+ * collection metadata. The fields below are the common subset
2293
+ * SDKs rely on; extra server-side fields are passed through.
2294
+ */
2295
+ GraphCollectionResponse: {
2296
+ graph_id?: string;
2297
+ name?: string | null;
2298
+ description?: string | null;
2299
+ node_count?: number | null;
2300
+ edge_count?: number | null;
2301
+ } & {
2302
+ [key: string]: unknown;
2303
+ };
2304
+ /**
2305
+ * @description Server returns a `GraphResponse<Vec<...>>` envelope with `data`
2306
+ * containing the graph collections.
2307
+ */
2308
+ ListGraphsResponse: {
2309
+ data?: components["schemas"]["GraphCollectionResponse"][];
2310
+ success?: boolean;
2311
+ } & {
2312
+ [key: string]: unknown;
2313
+ };
2314
+ /**
2315
+ * @description 204 No Content on success with an empty `GraphResponse` envelope;
2316
+ * 404 Not Found with an error envelope when the graph is missing.
2317
+ */
2318
+ DeleteGraphResponse: {
2319
+ success?: boolean;
2320
+ } & {
2321
+ [key: string]: unknown;
2322
+ };
2323
+ /**
2324
+ * @description Node payload nested inside `CreateNodeRequest.node`. Matches
2325
+ * `RestNodeInput` in proximadb-api's graph handler.
2326
+ */
2327
+ NodeInput: {
2328
+ id: string;
2329
+ labels?: string[];
2330
+ properties?: {
2331
+ [key: string]: unknown;
2332
+ };
2333
+ embedding?: components["schemas"]["EmbeddingInput"];
2334
+ };
2335
+ EmbeddingInput: {
2336
+ vector: number[];
2337
+ model_id?: string | null;
2338
+ modality?: string | null;
2339
+ };
2340
+ /** @description Wrapped envelope: server expects `{"node": NodeInput}`. */
2341
+ CreateNodeRequest: {
2342
+ node: components["schemas"]["NodeInput"];
2343
+ };
2344
+ NodeResponse: {
2345
+ id: string;
2346
+ labels?: string[] | null;
2347
+ properties?: {
2348
+ [key: string]: unknown;
2349
+ } | null;
2350
+ } & {
2351
+ [key: string]: unknown;
2352
+ };
2353
+ DeleteNodeResponse: {
2354
+ success?: boolean;
2355
+ id?: string;
2356
+ } & {
2357
+ [key: string]: unknown;
2358
+ };
2359
+ /**
2360
+ * @description Edge payload nested inside `CreateEdgeRequest.edge`. Matches
2361
+ * `RestEdgeInput` in proximadb-api's graph handler.
2362
+ */
2363
+ EdgeInput: {
2364
+ id: string;
2365
+ from_node_id: string;
2366
+ to_node_id: string;
2367
+ edge_type: string;
2368
+ properties?: {
2369
+ [key: string]: unknown;
2370
+ };
2371
+ /** Format: double */
2372
+ weight?: number | null;
2373
+ };
2374
+ /** @description Wrapped envelope: server expects `{"edge": EdgeInput}`. */
2375
+ CreateEdgeRequest: {
2376
+ edge: components["schemas"]["EdgeInput"];
2377
+ };
2378
+ EdgeResponse: {
2379
+ id: string;
2380
+ from_node_id?: string;
2381
+ to_node_id?: string;
2382
+ edge_type?: string | null;
2383
+ properties?: {
2384
+ [key: string]: unknown;
2385
+ } | null;
2386
+ /** Format: double */
2387
+ weight?: number | null;
2388
+ } & {
2389
+ [key: string]: unknown;
2390
+ };
2391
+ /**
2392
+ * @description Flat shape (no wrapper). Matches `RestTraversalRequest` in
2393
+ * proximadb-api.
2394
+ */
2395
+ TraverseRequest: {
2396
+ start_node_id: string;
2397
+ /** @default 3 */
2398
+ max_depth: number;
2399
+ edge_types?: string[];
2400
+ node_labels?: string[];
2401
+ /** @description bfs | dfs | shortest_path */
2402
+ algorithm?: string | null;
2403
+ limit?: number | null;
2404
+ };
2405
+ TraverseResponse: {
2406
+ nodes?: components["schemas"]["NodeResponse"][];
2407
+ edges?: components["schemas"]["EdgeResponse"][];
2408
+ paths?: string[][];
2409
+ } & {
2410
+ [key: string]: unknown;
2411
+ };
2412
+ GraphStatsResponse: {
2413
+ node_count?: number;
2414
+ edge_count?: number;
2415
+ /** Format: double */
2416
+ density?: number | null;
2417
+ } & {
2418
+ [key: string]: unknown;
2419
+ };
2420
+ /** @description Body for `POST /api/v2/graphs/{id}/nodes/batch`. */
2421
+ BatchCreateNodesRequest: {
2422
+ nodes: components["schemas"]["NodeInput"][];
2423
+ };
2424
+ /** @description Server returns a `GraphResponse<BatchResults<Node>>` envelope. */
2425
+ BatchNodesResponse: {
2426
+ success?: boolean;
2427
+ data?: {
2428
+ results?: components["schemas"]["NodeResponse"][];
2429
+ count?: number;
2430
+ } & {
2431
+ [key: string]: unknown;
2432
+ };
2433
+ } & {
2434
+ [key: string]: unknown;
2435
+ };
2436
+ /** @description Body for `POST /api/v2/graphs/{id}/edges/batch`. */
2437
+ BatchCreateEdgesRequest: {
2438
+ edges: components["schemas"]["EdgeInput"][];
2439
+ };
2440
+ /** @description Server returns a `GraphResponse<BatchResults<Edge>>` envelope. */
2441
+ BatchEdgesResponse: {
2442
+ success?: boolean;
2443
+ data?: {
2444
+ results?: components["schemas"]["EdgeResponse"][];
2445
+ count?: number;
2446
+ } & {
2447
+ [key: string]: unknown;
2448
+ };
2449
+ } & {
2450
+ [key: string]: unknown;
2451
+ };
2452
+ };
2453
+ responses: {
2454
+ /** @description Invalid request. */
2455
+ BadRequest: {
2456
+ headers: {
2457
+ [name: string]: unknown;
2458
+ };
2459
+ content: {
2460
+ "application/json": components["schemas"]["ErrorResponse"];
2461
+ };
2462
+ };
2463
+ /** @description Resource not found. */
2464
+ NotFound: {
2465
+ headers: {
2466
+ [name: string]: unknown;
2467
+ };
2468
+ content: {
2469
+ "application/json": components["schemas"]["ErrorResponse"];
2470
+ };
2471
+ };
2472
+ /** @description Authentication required or insufficient permissions. */
2473
+ Unauthorized: {
2474
+ headers: {
2475
+ [name: string]: unknown;
2476
+ };
2477
+ content: {
2478
+ "application/json": components["schemas"]["ErrorResponse"];
2479
+ };
2480
+ };
2481
+ };
2482
+ parameters: {
2483
+ GraphId: string;
2484
+ NodeId: string;
2485
+ };
2486
+ requestBodies: never;
2487
+ headers: never;
2488
+ pathItems: never;
2489
+ }
2490
+ export type $defs = Record<string, never>;
2491
+ export interface operations {
2492
+ listCollections: {
2493
+ parameters: {
2494
+ query?: {
2495
+ /** @description Maximum number of collections to return (default: 100) */
2496
+ limit?: number;
2497
+ /** @description Offset for pagination (default: 0) */
2498
+ offset?: number;
2499
+ /** @description Whether to include statistics */
2500
+ include_stats?: boolean;
2501
+ };
2502
+ header?: {
2503
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2504
+ "X-Tenant-ID"?: string;
2505
+ };
2506
+ path?: never;
2507
+ cookie?: never;
2508
+ };
2509
+ requestBody?: never;
2510
+ responses: {
2511
+ /** @description Collection page. */
2512
+ 200: {
2513
+ headers: {
2514
+ [name: string]: unknown;
2515
+ };
2516
+ content: {
2517
+ "application/json": components["schemas"]["ListCollectionsV2Response"];
2518
+ };
2519
+ };
2520
+ };
2521
+ };
2522
+ createCollection: {
2523
+ parameters: {
2524
+ query?: never;
2525
+ header?: {
2526
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2527
+ "X-Tenant-ID"?: string;
2528
+ };
2529
+ path?: never;
2530
+ cookie?: never;
2531
+ };
2532
+ requestBody: {
2533
+ content: {
2534
+ "application/json": components["schemas"]["CreateCollectionV2Request"];
2535
+ };
2536
+ };
2537
+ responses: {
2538
+ /** @description Collection created. */
2539
+ 200: {
2540
+ headers: {
2541
+ [name: string]: unknown;
2542
+ };
2543
+ content: {
2544
+ "application/json": components["schemas"]["CreateCollectionV2Response"];
2545
+ };
2546
+ };
2547
+ /** @description Invalid request. */
2548
+ 400: {
2549
+ headers: {
2550
+ [name: string]: unknown;
2551
+ };
2552
+ content: {
2553
+ "application/json": components["schemas"]["ErrorResponse"];
2554
+ };
2555
+ };
2556
+ };
2557
+ };
2558
+ getCollection: {
2559
+ parameters: {
2560
+ query?: never;
2561
+ header?: {
2562
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2563
+ "X-Tenant-ID"?: string;
2564
+ };
2565
+ path: {
2566
+ /** @description Collection name/ID. */
2567
+ collection_id: string;
2568
+ };
2569
+ cookie?: never;
2570
+ };
2571
+ requestBody?: never;
2572
+ responses: {
2573
+ /** @description Collection details. */
2574
+ 200: {
2575
+ headers: {
2576
+ [name: string]: unknown;
2577
+ };
2578
+ content: {
2579
+ "application/json": components["schemas"]["CollectionV2Response"];
2580
+ };
2581
+ };
2582
+ /** @description Resource not found. */
2583
+ 404: {
2584
+ headers: {
2585
+ [name: string]: unknown;
2586
+ };
2587
+ content: {
2588
+ "application/json": components["schemas"]["ErrorResponse"];
2589
+ };
2590
+ };
2591
+ };
2592
+ };
2593
+ deleteCollection: {
2594
+ parameters: {
2595
+ query?: never;
2596
+ header?: {
2597
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2598
+ "X-Tenant-ID"?: string;
2599
+ };
2600
+ path: {
2601
+ /** @description Collection name/ID. */
2602
+ collection_id: string;
2603
+ };
2604
+ cookie?: never;
2605
+ };
2606
+ requestBody?: never;
2607
+ responses: {
2608
+ /** @description Collection deleted. */
2609
+ 200: {
2610
+ headers: {
2611
+ [name: string]: unknown;
2612
+ };
2613
+ content: {
2614
+ "application/json": components["schemas"]["DeleteCollectionV2Response"];
2615
+ };
2616
+ };
2617
+ /** @description Resource not found. */
2618
+ 404: {
2619
+ headers: {
2620
+ [name: string]: unknown;
2621
+ };
2622
+ content: {
2623
+ "application/json": components["schemas"]["ErrorResponse"];
2624
+ };
2625
+ };
2626
+ };
2627
+ };
2628
+ ingestDocuments: {
2629
+ parameters: {
2630
+ query?: never;
2631
+ header?: {
2632
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2633
+ "X-Tenant-ID"?: string;
2634
+ };
2635
+ path: {
2636
+ /** @description Target collection name/ID. */
2637
+ collection_id: string;
2638
+ };
2639
+ cookie?: never;
2640
+ };
2641
+ requestBody: {
2642
+ content: {
2643
+ "application/json": components["schemas"]["IngestDocumentsRequest"];
2644
+ };
2645
+ };
2646
+ responses: {
2647
+ /** @description Ingested. */
2648
+ 200: {
2649
+ headers: {
2650
+ [name: string]: unknown;
2651
+ };
2652
+ content: {
2653
+ "application/json": components["schemas"]["IngestDocumentsResponse"];
2654
+ };
2655
+ };
2656
+ /** @description Invalid request. */
2657
+ 400: {
2658
+ headers: {
2659
+ [name: string]: unknown;
2660
+ };
2661
+ content: {
2662
+ "application/json": components["schemas"]["ErrorResponse"];
2663
+ };
2664
+ };
2665
+ /** @description Collection not found. */
2666
+ 404: {
2667
+ headers: {
2668
+ [name: string]: unknown;
2669
+ };
2670
+ content: {
2671
+ "application/json": components["schemas"]["ErrorResponse"];
2672
+ };
2673
+ };
2674
+ };
2675
+ };
2676
+ upsert_entity_v2: {
2677
+ parameters: {
2678
+ query?: never;
2679
+ header?: {
2680
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2681
+ "X-Tenant-ID"?: string;
2682
+ };
2683
+ path: {
2684
+ /** @description Collection backing the entities */
2685
+ collection_id: string;
2686
+ };
2687
+ cookie?: never;
2688
+ };
2689
+ requestBody: {
2690
+ content: {
2691
+ "application/json": components["schemas"]["UpsertEntityRequest"];
2692
+ };
2693
+ };
2694
+ responses: {
2695
+ /** @description Entity upserted */
2696
+ 200: {
2697
+ headers: {
2698
+ [name: string]: unknown;
2699
+ };
2700
+ content: {
2701
+ "application/json": components["schemas"]["UpsertEntityResponse"];
2702
+ };
2703
+ };
2704
+ /** @description Invalid request */
2705
+ 400: {
2706
+ headers: {
2707
+ [name: string]: unknown;
2708
+ };
2709
+ content: {
2710
+ "application/json": components["schemas"]["ErrorResponse"];
2711
+ };
2712
+ };
2713
+ /** @description Upsert failed */
2714
+ 500: {
2715
+ headers: {
2716
+ [name: string]: unknown;
2717
+ };
2718
+ content: {
2719
+ "application/json": components["schemas"]["ErrorResponse"];
2720
+ };
2721
+ };
2722
+ };
2723
+ };
2724
+ search_entities_v2: {
2725
+ parameters: {
2726
+ query?: never;
2727
+ header?: {
2728
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2729
+ "X-Tenant-ID"?: string;
2730
+ };
2731
+ path: {
2732
+ /** @description Collection backing the entities */
2733
+ collection_id: string;
2734
+ };
2735
+ cookie?: never;
2736
+ };
2737
+ requestBody: {
2738
+ content: {
2739
+ "application/json": components["schemas"]["SearchEntitiesRequest"];
2740
+ };
2741
+ };
2742
+ responses: {
2743
+ /** @description Search results */
2744
+ 200: {
2745
+ headers: {
2746
+ [name: string]: unknown;
2747
+ };
2748
+ content: {
2749
+ "application/json": components["schemas"]["SearchEntitiesResponse"];
2750
+ };
2751
+ };
2752
+ /** @description Invalid request */
2753
+ 400: {
2754
+ headers: {
2755
+ [name: string]: unknown;
2756
+ };
2757
+ content: {
2758
+ "application/json": components["schemas"]["ErrorResponse"];
2759
+ };
2760
+ };
2761
+ /** @description Search failed */
2762
+ 500: {
2763
+ headers: {
2764
+ [name: string]: unknown;
2765
+ };
2766
+ content: {
2767
+ "application/json": components["schemas"]["ErrorResponse"];
2768
+ };
2769
+ };
2770
+ };
2771
+ };
2772
+ get_entity_v2: {
2773
+ parameters: {
2774
+ query?: never;
2775
+ header?: {
2776
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2777
+ "X-Tenant-ID"?: string;
2778
+ };
2779
+ path: {
2780
+ /** @description Collection backing the entities */
2781
+ collection_id: string;
2782
+ /** @description Entity ID */
2783
+ entity_id: string;
2784
+ };
2785
+ cookie?: never;
2786
+ };
2787
+ requestBody?: never;
2788
+ responses: {
2789
+ /** @description Entity found */
2790
+ 200: {
2791
+ headers: {
2792
+ [name: string]: unknown;
2793
+ };
2794
+ content: {
2795
+ "application/json": components["schemas"]["EntityDto"];
2796
+ };
2797
+ };
2798
+ /** @description Entity not found */
2799
+ 404: {
2800
+ headers: {
2801
+ [name: string]: unknown;
2802
+ };
2803
+ content: {
2804
+ "application/json": components["schemas"]["ErrorResponse"];
2805
+ };
2806
+ };
2807
+ /** @description Fetch failed */
2808
+ 500: {
2809
+ headers: {
2810
+ [name: string]: unknown;
2811
+ };
2812
+ content: {
2813
+ "application/json": components["schemas"]["ErrorResponse"];
2814
+ };
2815
+ };
2816
+ };
2817
+ };
2818
+ delete_entity_v2: {
2819
+ parameters: {
2820
+ query?: never;
2821
+ header?: {
2822
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2823
+ "X-Tenant-ID"?: string;
2824
+ };
2825
+ path: {
2826
+ /** @description Collection backing the entities */
2827
+ collection_id: string;
2828
+ /** @description Entity ID */
2829
+ entity_id: string;
2830
+ };
2831
+ cookie?: never;
2832
+ };
2833
+ requestBody?: never;
2834
+ responses: {
2835
+ /** @description Entity deleted */
2836
+ 200: {
2837
+ headers: {
2838
+ [name: string]: unknown;
2839
+ };
2840
+ content: {
2841
+ "application/json": components["schemas"]["UpsertEntityResponse"];
2842
+ };
2843
+ };
2844
+ /** @description Entity not found */
2845
+ 404: {
2846
+ headers: {
2847
+ [name: string]: unknown;
2848
+ };
2849
+ content: {
2850
+ "application/json": components["schemas"]["ErrorResponse"];
2851
+ };
2852
+ };
2853
+ /** @description Delete failed */
2854
+ 500: {
2855
+ headers: {
2856
+ [name: string]: unknown;
2857
+ };
2858
+ content: {
2859
+ "application/json": components["schemas"]["ErrorResponse"];
2860
+ };
2861
+ };
2862
+ };
2863
+ };
2864
+ insertRecords: {
2865
+ parameters: {
2866
+ query?: never;
2867
+ header?: {
2868
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2869
+ "X-Tenant-ID"?: string;
2870
+ };
2871
+ path: {
2872
+ /** @description Collection name/ID. */
2873
+ collection_id: string;
2874
+ };
2875
+ cookie?: never;
2876
+ };
2877
+ requestBody: {
2878
+ content: {
2879
+ "application/json": components["schemas"]["InsertRecordsRequest"];
2880
+ };
2881
+ };
2882
+ responses: {
2883
+ /** @description Batch write result. */
2884
+ 200: {
2885
+ headers: {
2886
+ [name: string]: unknown;
2887
+ };
2888
+ content: {
2889
+ "application/json": components["schemas"]["InsertRecordsResponse"];
2890
+ };
2891
+ };
2892
+ /** @description Invalid request. */
2893
+ 400: {
2894
+ headers: {
2895
+ [name: string]: unknown;
2896
+ };
2897
+ content: {
2898
+ "application/json": components["schemas"]["ErrorResponse"];
2899
+ };
2900
+ };
2901
+ };
2902
+ };
2903
+ scanRecords: {
2904
+ parameters: {
2905
+ query?: never;
2906
+ header?: {
2907
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2908
+ "X-Tenant-ID"?: string;
2909
+ };
2910
+ path: {
2911
+ /** @description Collection name/ID. */
2912
+ collection_id: string;
2913
+ };
2914
+ cookie?: never;
2915
+ };
2916
+ requestBody: {
2917
+ content: {
2918
+ "application/json": components["schemas"]["ScanRecordsRequest"];
2919
+ };
2920
+ };
2921
+ responses: {
2922
+ /** @description Page of records + optional next cursor. */
2923
+ 200: {
2924
+ headers: {
2925
+ [name: string]: unknown;
2926
+ };
2927
+ content: {
2928
+ "application/json": components["schemas"]["ScanRecordsResponse"];
2929
+ };
2930
+ };
2931
+ /** @description Invalid request (including a cursor minted for a different collection). */
2932
+ 400: {
2933
+ headers: {
2934
+ [name: string]: unknown;
2935
+ };
2936
+ content: {
2937
+ "application/json": components["schemas"]["ErrorResponse"];
2938
+ };
2939
+ };
2940
+ /** @description Resource not found. */
2941
+ 404: {
2942
+ headers: {
2943
+ [name: string]: unknown;
2944
+ };
2945
+ content: {
2946
+ "application/json": components["schemas"]["ErrorResponse"];
2947
+ };
2948
+ };
2949
+ /** @description Collection changed during the scan; restart pagination. */
2950
+ 409: {
2951
+ headers: {
2952
+ [name: string]: unknown;
2953
+ };
2954
+ content: {
2955
+ "application/json": components["schemas"]["ErrorResponse"];
2956
+ };
2957
+ };
2958
+ /** @description Cursor expired (older than 24h); restart the scan. */
2959
+ 410: {
2960
+ headers: {
2961
+ [name: string]: unknown;
2962
+ };
2963
+ content: {
2964
+ "application/json": components["schemas"]["ErrorResponse"];
2965
+ };
2966
+ };
2967
+ };
2968
+ };
2969
+ getRecord: {
2970
+ parameters: {
2971
+ query?: {
2972
+ /** @description Whether to include the vector in the response */
2973
+ include_vector?: boolean;
2974
+ /** @description Whether to include TEXT fields in the response */
2975
+ include_text?: boolean;
2976
+ };
2977
+ header?: {
2978
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
2979
+ "X-Tenant-ID"?: string;
2980
+ };
2981
+ path: {
2982
+ /** @description Collection name/ID. */
2983
+ collection_id: string;
2984
+ /** @description Record ID. */
2985
+ record_id: string;
2986
+ };
2987
+ cookie?: never;
2988
+ };
2989
+ requestBody?: never;
2990
+ responses: {
2991
+ /** @description Record. */
2992
+ 200: {
2993
+ headers: {
2994
+ [name: string]: unknown;
2995
+ };
2996
+ content: {
2997
+ "application/json": components["schemas"]["RecordV2Response"];
2998
+ };
2999
+ };
3000
+ /** @description Resource not found. */
3001
+ 404: {
3002
+ headers: {
3003
+ [name: string]: unknown;
3004
+ };
3005
+ content: {
3006
+ "application/json": components["schemas"]["ErrorResponse"];
3007
+ };
3008
+ };
3009
+ };
3010
+ };
3011
+ deleteRecord: {
3012
+ parameters: {
3013
+ query?: never;
3014
+ header?: {
3015
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3016
+ "X-Tenant-ID"?: string;
3017
+ };
3018
+ path: {
3019
+ /** @description Collection name/ID. */
3020
+ collection_id: string;
3021
+ /** @description Record ID. */
3022
+ record_id: string;
3023
+ };
3024
+ cookie?: never;
3025
+ };
3026
+ requestBody?: never;
3027
+ responses: {
3028
+ /** @description Delete accepted. */
3029
+ 200: {
3030
+ headers: {
3031
+ [name: string]: unknown;
3032
+ };
3033
+ content: {
3034
+ "application/json": components["schemas"]["DeleteRecordV2Response"];
3035
+ };
3036
+ };
3037
+ };
3038
+ };
3039
+ getCollectionSchema: {
3040
+ parameters: {
3041
+ query?: never;
3042
+ header?: {
3043
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3044
+ "X-Tenant-ID"?: string;
3045
+ };
3046
+ path: {
3047
+ /** @description Collection name/ID. */
3048
+ collection_id: string;
3049
+ };
3050
+ cookie?: never;
3051
+ };
3052
+ requestBody?: never;
3053
+ responses: {
3054
+ /** @description Collection schema. */
3055
+ 200: {
3056
+ headers: {
3057
+ [name: string]: unknown;
3058
+ };
3059
+ content: {
3060
+ "application/json": components["schemas"]["SchemaResponse"];
3061
+ };
3062
+ };
3063
+ /** @description Resource not found. */
3064
+ 404: {
3065
+ headers: {
3066
+ [name: string]: unknown;
3067
+ };
3068
+ content: {
3069
+ "application/json": components["schemas"]["ErrorResponse"];
3070
+ };
3071
+ };
3072
+ };
3073
+ };
3074
+ updateCollectionSchema: {
3075
+ parameters: {
3076
+ query?: never;
3077
+ header?: {
3078
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3079
+ "X-Tenant-ID"?: string;
3080
+ };
3081
+ path: {
3082
+ /** @description Collection name/ID. */
3083
+ collection_id: string;
3084
+ };
3085
+ cookie?: never;
3086
+ };
3087
+ requestBody: {
3088
+ content: {
3089
+ "application/json": components["schemas"]["UpdateSchemaRequest"];
3090
+ };
3091
+ };
3092
+ responses: {
3093
+ /** @description Schema updated. */
3094
+ 200: {
3095
+ headers: {
3096
+ [name: string]: unknown;
3097
+ };
3098
+ content: {
3099
+ "application/json": components["schemas"]["UpdateSchemaResponse"];
3100
+ };
3101
+ };
3102
+ /** @description Invalid request. */
3103
+ 400: {
3104
+ headers: {
3105
+ [name: string]: unknown;
3106
+ };
3107
+ content: {
3108
+ "application/json": components["schemas"]["ErrorResponse"];
3109
+ };
3110
+ };
3111
+ };
3112
+ };
3113
+ searchRecords: {
3114
+ parameters: {
3115
+ query?: never;
3116
+ header?: {
3117
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3118
+ "X-Tenant-ID"?: string;
3119
+ };
3120
+ path: {
3121
+ /** @description Collection name/ID. */
3122
+ collection_id: string;
3123
+ };
3124
+ cookie?: never;
3125
+ };
3126
+ requestBody: {
3127
+ content: {
3128
+ "application/json": components["schemas"]["TypedSearchRequest"];
3129
+ };
3130
+ };
3131
+ responses: {
3132
+ /** @description Search results. */
3133
+ 200: {
3134
+ headers: {
3135
+ [name: string]: unknown;
3136
+ };
3137
+ content: {
3138
+ "application/json": components["schemas"]["TypedSearchResponse"];
3139
+ };
3140
+ };
3141
+ /** @description Invalid request. */
3142
+ 400: {
3143
+ headers: {
3144
+ [name: string]: unknown;
3145
+ };
3146
+ content: {
3147
+ "application/json": components["schemas"]["ErrorResponse"];
3148
+ };
3149
+ };
3150
+ };
3151
+ };
3152
+ fusion_search_v2: {
3153
+ parameters: {
3154
+ query?: never;
3155
+ header?: {
3156
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3157
+ "X-Tenant-ID"?: string;
3158
+ };
3159
+ path: {
3160
+ /** @description Graph ID for traversal expansion */
3161
+ graph_id: string;
3162
+ };
3163
+ cookie?: never;
3164
+ };
3165
+ requestBody: {
3166
+ content: {
3167
+ "application/json": components["schemas"]["FusionSearchRequest"];
3168
+ };
3169
+ };
3170
+ responses: {
3171
+ /** @description Fusion results with calibrated scores */
3172
+ 200: {
3173
+ headers: {
3174
+ [name: string]: unknown;
3175
+ };
3176
+ content: {
3177
+ "application/json": components["schemas"]["FusionSearchResponse"];
3178
+ };
3179
+ };
3180
+ /** @description Invalid request (empty query_vector, etc.) */
3181
+ 400: {
3182
+ headers: {
3183
+ [name: string]: unknown;
3184
+ };
3185
+ content: {
3186
+ "application/json": components["schemas"]["ErrorResponse"];
3187
+ };
3188
+ };
3189
+ /** @description Fusion execution failed */
3190
+ 500: {
3191
+ headers: {
3192
+ [name: string]: unknown;
3193
+ };
3194
+ content: {
3195
+ "application/json": components["schemas"]["ErrorResponse"];
3196
+ };
3197
+ };
3198
+ };
3199
+ };
3200
+ impact_analysis_v2: {
3201
+ parameters: {
3202
+ query?: never;
3203
+ header?: {
3204
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3205
+ "X-Tenant-ID"?: string;
3206
+ };
3207
+ path: {
3208
+ /** @description Graph ID */
3209
+ graph_id: string;
3210
+ };
3211
+ cookie?: never;
3212
+ };
3213
+ requestBody: {
3214
+ content: {
3215
+ "application/json": components["schemas"]["ImpactAnalysisRequest"];
3216
+ };
3217
+ };
3218
+ responses: {
3219
+ /** @description Impacted node ids */
3220
+ 200: {
3221
+ headers: {
3222
+ [name: string]: unknown;
3223
+ };
3224
+ content: {
3225
+ "application/json": components["schemas"]["ImpactAnalysisResponse"];
3226
+ };
3227
+ };
3228
+ /** @description Missing graph_id/node_id */
3229
+ 400: {
3230
+ headers: {
3231
+ [name: string]: unknown;
3232
+ };
3233
+ content: {
3234
+ "application/json": components["schemas"]["ErrorResponse"];
3235
+ };
3236
+ };
3237
+ /** @description Impact analysis failed */
3238
+ 500: {
3239
+ headers: {
3240
+ [name: string]: unknown;
3241
+ };
3242
+ content: {
3243
+ "application/json": components["schemas"]["ErrorResponse"];
3244
+ };
3245
+ };
3246
+ };
3247
+ };
3248
+ listModelRegistries: {
3249
+ parameters: {
3250
+ query?: never;
3251
+ header?: {
3252
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3253
+ "X-Tenant-ID"?: string;
3254
+ };
3255
+ path?: never;
3256
+ cookie?: never;
3257
+ };
3258
+ requestBody?: never;
3259
+ responses: {
3260
+ /** @description Tenant-scoped registries in deterministic name order. */
3261
+ 200: {
3262
+ headers: {
3263
+ [name: string]: unknown;
3264
+ };
3265
+ content: {
3266
+ "application/json": components["schemas"]["ListModelRegistriesResponse"];
3267
+ };
3268
+ };
3269
+ };
3270
+ };
3271
+ createModelRegistry: {
3272
+ parameters: {
3273
+ query?: never;
3274
+ header?: {
3275
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3276
+ "X-Tenant-ID"?: string;
3277
+ };
3278
+ path?: never;
3279
+ cookie?: never;
3280
+ };
3281
+ requestBody: {
3282
+ content: {
3283
+ "application/json": components["schemas"]["CreateModelRegistryRequest"];
3284
+ };
3285
+ };
3286
+ responses: {
3287
+ /** @description Created model registry. */
3288
+ 200: {
3289
+ headers: {
3290
+ [name: string]: unknown;
3291
+ };
3292
+ content: {
3293
+ "application/json": components["schemas"]["ModelRegistryRecordResponse"];
3294
+ };
3295
+ };
3296
+ /** @description Invalid registry name. */
3297
+ 400: {
3298
+ headers: {
3299
+ [name: string]: unknown;
3300
+ };
3301
+ content: {
3302
+ "application/json": components["schemas"]["ErrorResponse"];
3303
+ };
3304
+ };
3305
+ /** @description Registry already exists. */
3306
+ 409: {
3307
+ headers: {
3308
+ [name: string]: unknown;
3309
+ };
3310
+ content: {
3311
+ "application/json": components["schemas"]["ErrorResponse"];
3312
+ };
3313
+ };
3314
+ };
3315
+ };
3316
+ getModelRegistry: {
3317
+ parameters: {
3318
+ query?: never;
3319
+ header?: {
3320
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3321
+ "X-Tenant-ID"?: string;
3322
+ };
3323
+ path: {
3324
+ /** @description Tenant-local registry name. */
3325
+ name: string;
3326
+ };
3327
+ cookie?: never;
3328
+ };
3329
+ requestBody?: never;
3330
+ responses: {
3331
+ /** @description Model registry. */
3332
+ 200: {
3333
+ headers: {
3334
+ [name: string]: unknown;
3335
+ };
3336
+ content: {
3337
+ "application/json": components["schemas"]["ModelRegistryRecordResponse"];
3338
+ };
3339
+ };
3340
+ /** @description Registry not found. */
3341
+ 404: {
3342
+ headers: {
3343
+ [name: string]: unknown;
3344
+ };
3345
+ content: {
3346
+ "application/json": components["schemas"]["ErrorResponse"];
3347
+ };
3348
+ };
3349
+ };
3350
+ };
3351
+ applyModelRegistryMutation: {
3352
+ parameters: {
3353
+ query?: never;
3354
+ header?: {
3355
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3356
+ "X-Tenant-ID"?: string;
3357
+ };
3358
+ path: {
3359
+ /** @description Tenant-local registry name. */
3360
+ name: string;
3361
+ };
3362
+ cookie?: never;
3363
+ };
3364
+ requestBody: {
3365
+ content: {
3366
+ "application/json": components["schemas"]["ApplyModelRegistryMutationRequest"];
3367
+ };
3368
+ };
3369
+ responses: {
3370
+ /** @description Updated registry. */
3371
+ 200: {
3372
+ headers: {
3373
+ [name: string]: unknown;
3374
+ };
3375
+ content: {
3376
+ "application/json": components["schemas"]["ModelRegistryRecordResponse"];
3377
+ };
3378
+ };
3379
+ /** @description Invalid lifecycle command. */
3380
+ 400: {
3381
+ headers: {
3382
+ [name: string]: unknown;
3383
+ };
3384
+ content: {
3385
+ "application/json": components["schemas"]["ErrorResponse"];
3386
+ };
3387
+ };
3388
+ /** @description Registry not found. */
3389
+ 404: {
3390
+ headers: {
3391
+ [name: string]: unknown;
3392
+ };
3393
+ content: {
3394
+ "application/json": components["schemas"]["ErrorResponse"];
3395
+ };
3396
+ };
3397
+ /** @description Revision conflict. */
3398
+ 409: {
3399
+ headers: {
3400
+ [name: string]: unknown;
3401
+ };
3402
+ content: {
3403
+ "application/json": components["schemas"]["ErrorResponse"];
3404
+ };
3405
+ };
3406
+ };
3407
+ };
3408
+ resolveModelAlias: {
3409
+ parameters: {
3410
+ query?: never;
3411
+ header?: {
3412
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3413
+ "X-Tenant-ID"?: string;
3414
+ };
3415
+ path: {
3416
+ /** @description Tenant-local registry name. */
3417
+ name: string;
3418
+ };
3419
+ cookie?: never;
3420
+ };
3421
+ requestBody: {
3422
+ content: {
3423
+ "application/json": components["schemas"]["ResolveModelAliasRequest"];
3424
+ };
3425
+ };
3426
+ responses: {
3427
+ /** @description Immutable version and digest binding. */
3428
+ 200: {
3429
+ headers: {
3430
+ [name: string]: unknown;
3431
+ };
3432
+ content: {
3433
+ "application/json": components["schemas"]["ResolvedModelBindingResponse"];
3434
+ };
3435
+ };
3436
+ /** @description Alias, dimension, runtime, or approval policy rejected. */
3437
+ 400: {
3438
+ headers: {
3439
+ [name: string]: unknown;
3440
+ };
3441
+ content: {
3442
+ "application/json": components["schemas"]["ErrorResponse"];
3443
+ };
3444
+ };
3445
+ /** @description Registry not found. */
3446
+ 404: {
3447
+ headers: {
3448
+ [name: string]: unknown;
3449
+ };
3450
+ content: {
3451
+ "application/json": components["schemas"]["ErrorResponse"];
3452
+ };
3453
+ };
3454
+ };
3455
+ };
3456
+ executeQuery: {
3457
+ parameters: {
3458
+ query?: never;
3459
+ header?: {
3460
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3461
+ "X-Tenant-ID"?: string;
3462
+ };
3463
+ path?: never;
3464
+ cookie?: never;
3465
+ };
3466
+ requestBody: {
3467
+ content: {
3468
+ "application/json": components["schemas"]["QueryRequest"];
3469
+ };
3470
+ };
3471
+ responses: {
3472
+ /** @description Query result. */
3473
+ 200: {
3474
+ headers: {
3475
+ [name: string]: unknown;
3476
+ };
3477
+ content: {
3478
+ "application/json": components["schemas"]["QueryResponse"];
3479
+ };
3480
+ };
3481
+ /** @description Invalid request. */
3482
+ 400: {
3483
+ headers: {
3484
+ [name: string]: unknown;
3485
+ };
3486
+ content: {
3487
+ "application/json": components["schemas"]["ErrorResponse"];
3488
+ };
3489
+ };
3490
+ };
3491
+ };
3492
+ explainQuery: {
3493
+ parameters: {
3494
+ query?: never;
3495
+ header?: {
3496
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3497
+ "X-Tenant-ID"?: string;
3498
+ };
3499
+ path?: never;
3500
+ cookie?: never;
3501
+ };
3502
+ requestBody: {
3503
+ content: {
3504
+ "application/json": components["schemas"]["ExplainQueryRequest"];
3505
+ };
3506
+ };
3507
+ responses: {
3508
+ /** @description Query plan and lowering details. */
3509
+ 200: {
3510
+ headers: {
3511
+ [name: string]: unknown;
3512
+ };
3513
+ content: {
3514
+ "application/json": components["schemas"]["QueryResponse"];
3515
+ };
3516
+ };
3517
+ /** @description Invalid request. */
3518
+ 400: {
3519
+ headers: {
3520
+ [name: string]: unknown;
3521
+ };
3522
+ content: {
3523
+ "application/json": components["schemas"]["ErrorResponse"];
3524
+ };
3525
+ };
3526
+ };
3527
+ };
3528
+ executeSql: {
3529
+ parameters: {
3530
+ query?: never;
3531
+ header?: {
3532
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3533
+ "X-Tenant-ID"?: string;
3534
+ };
3535
+ path?: never;
3536
+ cookie?: never;
3537
+ };
3538
+ requestBody: {
3539
+ content: {
3540
+ "application/json": components["schemas"]["SqlRequest"];
3541
+ };
3542
+ };
3543
+ responses: {
3544
+ /** @description SQL result or write count. */
3545
+ 200: {
3546
+ headers: {
3547
+ [name: string]: unknown;
3548
+ };
3549
+ content: {
3550
+ "application/json": components["schemas"]["SqlResponse"];
3551
+ };
3552
+ };
3553
+ /** @description Invalid SQL request. */
3554
+ 400: {
3555
+ headers: {
3556
+ [name: string]: unknown;
3557
+ };
3558
+ content: {
3559
+ "application/json": components["schemas"]["ErrorResponse"];
3560
+ };
3561
+ };
3562
+ /** @description Query deadline exceeded. */
3563
+ 408: {
3564
+ headers: {
3565
+ [name: string]: unknown;
3566
+ };
3567
+ content: {
3568
+ "application/json": components["schemas"]["ErrorResponse"];
3569
+ };
3570
+ };
3571
+ /** @description Write lock conflict. */
3572
+ 409: {
3573
+ headers: {
3574
+ [name: string]: unknown;
3575
+ };
3576
+ content: {
3577
+ "application/json": components["schemas"]["ErrorResponse"];
3578
+ };
3579
+ };
3580
+ /** @description SQL execution failure. */
3581
+ 500: {
3582
+ headers: {
3583
+ [name: string]: unknown;
3584
+ };
3585
+ content: {
3586
+ "application/json": components["schemas"]["ErrorResponse"];
3587
+ };
3588
+ };
3589
+ };
3590
+ };
3591
+ getHealth: {
3592
+ parameters: {
3593
+ query?: never;
3594
+ header?: {
3595
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3596
+ "X-Tenant-ID"?: string;
3597
+ };
3598
+ path?: never;
3599
+ cookie?: never;
3600
+ };
3601
+ requestBody?: never;
3602
+ responses: {
3603
+ /** @description Health status. */
3604
+ 200: {
3605
+ headers: {
3606
+ [name: string]: unknown;
3607
+ };
3608
+ content: {
3609
+ "application/json": components["schemas"]["HealthResponse"];
3610
+ };
3611
+ };
3612
+ };
3613
+ };
3614
+ getLiveness: {
3615
+ parameters: {
3616
+ query?: never;
3617
+ header?: {
3618
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3619
+ "X-Tenant-ID"?: string;
3620
+ };
3621
+ path?: never;
3622
+ cookie?: never;
3623
+ };
3624
+ requestBody?: never;
3625
+ responses: {
3626
+ /** @description Process is alive. */
3627
+ 200: {
3628
+ headers: {
3629
+ [name: string]: unknown;
3630
+ };
3631
+ content: {
3632
+ "application/json": components["schemas"]["ProbeResponse"];
3633
+ };
3634
+ };
3635
+ };
3636
+ };
3637
+ getReadiness: {
3638
+ parameters: {
3639
+ query?: never;
3640
+ header?: {
3641
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3642
+ "X-Tenant-ID"?: string;
3643
+ };
3644
+ path?: never;
3645
+ cookie?: never;
3646
+ };
3647
+ requestBody?: never;
3648
+ responses: {
3649
+ /** @description Server is ready. */
3650
+ 200: {
3651
+ headers: {
3652
+ [name: string]: unknown;
3653
+ };
3654
+ content: {
3655
+ "application/json": components["schemas"]["ProbeResponse"];
3656
+ };
3657
+ };
3658
+ };
3659
+ };
3660
+ getCapabilities: {
3661
+ parameters: {
3662
+ query?: never;
3663
+ header?: {
3664
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3665
+ "X-Tenant-ID"?: string;
3666
+ };
3667
+ path?: never;
3668
+ cookie?: never;
3669
+ };
3670
+ requestBody?: never;
3671
+ responses: {
3672
+ /** @description Capability document. */
3673
+ 200: {
3674
+ headers: {
3675
+ [name: string]: unknown;
3676
+ };
3677
+ content: {
3678
+ "application/json": components["schemas"]["CapabilitiesResponse"];
3679
+ };
3680
+ };
3681
+ };
3682
+ };
3683
+ listGraphs: {
3684
+ parameters: {
3685
+ query?: never;
3686
+ header?: {
3687
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3688
+ "X-Tenant-ID"?: string;
3689
+ };
3690
+ path?: never;
3691
+ cookie?: never;
3692
+ };
3693
+ requestBody?: never;
3694
+ responses: {
3695
+ /** @description Graph collection listing. */
3696
+ 200: {
3697
+ headers: {
3698
+ [name: string]: unknown;
3699
+ };
3700
+ content: {
3701
+ "application/json": components["schemas"]["ListGraphsResponse"];
3702
+ };
3703
+ };
3704
+ };
3705
+ };
3706
+ createGraph: {
3707
+ parameters: {
3708
+ query?: never;
3709
+ header?: {
3710
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3711
+ "X-Tenant-ID"?: string;
3712
+ };
3713
+ path?: never;
3714
+ cookie?: never;
3715
+ };
3716
+ requestBody: {
3717
+ content: {
3718
+ "application/json": components["schemas"]["CreateGraphRequest"];
3719
+ };
3720
+ };
3721
+ responses: {
3722
+ /** @description Graph collection metadata. */
3723
+ 200: {
3724
+ headers: {
3725
+ [name: string]: unknown;
3726
+ };
3727
+ content: {
3728
+ "application/json": components["schemas"]["GraphCollectionResponse"];
3729
+ };
3730
+ };
3731
+ 400: components["responses"]["BadRequest"];
3732
+ };
3733
+ };
3734
+ getGraph: {
3735
+ parameters: {
3736
+ query?: never;
3737
+ header?: {
3738
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3739
+ "X-Tenant-ID"?: string;
3740
+ };
3741
+ path: {
3742
+ graph_id: components["parameters"]["GraphId"];
3743
+ };
3744
+ cookie?: never;
3745
+ };
3746
+ requestBody?: never;
3747
+ responses: {
3748
+ /** @description Graph collection metadata. */
3749
+ 200: {
3750
+ headers: {
3751
+ [name: string]: unknown;
3752
+ };
3753
+ content: {
3754
+ "application/json": components["schemas"]["GraphCollectionResponse"];
3755
+ };
3756
+ };
3757
+ 404: components["responses"]["NotFound"];
3758
+ };
3759
+ };
3760
+ deleteGraph: {
3761
+ parameters: {
3762
+ query?: never;
3763
+ header?: {
3764
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3765
+ "X-Tenant-ID"?: string;
3766
+ };
3767
+ path: {
3768
+ graph_id: components["parameters"]["GraphId"];
3769
+ };
3770
+ cookie?: never;
3771
+ };
3772
+ requestBody?: never;
3773
+ responses: {
3774
+ /** @description Deletion acknowledged. */
3775
+ 200: {
3776
+ headers: {
3777
+ [name: string]: unknown;
3778
+ };
3779
+ content: {
3780
+ "application/json": components["schemas"]["DeleteGraphResponse"];
3781
+ };
3782
+ };
3783
+ 404: components["responses"]["NotFound"];
3784
+ };
3785
+ };
3786
+ createNode: {
3787
+ parameters: {
3788
+ query?: never;
3789
+ header?: {
3790
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3791
+ "X-Tenant-ID"?: string;
3792
+ };
3793
+ path: {
3794
+ graph_id: components["parameters"]["GraphId"];
3795
+ };
3796
+ cookie?: never;
3797
+ };
3798
+ requestBody: {
3799
+ content: {
3800
+ "application/json": components["schemas"]["CreateNodeRequest"];
3801
+ };
3802
+ };
3803
+ responses: {
3804
+ /** @description Created node. */
3805
+ 200: {
3806
+ headers: {
3807
+ [name: string]: unknown;
3808
+ };
3809
+ content: {
3810
+ "application/json": components["schemas"]["NodeResponse"];
3811
+ };
3812
+ };
3813
+ 400: components["responses"]["BadRequest"];
3814
+ 404: components["responses"]["NotFound"];
3815
+ };
3816
+ };
3817
+ getNode: {
3818
+ parameters: {
3819
+ query?: never;
3820
+ header?: {
3821
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3822
+ "X-Tenant-ID"?: string;
3823
+ };
3824
+ path: {
3825
+ graph_id: components["parameters"]["GraphId"];
3826
+ node_id: components["parameters"]["NodeId"];
3827
+ };
3828
+ cookie?: never;
3829
+ };
3830
+ requestBody?: never;
3831
+ responses: {
3832
+ /** @description Node payload. */
3833
+ 200: {
3834
+ headers: {
3835
+ [name: string]: unknown;
3836
+ };
3837
+ content: {
3838
+ "application/json": components["schemas"]["NodeResponse"];
3839
+ };
3840
+ };
3841
+ 404: components["responses"]["NotFound"];
3842
+ };
3843
+ };
3844
+ deleteNode: {
3845
+ parameters: {
3846
+ query?: never;
3847
+ header?: {
3848
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3849
+ "X-Tenant-ID"?: string;
3850
+ };
3851
+ path: {
3852
+ graph_id: components["parameters"]["GraphId"];
3853
+ node_id: components["parameters"]["NodeId"];
3854
+ };
3855
+ cookie?: never;
3856
+ };
3857
+ requestBody?: never;
3858
+ responses: {
3859
+ /** @description Deletion acknowledged. */
3860
+ 200: {
3861
+ headers: {
3862
+ [name: string]: unknown;
3863
+ };
3864
+ content: {
3865
+ "application/json": components["schemas"]["DeleteNodeResponse"];
3866
+ };
3867
+ };
3868
+ 404: components["responses"]["NotFound"];
3869
+ };
3870
+ };
3871
+ createEdge: {
3872
+ parameters: {
3873
+ query?: never;
3874
+ header?: {
3875
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3876
+ "X-Tenant-ID"?: string;
3877
+ };
3878
+ path: {
3879
+ graph_id: components["parameters"]["GraphId"];
3880
+ };
3881
+ cookie?: never;
3882
+ };
3883
+ requestBody: {
3884
+ content: {
3885
+ "application/json": components["schemas"]["CreateEdgeRequest"];
3886
+ };
3887
+ };
3888
+ responses: {
3889
+ /** @description Created edge. */
3890
+ 200: {
3891
+ headers: {
3892
+ [name: string]: unknown;
3893
+ };
3894
+ content: {
3895
+ "application/json": components["schemas"]["EdgeResponse"];
3896
+ };
3897
+ };
3898
+ 400: components["responses"]["BadRequest"];
3899
+ 404: components["responses"]["NotFound"];
3900
+ };
3901
+ };
3902
+ batchCreateNodes: {
3903
+ parameters: {
3904
+ query?: never;
3905
+ header?: {
3906
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3907
+ "X-Tenant-ID"?: string;
3908
+ };
3909
+ path: {
3910
+ graph_id: components["parameters"]["GraphId"];
3911
+ };
3912
+ cookie?: never;
3913
+ };
3914
+ requestBody: {
3915
+ content: {
3916
+ "application/json": components["schemas"]["BatchCreateNodesRequest"];
3917
+ };
3918
+ };
3919
+ responses: {
3920
+ /** @description Batch result. */
3921
+ 200: {
3922
+ headers: {
3923
+ [name: string]: unknown;
3924
+ };
3925
+ content: {
3926
+ "application/json": components["schemas"]["BatchNodesResponse"];
3927
+ };
3928
+ };
3929
+ 400: components["responses"]["BadRequest"];
3930
+ 404: components["responses"]["NotFound"];
3931
+ };
3932
+ };
3933
+ batchCreateEdges: {
3934
+ parameters: {
3935
+ query?: never;
3936
+ header?: {
3937
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3938
+ "X-Tenant-ID"?: string;
3939
+ };
3940
+ path: {
3941
+ graph_id: components["parameters"]["GraphId"];
3942
+ };
3943
+ cookie?: never;
3944
+ };
3945
+ requestBody: {
3946
+ content: {
3947
+ "application/json": components["schemas"]["BatchCreateEdgesRequest"];
3948
+ };
3949
+ };
3950
+ responses: {
3951
+ /** @description Batch result. */
3952
+ 200: {
3953
+ headers: {
3954
+ [name: string]: unknown;
3955
+ };
3956
+ content: {
3957
+ "application/json": components["schemas"]["BatchEdgesResponse"];
3958
+ };
3959
+ };
3960
+ 400: components["responses"]["BadRequest"];
3961
+ 404: components["responses"]["NotFound"];
3962
+ };
3963
+ };
3964
+ traverseGraph: {
3965
+ parameters: {
3966
+ query?: never;
3967
+ header?: {
3968
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3969
+ "X-Tenant-ID"?: string;
3970
+ };
3971
+ path: {
3972
+ graph_id: components["parameters"]["GraphId"];
3973
+ };
3974
+ cookie?: never;
3975
+ };
3976
+ requestBody: {
3977
+ content: {
3978
+ "application/json": components["schemas"]["TraverseRequest"];
3979
+ };
3980
+ };
3981
+ responses: {
3982
+ /** @description Traversal result. */
3983
+ 200: {
3984
+ headers: {
3985
+ [name: string]: unknown;
3986
+ };
3987
+ content: {
3988
+ "application/json": components["schemas"]["TraverseResponse"];
3989
+ };
3990
+ };
3991
+ 400: components["responses"]["BadRequest"];
3992
+ };
3993
+ };
3994
+ getGraphStats: {
3995
+ parameters: {
3996
+ query?: never;
3997
+ header?: {
3998
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
3999
+ "X-Tenant-ID"?: string;
4000
+ };
4001
+ path: {
4002
+ graph_id: components["parameters"]["GraphId"];
4003
+ };
4004
+ cookie?: never;
4005
+ };
4006
+ requestBody?: never;
4007
+ responses: {
4008
+ /** @description Graph statistics. */
4009
+ 200: {
4010
+ headers: {
4011
+ [name: string]: unknown;
4012
+ };
4013
+ content: {
4014
+ "application/json": components["schemas"]["GraphStatsResponse"];
4015
+ };
4016
+ };
4017
+ };
4018
+ };
4019
+ hybridSearch: {
4020
+ parameters: {
4021
+ query?: never;
4022
+ header?: {
4023
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
4024
+ "X-Tenant-ID"?: string;
4025
+ };
4026
+ path?: never;
4027
+ cookie?: never;
4028
+ };
4029
+ requestBody: {
4030
+ content: {
4031
+ "application/json": {
4032
+ collection: string;
4033
+ vector?: number[];
4034
+ text_query?: string;
4035
+ top_k?: number;
4036
+ fusion_strategy?: string;
4037
+ } & {
4038
+ [key: string]: unknown;
4039
+ };
4040
+ };
4041
+ };
4042
+ responses: {
4043
+ /** @description Fused results. */
4044
+ 200: {
4045
+ headers: {
4046
+ [name: string]: unknown;
4047
+ };
4048
+ content: {
4049
+ "application/json": {
4050
+ [key: string]: unknown;
4051
+ };
4052
+ };
4053
+ };
4054
+ 400: components["responses"]["BadRequest"];
4055
+ };
4056
+ };
4057
+ hybridIndex: {
4058
+ parameters: {
4059
+ query?: never;
4060
+ header?: {
4061
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
4062
+ "X-Tenant-ID"?: string;
4063
+ };
4064
+ path?: never;
4065
+ cookie?: never;
4066
+ };
4067
+ requestBody: {
4068
+ content: {
4069
+ "application/json": {
4070
+ [key: string]: unknown;
4071
+ };
4072
+ };
4073
+ };
4074
+ responses: {
4075
+ /** @description Index result. */
4076
+ 200: {
4077
+ headers: {
4078
+ [name: string]: unknown;
4079
+ };
4080
+ content: {
4081
+ "application/json": {
4082
+ [key: string]: unknown;
4083
+ };
4084
+ };
4085
+ };
4086
+ };
4087
+ };
4088
+ listDocumentCollections: {
4089
+ parameters: {
4090
+ query?: never;
4091
+ header?: {
4092
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
4093
+ "X-Tenant-ID"?: string;
4094
+ };
4095
+ path?: never;
4096
+ cookie?: never;
4097
+ };
4098
+ requestBody?: never;
4099
+ responses: {
4100
+ /** @description Collections. */
4101
+ 200: {
4102
+ headers: {
4103
+ [name: string]: unknown;
4104
+ };
4105
+ content: {
4106
+ "application/json": {
4107
+ [key: string]: unknown;
4108
+ };
4109
+ };
4110
+ };
4111
+ };
4112
+ };
4113
+ createDocumentCollection: {
4114
+ parameters: {
4115
+ query?: never;
4116
+ header?: {
4117
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
4118
+ "X-Tenant-ID"?: string;
4119
+ };
4120
+ path?: never;
4121
+ cookie?: never;
4122
+ };
4123
+ requestBody: {
4124
+ content: {
4125
+ "application/json": {
4126
+ [key: string]: unknown;
4127
+ };
4128
+ };
4129
+ };
4130
+ responses: {
4131
+ /** @description Created. */
4132
+ 200: {
4133
+ headers: {
4134
+ [name: string]: unknown;
4135
+ };
4136
+ content: {
4137
+ "application/json": {
4138
+ [key: string]: unknown;
4139
+ };
4140
+ };
4141
+ };
4142
+ };
4143
+ };
4144
+ queryDocuments: {
4145
+ parameters: {
4146
+ query?: never;
4147
+ header?: {
4148
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
4149
+ "X-Tenant-ID"?: string;
4150
+ };
4151
+ path: {
4152
+ collection: string;
4153
+ };
4154
+ cookie?: never;
4155
+ };
4156
+ requestBody?: never;
4157
+ responses: {
4158
+ /** @description Documents. */
4159
+ 200: {
4160
+ headers: {
4161
+ [name: string]: unknown;
4162
+ };
4163
+ content: {
4164
+ "application/json": {
4165
+ [key: string]: unknown;
4166
+ };
4167
+ };
4168
+ };
4169
+ };
4170
+ };
4171
+ insertDocument: {
4172
+ parameters: {
4173
+ query?: never;
4174
+ header?: {
4175
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
4176
+ "X-Tenant-ID"?: string;
4177
+ };
4178
+ path: {
4179
+ collection: string;
4180
+ };
4181
+ cookie?: never;
4182
+ };
4183
+ requestBody: {
4184
+ content: {
4185
+ "application/json": {
4186
+ [key: string]: unknown;
4187
+ };
4188
+ };
4189
+ };
4190
+ responses: {
4191
+ /** @description Inserted. */
4192
+ 200: {
4193
+ headers: {
4194
+ [name: string]: unknown;
4195
+ };
4196
+ content: {
4197
+ "application/json": {
4198
+ [key: string]: unknown;
4199
+ };
4200
+ };
4201
+ };
4202
+ 404: components["responses"]["NotFound"];
4203
+ };
4204
+ };
4205
+ ingestLog: {
4206
+ parameters: {
4207
+ query?: never;
4208
+ header?: {
4209
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
4210
+ "X-Tenant-ID"?: string;
4211
+ };
4212
+ path: {
4213
+ namespace: string;
4214
+ };
4215
+ cookie?: never;
4216
+ };
4217
+ requestBody: {
4218
+ content: {
4219
+ "application/json": {
4220
+ [key: string]: unknown;
4221
+ };
4222
+ };
4223
+ };
4224
+ responses: {
4225
+ /** @description Ingested. */
4226
+ 200: {
4227
+ headers: {
4228
+ [name: string]: unknown;
4229
+ };
4230
+ content: {
4231
+ "application/json": {
4232
+ [key: string]: unknown;
4233
+ };
4234
+ };
4235
+ };
4236
+ };
4237
+ };
4238
+ queryLogs: {
4239
+ parameters: {
4240
+ query?: never;
4241
+ header?: {
4242
+ /** @description Optional explicit tenant selector. Applied only when there is no authenticated tenant context — a JWT tenant claim takes precedence, and a header that disagrees with the authenticated tenant is rejected. Absent ⇒ the default tenant. Tenant isolation is structural on the server; this header only selects the tenant. */
4243
+ "X-Tenant-ID"?: string;
4244
+ };
4245
+ path: {
4246
+ namespace: string;
4247
+ };
4248
+ cookie?: never;
4249
+ };
4250
+ requestBody: {
4251
+ content: {
4252
+ "application/json": {
4253
+ [key: string]: unknown;
4254
+ };
4255
+ };
4256
+ };
4257
+ responses: {
4258
+ /** @description Matching logs. */
4259
+ 200: {
4260
+ headers: {
4261
+ [name: string]: unknown;
4262
+ };
4263
+ content: {
4264
+ "application/json": {
4265
+ [key: string]: unknown;
4266
+ };
4267
+ };
4268
+ };
4269
+ };
4270
+ };
4271
+ }