@fortemi/core 2026.7.14 → 2026.8.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
@@ -39,7 +39,8 @@ Most browser note and knowledge apps choose between a thin IndexedDB wrapper, a
39
39
  | Queryable knowledge | SQL-backed repositories for notes, links, tags, collections, SKOS concepts, jobs, and search |
40
40
  | Retrieval quality | Full-text search, pgvector-backed semantic search, hybrid ranking, snippets, facets, and filters |
41
41
  | AI-ready workflows | Optional embeddings, local LLM capability discovery, job provenance, and fallback routing |
42
- | Portable archives | Knowledge Shard tar.gz import/export with set-scoped exports, chunked imports, checksums, BLAKE3-addressed blob sidecars, and profile-scoped conformance |
42
+ | Portable archives | Knowledge Shard tar.gz import/export with set-scoped exports, chunked imports, checksums, BLAKE3-addressed blob sidecars, profile-scoped conformance, and typed loss reports for omitted source identities |
43
+ | Source-addressed ingest | Atomic batch upsert keyed by tenant, archive, namespace, and external id, with replay-safe outcomes for PGlite and RecordStore |
43
44
  | Agent integration | Manifest-backed tools and direct helper functions for bridge adapters and automation |
44
45
  | UI freedom | A headless package you can use from React, another framework, a browser extension, or a custom host |
45
46
 
@@ -177,6 +178,27 @@ receipt disables the claim, while the verifier requires the packaged receipt
177
178
  bytes to match their declared digests. RecordStore remains `record-v1` only.
178
179
  This receipt does not establish suite-wide portability or complete backup.
179
180
 
181
+ ### Supported-platform conformance
182
+
183
+ The authority-owned suite matrix treats Fortemi as the schema/API/runtime
184
+ authority, `@fortemi/core` as the reusable conformance consumer, and HotM as an
185
+ application consumer. [Fortemi run
186
+ 6393](https://git.integrolabs.net/Fortemi/fortemi/actions/runs/6393) passed the
187
+ same receipt-bound contract on Linux x86_64, Linux arm64, and macOS arm64. Its
188
+ React/Core participant is commit
189
+ `ccf96fad6025025293e40e250c85f088c8999d86`,
190
+ `@fortemi/core@2026.7.14`, with tgz SHA-256
191
+ `e282f504a842261c3f598a7f2ee0d6a85e03dc213ddf545a18daf5f603a742cc`
192
+ and tar payload SHA-256
193
+ `47482320b543307c2d44f3a87a2268ead6faf265c6bd38cf33011e0ac7f8e77a`.
194
+
195
+ The supported claim is limited to the declared contract surface and exact
196
+ Knowledge Shard `2.0.0/full-v1` tuple on those platform cells. Windows remains
197
+ deferred to [Fortemi
198
+ #1096](https://git.integrolabs.net/Fortemi/fortemi/issues/1096). This does not
199
+ change the Fortemi #1081 `NO-GO` audit or prove complete backup, universal
200
+ portability, launched GUI/native-dialog behavior, or RecordStore `full-v1`.
201
+
180
202
  Knowledge Shard 2.0 treats absent, `null`, empty, and non-empty values as
181
203
  distinct authority states. PGlite persists `core-v1` field presence in a
182
204
  transactional sidecar, while RecordStore carries its `record-v1` projection and
@@ -331,6 +353,7 @@ bytes.
331
353
  | Capability system | Embeddings, local LLM, GPU detection, local-provider discovery, fallback routing |
332
354
  | Job queue | Server-compatible background workflow for revisions, titles, embeddings, concepts, and links |
333
355
  | Knowledge Shards | Tar.gz import/export with checksums, BLAKE3-addressed blob sidecars, progress callbacks, yielding imports, set-scoped embedding exports, and profile-scoped conformance |
356
+ | Lifecycle controls | Source-addressed import, metadata-scoped search locators, and terminal purge receipts that omit raw external ids and content |
334
357
  | Service-worker helpers | Route registration primitives for standalone browser integration |
335
358
 
336
359
  ## Search and Knowledge Model
@@ -5,5 +5,4 @@ interface AiwgIndexSchemaValidationResult {
5
5
  declare function getAiwgFortemiIndexExportSchema(): unknown;
6
6
  declare function validateAiwgFortemiIndexExportSchema(value: unknown): AiwgIndexSchemaValidationResult;
7
7
  declare function validateAiwgFortemiProjectedRecordSchema(value: unknown): AiwgIndexSchemaValidationResult;
8
-
9
8
  export { type AiwgIndexSchemaValidationResult, getAiwgFortemiIndexExportSchema, validateAiwgFortemiIndexExportSchema, validateAiwgFortemiProjectedRecordSchema };
@@ -1,12 +1,12 @@
1
1
  type AiwgFortemiRecordType = string;
2
2
  type AiwgFortemiRecordSchemaVersion = 'aiwg.fortemi.index.record.v1' | 'aiwg.fortemi.index.record.v2';
3
3
  type AiwgFortemiIndexExportSchemaVersion = 'aiwg.fortemi.index.export.v1' | 'aiwg.fortemi.index.export.v2';
4
- type AiwgPrivacyClassification = 'private' | 'sanitized' | 'public';
5
- type AiwgProvenanceConfidence = 'source' | 'candidate' | 'reviewed' | 'rejected';
6
- type AiwgReviewAction = 'accept' | 'reject' | 'defer';
7
- type AiwgFortemiRelationshipDirection = 'upstream' | 'downstream' | 'related';
8
- type AiwgOperationalStateClassification = 'fresh' | 'historical' | 'superseded' | 'contradicted' | 'needs-source';
9
- type AiwgOperationalStateConfidence = 'source' | 'candidate' | 'reviewed' | 'rejected';
4
+ type AiwgPrivacyClassification = 'private' | 'public' | 'sanitized';
5
+ type AiwgProvenanceConfidence = 'candidate' | 'rejected' | 'reviewed' | 'source';
6
+ type AiwgReviewAction = 'accept' | 'defer' | 'reject';
7
+ type AiwgFortemiRelationshipDirection = 'downstream' | 'related' | 'upstream';
8
+ type AiwgOperationalStateClassification = 'contradicted' | 'fresh' | 'historical' | 'needs-source' | 'superseded';
9
+ type AiwgOperationalStateConfidence = 'candidate' | 'rejected' | 'reviewed' | 'source';
10
10
  interface AiwgFortemiRecordSource {
11
11
  path: string;
12
12
  repo_relative_path: string;
@@ -98,16 +98,16 @@ interface AiwgFortemiRecordEmbedding {
98
98
  interface AiwgFortemiAttachmentReference {
99
99
  id: string;
100
100
  path: string;
101
- mime: string | null;
101
+ mime: null | string;
102
102
  checksum: string;
103
103
  bytes: number;
104
104
  }
105
105
  interface AiwgFortemiBinarySource {
106
- extracted_text: string | null;
106
+ extracted_text: null | string;
107
107
  created_at?: string;
108
- deleted_at?: string | null;
109
- extraction_status?: 'extracted' | 'pending' | 'failed' | 'blocked' | 'deferred';
110
- reason?: null | 'extraction_pending' | 'extractor_failed' | 'quarantined' | 'large_binary' | 'unsupported_mime' | 'no_extracted_text';
108
+ deleted_at?: null | string;
109
+ extraction_status?: 'blocked' | 'deferred' | 'extracted' | 'failed' | 'pending';
110
+ reason?: 'extraction_pending' | 'extractor_failed' | 'large_binary' | 'no_extracted_text' | 'quarantined' | 'unsupported_mime' | null;
111
111
  attachment: AiwgFortemiAttachmentReference;
112
112
  }
113
113
  interface AiwgOperationalState {
@@ -128,7 +128,7 @@ interface AiwgOperationalState {
128
128
  current_action_selector?: boolean;
129
129
  }
130
130
  interface AiwgStateTransfer {
131
- deleted_at: string | null;
131
+ deleted_at: null | string;
132
132
  }
133
133
  interface AiwgFortemiRecord {
134
134
  schema_version: AiwgFortemiRecordSchemaVersion;
@@ -159,8 +159,8 @@ interface AiwgFortemiRecord {
159
159
  state_transfer?: AiwgStateTransfer;
160
160
  privacy: {
161
161
  classification: AiwgPrivacyClassification;
162
- pii: boolean;
163
162
  locality?: string;
163
+ pii: boolean;
164
164
  };
165
165
  updated_at: string;
166
166
  }
@@ -168,9 +168,9 @@ interface AiwgFortemiIndexExport {
168
168
  schema_version: AiwgFortemiIndexExportSchemaVersion;
169
169
  generated_at: string;
170
170
  source: {
171
- repo: string;
172
- privacy: AiwgPrivacyClassification;
173
171
  graph?: string;
172
+ privacy: AiwgPrivacyClassification;
173
+ repo: string;
174
174
  };
175
175
  items: AiwgFortemiRecord[];
176
176
  compatibility?: {
@@ -184,8 +184,8 @@ interface AiwgFortemiChunkPartRef {
184
184
  count: number;
185
185
  }
186
186
  declare const AIWG_SCAN_REQUIRED_FIELDS: Array<keyof AiwgFortemiRecord>;
187
- type AiwgFortemiProjectedRecord = Pick<AiwgFortemiRecord, 'schema_version' | 'id' | 'type' | 'title' | 'text' | 'facets' | 'tags' | 'concepts' | 'privacy'> & Partial<AiwgFortemiRecord>;
188
- type AiwgDetailIdEncoding = 'uri' | 'base64url';
187
+ type AiwgFortemiProjectedRecord = Pick<AiwgFortemiRecord, 'concepts' | 'facets' | 'id' | 'privacy' | 'schema_version' | 'tags' | 'text' | 'title' | 'type'> & Partial<AiwgFortemiRecord>;
188
+ type AiwgDetailIdEncoding = 'base64url' | 'uri';
189
189
  interface AiwgFortemiChunkDetailRef {
190
190
  href: string;
191
191
  encoding?: AiwgDetailIdEncoding;
@@ -231,7 +231,7 @@ interface AiwgIndexQueryOptions {
231
231
  snippetLength?: number;
232
232
  weights?: Partial<AiwgIndexQueryWeights>;
233
233
  includeMatches?: boolean;
234
- searchProfile?: 'default' | 'aiwg-discovery';
234
+ searchProfile?: 'aiwg-discovery' | 'default';
235
235
  }
236
236
  interface AiwgIndexQueryWeights {
237
237
  title: number;
@@ -243,7 +243,7 @@ interface AiwgIndexQueryWeights {
243
243
  source: number;
244
244
  }
245
245
  interface AiwgIndexQueryMatch {
246
- field: 'title' | 'text' | 'tag' | 'concept' | 'facet' | 'id' | 'source';
246
+ field: 'concept' | 'facet' | 'id' | 'source' | 'tag' | 'text' | 'title';
247
247
  value: string;
248
248
  score?: number;
249
249
  reason?: string;
@@ -302,8 +302,8 @@ interface AiwgIndexGraphOptions {
302
302
  relationshipWeights?: Record<string, number>;
303
303
  includeDanglingRelationships?: boolean;
304
304
  }
305
- type AiwgRelationshipDirection = 'in' | 'out' | 'both';
306
- type AiwgRelationshipSetOperation = 'intersection' | 'union' | 'difference';
305
+ type AiwgRelationshipDirection = 'both' | 'in' | 'out';
306
+ type AiwgRelationshipSetOperation = 'difference' | 'intersection' | 'union';
307
307
  interface AiwgRelationshipTraversalOptions {
308
308
  direction?: AiwgRelationshipDirection;
309
309
  relationshipType?: string;
@@ -359,7 +359,7 @@ interface AiwgStaticEmbeddingSet {
359
359
  model: string;
360
360
  dimensions: number;
361
361
  generated_at: string;
362
- granularity: 'title-summary' | 'body' | 'chunked-body' | string;
362
+ granularity: 'body' | 'chunked-body' | 'title-summary' | string;
363
363
  metric?: 'cosine' | 'dot' | 'euclidean';
364
364
  input_hash_algorithm?: string;
365
365
  embeddings: AiwgStaticEmbeddingRecord[];
@@ -381,7 +381,7 @@ interface BuildAiwgStaticEmbeddingSetOptions {
381
381
  id: string;
382
382
  backend: AiwgHeadlessEmbeddingBackend;
383
383
  records?: AiwgFortemiRecord[];
384
- generatedAt?: string | Date;
384
+ generatedAt?: Date | string;
385
385
  granularity?: AiwgStaticEmbeddingSet['granularity'];
386
386
  metric?: AiwgStaticEmbeddingSet['metric'];
387
387
  textForRecord?: (record: AiwgFortemiRecord) => string;
@@ -415,8 +415,8 @@ interface AiwgReviewInput {
415
415
  interface AiwgIndexControllerSnapshot {
416
416
  index: AiwgFortemiIndexExport | null;
417
417
  chunked: {
418
- manifest: AiwgFortemiChunkManifest;
419
418
  cachedParts: number;
419
+ manifest: AiwgFortemiChunkManifest;
420
420
  maxCachedParts: number;
421
421
  } | null;
422
422
  data: AiwgIndexQueryResult | null;
@@ -475,8 +475,8 @@ interface AiwgChunkedIndexBuildResult {
475
475
  part: AiwgFortemiChunkPart;
476
476
  }>;
477
477
  details: Array<{
478
- id: string;
479
478
  href: string;
479
+ id: string;
480
480
  record: AiwgFortemiRecord;
481
481
  }>;
482
482
  }
@@ -493,19 +493,18 @@ declare function findAiwgStaticDuplicatePairs(index: AiwgFortemiIndexExport, emb
493
493
  declare function createAiwgReviewDecisionExport(source: Pick<AiwgFortemiIndexExport, 'schema_version'>, decisions: AiwgReviewDecision[], generatedAt?: string): AiwgReviewDecisionExport;
494
494
  declare function createAiwgIndexController(initialIndex?: AiwgFortemiIndexExport): AiwgIndexController;
495
495
  declare function aiwgFortemiIndexToCommunityGraph(index: AiwgFortemiIndexExport, options?: AiwgIndexGraphOptions): {
496
- nodes: {
496
+ communities: {
497
497
  id: string;
498
+ nodes: string[];
498
499
  }[];
499
500
  edges: {
501
+ kind: string;
500
502
  source: string;
501
503
  target: string;
502
- kind: string;
503
504
  weight: number;
504
505
  }[];
505
- communities: {
506
+ nodes: {
506
507
  id: string;
507
- nodes: string[];
508
508
  }[];
509
509
  };
510
-
511
510
  export { AIWG_SCAN_REQUIRED_FIELDS, type AiwgChunkedIndexBuildOptions, type AiwgChunkedIndexBuildResult, type AiwgChunkedIndexDetailLoader, type AiwgChunkedIndexLoadOptions, type AiwgChunkedIndexLoader, type AiwgChunkedIndexProgress, type AiwgChunkedIndexProgressPhase, type AiwgChunkedIndexQueryOptions, type AiwgChunkedIndexQueryResult, type AiwgChunkedIndexValidationResult, type AiwgDetailIdEncoding, type AiwgFortemiAttachmentReference, type AiwgFortemiBinarySource, type AiwgFortemiChunk, type AiwgFortemiChunkDetailRef, type AiwgFortemiChunkManifest, type AiwgFortemiChunkPart, type AiwgFortemiChunkPartRef, type AiwgFortemiIndexExport, type AiwgFortemiIndexExportSchemaVersion, type AiwgFortemiProjectedRecord, type AiwgFortemiProvenance, type AiwgFortemiProvenanceEvent, type AiwgFortemiRecord, type AiwgFortemiRecordEmbedding, type AiwgFortemiRecordSchemaVersion, type AiwgFortemiRecordSource, type AiwgFortemiRecordType, type AiwgFortemiRelationship, type AiwgFortemiRelationshipDirection, type AiwgFortemiSearchProjection, type AiwgFortemiSkosConcept, type AiwgFortemiSkosRelation, type AiwgFortemiSkosRelationType, type AiwgHeadlessEmbeddingBackend, type AiwgIndexController, type AiwgIndexControllerListener, type AiwgIndexControllerSnapshot, type AiwgIndexGraphOptions, type AiwgIndexQueryMatch, type AiwgIndexQueryOptions, type AiwgIndexQueryRankedItem, type AiwgIndexQueryResult, type AiwgIndexQueryWeights, type AiwgIndexValidationResult, type AiwgOperationalState, type AiwgOperationalStateClassification, type AiwgOperationalStateConfidence, type AiwgPrivacyClassification, type AiwgPrivacyFilterOptions, type AiwgProvenanceConfidence, type AiwgRelationshipDirection, type AiwgRelationshipEdgeSummary, type AiwgRelationshipNodeSummary, type AiwgRelationshipQueryOptions, type AiwgRelationshipSetOperation, type AiwgRelationshipSetOptions, type AiwgRelationshipSetResult, type AiwgRelationshipTraversalOptions, type AiwgRelationshipTraversalResult, type AiwgReviewAction, type AiwgReviewDecision, type AiwgReviewDecisionExport, type AiwgReviewInput, type AiwgStateTransfer, type AiwgStaticDuplicatePair, type AiwgStaticEmbeddingRecord, type AiwgStaticEmbeddingSet, type AiwgStaticHybridQueryOptions, type AiwgStaticSemanticQueryOptions, type AiwgStaticSemanticResult, type BuildAiwgStaticEmbeddingSetOptions, DEFAULT_AIWG_DUPLICATE_SCAN_MAX_EMBEDDINGS, aiwgDetailHrefForId, aiwgFortemiIndexToCommunityGraph, assertAiwgFortemiChunkManifest, assertAiwgFortemiChunkPart, assertAiwgFortemiIndexExport, assertAiwgStaticEmbeddingSet, buildAiwgChunkedIndex, buildAiwgStaticEmbeddingSet, createAiwgFetchChunkLoader, createAiwgFetchDetailLoader, createAiwgIndexController, createAiwgReviewDecisionExport, encodeAiwgDetailId, filterAiwgRecordsByPrivacy, findAiwgStaticDuplicatePairs, getAiwgFortemiFacets, queryAiwgFortemiIndex, queryAiwgHybridIndex, queryAiwgSemanticIndex, resolveAiwgFetchUrl, validateAiwgFortemiChunkManifest, validateAiwgFortemiChunkPart, validateAiwgFortemiIndexExport, validateAiwgStaticEmbeddingSet };