@littlebigbrain/client 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -68,19 +68,19 @@ const accepted = await lbb.submitImport(records(), {
68
68
  });
69
69
  const completed = await lbb.waitForImportJob(accepted.job_id);
70
70
  console.log(completed.state, completed.committed_commit_seq);
71
- if (completed.committed_commit_seq != null) {
72
- await lbb.waitForIndexLineage(completed.committed_commit_seq);
73
- }
74
71
  ```
75
72
 
76
73
  `records()` may be an iterable or async iterable. Success means every grouped
77
- commit is durable and final publication was enqueued; it does not mean indexes
78
- have already reached `committed_commit_seq`. Wait once after the final commit,
79
- not after each source row or chunk. The lineage waiter polls normal
80
- `index_caught_up=false` metadata until its own deadline, including on an
81
- RDF-only deployment. An empty iterable is rejected locally before an import
74
+ commit is durable and immediately queryable by a strong SPARQL read. The same
75
+ commits advance the graph's coalesced RDF reconciliation fence; waiting for base
76
+ compaction is optional. An empty iterable is rejected locally before an import
82
77
  POST is sent.
83
78
 
79
+ For several RDF documents, `facts.importRdfMany(...)` automatically defers
80
+ intermediate reconciliation and triggers it on the last document. Call
81
+ `graph.waitForPublished(result.finalSequence)` only when the caller needs the
82
+ immutable base itself to cover the import; strong reads need no waiter.
83
+
84
84
  **Time-travel read.** Pin a SPARQL read to a past instant — results reflect the graph as it was then:
85
85
 
86
86
  ```ts
@@ -101,8 +101,10 @@ const { rows } = await lbb.sparqlRows({
101
101
  ## Errors & retries
102
102
 
103
103
  Methods return parsed JSON and throw `LbbError` (with `status`, `code`, `message`, `param`, `requestId`, `docUrl`) on any non-2xx response. Safe reads and idempotency-keyed writes retry `429`/`5xx` and network failures with full-jitter backoff, bounded by a retry budget (`retryBudgetMs`, default 60s) rather than a fixed count, and honor `Retry-After` — a terminal error the server marks non-retryable surfaces immediately. Use `rawRequest()` for response headers, request id, and retry/timing metadata.
104
- `waitForIndexLineage(...)` is a separate deadline-bounded poller, so the generic
105
- request retry-count cap cannot end publication waiting early.
104
+ `waitForPublished(...)` is an optional, deadline-bounded maintenance poller for
105
+ workflows that want the immutable RDF base itself to cover a commit. Strong
106
+ SPARQL does not need it: acknowledged commits are queryable immediately from
107
+ the branch head's base-plus-delta lineage.
106
108
 
107
109
  ## More
108
110
 
package/dist/client.d.ts CHANGED
@@ -1,20 +1,11 @@
1
- import type { DurableImportSource, ImportLine, LbbClientOptions, ListResponse, RawLbbResponse, ReadConsistencyOptions, RdfImportOptions, Schemas, SearchConsistency, SparqlResults } from "./types.js";
1
+ import type { DurableImportSource, ImportLine, LbbClientOptions, ListResponse, RawLbbResponse, ReadConsistencyOptions, RdfImportDocument, RdfImportManyResult, RdfImportOptions, Schemas, SearchConsistency, SparqlResults } from "./types.js";
2
2
  import { type CallOptions, type RequestOptions } from "./transport.js";
3
3
  import { EntityNamespace, GraphNamespace, OntologyNamespace, QueryNamespace, SchemaNamespace, SearchNamespace } from "./namespaces.js";
4
4
  export { parseSparqlResults } from "./types.js";
5
- export type { AttributeFilter, AttributeFilterOp, AttributeFilterValue, EntityAttributeFilterOptions, EntityPropertiesLine, DurableImportLine, DurableImportSource, FetchLike, FlatProperties, ImportLine, LbbClientOptions, LbbRequestEvent, LbbResponseEvent, LbbRetryEvent, LbbErrorPayload, ListResponse, RawLbbResponse, ReadConsistencyOptions, RdfImportOptions, Schemas, SearchConsistency, SparqlResults, SparqlResultsJson, SparqlTerm, CommitRequest, CommitResponse, Entity, EntitySelector, GraphMetadata, GraphSummary, SchemaView, Snapshot, } from "./types.js";
5
+ export type { AttributeFilter, AttributeFilterOp, AttributeFilterValue, EntityAttributeFilterOptions, EntityPropertiesLine, DurableImportLine, DurableImportSource, FetchLike, FlatProperties, ImportLine, LbbClientOptions, LbbRequestEvent, LbbResponseEvent, LbbRetryEvent, LbbErrorPayload, ListResponse, RawLbbResponse, ReadConsistencyOptions, RdfImportDocument, RdfImportManyResult, RdfImportOptions, Schemas, SearchConsistency, SparqlResults, SparqlResultsJson, SparqlTerm, CommitRequest, CommitResponse, Entity, EntitySelector, GraphMetadata, GraphSummary, SchemaView, Snapshot, } from "./types.js";
6
6
  export { LbbCapabilityError, LbbError } from "./transport.js";
7
7
  export type { CallOptions, Query, QueryValue, RequestOptions, } from "./transport.js";
8
8
  export { EntityNamespace, FactsNamespace, GraphNamespace, OntologyNamespace, QueryNamespace, SchemaNamespace, SearchNamespace, } from "./namespaces.js";
9
- export interface IndexLineageObservation {
10
- metadata: Schemas["GraphMetadataResponse"];
11
- lineage: Schemas["IndexLineage"];
12
- buildCommit?: string;
13
- replica?: string;
14
- requestId?: string;
15
- attempts: number;
16
- elapsedMs: number;
17
- }
18
9
  /**
19
10
  * A typed HTTP client for a little big brain graph server. One instance is scoped to a
20
11
  * single graph/branch; construct another for a different scope. All methods
@@ -137,6 +128,8 @@ export declare class LbbClient {
137
128
  * properties on the subject Resource.
138
129
  */
139
130
  importRdf(rdf: string, opts?: RdfImportOptions): Promise<Schemas["GraphRdfImportResponse"]>;
131
+ /** Import several RDF documents as truth-only chunks, then advance one final publication fence. */
132
+ importRdfMany(documents: readonly RdfImportDocument[], opts?: RdfImportOptions): Promise<RdfImportManyResult>;
140
133
  /**
141
134
  * Retract specific edges and/or every edge touching given entities. Appends
142
135
  * superseding retract events rather than deleting — history stays visible in an
@@ -405,7 +398,7 @@ export declare class LbbClient {
405
398
  * `groups[].keys`.
406
399
  */
407
400
  sparql(body: Schemas["SparqlSelectRequest"], opts?: ReadConsistencyOptions): Promise<Schemas["SparqlSelectResponse"]>;
408
- /** SPARQL 1.1 query from text (SELECT/ASK) over the live graph; `results` is SPARQL 1.1 Query Results JSON. The text dialect carries `consistency`/`min_indexed_seq` on the URL. */
401
+ /** SPARQL 1.1 query from text (SELECT/ASK) over the live graph; `results` is SPARQL 1.1 Query Results JSON. The text dialect carries `consistency`/`min_indexed_seq` on the URL; a floor with no explicit consistency implies a strong base-plus-delta read. */
409
402
  sparqlText(body: Schemas["SparqlTextRequest"], opts?: ReadConsistencyOptions): Promise<Schemas["SparqlTextResponse"]>;
410
403
  /**
411
404
  * Run a SPARQL 1.1 text query and return parsed results — the ergonomic
@@ -468,21 +461,25 @@ export declare class LbbClient {
468
461
  metadata(opts?: {
469
462
  includeIndexes?: boolean;
470
463
  }): Promise<Schemas["GraphMetadataResponse"]>;
471
- /**
472
- * Wait until one published generation covers `targetSeq`.
473
- *
474
- * The returned lineage may name absent BM25/ANN families on an RDF-only
475
- * deployment; `metadata.index_caught_up` is the generation-level readiness
476
- * signal used by bulk loaders.
477
- */
478
- waitForIndexLineage(targetSeq: number, opts?: {
464
+ /** Automatic publication lifecycle, available before the first generation exists. */
465
+ publicationStatus(): Promise<Schemas["PublicationStatusResponse"]>;
466
+ /** Wait until background reconciliation folds `targetSeq` into the RDF base. */
467
+ waitForPublished(targetSeq: number, opts?: {
479
468
  timeoutMs?: number;
480
469
  pollIntervalMs?: number;
481
- }): Promise<IndexLineageObservation>;
470
+ }): Promise<Schemas["PublicationStatusResponse"]>;
482
471
  /** Graph counts and type/relation buckets. Carries `consistency`/`min_indexed_seq` on the URL. */
483
472
  summary(opts?: ReadConsistencyOptions): Promise<Schemas["GraphSummaryResponse"]>;
484
473
  /** Pinned published read root and its query/conformance lag against one coherent head. */
485
474
  readSnapshot(): Promise<Schemas["PublishedReadStatusResponse"]>;
475
+ /**
476
+ * Compact observed RDF schema attached to the immutable published base:
477
+ * class populations, resource- and literal-valued predicate counts, and
478
+ * bounded OWL/RDFS statements. `literal_predicate_counts` is `null` when
479
+ * the stored summary artifact predates the field; the next full summary
480
+ * rebuild fills it.
481
+ */
482
+ schemaSummary(): Promise<Schemas["RdfSchemaSummaryResponse"]>;
486
483
  /** List the graphs (and branches) under the scoped tenant. */
487
484
  listGraphs(): Promise<Schemas["GraphListResponse"]>;
488
485
  }
package/dist/client.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { parseSparqlResults } from "./types.js";
2
2
  import { bodyMarksTerminal, errorCodeFromBody, fullJitterBackoffMs, parseLbbError, parseResponseJson, retryAllowed, retryableStatus, retryDelayMs, sleep, } from "./transport.js";
3
- import { LbbCapabilityError, LbbError } from "./transport.js";
3
+ import { LbbCapabilityError } from "./transport.js";
4
4
  import { EntityNamespace, GraphNamespace, OntologyNamespace, QueryNamespace, SchemaNamespace, SearchNamespace, } from "./namespaces.js";
5
5
  export { parseSparqlResults } from "./types.js";
6
6
  export { LbbCapabilityError, LbbError } from "./transport.js";
@@ -563,6 +563,30 @@ export class LbbClient {
563
563
  idempotencyKey: opts.idempotencyKey ?? this.idempotencyKey("import-rdf"),
564
564
  });
565
565
  }
566
+ /** Import several RDF documents as truth-only chunks, then advance one final publication fence. */
567
+ async importRdfMany(documents, opts = {}) {
568
+ if (documents.length === 0) {
569
+ throw new RangeError("importRdfMany requires at least one document");
570
+ }
571
+ const imports = [];
572
+ for (const [index, document] of documents.entries()) {
573
+ const merged = { ...opts, ...document.options };
574
+ const idempotencyKey = merged.idempotencyKey
575
+ ? `${merged.idempotencyKey}:${index + 1}`
576
+ : undefined;
577
+ imports.push(await this.importRdf(document.rdf, {
578
+ ...merged,
579
+ idempotencyKey,
580
+ build: index === documents.length - 1,
581
+ }));
582
+ }
583
+ const final = imports[imports.length - 1];
584
+ return {
585
+ imports,
586
+ finalSequence: final?.committed_commit_seq ?? undefined,
587
+ publication: final?.published_generation,
588
+ };
589
+ }
566
590
  /**
567
591
  * Retract specific edges and/or every edge touching given entities. Appends
568
592
  * superseding retract events rather than deleting — history stays visible in an
@@ -940,7 +964,7 @@ export class LbbClient {
940
964
  body: this.mergeReadConsistency(body, opts),
941
965
  });
942
966
  }
943
- /** SPARQL 1.1 query from text (SELECT/ASK) over the live graph; `results` is SPARQL 1.1 Query Results JSON. The text dialect carries `consistency`/`min_indexed_seq` on the URL. */
967
+ /** SPARQL 1.1 query from text (SELECT/ASK) over the live graph; `results` is SPARQL 1.1 Query Results JSON. The text dialect carries `consistency`/`min_indexed_seq` on the URL; a floor with no explicit consistency implies a strong base-plus-delta read. */
944
968
  sparqlText(body, opts) {
945
969
  return this.request("POST", "/v1/query/sparql-text", {
946
970
  body,
@@ -1038,68 +1062,38 @@ export class LbbClient {
1038
1062
  },
1039
1063
  });
1040
1064
  }
1041
- /**
1042
- * Wait until one published generation covers `targetSeq`.
1043
- *
1044
- * The returned lineage may name absent BM25/ANN families on an RDF-only
1045
- * deployment; `metadata.index_caught_up` is the generation-level readiness
1046
- * signal used by bulk loaders.
1047
- */
1048
- async waitForIndexLineage(targetSeq, opts = {}) {
1049
- const deadline = Date.now() + (opts.timeoutMs ?? 30_000);
1065
+ /** Automatic publication lifecycle, available before the first generation exists. */
1066
+ publicationStatus() {
1067
+ return this.request("GET", "/v1/graph/publication-status");
1068
+ }
1069
+ /** Wait until background reconciliation folds `targetSeq` into the RDF base. */
1070
+ async waitForPublished(targetSeq, opts = {}) {
1071
+ if (!Number.isSafeInteger(targetSeq) || targetSeq < 0) {
1072
+ throw new RangeError("targetSeq must be a non-negative safe integer");
1073
+ }
1074
+ const timeoutMs = opts.timeoutMs ?? 30_000;
1075
+ const pollIntervalMs = opts.pollIntervalMs ?? 250;
1076
+ if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {
1077
+ throw new RangeError("timeoutMs must be a non-negative number");
1078
+ }
1079
+ if (!Number.isFinite(pollIntervalMs) || pollIntervalMs < 0) {
1080
+ throw new RangeError("pollIntervalMs must be a non-negative number");
1081
+ }
1082
+ const deadline = Date.now() + timeoutMs;
1050
1083
  let last;
1051
1084
  while (true) {
1052
- try {
1053
- // This method is already an explicit, deadline-bounded poller. Avoid
1054
- // nesting the generic request retry count inside it: publication may
1055
- // legitimately take longer than that secondary cap.
1056
- last = await this.rawRequest("GET", "/v1/graph/metadata", {
1057
- maxRetries: 0,
1058
- });
1085
+ last = await this.publicationStatus();
1086
+ if (last.state === "blocked") {
1087
+ throw new Error(`publication blocked at ${last.current_stage ?? "unknown stage"}: ${last.retry.message}`);
1059
1088
  }
1060
- catch (error) {
1061
- const retryableHttpError = error instanceof LbbError &&
1062
- retryableStatus(error.status) &&
1063
- error.retryable !== false;
1064
- const retryableTransportError = error instanceof Error && !(error instanceof LbbError);
1065
- if (!retryableHttpError && !retryableTransportError)
1066
- throw error;
1067
- const now = Date.now();
1068
- if (now >= deadline) {
1069
- throw new Error(`index lineage did not reach ${targetSeq} before timeout (last_error=${error.message})`, { cause: error });
1070
- }
1071
- const retryAfterMs = error instanceof LbbError
1072
- ? (error.retryAfterSeconds ?? 0) * 1_000
1073
- : 0;
1074
- await sleep(Math.min(Math.max(opts.pollIntervalMs ?? 250, retryAfterMs), deadline - now));
1075
- continue;
1076
- }
1077
- const lineage = last.data.index_lineage;
1078
- const servedAt = last.data.snapshot.served_at_seq;
1079
- if (lineage != null &&
1080
- servedAt != null &&
1081
- servedAt >= targetSeq &&
1082
- (last.data.index_caught_up === true ||
1083
- (lineage.bm25_indexed_commit_seq != null &&
1084
- lineage.bm25_indexed_commit_seq >= targetSeq &&
1085
- lineage.ann_indexed_commit_seq != null &&
1086
- lineage.ann_indexed_commit_seq >= targetSeq))) {
1087
- return {
1088
- metadata: last.data,
1089
- lineage,
1090
- buildCommit: last.headers?.get("lbb-build-commit") ?? undefined,
1091
- replica: last.headers?.get("lbb-replica") ?? undefined,
1092
- requestId: last.requestId,
1093
- attempts: last.attempts,
1094
- elapsedMs: last.elapsedMs,
1095
- };
1089
+ if (last.state === "current" && last.published_seq >= targetSeq) {
1090
+ return last;
1096
1091
  }
1097
- if (Date.now() >= deadline) {
1098
- const build = last.headers?.get("lbb-build-commit") ?? "unknown";
1099
- const replica = last.headers?.get("lbb-replica") ?? "unknown";
1100
- throw new Error(`index lineage did not reach ${targetSeq} before timeout (build=${build}, replica=${replica}, last=${JSON.stringify(last.data.index_lineage)})`);
1092
+ const now = Date.now();
1093
+ if (now >= deadline) {
1094
+ throw new Error(`publication did not reach ${targetSeq} before timeout (state=${last.state}, head=${last.head_seq}, target=${last.target_seq}, published=${last.published_seq}, stage=${last.current_stage ?? "unknown"})`);
1101
1095
  }
1102
- await sleep(opts.pollIntervalMs ?? 250);
1096
+ await sleep(Math.min(Math.max(pollIntervalMs, last.retry.retry_after_ms), deadline - now));
1103
1097
  }
1104
1098
  }
1105
1099
  /** Graph counts and type/relation buckets. Carries `consistency`/`min_indexed_seq` on the URL. */
@@ -1112,6 +1106,16 @@ export class LbbClient {
1112
1106
  readSnapshot() {
1113
1107
  return this.request("GET", "/v1/graph/read-snapshot");
1114
1108
  }
1109
+ /**
1110
+ * Compact observed RDF schema attached to the immutable published base:
1111
+ * class populations, resource- and literal-valued predicate counts, and
1112
+ * bounded OWL/RDFS statements. `literal_predicate_counts` is `null` when
1113
+ * the stored summary artifact predates the field; the next full summary
1114
+ * rebuild fills it.
1115
+ */
1116
+ schemaSummary() {
1117
+ return this.request("GET", "/v1/graph/schema-summary");
1118
+ }
1115
1119
  /** List the graphs (and branches) under the scoped tenant. */
1116
1120
  listGraphs() {
1117
1121
  return this.request("GET", "/v1/graphs");
@@ -1,6 +1,6 @@
1
1
  import type { LbbClient } from "./client.js";
2
2
  import type { CallOptions } from "./transport.js";
3
- import { type EntityAttributeFilterOptions, type ImportLine, type ReadConsistencyOptions, type RdfImportOptions, type Schemas } from "./types.js";
3
+ import { type EntityAttributeFilterOptions, type ImportLine, type ReadConsistencyOptions, type RdfImportDocument, type RdfImportManyResult, type RdfImportOptions, type Schemas } from "./types.js";
4
4
  export declare class GraphNamespace {
5
5
  private readonly client;
6
6
  readonly facts: FactsNamespace;
@@ -11,6 +11,13 @@ export declare class GraphNamespace {
11
11
  readonly search: SearchNamespace;
12
12
  constructor(client: LbbClient);
13
13
  branch(name: string): GraphNamespace;
14
+ /** Publication lifecycle for this graph/branch, including pre-first-publish state. */
15
+ publicationStatus(): Promise<Schemas["PublicationStatusResponse"]>;
16
+ /** Wait until this graph/branch has an exact generation covering `targetSeq`. */
17
+ waitForPublished(targetSeq: number, opts?: {
18
+ timeoutMs?: number;
19
+ pollIntervalMs?: number;
20
+ }): Promise<Schemas["PublicationStatusResponse"]>;
14
21
  create(opts?: CallOptions): Promise<Schemas["CreateGraphResponse"]>;
15
22
  delete(opts: {
16
23
  confirm: string;
@@ -39,6 +46,8 @@ export declare class FactsNamespace {
39
46
  * predicates and literal term details are preserved as edge metadata.
40
47
  */
41
48
  importRdf(rdf: string, opts?: CallOptions & RdfImportOptions): Promise<Schemas["GraphRdfImportResponse"]>;
49
+ /** Import several RDF documents and enqueue publication only for the final commit. */
50
+ importRdfMany(documents: readonly RdfImportDocument[], opts?: RdfImportOptions): Promise<RdfImportManyResult>;
42
51
  }
43
52
  /**
44
53
  * Relevance-label storage. The query surfaces this namespace once fronted were
@@ -35,6 +35,14 @@ export class GraphNamespace {
35
35
  branch(name) {
36
36
  return new GraphNamespace(this.client.withScope({ branch: name }));
37
37
  }
38
+ /** Publication lifecycle for this graph/branch, including pre-first-publish state. */
39
+ publicationStatus() {
40
+ return this.client.publicationStatus();
41
+ }
42
+ /** Wait until this graph/branch has an exact generation covering `targetSeq`. */
43
+ waitForPublished(targetSeq, opts = {}) {
44
+ return this.client.waitForPublished(targetSeq, opts);
45
+ }
38
46
  create(opts = {}) {
39
47
  return this.client.request("POST", "/v1/graph/create", opts);
40
48
  }
@@ -120,6 +128,10 @@ export class FactsNamespace {
120
128
  },
121
129
  });
122
130
  }
131
+ /** Import several RDF documents and enqueue publication only for the final commit. */
132
+ importRdfMany(documents, opts = {}) {
133
+ return this.client.importRdfMany(documents, opts);
134
+ }
123
135
  }
124
136
  /**
125
137
  * Relevance-label storage. The query surfaces this namespace once fronted were
package/dist/schema.d.ts CHANGED
@@ -381,6 +381,23 @@ export interface paths {
381
381
  patch?: never;
382
382
  trace?: never;
383
383
  };
384
+ "/v1/graph/publication-status": {
385
+ parameters: {
386
+ query?: never;
387
+ header?: never;
388
+ path?: never;
389
+ cookie?: never;
390
+ };
391
+ /** Automatic publication lifecycle and exact read watermarks */
392
+ get: operations["get_v1_graph_publication_status"];
393
+ put?: never;
394
+ post?: never;
395
+ delete?: never;
396
+ options?: never;
397
+ head?: never;
398
+ patch?: never;
399
+ trace?: never;
400
+ };
384
401
  "/v1/graph/read-snapshot": {
385
402
  parameters: {
386
403
  query?: never;
@@ -432,6 +449,23 @@ export interface paths {
432
449
  patch?: never;
433
450
  trace?: never;
434
451
  };
452
+ "/v1/graph/schema-summary": {
453
+ parameters: {
454
+ query?: never;
455
+ header?: never;
456
+ path?: never;
457
+ cookie?: never;
458
+ };
459
+ /** Compact observed RDF schema attached to the immutable F3 base */
460
+ get: operations["get_v1_graph_schema_summary"];
461
+ put?: never;
462
+ post?: never;
463
+ delete?: never;
464
+ options?: never;
465
+ head?: never;
466
+ patch?: never;
467
+ trace?: never;
468
+ };
435
469
  "/v1/graph/summary": {
436
470
  parameters: {
437
471
  query?: never;
@@ -798,7 +832,7 @@ export interface paths {
798
832
  path?: never;
799
833
  cookie?: never;
800
834
  };
801
- /** Read the durable ontology-conformance report referenced by the published snapshot, including its validation watermark and ontology/shapes provenance */
835
+ /** Read the immutable branch-owned ontology-conformance sidecar selected by the F3 checksum and schema identity */
802
836
  get: operations["get_v1_ontology_conformance"];
803
837
  put?: never;
804
838
  post?: never;
@@ -817,7 +851,7 @@ export interface paths {
817
851
  };
818
852
  get?: never;
819
853
  put?: never;
820
- /** Import a custom ontology and create the scoped graph head with it; fails if the graph already exists */
854
+ /** Define or additively evolve a graph ontology, or preview the exact result without mutation */
821
855
  post: operations["post_v1_ontology_define"];
822
856
  delete?: never;
823
857
  options?: never;
@@ -1325,8 +1359,25 @@ export interface components {
1325
1359
  /** @description Whether the relation is transitive (default false). */
1326
1360
  transitive?: boolean;
1327
1361
  };
1362
+ /**
1363
+ * @description Add direct parent classes to an existing entity type. All named classes
1364
+ * must already exist, or be declared earlier in the same request with
1365
+ * `add_entity_type`. Existing links are skipped, so the op is idempotent.
1366
+ * Removing a parent is not additive and requires an explicit migration.
1367
+ */
1368
+ AddSuperTypesOp: {
1369
+ /** @description Entity type whose direct parents should grow. */
1370
+ entity_type: string;
1371
+ /**
1372
+ * @description discriminator enum property added by openapi-typescript
1373
+ * @enum {string}
1374
+ */
1375
+ op: "add_super_types";
1376
+ /** @description Direct parent entity-type names to add. */
1377
+ super_types: string[];
1378
+ };
1328
1379
  /** @description Governed proposal operation restricted to additive ontology changes. */
1329
- AdditiveOntologyEvolveOp: components["schemas"]["WidenRelationOp"] | components["schemas"]["AddEntityTypeOp"] | components["schemas"]["AddRelationOp"] | components["schemas"]["AddPropertyOp"];
1380
+ AdditiveOntologyEvolveOp: components["schemas"]["WidenRelationOp"] | components["schemas"]["AddEntityTypeOp"] | components["schemas"]["AddSuperTypesOp"] | components["schemas"]["AddRelationOp"];
1330
1381
  /** @description Additive-only ontology proposal helper for structured-output systems. */
1331
1382
  AdditiveOntologyEvolveRequest: {
1332
1383
  ops: components["schemas"]["AdditiveOntologyEvolveOp"][];
@@ -3758,6 +3809,12 @@ export interface components {
3758
3809
  * difference is refused with a typed error naming the route that applies it.
3759
3810
  */
3760
3811
  OntologyDefineRequest: {
3812
+ /**
3813
+ * @description Preview the exact definition without creating a graph, writing an
3814
+ * ontology object, or changing the graph head. Equivalent to the
3815
+ * `?dry_run=true` query parameter; either signal enables preview mode.
3816
+ */
3817
+ dry_run?: boolean;
3761
3818
  /** @description Import format hint. `auto` (the default) sniffs the content. */
3762
3819
  format?: string | null;
3763
3820
  /**
@@ -3773,29 +3830,28 @@ export interface components {
3773
3830
  };
3774
3831
  OntologyDefineResponse: {
3775
3832
  /**
3776
- * @description True when this call wrote a new ontology version, either by creating the
3777
- * graph or by applying an additive difference. False when the proposed
3778
- * ontology already matched the active one, which is what makes re-running
3779
- * the same bootstrap request a no-op.
3833
+ * @description True when this call wrote a new ontology version, or when a dry run
3834
+ * predicts that it would. False when the proposed ontology already matched
3835
+ * the active one, which is what makes re-running the same bootstrap request
3836
+ * a no-op.
3780
3837
  *
3781
- * This tracks what was written, so it never reports `false` for a call
3782
- * that changed the ontology: a widened relation domain or range and a new
3783
- * property field both set it, even though neither appears in the
3784
- * class-and-relation schema diff.
3838
+ * A widened relation domain or range and a new property field both set it,
3839
+ * even though neither appears in the class-and-relation schema diff.
3785
3840
  */
3786
3841
  changed?: boolean;
3787
3842
  /**
3788
- * @description The additive changes this call applied to an existing graph's ontology.
3789
- * Empty when the graph was created and when nothing changed.
3843
+ * @description The additive changes this call applied, or would apply during a dry run,
3844
+ * to an existing graph's ontology. Empty on create and no-op.
3790
3845
  */
3791
3846
  changes?: components["schemas"]["SchemaDiffEntry"][];
3847
+ /** @description True when this response is a preview and no durable state changed. */
3848
+ dry_run?: boolean;
3792
3849
  entity_types: components["schemas"]["OntologyTermView"][];
3793
3850
  format: string;
3794
3851
  graph: components["schemas"]["GraphKey"];
3795
3852
  /**
3796
- * @description True when this call created the graph head. False when the graph already
3797
- * existed, whether the ontology then changed or not. This is the `created`
3798
- * signal for the define route.
3853
+ * @description True when this call created the graph head, or when a dry run predicts
3854
+ * that the real definition would create it.
3799
3855
  */
3800
3856
  graph_created: boolean;
3801
3857
  merged_default: boolean;
@@ -3840,6 +3896,8 @@ export interface components {
3840
3896
  OntologyDraftStatus: "draft" | "validated" | "promoted" | "rejected";
3841
3897
  /** @description The full definition of one entity type (class) in the active ontology. */
3842
3898
  OntologyEntityTypeView: {
3899
+ /** @description Canonical query IRI minted by Little Big Brain for this class identity. */
3900
+ iri?: string;
3843
3901
  name: string;
3844
3902
  properties: components["schemas"]["OntologyPropertyView"][];
3845
3903
  /** Format: int64 */
@@ -3848,6 +3906,17 @@ export interface components {
3848
3906
  resolvable: boolean;
3849
3907
  /** Format: int64 */
3850
3908
  since_version: number;
3909
+ /**
3910
+ * @description Frozen class identity used by commits and the RDF projection. This is
3911
+ * unique even when imported vocabularies reuse the same local name.
3912
+ */
3913
+ stable_id?: string;
3914
+ /**
3915
+ * @description Direct parent classes (`rdfs:subClassOf`), named by their frozen
3916
+ * `stable_id`s. Clients can build the full class lattice without a SPARQL
3917
+ * scan or a second ontology lookup.
3918
+ */
3919
+ super_types?: string[];
3851
3920
  };
3852
3921
  OntologyEvidenceSample: {
3853
3922
  /** @description Stable connector/source reference; sample content is never used as identity. */
@@ -3866,7 +3935,7 @@ export interface components {
3866
3935
  * the supported "ontology evolution" path; identity-breaking changes (removals,
3867
3936
  * narrowing) still require an explicit expand→migrate→contract plan.
3868
3937
  */
3869
- OntologyEvolveOp: components["schemas"]["WidenRelationOp"] | components["schemas"]["AddEntityTypeOp"] | components["schemas"]["AddRelationOp"] | components["schemas"]["AddPropertyOp"] | components["schemas"]["SetPropertyConstraintOp"] | components["schemas"]["RenameEntityTypeOp"] | components["schemas"]["RenameRelationOp"] | components["schemas"]["SetRelationInverseOp"] | components["schemas"]["SetRelationCardinalityOp"] | components["schemas"]["NarrowRelationOp"] | components["schemas"]["RemoveEntityTypeOp"] | components["schemas"]["RemoveRelationOp"];
3938
+ OntologyEvolveOp: components["schemas"]["WidenRelationOp"] | components["schemas"]["AddEntityTypeOp"] | components["schemas"]["AddSuperTypesOp"] | components["schemas"]["AddRelationOp"] | components["schemas"]["AddPropertyOp"] | components["schemas"]["SetPropertyConstraintOp"] | components["schemas"]["RenameEntityTypeOp"] | components["schemas"]["RenameRelationOp"] | components["schemas"]["SetRelationInverseOp"] | components["schemas"]["SetRelationCardinalityOp"] | components["schemas"]["NarrowRelationOp"] | components["schemas"]["RemoveEntityTypeOp"] | components["schemas"]["RemoveRelationOp"];
3870
3939
  /**
3871
3940
  * @description Apply a list of additive ontology changes in order, writing a new ontology
3872
3941
  * version when anything actually changes. Ops are applied against the
@@ -4344,6 +4413,42 @@ export interface components {
4344
4413
  /** @description Members of an `i64_set` field; canonicalized like `keyword_set`. */
4345
4414
  i64_set: number[];
4346
4415
  };
4416
+ PublicationRetryGuidance: {
4417
+ eventual_read_available: boolean;
4418
+ message: string;
4419
+ /** Format: int64 */
4420
+ retry_after_ms: number;
4421
+ };
4422
+ /**
4423
+ * @description Server-managed publication lifecycle for one graph epoch.
4424
+ * @enum {string}
4425
+ */
4426
+ PublicationState: "current" | "queued" | "compacting" | "building" | "publishing" | "blocked";
4427
+ /**
4428
+ * @description One bounded status document for automatic exact-generation publication.
4429
+ * It is available before the first generation publishes, unlike
4430
+ * [`PublishedReadStatusResponse`], so SDKs can wait without probing SPARQL.
4431
+ */
4432
+ PublicationStatusResponse: {
4433
+ current_stage?: string | null;
4434
+ /** Format: int64 */
4435
+ epoch: number;
4436
+ /** Format: int64 */
4437
+ head_generation: number;
4438
+ head_seq: components["schemas"]["CommitSeq"];
4439
+ /** Format: int64 */
4440
+ lag_commits: number;
4441
+ /** Format: int64 */
4442
+ last_progress_at_micros: number;
4443
+ /** Format: int64 */
4444
+ published_generation?: number | null;
4445
+ published_seq: components["schemas"]["CommitSeq"];
4446
+ retry: components["schemas"]["PublicationRetryGuidance"];
4447
+ state: components["schemas"]["PublicationState"];
4448
+ /** Format: int64 */
4449
+ target_head_generation: number;
4450
+ target_seq: components["schemas"]["CommitSeq"];
4451
+ };
4347
4452
  /**
4348
4453
  * @description Whether an import's deterministic published-generation job was newly
4349
4454
  * queued or coalesced with equivalent pending work.
@@ -4467,6 +4572,52 @@ export interface components {
4467
4572
  */
4468
4573
  rerank_raw_bytes_fetched?: number;
4469
4574
  };
4575
+ /**
4576
+ * @description The RDF node kind of a bounded observed-schema statement object.
4577
+ * @enum {string}
4578
+ */
4579
+ RdfSchemaObjectKind: "iri" | "blank_node" | "literal";
4580
+ /** @description One OWL/RDFS vocabulary or annotation statement retained for schema UIs. */
4581
+ RdfSchemaStatement: {
4582
+ object: string;
4583
+ object_kind: components["schemas"]["RdfSchemaObjectKind"];
4584
+ predicate: string;
4585
+ subject: string;
4586
+ };
4587
+ /**
4588
+ * @description Compact, immutable observed-schema artifact attached to one exact F3 base.
4589
+ *
4590
+ * This is the overview/read-model surface for Explorer and Ontology. It is
4591
+ * produced by maintenance while publishing F3 and is therefore cheap to read:
4592
+ * no request-time graph scan or base-plus-delta assembly is required.
4593
+ */
4594
+ RdfSchemaSummaryResponse: {
4595
+ /**
4596
+ * @description Per-predicate totals of literal-valued statements, the data-property
4597
+ * sibling of `resource_predicate_counts`. `None` when the stored summary
4598
+ * artifact predates this field; the next full summary rebuild fills it.
4599
+ */
4600
+ literal_predicate_counts?: components["schemas"]["RdfSchemaTermCount"][] | null;
4601
+ /** Format: int64 */
4602
+ ontology_version: number;
4603
+ resource_predicate_counts: components["schemas"]["RdfSchemaTermCount"][];
4604
+ snapshot: components["schemas"]["SnapshotView"];
4605
+ statements: components["schemas"]["RdfSchemaStatement"][];
4606
+ truncated: boolean;
4607
+ type_counts: components["schemas"]["RdfSchemaTermCount"][];
4608
+ };
4609
+ /**
4610
+ * @description One exact RDF term count in the compact observed-schema summary.
4611
+ *
4612
+ * `term` is the complete IRI rather than a display-local name. This keeps
4613
+ * foreign vocabularies unambiguous; clients may choose their own prefix or
4614
+ * local-name presentation.
4615
+ */
4616
+ RdfSchemaTermCount: {
4617
+ /** Format: int64 */
4618
+ count: number;
4619
+ term: string;
4620
+ };
4470
4621
  /**
4471
4622
  * @description A page-region provenance anchor on a fact's evidence (region provenance
4472
4623
  * §4.1/§6.4(b) BYO import): where the evidence appears in the source
@@ -4739,6 +4890,11 @@ export interface components {
4739
4890
  };
4740
4891
  SchemaAuditResult: {
4741
4892
  component: string;
4893
+ /**
4894
+ * @description Nested results explaining a composite violation (`sh:detail`), e.g.
4895
+ * which constraint inside a `sh:node` shape the value node failed.
4896
+ */
4897
+ details?: components["schemas"]["SchemaAuditResult"][];
4742
4898
  focus_node: string;
4743
4899
  message?: string | null;
4744
4900
  result_path?: string | null;
@@ -4786,6 +4942,8 @@ export interface components {
4786
4942
  /** @enum {string} */
4787
4943
  SchemaChangeKind: "additive" | "restrictive" | "identity_breaking";
4788
4944
  SchemaClassView: {
4945
+ /** @description Canonical query IRI minted by Little Big Brain for this class identity. */
4946
+ iri?: string;
4789
4947
  name: string;
4790
4948
  property_count: number;
4791
4949
  /** Format: int64 */
@@ -4793,6 +4951,8 @@ export interface components {
4793
4951
  /** Format: int64 */
4794
4952
  since_version: number;
4795
4953
  stable_id: string;
4954
+ /** @description Direct parent classes (`rdfs:subClassOf`), named by `stable_id`. */
4955
+ super_types?: string[];
4796
4956
  };
4797
4957
  /** @enum {string} */
4798
4958
  SchemaCompatibilityVerdict: "compatible" | "restrictive" | "migration_required";
@@ -5767,11 +5927,13 @@ export interface components {
5767
5927
  */
5768
5928
  SparqlCompareOp: "eq" | "ne" | "lt" | "le" | "gt" | "ge";
5769
5929
  /**
5770
- * @description RDFS entailment regime applied when projecting the graph for a conformant
5771
- * SPARQL query. Controls whether a class term matches subtype instances.
5930
+ * @description Entailment regime applied to a conformant SPARQL query. The regime is
5931
+ * evaluated at query time as a closure-driven pattern rewrite over the
5932
+ * dataset's asserted schema triples; the published dataset itself stays
5933
+ * asserted-only.
5772
5934
  * @enum {string}
5773
5935
  */
5774
- SparqlEntailment: "subclass" | "none";
5936
+ SparqlEntailment: "owl" | "rdfs" | "subclass" | "none";
5775
5937
  /**
5776
5938
  * @description A FILTER over a solution: a comparison, or a boolean composition of filters.
5777
5939
  * A comparison whose operands are unbound, incomparable, or a type mismatch is
@@ -5967,11 +6129,10 @@ export interface components {
5967
6129
  /** @description WHERE: the conjunctive basic graph pattern (shares the analytic engine). */
5968
6130
  patterns: components["schemas"]["AnalyticTriplePattern"][];
5969
6131
  /**
5970
- * @description Reason over the graph's stored inference rules so a pattern matches
5971
- * asserted **and** derived edges in one shot. Off by default
5972
- * (asserted-only). Public serving requires a compatible reasoned
5973
- * projection in the pinned published generation and fails closed when it
5974
- * is absent; it never forces an overlay reduce.
6132
+ * @description Not available on the published SPARQL surface: a branch's stored
6133
+ * inference rules already run at publish time, folding derived facts into
6134
+ * the asserted dataset every query reads. Requesting `reason: true`
6135
+ * returns a typed, non-retryable error.
5975
6136
  */
5976
6137
  reason?: boolean;
5977
6138
  /**
@@ -6032,10 +6193,13 @@ export interface components {
6032
6193
  * RDF graph, not a results table).
6033
6194
  */
6034
6195
  SparqlTextRequest: {
6196
+ as_of_commit_seq?: null | components["schemas"]["CommitSeq"];
6035
6197
  /**
6036
- * @description RDFS entailment regime. `None` (default) reads the asserted published
6037
- * projection. `Subclass` requires a compatible reasoned projection and
6038
- * fails closed while one is unavailable.
6198
+ * @description Entailment regime. `None` (default) matches asserted triples only.
6199
+ * `Rdfs` applies the practical RDFS core at query time, `Subclass` the
6200
+ * class-only subset, and `Owl` the OWL profile on top of `Rdfs`. All
6201
+ * derive the closure from the pinned generation's asserted schema
6202
+ * triples.
6039
6203
  */
6040
6204
  entailment?: components["schemas"]["SparqlEntailment"];
6041
6205
  /**
@@ -6048,12 +6212,10 @@ export interface components {
6048
6212
  /** @description The SPARQL query text (SELECT or ASK). */
6049
6213
  query: string;
6050
6214
  /**
6051
- * @description Reason over the branch's stored inference rules: project the rule-derived
6052
- * facts into the dataset the conformant engine runs over, so a query reasons
6053
- * over asserted **and** derived edges. Off by default; a no-op when the branch
6054
- * has no stored rules. Combine with `entailment: subclass` for full
6055
- * reasoning—rule-derived facts plus `rdfs:subClassOf` type closure—once
6056
- * maintenance publishes a compatible reasoned projection.
6215
+ * @description Not available on the published SPARQL surface: a branch's stored
6216
+ * inference rules already run at publish time, folding derived facts into
6217
+ * the asserted dataset every query reads. Requesting `reason: true`
6218
+ * returns a typed, non-retryable error.
6057
6219
  */
6058
6220
  reason?: boolean;
6059
6221
  };
@@ -10068,7 +10230,7 @@ export interface operations {
10068
10230
  blank_node_scope?: string;
10069
10231
  /** @description Entity type name for imported RDF resources (default Resource) */
10070
10232
  resource_type?: string;
10071
- /** @description Set false to defer the published-generation enqueue; send build=false on every chunk except the last of a chunked bulk stream. Default true. */
10233
+ /** @description Set false on intermediate chunks to defer eager publication. Each request still atomically commits a compacted truth segment and exact per-commit F3 delta; graph reconstruction, SHACL, and complete F3 construction run off-path. The server advances one coalesced safety fence when the deferred delta tail reaches 8 entries or 32 MiB, so a large stream cannot wedge itself. Omit build=false on the final chunk to advance the final fence. Default true. */
10072
10234
  build?: string;
10073
10235
  };
10074
10236
  header?: {
@@ -10337,6 +10499,142 @@ export interface operations {
10337
10499
  };
10338
10500
  };
10339
10501
  };
10502
+ get_v1_graph_publication_status: {
10503
+ parameters: {
10504
+ query?: {
10505
+ /** @description Graph name (default `main`) */
10506
+ graph?: string;
10507
+ /** @description Branch name (default `main`) */
10508
+ branch?: string;
10509
+ };
10510
+ header?: {
10511
+ /** @description API contract version to pin. Use `2026-07-23` for this beta-breaking shape. */
10512
+ "Lbb-Version"?: string;
10513
+ };
10514
+ path?: never;
10515
+ cookie?: never;
10516
+ };
10517
+ requestBody?: never;
10518
+ responses: {
10519
+ /** @description OK */
10520
+ 200: {
10521
+ headers: {
10522
+ /** @description API contract version used for the response */
10523
+ "Lbb-Version"?: string;
10524
+ /** @description Request correlation id */
10525
+ "X-Request-Id"?: string;
10526
+ [name: string]: unknown;
10527
+ };
10528
+ content: {
10529
+ "application/json": components["schemas"]["PublicationStatusResponse"];
10530
+ };
10531
+ };
10532
+ /** @description Bad request */
10533
+ 400: {
10534
+ headers: {
10535
+ /** @description API contract version used for the response */
10536
+ "Lbb-Version"?: string;
10537
+ /** @description Request correlation id */
10538
+ "X-Request-Id"?: string;
10539
+ [name: string]: unknown;
10540
+ };
10541
+ content: {
10542
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
10543
+ };
10544
+ };
10545
+ /** @description Unauthorized */
10546
+ 401: {
10547
+ headers: {
10548
+ /** @description API contract version used for the response */
10549
+ "Lbb-Version"?: string;
10550
+ /** @description Request correlation id */
10551
+ "X-Request-Id"?: string;
10552
+ [name: string]: unknown;
10553
+ };
10554
+ content: {
10555
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
10556
+ };
10557
+ };
10558
+ /** @description Forbidden */
10559
+ 403: {
10560
+ headers: {
10561
+ /** @description API contract version used for the response */
10562
+ "Lbb-Version"?: string;
10563
+ /** @description Request correlation id */
10564
+ "X-Request-Id"?: string;
10565
+ [name: string]: unknown;
10566
+ };
10567
+ content: {
10568
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
10569
+ };
10570
+ };
10571
+ /** @description Not found */
10572
+ 404: {
10573
+ headers: {
10574
+ /** @description API contract version used for the response */
10575
+ "Lbb-Version"?: string;
10576
+ /** @description Request correlation id */
10577
+ "X-Request-Id"?: string;
10578
+ [name: string]: unknown;
10579
+ };
10580
+ content: {
10581
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
10582
+ };
10583
+ };
10584
+ /** @description Conflict */
10585
+ 409: {
10586
+ headers: {
10587
+ /** @description API contract version used for the response */
10588
+ "Lbb-Version"?: string;
10589
+ /** @description Request correlation id */
10590
+ "X-Request-Id"?: string;
10591
+ [name: string]: unknown;
10592
+ };
10593
+ content: {
10594
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
10595
+ };
10596
+ };
10597
+ /** @description Rate limit exceeded */
10598
+ 429: {
10599
+ headers: {
10600
+ /** @description API contract version used for the response */
10601
+ "Lbb-Version"?: string;
10602
+ /** @description Request correlation id */
10603
+ "X-Request-Id"?: string;
10604
+ [name: string]: unknown;
10605
+ };
10606
+ content: {
10607
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
10608
+ };
10609
+ };
10610
+ /** @description Internal server error */
10611
+ 500: {
10612
+ headers: {
10613
+ /** @description API contract version used for the response */
10614
+ "Lbb-Version"?: string;
10615
+ /** @description Request correlation id */
10616
+ "X-Request-Id"?: string;
10617
+ [name: string]: unknown;
10618
+ };
10619
+ content: {
10620
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
10621
+ };
10622
+ };
10623
+ /** @description Service unavailable */
10624
+ 503: {
10625
+ headers: {
10626
+ /** @description API contract version used for the response */
10627
+ "Lbb-Version"?: string;
10628
+ /** @description Request correlation id */
10629
+ "X-Request-Id"?: string;
10630
+ [name: string]: unknown;
10631
+ };
10632
+ content: {
10633
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
10634
+ };
10635
+ };
10636
+ };
10637
+ };
10340
10638
  get_v1_graph_read_snapshot: {
10341
10639
  parameters: {
10342
10640
  query?: {
@@ -10761,6 +11059,142 @@ export interface operations {
10761
11059
  };
10762
11060
  };
10763
11061
  };
11062
+ get_v1_graph_schema_summary: {
11063
+ parameters: {
11064
+ query?: {
11065
+ /** @description Graph name (default `main`) */
11066
+ graph?: string;
11067
+ /** @description Branch name (default `main`) */
11068
+ branch?: string;
11069
+ };
11070
+ header?: {
11071
+ /** @description API contract version to pin. Use `2026-07-23` for this beta-breaking shape. */
11072
+ "Lbb-Version"?: string;
11073
+ };
11074
+ path?: never;
11075
+ cookie?: never;
11076
+ };
11077
+ requestBody?: never;
11078
+ responses: {
11079
+ /** @description OK */
11080
+ 200: {
11081
+ headers: {
11082
+ /** @description API contract version used for the response */
11083
+ "Lbb-Version"?: string;
11084
+ /** @description Request correlation id */
11085
+ "X-Request-Id"?: string;
11086
+ [name: string]: unknown;
11087
+ };
11088
+ content: {
11089
+ "application/json": components["schemas"]["RdfSchemaSummaryResponse"];
11090
+ };
11091
+ };
11092
+ /** @description Bad request */
11093
+ 400: {
11094
+ headers: {
11095
+ /** @description API contract version used for the response */
11096
+ "Lbb-Version"?: string;
11097
+ /** @description Request correlation id */
11098
+ "X-Request-Id"?: string;
11099
+ [name: string]: unknown;
11100
+ };
11101
+ content: {
11102
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
11103
+ };
11104
+ };
11105
+ /** @description Unauthorized */
11106
+ 401: {
11107
+ headers: {
11108
+ /** @description API contract version used for the response */
11109
+ "Lbb-Version"?: string;
11110
+ /** @description Request correlation id */
11111
+ "X-Request-Id"?: string;
11112
+ [name: string]: unknown;
11113
+ };
11114
+ content: {
11115
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
11116
+ };
11117
+ };
11118
+ /** @description Forbidden */
11119
+ 403: {
11120
+ headers: {
11121
+ /** @description API contract version used for the response */
11122
+ "Lbb-Version"?: string;
11123
+ /** @description Request correlation id */
11124
+ "X-Request-Id"?: string;
11125
+ [name: string]: unknown;
11126
+ };
11127
+ content: {
11128
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
11129
+ };
11130
+ };
11131
+ /** @description Not found */
11132
+ 404: {
11133
+ headers: {
11134
+ /** @description API contract version used for the response */
11135
+ "Lbb-Version"?: string;
11136
+ /** @description Request correlation id */
11137
+ "X-Request-Id"?: string;
11138
+ [name: string]: unknown;
11139
+ };
11140
+ content: {
11141
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
11142
+ };
11143
+ };
11144
+ /** @description Conflict */
11145
+ 409: {
11146
+ headers: {
11147
+ /** @description API contract version used for the response */
11148
+ "Lbb-Version"?: string;
11149
+ /** @description Request correlation id */
11150
+ "X-Request-Id"?: string;
11151
+ [name: string]: unknown;
11152
+ };
11153
+ content: {
11154
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
11155
+ };
11156
+ };
11157
+ /** @description Rate limit exceeded */
11158
+ 429: {
11159
+ headers: {
11160
+ /** @description API contract version used for the response */
11161
+ "Lbb-Version"?: string;
11162
+ /** @description Request correlation id */
11163
+ "X-Request-Id"?: string;
11164
+ [name: string]: unknown;
11165
+ };
11166
+ content: {
11167
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
11168
+ };
11169
+ };
11170
+ /** @description Internal server error */
11171
+ 500: {
11172
+ headers: {
11173
+ /** @description API contract version used for the response */
11174
+ "Lbb-Version"?: string;
11175
+ /** @description Request correlation id */
11176
+ "X-Request-Id"?: string;
11177
+ [name: string]: unknown;
11178
+ };
11179
+ content: {
11180
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
11181
+ };
11182
+ };
11183
+ /** @description Service unavailable */
11184
+ 503: {
11185
+ headers: {
11186
+ /** @description API contract version used for the response */
11187
+ "Lbb-Version"?: string;
11188
+ /** @description Request correlation id */
11189
+ "X-Request-Id"?: string;
11190
+ [name: string]: unknown;
11191
+ };
11192
+ content: {
11193
+ "application/json": components["schemas"]["LbbErrorEnvelope"];
11194
+ };
11195
+ };
11196
+ };
11197
+ };
10764
11198
  get_v1_graph_summary: {
10765
11199
  parameters: {
10766
11200
  query?: {
@@ -13988,7 +14422,7 @@ export interface operations {
13988
14422
  graph?: string;
13989
14423
  /** @description Branch name (default `main`) */
13990
14424
  branch?: string;
13991
- /** @description eventual (default) serves the referenced durable report; strong requires validation at current head with current ontology/shapes */
14425
+ /** @description eventual (default) serves the selected base sidecar; strong requires an exact-head sidecar with current ontology/shapes */
13992
14426
  consistency?: string;
13993
14427
  /** @description Maximum returned result rows; result_count remains exact */
13994
14428
  limit?: string;
@@ -14128,6 +14562,8 @@ export interface operations {
14128
14562
  graph?: string;
14129
14563
  /** @description Branch name (default `main`) */
14130
14564
  branch?: string;
14565
+ /** @description Validate and return the exact predicted definition without creating a graph, writing an ontology object, or changing the graph head */
14566
+ dry_run?: string;
14131
14567
  };
14132
14568
  header?: {
14133
14569
  /** @description API contract version to pin. Use `2026-07-23` for this beta-breaking shape. */
package/dist/types.d.ts CHANGED
@@ -53,13 +53,23 @@ export interface RdfImportOptions {
53
53
  resourceType?: string;
54
54
  edgeIdempotency?: "append" | "skip_unchanged";
55
55
  /**
56
- * Set `false` to defer the published-generation enqueue. Send `build: false`
57
- * on every chunk except the last of a chunked bulk stream, so derived
58
- * families build once at the final head. Defaults to `true`.
56
+ * Set `false` on intermediate chunks to suppress the publication enqueue.
57
+ * Every request still commits durable truth and an exact per-commit F3 delta;
58
+ * omit `build: false` on the last chunk to advance one final coalesced fence.
59
+ * Defaults to `true`.
59
60
  */
60
61
  build?: boolean;
61
62
  idempotencyKey?: string;
62
63
  }
64
+ export interface RdfImportDocument {
65
+ rdf: string;
66
+ options?: RdfImportOptions;
67
+ }
68
+ export interface RdfImportManyResult {
69
+ imports: Schemas["GraphRdfImportResponse"][];
70
+ finalSequence?: number;
71
+ publication?: Schemas["GraphImportPublishedGenerationOutcome"] | null;
72
+ }
63
73
  export type AttributeFilterOp = "eq" | "ne" | "lt" | "le" | "gt" | "ge";
64
74
  export type AttributeFilterValue = string | number | boolean | {
65
75
  dateTime: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@littlebigbrain/client",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "TypeScript client for the little big brain graph + hybrid search HTTP API",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {