@fortemi/core 2026.7.1 → 2026.7.3
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 +16 -2
- package/dist/aiwg-index.d.ts +48 -7
- package/dist/aiwg-index.js +184 -10
- package/dist/aiwg-index.js.map +1 -1
- package/dist/index.d.ts +69 -32
- package/dist/index.js +346 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/aiwg-index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/aiwg-index.ts"],"names":[],"mappings":"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","file":"aiwg-index.js","sourcesContent":["export type AiwgFortemiKnownRecordType =\n | 'crm.contact'\n | 'crm.organization'\n | 'crm.event'\n | 'crm.interaction'\n | 'aiwg.artifact'\n | 'docs.page'\n\nexport type AiwgFortemiRecordType = AiwgFortemiKnownRecordType | `aiwg.${string}` | `research.${string}` | `docs.${string}` | string\n\nexport type AiwgFortemiRecordSchemaVersion = 'aiwg.fortemi.index.record.v1' | 'aiwg.fortemi.index.record.v2'\nexport type AiwgFortemiIndexExportSchemaVersion = 'aiwg.fortemi.index.export.v1' | 'aiwg.fortemi.index.export.v2'\nexport type AiwgPrivacyClassification = 'private' | 'sanitized' | 'public'\nexport type AiwgProvenanceConfidence = 'source' | 'candidate' | 'reviewed' | 'rejected'\nexport type AiwgReviewAction = 'accept' | 'reject' | 'defer'\nexport type AiwgFortemiRelationshipDirection = 'upstream' | 'downstream' | 'related'\n\nexport interface AiwgFortemiRecordSource {\n path: string\n repo_relative_path: string\n locator: string\n origin?: string\n generated?: boolean\n checksum?: string\n updated_at?: string\n}\n\nexport interface AiwgFortemiRelationship {\n type: string\n target_id: string\n source_path?: string\n target_path?: string\n direction?: AiwgFortemiRelationshipDirection\n label?: string\n confidence?: number\n privacy?: AiwgPrivacyClassification\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiProvenance {\n field: string\n source: string\n path: string\n confidence: AiwgProvenanceConfidence\n privacy: AiwgPrivacyClassification\n}\n\nexport type AiwgFortemiSkosRelationType = 'broader' | 'narrower' | 'related' | string\n\nexport interface AiwgFortemiSkosConcept {\n id: string\n prefLabel: string\n definition?: string\n scheme?: string\n notation?: string\n uri?: string\n altLabels?: string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiSkosRelation {\n type: AiwgFortemiSkosRelationType\n source_id: string\n target_id: string\n source_path?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiProvenanceEvent {\n id?: string\n activity: string\n agent?: string\n started_at?: string\n ended_at?: string\n source?: string\n path?: string\n confidence?: AiwgProvenanceConfidence\n privacy?: AiwgPrivacyClassification\n attributes?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiSearchProjection {\n title?: string\n name?: string\n summary?: string\n body?: string\n triggers?: string[]\n aliases?: string[]\n capability?: string\n tags?: string[]\n phase?: string\n type?: string\n frontmatter?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiChunk {\n id?: string\n text?: string\n body?: string\n summary?: string\n source_path?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiRecordEmbedding {\n id?: string\n embedding?: number[]\n vector?: number[]\n model?: string\n granularity?: string\n input_hash?: string\n source_path?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiRecord {\n schema_version: AiwgFortemiRecordSchemaVersion\n id: string\n type: AiwgFortemiRecordType\n source: AiwgFortemiRecordSource\n title?: string\n text?: string\n facets: Record<string, string[]>\n tags: string[]\n concepts: string[]\n relationships: AiwgFortemiRelationship[]\n provenance: AiwgFortemiProvenance[]\n search?: AiwgFortemiSearchProjection\n chunks?: AiwgFortemiChunk[]\n embeddings?: AiwgFortemiRecordEmbedding[]\n compatibility?: Record<string, unknown>\n /** Optional rich SKOS metadata for static consumers that need labels/definitions without opening a shard. */\n skos_concepts?: AiwgFortemiSkosConcept[]\n /** Optional SKOS relationship edges among concepts referenced by this record. */\n skos_relations?: AiwgFortemiSkosRelation[]\n /** Optional W3C PROV-style activity chain for this record. */\n provenance_events?: AiwgFortemiProvenanceEvent[]\n privacy: {\n classification: AiwgPrivacyClassification\n pii: boolean\n locality?: string\n }\n updated_at: string\n}\n\nexport interface AiwgFortemiIndexExport {\n schema_version: AiwgFortemiIndexExportSchemaVersion\n generated_at: string\n source: {\n repo: string\n privacy: AiwgPrivacyClassification\n origin?: string\n generated?: boolean\n checksum?: string\n updated_at?: string\n }\n items: AiwgFortemiRecord[]\n compatibility?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiChunkPartRef {\n href: string\n offset: number\n count: number\n}\n\n// Fields a scan part must retain for query/browse/rank/facet to work. The rest\n// (source, provenance, relationships, updated_at) are detail-only and may be\n// dropped from scan parts via `projection`, then resolved on demand by id.\nexport const AIWG_SCAN_REQUIRED_FIELDS: Array<keyof AiwgFortemiRecord> = [\n 'schema_version',\n 'id',\n 'type',\n 'title',\n 'text',\n 'facets',\n 'tags',\n 'concepts',\n 'privacy',\n]\n\n// A record as it appears in a scan part. With no manifest `projection`, this is a\n// full AiwgFortemiRecord. With a projection, detail-only fields are absent — read\n// them via the controller's getRecord(). Typed as the full record for ergonomics;\n// query/browse code guards the projectable fields.\nexport type AiwgFortemiProjectedRecord =\n Pick<AiwgFortemiRecord, 'schema_version' | 'id' | 'type' | 'title' | 'text' | 'facets' | 'tags' | 'concepts' | 'privacy'>\n & Partial<AiwgFortemiRecord>\n\n// How a record id is encoded into a detail filename/path segment.\n// - 'base64url': path-safe, single segment, no '%' — works on every static host,\n// including ids containing '/' (default for new builds; see #177).\n// - 'uri': encodeURIComponent — legacy. Breaks for ids containing '/' on static\n// servers that reject %2F (path-traversal protection → 404).\nexport type AiwgDetailIdEncoding = 'uri' | 'base64url'\n\n// How the controller resolves a full record by id when scan parts are projected.\nexport interface AiwgFortemiChunkDetailRef {\n // href template containing `{id}`, relative to the manifest base — e.g.\n // \"detail/{id}.json\". The `{id}` is encoded per `encoding` at substitution.\n href: string\n // id→segment encoding. Absent is treated as 'uri' for backward compatibility\n // with manifests built before #177; new builds default to 'base64url'.\n encoding?: AiwgDetailIdEncoding\n}\n\nexport interface AiwgFortemiChunkManifest {\n schema_version: 'aiwg.fortemi.index.chunk-manifest.v1'\n generated_at: string\n source: AiwgFortemiIndexExport['source']\n total: number\n part_size: number\n facets?: Record<string, Record<string, number>>\n // Field names present in scan-part items. Absent → scan parts carry whole records.\n // When set, must include AIWG_SCAN_REQUIRED_FIELDS.\n projection?: Array<keyof AiwgFortemiRecord>\n // Resolver for full records by id (used with `projection` to lazy-load detail).\n detail?: AiwgFortemiChunkDetailRef\n parts: AiwgFortemiChunkPartRef[]\n}\n\nexport interface AiwgFortemiChunkPart {\n schema_version: 'aiwg.fortemi.index.chunk.v1'\n manifest_schema_version: 'aiwg.fortemi.index.chunk-manifest.v1'\n offset: number\n items: AiwgFortemiRecord[]\n}\n\nexport interface AiwgIndexValidationResult {\n valid: boolean\n errors: string[]\n counts: Partial<Record<string, number>>\n}\n\nexport interface AiwgChunkedIndexValidationResult {\n valid: boolean\n errors: string[]\n}\n\nexport interface AiwgIndexQueryOptions {\n types?: AiwgFortemiRecordType[]\n facets?: Record<string, string[]>\n tags?: string[]\n concepts?: string[]\n privacy?: AiwgPrivacyClassification[]\n relationshipTargetId?: string\n limit?: number\n offset?: number\n rank?: boolean\n snippets?: boolean\n snippetLength?: number\n weights?: Partial<AiwgIndexQueryWeights>\n includeMatches?: boolean\n searchProfile?: 'default' | 'aiwg-discovery'\n}\n\nexport interface AiwgIndexQueryWeights {\n title: number\n text: number\n tag: number\n concept: number\n facet: number\n id: number\n source: number\n}\n\nexport interface AiwgIndexQueryMatch {\n field: 'title' | 'text' | 'tag' | 'concept' | 'facet' | 'id' | 'source'\n value: string\n score?: number\n reason?: string\n}\n\nexport interface AiwgIndexQueryRankedItem {\n item: AiwgFortemiRecord\n rank: number\n snippet?: string\n matches?: AiwgIndexQueryMatch[]\n}\n\nexport interface AiwgIndexQueryResult {\n items: AiwgFortemiRecord[]\n total: number\n facets: Record<string, Record<string, number>>\n rankedItems?: AiwgIndexQueryRankedItem[]\n}\n\nexport type AiwgChunkedIndexLoader = (\n part: AiwgFortemiChunkPartRef,\n manifest: AiwgFortemiChunkManifest,\n) => Promise<unknown>\n\n// Resolves a full record by id (used with projected scan parts). Returns the\n// parsed record JSON; validated by the controller before use.\nexport type AiwgChunkedIndexDetailLoader = (\n id: string,\n manifest: AiwgFortemiChunkManifest,\n) => Promise<unknown>\n\nexport interface AiwgChunkedIndexLoadOptions {\n maxCachedParts?: number\n // Required to resolve detail for projected indexes via getRecord(); ignored otherwise.\n detailLoader?: AiwgChunkedIndexDetailLoader\n maxCachedDetails?: number\n // Bounds the filtered/ranked match-set cache used to page a query without\n // re-scanning every part. Counts total cached entries across all queries\n // (LRU-evicted). Defaults to 5000. The cache is keyed on query + filters +\n // weights, so paging the same query (varying only offset/limit/sort/snippets)\n // reuses the scan; see queryChunked.\n maxCachedMatches?: number\n}\n\nexport type AiwgChunkedIndexProgressPhase = 'part' | 'query'\n\nexport interface AiwgChunkedIndexProgress {\n phase: AiwgChunkedIndexProgressPhase\n done: number\n total: number\n href?: string\n}\n\nexport interface AiwgChunkedIndexQueryOptions extends AiwgIndexQueryOptions {\n onProgress?: (progress: AiwgChunkedIndexProgress) => void\n}\n\nexport interface AiwgChunkedIndexQueryResult extends AiwgIndexQueryResult {\n manifestTotal: number\n scannedParts: number\n fetchedParts: number\n complete: boolean\n}\n\nexport interface AiwgReviewDecision {\n item_id: string\n action: AiwgReviewAction\n reason?: string\n updated_at: string\n}\n\nexport interface AiwgReviewDecisionExport {\n schema_version: 'aiwg.fortemi.review-decisions.v1'\n generated_at: string\n source_export_schema_version: string\n decisions: AiwgReviewDecision[]\n}\n\nexport interface AiwgIndexGraphOptions {\n communityFacet?: string\n communityTagPrefix?: string\n relationshipWeights?: Record<string, number>\n includeDanglingRelationships?: boolean\n}\n\nexport type AiwgRelationshipDirection = 'in' | 'out' | 'both'\nexport type AiwgRelationshipSetOperation = 'intersection' | 'union' | 'difference'\n\nexport interface AiwgRelationshipTraversalOptions {\n direction?: AiwgRelationshipDirection\n relationshipType?: string\n relationshipDirection?: AiwgFortemiRelationshipDirection\n limit?: number\n}\n\nexport interface AiwgRelationshipQueryOptions extends AiwgRelationshipTraversalOptions {\n sourceId?: string\n targetId?: string\n type?: string\n}\n\nexport interface AiwgRelationshipEdgeSummary {\n source_id: string\n target_id: string\n type: string\n source_path?: string\n target_path?: string\n direction?: AiwgFortemiRelationshipDirection\n}\n\nexport interface AiwgRelationshipNodeSummary {\n id: string\n type: AiwgFortemiRecordType\n title: string\n}\n\nexport interface AiwgRelationshipTraversalResult {\n nodes: AiwgRelationshipNodeSummary[]\n edges: AiwgRelationshipEdgeSummary[]\n complete: boolean\n scannedParts?: number\n fetchedParts?: number\n}\n\nexport interface AiwgRelationshipSetOptions extends AiwgRelationshipTraversalOptions {\n op: AiwgRelationshipSetOperation\n a: string\n b: string\n}\n\nexport interface AiwgRelationshipSetResult {\n ids: string[]\n op: AiwgRelationshipSetOperation\n}\n\nexport interface AiwgStaticEmbeddingRecord {\n record_id: string\n embedding: number[]\n embedding_id?: string\n granularity?: string\n input_hash: string\n source_path?: string\n}\n\nexport interface AiwgStaticEmbeddingSet {\n schema_version: 'aiwg.fortemi.embedding.set.v1'\n id: string\n model: string\n dimensions: number\n generated_at: string\n granularity: 'title-summary' | 'body' | 'chunked-body' | string\n metric?: 'cosine' | 'dot' | 'euclidean'\n input_hash_algorithm?: string\n embeddings: AiwgStaticEmbeddingRecord[]\n}\n\nexport interface AiwgStaticSemanticQueryOptions {\n limit?: number\n offset?: number\n minScore?: number\n}\n\nexport interface AiwgStaticSemanticResult {\n item: AiwgFortemiRecord\n score: number\n embedding?: AiwgStaticEmbeddingRecord\n}\n\nexport interface AiwgStaticHybridQueryOptions extends AiwgStaticSemanticQueryOptions, AiwgIndexQueryOptions {\n lexicalWeight?: number\n semanticWeight?: number\n}\n\nexport interface AiwgStaticDuplicatePair {\n left: AiwgFortemiRecord\n right: AiwgFortemiRecord\n score: number\n}\n\nexport interface AiwgReviewInput {\n item_id: string\n action: AiwgReviewAction\n reason?: string\n}\n\nexport interface AiwgIndexControllerSnapshot {\n index: AiwgFortemiIndexExport | null\n chunked: {\n manifest: AiwgFortemiChunkManifest\n cachedParts: number\n maxCachedParts: number\n } | null\n data: AiwgIndexQueryResult | null\n error: Error | null\n reviewDecisions: AiwgReviewDecision[]\n}\n\nexport type AiwgIndexControllerListener = (snapshot: AiwgIndexControllerSnapshot) => void\n\nexport interface AiwgIndexController {\n loadIndex(value: unknown): AiwgFortemiIndexExport\n loadChunkedIndex(\n manifest: unknown,\n loader: AiwgChunkedIndexLoader,\n options?: AiwgChunkedIndexLoadOptions,\n ): AiwgFortemiChunkManifest\n getIndex(): AiwgFortemiIndexExport | null\n getChunkedManifest(): AiwgFortemiChunkManifest | null\n getSnapshot(): AiwgIndexControllerSnapshot\n query(query?: string, options?: AiwgIndexQueryOptions): AiwgIndexQueryResult\n queryChunked(query?: string, options?: AiwgChunkedIndexQueryOptions): Promise<AiwgChunkedIndexQueryResult>\n // Resolve a full record by id. For a projected chunked index, fetches detail via\n // the detailLoader (bounded cache); for a whole-record index/parts, returns the\n // record from loaded data. Rejects if detail is unavailable.\n getRecord(id: string): Promise<AiwgFortemiRecord>\n neighbors(id: string, options?: AiwgRelationshipTraversalOptions): Promise<AiwgRelationshipTraversalResult>\n relationshipQuery(options?: AiwgRelationshipQueryOptions): Promise<AiwgRelationshipTraversalResult>\n relationshipSet(options: AiwgRelationshipSetOptions): Promise<AiwgRelationshipSetResult>\n clearChunkCache(): void\n toCommunityGraph(options?: AiwgIndexGraphOptions): ReturnType<typeof aiwgFortemiIndexToCommunityGraph>\n toCommunityGraphChunked(options?: AiwgIndexGraphOptions & { onProgress?: (progress: AiwgChunkedIndexProgress) => void }): Promise<ReturnType<typeof aiwgFortemiIndexToCommunityGraph>>\n setReviewDecision(input: AiwgReviewInput): AiwgReviewDecision\n clearReviewDecision(itemId: string): void\n createReviewDecisionExport(generatedAt?: string): AiwgReviewDecisionExport\n subscribe(listener: AiwgIndexControllerListener): () => void\n}\n\nconst REQUIRED_RECORD_FIELDS: Array<keyof AiwgFortemiRecord> = [\n 'schema_version',\n 'id',\n 'type',\n 'source',\n 'facets',\n 'tags',\n 'concepts',\n 'relationships',\n 'provenance',\n 'privacy',\n 'updated_at',\n]\n\nconst DEFAULT_QUERY_WEIGHTS: AiwgIndexQueryWeights = {\n title: 4,\n tag: 3,\n concept: 2,\n text: 1,\n facet: 2,\n id: 1,\n source: 0.25,\n}\n\nfunction hasString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0\n}\n\nfunction pushFacet(counts: Record<string, Record<string, number>>, name: string, value: string) {\n counts[name] ??= {}\n counts[name][value] = (counts[name][value] ?? 0) + 1\n}\n\nfunction hasNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === 'number' && value >= 0\n}\n\nfunction hasPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === 'number' && value > 0\n}\n\nfunction isFacetCounts(value: unknown): value is Record<string, Record<string, number>> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n return Object.values(value).every((counts) => (\n !!counts\n && typeof counts === 'object'\n && !Array.isArray(counts)\n && Object.values(counts).every((count) => hasNonNegativeInteger(count))\n ))\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isOptionalStringArray(value: unknown): boolean {\n return value === undefined || (Array.isArray(value) && value.every((item) => typeof item === 'string'))\n}\n\nfunction isSupportedIndexSchemaVersion(value: unknown): value is AiwgFortemiIndexExportSchemaVersion {\n return value === 'aiwg.fortemi.index.export.v1' || value === 'aiwg.fortemi.index.export.v2'\n}\n\nfunction isSupportedRecordSchemaVersion(value: unknown): value is AiwgFortemiRecordSchemaVersion {\n return value === 'aiwg.fortemi.index.record.v1' || value === 'aiwg.fortemi.index.record.v2'\n}\n\nfunction validateOptionalRichMetadata(item: Partial<AiwgFortemiRecord>, index: number, errors: string[]): void {\n if (item.skos_concepts !== undefined) {\n if (!Array.isArray(item.skos_concepts)) {\n errors.push('items[' + index + '].skos_concepts must be an array when present')\n } else {\n for (const [conceptIndex, concept] of item.skos_concepts.entries()) {\n if (!hasString(concept.id)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].id is required')\n if (!hasString(concept.prefLabel)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].prefLabel is required')\n if (!isOptionalStringArray(concept.altLabels)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].altLabels must be a string array')\n if (concept.metadata !== undefined && !isPlainRecord(concept.metadata)) {\n errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.skos_relations !== undefined) {\n if (!Array.isArray(item.skos_relations)) {\n errors.push('items[' + index + '].skos_relations must be an array when present')\n } else {\n for (const [relationIndex, relation] of item.skos_relations.entries()) {\n if (!hasString(relation.type)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].type is required')\n if (!hasString(relation.source_id)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].source_id is required')\n if (!hasString(relation.target_id)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].target_id is required')\n if (relation.metadata !== undefined && !isPlainRecord(relation.metadata)) {\n errors.push('items[' + index + '].skos_relations[' + relationIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.provenance_events !== undefined) {\n if (!Array.isArray(item.provenance_events)) {\n errors.push('items[' + index + '].provenance_events must be an array when present')\n } else {\n for (const [eventIndex, event] of item.provenance_events.entries()) {\n if (!hasString(event.activity)) errors.push('items[' + index + '].provenance_events[' + eventIndex + '].activity is required')\n if (event.attributes !== undefined && !isPlainRecord(event.attributes)) {\n errors.push('items[' + index + '].provenance_events[' + eventIndex + '].attributes must be an object')\n }\n }\n }\n }\n if (Array.isArray(item.relationships)) {\n for (const [relationshipIndex, relationship] of item.relationships.entries()) {\n if (relationship.metadata !== undefined && !isPlainRecord(relationship.metadata)) {\n errors.push('items[' + index + '].relationships[' + relationshipIndex + '].metadata must be an object')\n }\n if (\n relationship.direction !== undefined &&\n relationship.direction !== 'upstream' &&\n relationship.direction !== 'downstream' &&\n relationship.direction !== 'related'\n ) {\n errors.push('items[' + index + '].relationships[' + relationshipIndex + '].direction must be upstream, downstream, or related')\n }\n if (relationship.target_path !== undefined && typeof relationship.target_path !== 'string') {\n errors.push('items[' + index + '].relationships[' + relationshipIndex + '].target_path must be a string')\n }\n }\n }\n if (item.search !== undefined) {\n if (!isPlainRecord(item.search)) {\n errors.push('items[' + index + '].search must be an object')\n } else {\n if (!isOptionalStringArray(item.search.triggers)) errors.push('items[' + index + '].search.triggers must be a string array')\n if (!isOptionalStringArray(item.search.aliases)) errors.push('items[' + index + '].search.aliases must be a string array')\n if (!isOptionalStringArray(item.search.tags)) errors.push('items[' + index + '].search.tags must be a string array')\n if (item.search.frontmatter !== undefined && !isPlainRecord(item.search.frontmatter)) {\n errors.push('items[' + index + '].search.frontmatter must be an object')\n }\n }\n }\n if (item.chunks !== undefined) {\n if (!Array.isArray(item.chunks)) {\n errors.push('items[' + index + '].chunks must be an array when present')\n } else {\n for (const [chunkIndex, chunk] of item.chunks.entries()) {\n if (!isPlainRecord(chunk)) errors.push('items[' + index + '].chunks[' + chunkIndex + '] must be an object')\n if (chunk.metadata !== undefined && !isPlainRecord(chunk.metadata)) {\n errors.push('items[' + index + '].chunks[' + chunkIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.embeddings !== undefined) {\n if (!Array.isArray(item.embeddings)) {\n errors.push('items[' + index + '].embeddings must be an array when present')\n } else {\n for (const [embeddingIndex, embedding] of item.embeddings.entries()) {\n if (!isPlainRecord(embedding)) errors.push('items[' + index + '].embeddings[' + embeddingIndex + '] must be an object')\n const vector = embedding.embedding ?? embedding.vector\n if (vector !== undefined && (!Array.isArray(vector) || !vector.every((entry) => typeof entry === 'number'))) {\n errors.push('items[' + index + '].embeddings[' + embeddingIndex + '].embedding/vector must be a number array')\n }\n if (embedding.metadata !== undefined && !isPlainRecord(embedding.metadata)) {\n errors.push('items[' + index + '].embeddings[' + embeddingIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.compatibility !== undefined && !isPlainRecord(item.compatibility)) {\n errors.push('items[' + index + '].compatibility must be an object')\n }\n}\n\nexport function validateAiwgFortemiIndexExport(value: unknown): AiwgIndexValidationResult {\n const errors: string[] = []\n const counts: Partial<Record<string, number>> = {}\n const data = value as Partial<AiwgFortemiIndexExport>\n\n if (!isSupportedIndexSchemaVersion(data?.schema_version)) {\n errors.push('schema_version must be aiwg.fortemi.index.export.v1 or aiwg.fortemi.index.export.v2')\n }\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.source?.repo)) errors.push('source.repo is required')\n if (!hasString(data?.source?.privacy)) errors.push('source.privacy is required')\n if (!Array.isArray(data?.items)) errors.push('items must be an array')\n if (data.compatibility !== undefined && !isPlainRecord(data.compatibility)) {\n errors.push('compatibility must be an object')\n }\n\n const ids = new Set<string>()\n let previousId = ''\n for (const [index, item] of (data.items ?? []).entries()) {\n for (const field of REQUIRED_RECORD_FIELDS) {\n if (!(field in item)) errors.push('items[' + index + '].' + field + ' is required')\n }\n if (!isSupportedRecordSchemaVersion(item.schema_version)) {\n errors.push('items[' + index + '].schema_version must be aiwg.fortemi.index.record.v1 or aiwg.fortemi.index.record.v2')\n }\n if (!hasString(item.id)) errors.push('items[' + index + '].id is required')\n if (hasString(item.id) && ids.has(item.id)) errors.push('duplicate id: ' + item.id)\n if (hasString(item.id)) ids.add(item.id)\n if (previousId && hasString(item.id) && previousId.localeCompare(item.id) > 0) {\n errors.push('items must be sorted by id: ' + previousId + ' before ' + item.id)\n }\n if (hasString(item.id)) previousId = item.id\n if (!hasString(item.type)) errors.push('items[' + index + '].type must be a non-empty string')\n else counts[item.type] = (counts[item.type] ?? 0) + 1\n if (!hasString(item.source?.path)) errors.push('items[' + index + '].source.path is required')\n if (!hasString(item.source?.repo_relative_path)) errors.push('items[' + index + '].source.repo_relative_path is required')\n if (!hasString(item.source?.locator)) errors.push('items[' + index + '].source.locator is required')\n if (typeof item.title !== 'string' && typeof item.search?.title !== 'string' && typeof item.search?.name !== 'string') {\n errors.push('items[' + index + '].title or search.title/search.name is required')\n }\n if (typeof item.text !== 'string' && typeof item.search?.body !== 'string' && typeof item.search?.summary !== 'string') {\n errors.push('items[' + index + '].text or search.body/search.summary is required')\n }\n if (!Array.isArray(item.tags)) errors.push('items[' + index + '].tags must be an array')\n if (!Array.isArray(item.concepts)) errors.push('items[' + index + '].concepts must be an array')\n if (!Array.isArray(item.relationships)) errors.push('items[' + index + '].relationships must be an array')\n if (!Array.isArray(item.provenance) || item.provenance.length === 0) {\n errors.push('items[' + index + '].provenance must be a non-empty array')\n }\n validateOptionalRichMetadata(item, index, errors)\n if (!item.privacy || typeof item.privacy.pii !== 'boolean' || !hasString(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy requires classification and pii')\n }\n }\n\n return { valid: errors.length === 0, errors, counts }\n}\n\nexport function assertAiwgFortemiIndexExport(value: unknown): AiwgFortemiIndexExport {\n const result = validateAiwgFortemiIndexExport(value)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi index export:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiIndexExport\n}\n\nexport function validateAiwgFortemiChunkManifest(value: unknown): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgFortemiChunkManifest>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.chunk-manifest.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.chunk-manifest.v1')\n }\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.source?.repo)) errors.push('source.repo is required')\n if (!hasString(data?.source?.privacy)) errors.push('source.privacy is required')\n if (!hasNonNegativeInteger(data?.total)) errors.push('total must be a non-negative integer')\n if (!hasPositiveInteger(data?.part_size)) errors.push('part_size must be a positive integer')\n if (data.facets !== undefined && !isFacetCounts(data.facets)) {\n errors.push('facets must be a nested string-to-number count object')\n }\n if (data.projection !== undefined) {\n if (!Array.isArray(data.projection) || !data.projection.every((field) => typeof field === 'string')) {\n errors.push('projection must be an array of field names')\n } else {\n const present = new Set(data.projection)\n for (const field of AIWG_SCAN_REQUIRED_FIELDS) {\n if (!present.has(field)) errors.push('projection must include scan-required field ' + field)\n }\n }\n }\n if (data.detail !== undefined) {\n if (!hasString(data.detail.href)) errors.push('detail.href is required')\n else if (!data.detail.href.includes('{id}')) errors.push('detail.href must contain the {id} placeholder')\n if (\n data.detail.encoding !== undefined &&\n data.detail.encoding !== 'uri' &&\n data.detail.encoding !== 'base64url'\n ) {\n errors.push(\"detail.encoding must be 'uri' or 'base64url'\")\n }\n }\n if (!Array.isArray(data?.parts)) errors.push('parts must be an array')\n\n let expectedOffset = 0\n const parts = Array.isArray(data?.parts) ? data.parts : []\n for (const [index, part] of parts.entries()) {\n if (!hasString(part.href)) errors.push('parts[' + index + '].href is required')\n if (!hasNonNegativeInteger(part.offset)) errors.push('parts[' + index + '].offset must be a non-negative integer')\n if (!hasNonNegativeInteger(part.count)) errors.push('parts[' + index + '].count must be a non-negative integer')\n if (hasNonNegativeInteger(part.offset) && part.offset !== expectedOffset) {\n errors.push('parts[' + index + '].offset must be ' + expectedOffset)\n }\n if (hasNonNegativeInteger(part.count)) expectedOffset += part.count\n }\n if (hasNonNegativeInteger(data?.total) && expectedOffset !== data.total) {\n errors.push('parts counts must add up to total')\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgFortemiChunkManifest(value: unknown): AiwgFortemiChunkManifest {\n const result = validateAiwgFortemiChunkManifest(value)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi chunk manifest:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiChunkManifest\n}\n\n// Validate projected (slim) scan-part items: scan-required fields only, ids unique + sorted.\nfunction validateProjectedRecords(items: Array<Partial<AiwgFortemiRecord>>): string[] {\n const errors: string[] = []\n const ids = new Set<string>()\n let previousId = ''\n for (const [index, item] of items.entries()) {\n if (!isSupportedRecordSchemaVersion(item.schema_version)) {\n errors.push('items[' + index + '].schema_version must be aiwg.fortemi.index.record.v1 or aiwg.fortemi.index.record.v2')\n }\n if (!hasString(item.id)) errors.push('items[' + index + '].id is required')\n if (hasString(item.id) && ids.has(item.id)) errors.push('duplicate id: ' + item.id)\n if (hasString(item.id)) ids.add(item.id)\n if (previousId && hasString(item.id) && previousId.localeCompare(item.id) > 0) {\n errors.push('items must be sorted by id: ' + previousId + ' before ' + item.id)\n }\n if (hasString(item.id)) previousId = item.id\n if (!hasString(item.type)) errors.push('items[' + index + '].type must be a non-empty string')\n if (typeof item.title !== 'string' && typeof item.search?.title !== 'string' && typeof item.search?.name !== 'string') {\n errors.push('items[' + index + '].title or search.title/search.name is required')\n }\n if (typeof item.text !== 'string' && typeof item.search?.body !== 'string' && typeof item.search?.summary !== 'string') {\n errors.push('items[' + index + '].text or search.body/search.summary is required')\n }\n if (!item.facets || typeof item.facets !== 'object' || Array.isArray(item.facets)) {\n errors.push('items[' + index + '].facets must be an object')\n }\n if (!Array.isArray(item.tags)) errors.push('items[' + index + '].tags must be an array')\n if (!Array.isArray(item.concepts)) errors.push('items[' + index + '].concepts must be an array')\n if (!item.privacy || !hasString(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy.classification is required')\n }\n }\n return errors\n}\n\nexport function validateAiwgFortemiChunkPart(\n value: unknown,\n partRef?: AiwgFortemiChunkPartRef,\n manifest?: AiwgFortemiChunkManifest,\n): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgFortemiChunkPart>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.chunk.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.chunk.v1')\n }\n if (data?.manifest_schema_version !== 'aiwg.fortemi.index.chunk-manifest.v1') {\n errors.push('manifest_schema_version must be aiwg.fortemi.index.chunk-manifest.v1')\n }\n if (!hasNonNegativeInteger(data?.offset)) errors.push('offset must be a non-negative integer')\n if (!Array.isArray(data?.items)) errors.push('items must be an array')\n\n if (partRef && hasNonNegativeInteger(data?.offset) && data.offset !== partRef.offset) {\n errors.push('offset must match manifest part offset ' + partRef.offset)\n }\n if (partRef && Array.isArray(data?.items) && data.items.length !== partRef.count) {\n errors.push('items length must match manifest part count ' + partRef.count)\n }\n\n if (Array.isArray(data?.items)) {\n if (manifest?.projection) {\n errors.push(...validateProjectedRecords(data.items).map((error) => 'items.' + error))\n } else {\n const validation = validateAiwgFortemiIndexExport({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: manifest?.generated_at ?? '1970-01-01T00:00:00.000Z',\n source: manifest?.source ?? { repo: 'chunk', privacy: 'public' },\n items: data.items,\n })\n errors.push(...validation.errors.map((error) => 'items.' + error))\n }\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgFortemiChunkPart(\n value: unknown,\n partRef?: AiwgFortemiChunkPartRef,\n manifest?: AiwgFortemiChunkManifest,\n): AiwgFortemiChunkPart {\n const result = validateAiwgFortemiChunkPart(value, partRef, manifest)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi chunk part:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiChunkPart\n}\n\nexport function createAiwgFetchChunkLoader(baseUrl?: string | URL): AiwgChunkedIndexLoader {\n return async (part) => {\n const href = baseUrl ? new URL(part.href, baseUrl).toString() : part.href\n const response = await fetch(href)\n if (!response.ok) throw new Error('Failed to fetch AIWG index chunk ' + href + ': ' + response.status)\n return response.json()\n }\n}\n\n// Encode a record id into a single, path-safe detail filename segment.\n// - 'base64url' (default): UTF-8 → base64url (no '+', '/', '=', '%'). Safe for ids\n// containing '/' on static hosts that reject %2F (#177).\n// - 'uri': encodeURIComponent (legacy).\nexport function encodeAiwgDetailId(id: string, encoding: AiwgDetailIdEncoding = 'base64url'): string {\n if (encoding === 'uri') return encodeURIComponent(id)\n const bytes = new TextEncoder().encode(id)\n let binary = ''\n for (const byte of bytes) binary += String.fromCharCode(byte)\n // btoa is available in browsers and Node ≥16.\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n// Resolve a manifest detail.href template for a given id, honoring detail.encoding\n// (absent → 'uri' for backward compatibility). The writer and the loader both go\n// through this so emitted filenames and fetched paths always agree.\nexport function aiwgDetailHrefForId(detail: AiwgFortemiChunkDetailRef, id: string): string {\n return detail.href.replace('{id}', encodeAiwgDetailId(id, detail.encoding ?? 'uri'))\n}\n\n// Detail loader for projected indexes: resolves the manifest's detail.href {id}\n// template (encoded per detail.encoding) against baseUrl and fetches the full record.\nexport function createAiwgFetchDetailLoader(baseUrl?: string | URL): AiwgChunkedIndexDetailLoader {\n return async (id, manifest) => {\n if (!manifest.detail?.href) throw new Error('Manifest has no detail.href for record resolution')\n const relative = aiwgDetailHrefForId(manifest.detail, id)\n const href = baseUrl ? new URL(relative, baseUrl).toString() : relative\n const response = await fetch(href)\n if (!response.ok) throw new Error('Failed to fetch AIWG index detail ' + href + ': ' + response.status)\n return response.json()\n }\n}\n\nexport function getAiwgFortemiFacets(items: AiwgFortemiRecord[]): Record<string, Record<string, number>> {\n const result: Record<string, Record<string, number>> = {}\n for (const item of items) {\n pushFacet(result, 'type', item.type)\n pushFacet(result, 'privacy', item.privacy.classification)\n for (const tag of item.tags) pushFacet(result, 'tag', tag)\n for (const concept of item.concepts) pushFacet(result, 'concept', concept)\n for (const [name, values] of Object.entries(item.facets)) {\n for (const value of values) pushFacet(result, name, value)\n }\n }\n return result\n}\n\nfunction recordTitle(item: AiwgFortemiProjectedRecord): string {\n return item.title ?? item.search?.title ?? item.search?.name ?? item.id\n}\n\nfunction recordText(item: AiwgFortemiProjectedRecord): string {\n return item.text\n ?? item.search?.body\n ?? item.search?.summary\n ?? item.chunks?.map((chunk) => chunk.text ?? chunk.body ?? chunk.summary ?? '').filter(Boolean).join('\\n')\n ?? ''\n}\n\nfunction recordSearchValues(item: AiwgFortemiProjectedRecord): string[] {\n const search = item.search\n const values = [\n item.id,\n recordTitle(item),\n recordText(item),\n search?.title,\n search?.name,\n search?.summary,\n search?.body,\n search?.capability,\n search?.phase,\n search?.type,\n ...(search?.triggers ?? []),\n ...(search?.aliases ?? []),\n ...(search?.tags ?? []),\n ...(item.chunks ?? []).flatMap((chunk) => [chunk.text, chunk.body, chunk.summary, chunk.source_path]),\n ]\n if (search?.frontmatter) {\n for (const value of Object.values(search.frontmatter)) {\n if (typeof value === 'string') values.push(value)\n else if (Array.isArray(value)) values.push(...value.filter((entry): entry is string => typeof entry === 'string'))\n }\n }\n return values.filter((value): value is string => typeof value === 'string' && value.length > 0)\n}\n\nexport interface AiwgChunkedIndexBuildOptions {\n partSize?: number\n // When set, scan parts carry only these fields; full records go to `details`.\n projection?: Array<keyof AiwgFortemiRecord>\n // Detail href template (with {id}); defaults to \"detail/{id}.json\" when projecting.\n detailHref?: string\n // id→filename encoding for detail files; defaults to 'base64url' (path-safe,\n // works for ids containing '/'; see #177).\n idEncoding?: AiwgDetailIdEncoding\n generatedAt?: string\n}\n\nexport interface AiwgChunkedIndexBuildResult {\n manifest: AiwgFortemiChunkManifest\n parts: Array<{ href: string; part: AiwgFortemiChunkPart }>\n // Empty unless projecting. Each entry carries the full record plus the resolved,\n // encoding-correct `href` to host it at — write the record to that path so the\n // detail loader (which uses the same encoding) can fetch it back.\n details: Array<{ id: string; href: string; record: AiwgFortemiRecord }>\n}\n\n// Pure builder (no I/O): project an index export into the chunked manifest + parts\n// (+ detail records when projecting). The caller writes the returned objects to disk.\n// Manifest facets are computed from the full records, so global counts are exact even\n// when scan parts are slim.\nexport function buildAiwgChunkedIndex(\n index: AiwgFortemiIndexExport,\n options: AiwgChunkedIndexBuildOptions = {},\n): AiwgChunkedIndexBuildResult {\n const partSize = hasPositiveInteger(options.partSize) ? options.partSize : 500\n const projection = options.projection\n const idEncoding = options.idEncoding ?? 'base64url'\n const detailHref = options.detailHref ?? 'detail/{id}.json'\n const items = index.items\n const pad = (value: number): string => String(value).padStart(4, '0')\n const project = (record: AiwgFortemiRecord): AiwgFortemiRecord => {\n if (!projection) return record\n const slim: Record<string, unknown> = {}\n for (const field of projection) slim[field] = record[field]\n return slim as unknown as AiwgFortemiRecord\n }\n\n const parts: Array<{ href: string; part: AiwgFortemiChunkPart }> = []\n const partRefs: AiwgFortemiChunkPartRef[] = []\n for (let offset = 0, partIndex = 0; offset < items.length; offset += partSize, partIndex += 1) {\n const slice = items.slice(offset, offset + partSize)\n const href = 'part-' + pad(partIndex) + '.json'\n parts.push({\n href,\n part: {\n schema_version: 'aiwg.fortemi.index.chunk.v1',\n manifest_schema_version: 'aiwg.fortemi.index.chunk-manifest.v1',\n offset,\n items: slice.map(project),\n },\n })\n partRefs.push({ href, offset, count: slice.length })\n }\n\n const manifest: AiwgFortemiChunkManifest = {\n schema_version: 'aiwg.fortemi.index.chunk-manifest.v1',\n generated_at: options.generatedAt ?? index.generated_at,\n source: index.source,\n total: items.length,\n part_size: partSize,\n facets: getAiwgFortemiFacets(items),\n parts: partRefs,\n ...(projection ? { projection, detail: { href: detailHref, encoding: idEncoding } } : {}),\n }\n\n return {\n manifest,\n parts,\n details: projection\n ? items.map((record) => ({\n id: record.id,\n href: aiwgDetailHrefForId({ href: detailHref, encoding: idEncoding }, record.id),\n record,\n }))\n : [],\n }\n}\n\nfunction includesAll(actual: string[], expected: string[] | undefined): boolean {\n if (!expected || expected.length === 0) return true\n const actualSet = new Set(actual)\n return expected.every((value) => actualSet.has(value))\n}\n\nfunction matchesFacetFilters(item: AiwgFortemiRecord, filters: Record<string, string[]> | undefined): boolean {\n if (!filters) return true\n return Object.entries(filters).every(([name, expected]) => includesAll(item.facets[name] ?? [], expected))\n}\n\nfunction queryMatches(item: AiwgFortemiRecord, q: string): AiwgIndexQueryMatch[] {\n if (!q) return []\n const matches: AiwgIndexQueryMatch[] = []\n const title = recordTitle(item)\n const text = recordText(item)\n if (title.toLowerCase().includes(q)) matches.push({ field: 'title', value: title })\n if (text.toLowerCase().includes(q)) matches.push({ field: 'text', value: text })\n for (const tag of item.tags) {\n if (tag.toLowerCase().includes(q)) matches.push({ field: 'tag', value: tag })\n }\n for (const concept of item.concepts) {\n if (concept.toLowerCase().includes(q)) matches.push({ field: 'concept', value: concept })\n }\n for (const value of recordSearchValues(item)) {\n if (value !== title && value !== text && value.toLowerCase().includes(q)) {\n matches.push({ field: 'text', value, score: DEFAULT_QUERY_WEIGHTS.text })\n }\n }\n return matches\n}\n\nconst DISCOVERY_STOPWORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'are',\n 'as',\n 'for',\n 'from',\n 'how',\n 'i',\n 'in',\n 'is',\n 'me',\n 'of',\n 'on',\n 'or',\n 'please',\n 'the',\n 'to',\n 'use',\n 'with',\n])\n\nfunction normalizeDiscoveryText(value: string): string {\n return value.toLowerCase().replace(/[_/]+/g, ' ').replace(/[^a-z0-9.-]+/g, ' ').trim()\n}\n\nfunction canonicalDiscoveryName(value: string): string {\n return normalizeDiscoveryText(value).replace(/[\\s.-]+/g, '')\n}\n\nfunction discoveryTokens(value: string): string[] {\n return normalizeDiscoveryText(value)\n .split(/\\s+/)\n .filter((token) => token.length > 1 && !DISCOVERY_STOPWORDS.has(token))\n}\n\nfunction facetValues(item: AiwgFortemiRecord, names: string[]): string[] {\n return names.flatMap((name) => item.facets[name] ?? [])\n}\n\nfunction addDiscoveryMatch(matches: AiwgIndexQueryMatch[], match: AiwgIndexQueryMatch) {\n if (!matches.some((existing) => existing.field === match.field && existing.value === match.value && existing.reason === match.reason)) {\n matches.push(match)\n }\n}\n\nfunction tokenOverlapScore(tokens: string[], value: string): number {\n if (tokens.length === 0 || !value) return 0\n const normalized = normalizeDiscoveryText(value)\n const hits = tokens.filter((token) => normalized.includes(token)).length\n return hits / tokens.length\n}\n\nfunction discoveryMatches(item: AiwgFortemiRecord, query: string): AiwgIndexQueryMatch[] {\n if (!query) return []\n const matches: AiwgIndexQueryMatch[] = []\n const tokens = discoveryTokens(query)\n const canonicalQuery = canonicalDiscoveryName(query)\n const idParts = item.id.split(/[:/]/)\n const names = [\n item.id,\n recordTitle(item),\n item.search?.name,\n item.search?.title,\n ...(item.search?.aliases ?? []),\n ...idParts,\n ...facetValues(item, ['name', 'canonical_name', 'command', 'skill', 'agent', 'rule']),\n ].filter((value): value is string => hasString(value))\n const triggers = [\n ...facetValues(item, ['trigger', 'triggers', 'trigger_phrase', 'trigger_phrases']),\n ...(item.search?.triggers ?? []),\n ]\n const capabilities = [\n ...facetValues(item, ['capability', 'capabilities', 'summary', 'description']),\n item.search?.capability,\n item.search?.summary,\n item.search?.phase,\n item.search?.type,\n ...(item.search?.tags ?? []),\n ...item.concepts,\n ...item.tags,\n ].filter((value): value is string => hasString(value))\n const sourceValues = [item.source?.path, item.source?.repo_relative_path, item.source?.locator].filter((value): value is string => hasString(value))\n\n for (const name of names) {\n const canonicalName = canonicalDiscoveryName(name)\n if (!canonicalName) continue\n if (canonicalName === canonicalQuery) {\n addDiscoveryMatch(matches, { field: 'id', value: name, score: 80, reason: 'exact canonical name' })\n } else if (canonicalName.includes(canonicalQuery) || canonicalQuery.includes(canonicalName)) {\n addDiscoveryMatch(matches, { field: 'id', value: name, score: 48, reason: 'near canonical name' })\n }\n }\n\n const title = recordTitle(item)\n const titleOverlap = tokenOverlapScore(tokens, title)\n if (titleOverlap > 0) addDiscoveryMatch(matches, { field: 'title', value: title, score: 18 * titleOverlap, reason: 'title token overlap' })\n\n for (const trigger of triggers) {\n const overlap = tokenOverlapScore(tokens, trigger)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'facet', value: trigger, score: 34 * overlap, reason: 'trigger phrase' })\n }\n\n for (const capability of capabilities) {\n const overlap = tokenOverlapScore(tokens, capability)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'concept', value: capability, score: 22 * overlap, reason: 'capability overlap' })\n }\n\n const text = recordText(item)\n const textOverlap = tokenOverlapScore(tokens, text)\n if (textOverlap > 0) addDiscoveryMatch(matches, { field: 'text', value: text, score: 8 * textOverlap, reason: 'body token overlap' })\n\n for (const source of sourceValues) {\n const overlap = tokenOverlapScore(tokens, source)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'source', value: source, score: 2 * overlap, reason: 'path overlap' })\n }\n\n return matches\n}\n\nfunction rankMatches(matches: AiwgIndexQueryMatch[], weights: AiwgIndexQueryWeights): number {\n return matches.reduce((total, match) => total + (match.score ?? weights[match.field]), 0)\n}\n\nfunction clipSnippet(value: string, q: string, maxLength: number): string {\n const normalizedLength = Math.max(20, maxLength)\n if (!value) return ''\n if (!q) return value.length > normalizedLength ? `${value.slice(0, normalizedLength).trimEnd()}...` : value\n\n const lower = value.toLowerCase()\n const index = lower.indexOf(q)\n if (index < 0) return value.length > normalizedLength ? `${value.slice(0, normalizedLength).trimEnd()}...` : value\n\n const context = Math.max(0, Math.floor((normalizedLength - q.length) / 2))\n const start = Math.max(0, index - context)\n const end = Math.min(value.length, start + normalizedLength)\n const prefix = start > 0 ? '...' : ''\n const suffix = end < value.length ? '...' : ''\n return `${prefix}${value.slice(start, end).trim()}${suffix}`\n}\n\nfunction createSnippet(item: AiwgFortemiRecord, matches: AiwgIndexQueryMatch[], q: string, maxLength: number): string {\n const textMatch = matches.find((match) => match.field === 'text')\n const titleMatch = matches.find((match) => match.field === 'title')\n const firstMatch = textMatch ?? titleMatch ?? matches[0]\n return clipSnippet(firstMatch?.value ?? recordText(item), q, maxLength)\n}\n\ninterface AiwgRankedEntry {\n item: AiwgFortemiRecord\n ordinal: number\n rank: number\n matches: AiwgIndexQueryMatch[]\n}\n\nfunction createRankedEntries(\n items: AiwgFortemiRecord[],\n q: string,\n options: AiwgIndexQueryOptions,\n ordinalBase = 0,\n): AiwgRankedEntry[] {\n const weights = { ...DEFAULT_QUERY_WEIGHTS, ...options.weights }\n const profile = options.searchProfile ?? 'default'\n return items.map((item, ordinal) => ({\n item,\n ordinal: ordinalBase + ordinal,\n matches: profile === 'aiwg-discovery' ? discoveryMatches(item, q) : queryMatches(item, q),\n }))\n .filter(({ item, matches }) => {\n if (q && matches.length === 0) return false\n if (options.types && !options.types.includes(item.type)) return false\n if (options.privacy && !options.privacy.includes(item.privacy.classification)) return false\n if (!includesAll(item.tags, options.tags)) return false\n if (!includesAll(item.concepts, options.concepts)) return false\n if (!matchesFacetFilters(item, options.facets)) return false\n if (options.relationshipTargetId && !(item.relationships ?? []).some((rel) => rel.target_id === options.relationshipTargetId)) {\n return false\n }\n return true\n })\n .map(({ item, ordinal, matches }) => ({\n item,\n ordinal,\n rank: rankMatches(matches, weights),\n matches,\n }))\n}\n\nfunction sortRankedEntries(entries: AiwgRankedEntry[], rank?: boolean): AiwgRankedEntry[] {\n return [...entries].sort((left, right) => {\n if (rank) return right.rank - left.rank || left.ordinal - right.ordinal\n return left.ordinal - right.ordinal\n })\n}\n\nfunction createQueryResultFromRankedEntries(\n entries: AiwgRankedEntry[],\n query: string,\n options: AiwgIndexQueryOptions,\n): AiwgIndexQueryResult {\n const ranked = sortRankedEntries(entries, options.rank)\n const offset = options.offset ?? 0\n const limit = options.limit ?? ranked.length\n const page = ranked.slice(offset, offset + limit)\n const result: AiwgIndexQueryResult = {\n items: page.map((entry) => entry.item),\n total: ranked.length,\n facets: getAiwgFortemiFacets(ranked.map((entry) => entry.item)),\n }\n if (options.rank || options.snippets || options.includeMatches) {\n const snippetLength = options.snippetLength ?? 160\n result.rankedItems = page.map((entry) => ({\n item: entry.item,\n rank: entry.rank,\n ...(options.snippets ? { snippet: createSnippet(entry.item, entry.matches, query, snippetLength) } : {}),\n ...(options.includeMatches ? { matches: entry.matches } : {}),\n }))\n }\n return result\n}\n\nexport function queryAiwgFortemiIndex(\n index: AiwgFortemiIndexExport,\n query = '',\n options: AiwgIndexQueryOptions = {},\n): AiwgIndexQueryResult {\n const q = query.trim().toLowerCase()\n const entries = createRankedEntries(index.items, q, options)\n if (entries.length === 0 && q && options.searchProfile === 'aiwg-discovery') {\n const relaxed = discoveryTokens(q).join(' ')\n return createQueryResultFromRankedEntries(createRankedEntries(index.items, relaxed, options), relaxed, options)\n }\n return createQueryResultFromRankedEntries(entries, q, options)\n}\n\nfunction cosineSimilarity(left: number[], right: number[]): number {\n if (left.length !== right.length || left.length === 0) return 0\n let dot = 0\n let leftMag = 0\n let rightMag = 0\n for (let i = 0; i < left.length; i += 1) {\n const l = left[i]\n const r = right[i]\n dot += l * r\n leftMag += l * l\n rightMag += r * r\n }\n if (leftMag === 0 || rightMag === 0) return 0\n return dot / (Math.sqrt(leftMag) * Math.sqrt(rightMag))\n}\n\nexport function validateAiwgStaticEmbeddingSet(value: unknown): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgStaticEmbeddingSet>\n if (data?.schema_version !== 'aiwg.fortemi.embedding.set.v1') errors.push('schema_version must be aiwg.fortemi.embedding.set.v1')\n if (!hasString(data?.id)) errors.push('id is required')\n if (!hasString(data?.model)) errors.push('model is required')\n if (!hasPositiveInteger(data?.dimensions)) errors.push('dimensions must be a positive integer')\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.granularity)) errors.push('granularity is required')\n if (!Array.isArray(data?.embeddings)) errors.push('embeddings must be an array')\n for (const [index, embedding] of (data.embeddings ?? []).entries()) {\n if (!hasString(embedding.record_id)) errors.push('embeddings[' + index + '].record_id is required')\n if (!hasString(embedding.input_hash)) errors.push('embeddings[' + index + '].input_hash is required')\n if (!Array.isArray(embedding.embedding)) errors.push('embeddings[' + index + '].embedding must be an array')\n else if (hasPositiveInteger(data?.dimensions) && embedding.embedding.length !== data.dimensions) {\n errors.push('embeddings[' + index + '].embedding length must match dimensions')\n } else if (!embedding.embedding.every((number) => typeof number === 'number' && Number.isFinite(number))) {\n errors.push('embeddings[' + index + '].embedding must contain finite numbers')\n }\n }\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgStaticEmbeddingSet(value: unknown): AiwgStaticEmbeddingSet {\n const result = validateAiwgStaticEmbeddingSet(value)\n if (!result.valid) throw new Error('Invalid AIWG Fortemi embedding set:\\n' + result.errors.join('\\n'))\n return value as AiwgStaticEmbeddingSet\n}\n\nexport function queryAiwgSemanticIndex(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n queryEmbedding: number[],\n options: AiwgStaticSemanticQueryOptions = {},\n): AiwgStaticSemanticResult[] {\n assertAiwgStaticEmbeddingSet(embeddingSet)\n if (queryEmbedding.length !== embeddingSet.dimensions) throw new Error('query embedding length must match embedding set dimensions')\n const byId = new Map(index.items.map((item) => [item.id, item]))\n const offset = options.offset ?? 0\n const limit = options.limit ?? 20\n return embeddingSet.embeddings\n .map((embedding): AiwgStaticSemanticResult | null => {\n const item = byId.get(embedding.record_id)\n if (!item) return null\n return { item, embedding, score: cosineSimilarity(queryEmbedding, embedding.embedding) }\n })\n .filter((result): result is AiwgStaticSemanticResult => result !== null && result.score >= (options.minScore ?? -1))\n .sort((left, right) => right.score - left.score || left.item.id.localeCompare(right.item.id))\n .slice(offset, offset + limit)\n}\n\nexport function queryAiwgHybridIndex(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n query: string,\n queryEmbedding: number[],\n options: AiwgStaticHybridQueryOptions = {},\n): AiwgStaticSemanticResult[] {\n const lexical = queryAiwgFortemiIndex(index, query, { ...options, rank: true })\n const semantic = queryAiwgSemanticIndex(index, embeddingSet, queryEmbedding, { limit: index.items.length })\n const lexicalWeight = options.lexicalWeight ?? 0.5\n const semanticWeight = options.semanticWeight ?? 0.5\n const lexicalScores = new Map(lexical.rankedItems?.map((entry) => [entry.item.id, entry.rank]) ?? [])\n const maxLexical = Math.max(1, ...lexicalScores.values())\n const embeddingById = new Map(semantic.flatMap((entry) => entry.embedding ? [[entry.item.id, entry.embedding] as const] : []))\n const semanticScores = new Map(semantic.map((entry) => [entry.item.id, entry.score]))\n const ids = new Set([...lexicalScores.keys(), ...semanticScores.keys()])\n const offset = options.offset ?? 0\n const limit = options.limit ?? 20\n return [...ids]\n .map((id) => {\n const item = index.items.find((candidate) => candidate.id === id)\n const embedding = embeddingById.get(id)\n if (!item) return null\n return {\n item,\n ...(embedding ? { embedding } : {}),\n score: ((lexicalScores.get(id) ?? 0) / maxLexical) * lexicalWeight + (semanticScores.get(id) ?? 0) * semanticWeight,\n }\n })\n .filter((result): result is AiwgStaticSemanticResult => result !== null && result.score >= (options.minScore ?? -1))\n .sort((left, right) => right.score - left.score || left.item.id.localeCompare(right.item.id))\n .slice(offset, offset + limit)\n}\n\nexport function findAiwgStaticDuplicatePairs(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n threshold = 0.9,\n): AiwgStaticDuplicatePair[] {\n assertAiwgStaticEmbeddingSet(embeddingSet)\n const byId = new Map(index.items.map((item) => [item.id, item]))\n const pairs: AiwgStaticDuplicatePair[] = []\n for (let leftIndex = 0; leftIndex < embeddingSet.embeddings.length; leftIndex += 1) {\n for (let rightIndex = leftIndex + 1; rightIndex < embeddingSet.embeddings.length; rightIndex += 1) {\n const leftEmbedding = embeddingSet.embeddings[leftIndex]\n const rightEmbedding = embeddingSet.embeddings[rightIndex]\n const left = byId.get(leftEmbedding.record_id)\n const right = byId.get(rightEmbedding.record_id)\n if (!left || !right) continue\n const score = cosineSimilarity(leftEmbedding.embedding, rightEmbedding.embedding)\n if (score >= threshold) pairs.push({ left, right, score })\n }\n }\n return pairs.sort((left, right) => right.score - left.score || left.left.id.localeCompare(right.left.id))\n}\n\ninterface AiwgChunkedIndexRuntime {\n manifest: AiwgFortemiChunkManifest\n loader: AiwgChunkedIndexLoader\n maxCachedParts: number\n partCache: Map<string, AiwgFortemiChunkPart>\n detailLoader?: AiwgChunkedIndexDetailLoader\n maxCachedDetails: number\n detailCache: Map<string, AiwgFortemiRecord>\n maxCachedMatches: number\n // query+filter+weights key -> the full filtered/ranked entry set for that\n // query (offset/limit/sort/snippets independent). LRU-ordered; bounded by\n // maxCachedMatches (total entries). Lets pagination reuse a single scan.\n matchCache: Map<string, AiwgRankedEntry[]>\n}\n\nfunction chunkPartCacheKey(part: AiwgFortemiChunkPartRef): string {\n return `${part.offset}:${part.href}`\n}\n\nfunction clampMaxCachedParts(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 3\n return value\n}\n\nfunction clampMaxCachedDetails(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 32\n return value\n}\n\nfunction clampMaxCachedMatches(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 5000\n return value\n}\n\n// Stable key over the inputs that determine the filtered/ranked entry SET and\n// each entry's rank value — but not offset/limit/sort/snippets, which only shape\n// the page projected from a cached set. Caller-stable option objects (same field\n// order each page) hit the cache; a reordered object simply misses (still correct).\nfunction matchSetCacheKey(q: string, options: AiwgIndexQueryOptions): string {\n return JSON.stringify({\n q,\n types: options.types ?? null,\n facets: options.facets ?? null,\n tags: options.tags ?? null,\n concepts: options.concepts ?? null,\n privacy: options.privacy ?? null,\n rel: options.relationshipTargetId ?? null,\n weights: { ...DEFAULT_QUERY_WEIGHTS, ...options.weights },\n })\n}\n\nfunction cacheMatchEntries(runtime: AiwgChunkedIndexRuntime, key: string, entries: AiwgRankedEntry[]): void {\n runtime.matchCache.delete(key)\n runtime.matchCache.set(key, entries)\n let total = 0\n for (const set of runtime.matchCache.values()) total += set.length\n // Evict oldest sets until within budget, but always keep the just-inserted set\n // so paging a large result still benefits from the single scan.\n while (total > runtime.maxCachedMatches && runtime.matchCache.size > 1) {\n const oldest = runtime.matchCache.keys().next().value\n if (oldest === undefined || oldest === key) break\n total -= runtime.matchCache.get(oldest)?.length ?? 0\n runtime.matchCache.delete(oldest)\n }\n}\n\nfunction isDirectChunkBrowse(query: string, options: AiwgIndexQueryOptions): boolean {\n return query.trim() === ''\n && !options.rank\n && !options.snippets\n && !options.includeMatches\n && !options.types\n && !options.facets\n && !options.tags\n && !options.concepts\n && !options.privacy\n && !options.relationshipTargetId\n}\n\nfunction getPartsForRange(\n manifest: AiwgFortemiChunkManifest,\n offset: number,\n limit: number,\n): AiwgFortemiChunkPartRef[] {\n const end = offset + limit\n return manifest.parts.filter((part) => part.count > 0 && part.offset < end && part.offset + part.count > offset)\n}\n\nasync function loadChunkPart(\n runtime: AiwgChunkedIndexRuntime,\n part: AiwgFortemiChunkPartRef,\n): Promise<{ part: AiwgFortemiChunkPart; fetched: boolean }> {\n const key = chunkPartCacheKey(part)\n const cached = runtime.partCache.get(key)\n if (cached) {\n runtime.partCache.delete(key)\n runtime.partCache.set(key, cached)\n return { part: cached, fetched: false }\n }\n\n const parsed = assertAiwgFortemiChunkPart(await runtime.loader(part, runtime.manifest), part, runtime.manifest)\n runtime.partCache.set(key, parsed)\n while (runtime.partCache.size > runtime.maxCachedParts) {\n const oldest = runtime.partCache.keys().next().value\n if (oldest === undefined) break\n runtime.partCache.delete(oldest)\n }\n return { part: parsed, fetched: true }\n}\n\nasync function getChunkRecord(runtime: AiwgChunkedIndexRuntime, id: string): Promise<AiwgFortemiRecord> {\n const cached = runtime.detailCache.get(id)\n if (cached) {\n runtime.detailCache.delete(id)\n runtime.detailCache.set(id, cached)\n return cached\n }\n // Whole-record parts already in cache: serve without a detail fetch.\n if (!runtime.manifest.projection) {\n for (const part of runtime.partCache.values()) {\n const found = part.items.find((item) => item.id === id)\n if (found) return found\n }\n }\n if (!runtime.detailLoader) {\n throw new Error('No detailLoader configured to resolve record ' + id)\n }\n const raw = await runtime.detailLoader(id, runtime.manifest)\n const record = assertAiwgFortemiIndexExport({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: runtime.manifest.generated_at,\n source: runtime.manifest.source,\n items: [raw],\n }).items[0]\n if (record.id !== id) {\n throw new Error('Detail record id mismatch: expected ' + id + ', got ' + record.id)\n }\n runtime.detailCache.set(id, record)\n while (runtime.detailCache.size > runtime.maxCachedDetails) {\n const oldest = runtime.detailCache.keys().next().value\n if (oldest === undefined) break\n runtime.detailCache.delete(oldest)\n }\n return record\n}\n\nfunction relationshipTypeFilter(options?: AiwgRelationshipQueryOptions): string | undefined {\n return options?.relationshipType ?? options?.type\n}\n\nfunction edgeFromRelationship(sourceId: string, relationship: AiwgFortemiRelationship): AiwgRelationshipEdgeSummary {\n return {\n source_id: sourceId,\n target_id: relationship.target_id,\n type: relationship.type,\n ...(relationship.source_path ? { source_path: relationship.source_path } : {}),\n ...(relationship.target_path ? { target_path: relationship.target_path } : {}),\n ...(relationship.direction ? { direction: relationship.direction } : {}),\n }\n}\n\nfunction relationshipMatches(edge: AiwgRelationshipEdgeSummary, options: AiwgRelationshipQueryOptions = {}): boolean {\n const type = relationshipTypeFilter(options)\n const direction = options.direction ?? 'both'\n if (type && edge.type !== type) return false\n if (options.relationshipDirection && edge.direction !== options.relationshipDirection) return false\n if (options.sourceId && edge.source_id !== options.sourceId) return false\n if (options.targetId && edge.target_id !== options.targetId) return false\n if (direction === 'out' && options.targetId && edge.target_id !== options.targetId) return false\n if (direction === 'in' && options.sourceId && edge.source_id !== options.sourceId) return false\n return true\n}\n\nfunction nodeSummary(item: AiwgFortemiProjectedRecord): AiwgRelationshipNodeSummary {\n return { id: item.id, type: item.type, title: recordTitle(item) }\n}\n\nfunction addNode(nodes: Map<string, AiwgRelationshipNodeSummary>, item: AiwgFortemiProjectedRecord | undefined) {\n if (item) nodes.set(item.id, nodeSummary(item))\n}\n\nfunction relationshipResultFromRecords(\n records: AiwgFortemiProjectedRecord[],\n options: AiwgRelationshipQueryOptions = {},\n): AiwgRelationshipTraversalResult {\n const byId = new Map(records.map((record) => [record.id, record]))\n const edges: AiwgRelationshipEdgeSummary[] = []\n for (const record of records) {\n for (const relationship of record.relationships ?? []) {\n const edge = edgeFromRelationship(record.id, relationship)\n if (!relationshipMatches(edge, options)) continue\n edges.push(edge)\n }\n }\n const limitedEdges = (options.limit ? edges.slice(0, options.limit) : edges).sort((left, right) => (\n left.source_id.localeCompare(right.source_id)\n || left.target_id.localeCompare(right.target_id)\n || left.type.localeCompare(right.type)\n ))\n const nodes = new Map<string, AiwgRelationshipNodeSummary>()\n for (const edge of limitedEdges) {\n addNode(nodes, byId.get(edge.source_id))\n addNode(nodes, byId.get(edge.target_id))\n }\n return {\n nodes: [...nodes.values()].sort((left, right) => left.id.localeCompare(right.id)),\n edges: limitedEdges,\n complete: true,\n }\n}\n\nfunction neighborQueryOptions(id: string, options: AiwgRelationshipTraversalOptions = {}): AiwgRelationshipQueryOptions {\n const direction = options.direction ?? 'both'\n return {\n ...options,\n ...(direction === 'out' ? { sourceId: id } : {}),\n ...(direction === 'in' ? { targetId: id } : {}),\n }\n}\n\nfunction filterNeighborResult(id: string, result: AiwgRelationshipTraversalResult, options: AiwgRelationshipTraversalOptions = {}): AiwgRelationshipTraversalResult {\n const direction = options.direction ?? 'both'\n const edges = result.edges.filter((edge) => {\n if (direction === 'out') return edge.source_id === id\n if (direction === 'in') return edge.target_id === id\n return edge.source_id === id || edge.target_id === id\n })\n const ids = new Set<string>()\n for (const edge of edges) {\n ids.add(edge.source_id)\n ids.add(edge.target_id)\n }\n return {\n ...result,\n edges,\n nodes: result.nodes.filter((node) => ids.has(node.id)),\n }\n}\n\nasync function recordsFromChunkedRuntime(\n runtime: AiwgChunkedIndexRuntime,\n onProgress?: (progress: AiwgChunkedIndexProgress) => void,\n): Promise<{ records: AiwgFortemiRecord[]; scannedParts: number; fetchedParts: number }> {\n let scannedParts = 0\n let fetchedParts = 0\n const records: AiwgFortemiRecord[] = []\n for (const partRef of runtime.manifest.parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n onProgress?.({ phase: 'part', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n for (const item of loaded.part.items) {\n records.push(item.relationships ? item : await getChunkRecord(runtime, item.id))\n }\n }\n return { records, scannedParts, fetchedParts }\n}\n\nasync function relationshipResultFromChunkedRuntime(\n runtime: AiwgChunkedIndexRuntime,\n options: AiwgRelationshipQueryOptions = {},\n): Promise<AiwgRelationshipTraversalResult> {\n const loaded = await recordsFromChunkedRuntime(runtime)\n return {\n ...relationshipResultFromRecords(loaded.records, options),\n scannedParts: loaded.scannedParts,\n fetchedParts: loaded.fetchedParts,\n }\n}\n\nasync function queryChunkedAiwgFortemiIndex(\n runtime: AiwgChunkedIndexRuntime,\n query = '',\n options: AiwgChunkedIndexQueryOptions = {},\n): Promise<AiwgChunkedIndexQueryResult> {\n const q = query.trim().toLowerCase()\n let scannedParts = 0\n let fetchedParts = 0\n\n if (isDirectChunkBrowse(query, options)) {\n const offset = options.offset ?? 0\n const limit = options.limit ?? runtime.manifest.total\n const parts = getPartsForRange(runtime.manifest, offset, limit)\n const items: AiwgFortemiRecord[] = []\n for (const partRef of parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n options.onProgress?.({ phase: 'part', done: scannedParts, total: parts.length, href: partRef.href })\n const start = Math.max(0, offset - partRef.offset)\n const end = Math.min(loaded.part.items.length, offset + limit - partRef.offset)\n items.push(...loaded.part.items.slice(start, end))\n }\n return {\n items,\n total: runtime.manifest.total,\n facets: runtime.manifest.facets ?? {},\n manifestTotal: runtime.manifest.total,\n scannedParts,\n fetchedParts,\n complete: true,\n }\n }\n\n // Reuse the filtered/ranked entry set across pages of the same query: the\n // expensive part scan is offset/limit/sort/snippet independent. A hit projects\n // a new page from cached entries without touching parts (scanned/fetched = 0).\n const matchKey = matchSetCacheKey(q, options)\n const cached = runtime.matchCache.get(matchKey)\n if (cached) {\n runtime.matchCache.delete(matchKey)\n runtime.matchCache.set(matchKey, cached)\n return {\n ...createQueryResultFromRankedEntries(cached, q, options),\n manifestTotal: runtime.manifest.total,\n scannedParts: 0,\n fetchedParts: 0,\n complete: true,\n }\n }\n\n const entries: AiwgRankedEntry[] = []\n for (const partRef of runtime.manifest.parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n options.onProgress?.({ phase: 'part', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n entries.push(...createRankedEntries(loaded.part.items, q, options, partRef.offset))\n options.onProgress?.({ phase: 'query', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n }\n cacheMatchEntries(runtime, matchKey, entries)\n\n return {\n ...createQueryResultFromRankedEntries(entries, q, options),\n manifestTotal: runtime.manifest.total,\n scannedParts,\n fetchedParts,\n complete: true,\n }\n}\n\nexport function createAiwgReviewDecisionExport(\n // Only the export schema_version is needed — so this works in chunked mode\n // (where no whole index is loaded) by passing a minimal source. See #178.\n source: Pick<AiwgFortemiIndexExport, 'schema_version'>,\n decisions: AiwgReviewDecision[],\n generatedAt = new Date().toISOString(),\n): AiwgReviewDecisionExport {\n return {\n schema_version: 'aiwg.fortemi.review-decisions.v1',\n generated_at: generatedAt,\n source_export_schema_version: source.schema_version,\n decisions: [...decisions].sort((left, right) => left.item_id.localeCompare(right.item_id)),\n }\n}\n\nexport function createAiwgIndexController(initialIndex?: AiwgFortemiIndexExport): AiwgIndexController {\n let index: AiwgFortemiIndexExport | null = initialIndex ?? null\n let chunked: AiwgChunkedIndexRuntime | null = null\n let data: AiwgIndexQueryResult | null = null\n let error: Error | null = null\n let reviewDecisions: AiwgReviewDecision[] = []\n const listeners = new Set<AiwgIndexControllerListener>()\n\n const snapshot = (): AiwgIndexControllerSnapshot => ({\n index,\n chunked: chunked\n ? {\n manifest: chunked.manifest,\n cachedParts: chunked.partCache.size,\n maxCachedParts: chunked.maxCachedParts,\n }\n : null,\n data,\n error,\n reviewDecisions: [...reviewDecisions],\n })\n const notify = () => {\n const current = snapshot()\n for (const listener of listeners) listener(current)\n }\n const requireIndex = (): AiwgFortemiIndexExport => {\n if (!index) throw new Error('No AIWG index export loaded')\n return index\n }\n\n return {\n loadIndex(value: unknown): AiwgFortemiIndexExport {\n try {\n const parsed = assertAiwgFortemiIndexExport(value)\n index = parsed\n chunked = null\n data = null\n reviewDecisions = []\n error = null\n notify()\n return parsed\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n loadChunkedIndex(\n manifest: unknown,\n loader: AiwgChunkedIndexLoader,\n options: AiwgChunkedIndexLoadOptions = {},\n ): AiwgFortemiChunkManifest {\n try {\n const parsed = assertAiwgFortemiChunkManifest(manifest)\n index = null\n chunked = {\n manifest: parsed,\n loader,\n maxCachedParts: clampMaxCachedParts(options.maxCachedParts),\n partCache: new Map(),\n detailLoader: options.detailLoader,\n maxCachedDetails: clampMaxCachedDetails(options.maxCachedDetails),\n detailCache: new Map(),\n maxCachedMatches: clampMaxCachedMatches(options.maxCachedMatches),\n matchCache: new Map(),\n }\n data = null\n reviewDecisions = []\n error = null\n notify()\n return parsed\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n getIndex(): AiwgFortemiIndexExport | null {\n return index\n },\n getChunkedManifest(): AiwgFortemiChunkManifest | null {\n return chunked?.manifest ?? null\n },\n getSnapshot(): AiwgIndexControllerSnapshot {\n return snapshot()\n },\n query(query = '', options?: AiwgIndexQueryOptions): AiwgIndexQueryResult {\n const result = queryAiwgFortemiIndex(requireIndex(), query, options)\n data = result\n error = null\n notify()\n return result\n },\n async queryChunked(query = '', options?: AiwgChunkedIndexQueryOptions): Promise<AiwgChunkedIndexQueryResult> {\n if (!chunked) throw new Error('No AIWG chunked index manifest loaded')\n try {\n const result = await queryChunkedAiwgFortemiIndex(chunked, query, options)\n data = result\n error = null\n notify()\n return result\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async getRecord(id: string): Promise<AiwgFortemiRecord> {\n if (chunked) {\n try {\n return await getChunkRecord(chunked, id)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n }\n const found = requireIndex().items.find((item) => item.id === id)\n if (!found) throw new Error('Record not found: ' + id)\n return found\n },\n async neighbors(id: string, options?: AiwgRelationshipTraversalOptions): Promise<AiwgRelationshipTraversalResult> {\n try {\n const queryOptions = neighborQueryOptions(id, options)\n const result = chunked\n ? await relationshipResultFromChunkedRuntime(chunked, queryOptions)\n : relationshipResultFromRecords(requireIndex().items, queryOptions)\n return filterNeighborResult(id, result, options)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async relationshipQuery(options?: AiwgRelationshipQueryOptions): Promise<AiwgRelationshipTraversalResult> {\n try {\n return chunked\n ? await relationshipResultFromChunkedRuntime(chunked, options)\n : relationshipResultFromRecords(requireIndex().items, options)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async relationshipSet(options: AiwgRelationshipSetOptions): Promise<AiwgRelationshipSetResult> {\n const [left, right] = await Promise.all([\n this.neighbors(options.a, options),\n this.neighbors(options.b, options),\n ])\n const leftIds = new Set(left.nodes.map((node) => node.id).filter((id) => id !== options.a))\n const rightIds = new Set(right.nodes.map((node) => node.id).filter((id) => id !== options.b))\n let ids: string[]\n if (options.op === 'intersection') ids = [...leftIds].filter((id) => rightIds.has(id))\n else if (options.op === 'difference') ids = [...leftIds].filter((id) => !rightIds.has(id))\n else ids = [...new Set([...leftIds, ...rightIds])]\n return { op: options.op, ids: ids.sort() }\n },\n clearChunkCache(): void {\n chunked?.partCache.clear()\n chunked?.detailCache.clear()\n chunked?.matchCache.clear()\n error = null\n notify()\n },\n toCommunityGraph(options?: AiwgIndexGraphOptions) {\n return aiwgFortemiIndexToCommunityGraph(requireIndex(), options)\n },\n async toCommunityGraphChunked(options?: AiwgIndexGraphOptions & { onProgress?: (progress: AiwgChunkedIndexProgress) => void }) {\n if (!chunked) return aiwgFortemiIndexToCommunityGraph(requireIndex(), options)\n const loaded = await recordsFromChunkedRuntime(chunked, options?.onProgress)\n return aiwgFortemiIndexToCommunityGraph({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: chunked.manifest.generated_at,\n source: chunked.manifest.source,\n items: loaded.records,\n }, options)\n },\n setReviewDecision(input: AiwgReviewInput): AiwgReviewDecision {\n const decision: AiwgReviewDecision = {\n ...input,\n updated_at: new Date().toISOString(),\n }\n reviewDecisions = [\n ...reviewDecisions.filter((item) => item.item_id !== decision.item_id),\n decision,\n ].sort((left, right) => left.item_id.localeCompare(right.item_id))\n error = null\n notify()\n return decision\n },\n clearReviewDecision(itemId: string): void {\n reviewDecisions = reviewDecisions.filter((item) => item.item_id !== itemId)\n error = null\n notify()\n },\n createReviewDecisionExport(generatedAt?: string): AiwgReviewDecisionExport {\n // The review-decisions export only needs the export schema_version, not the\n // items — so it works in chunked mode by synthesizing a minimal source (#178).\n const source: Pick<AiwgFortemiIndexExport, 'schema_version'> | null =\n index ?? (chunked ? { schema_version: 'aiwg.fortemi.index.export.v1' } : null)\n if (!source) throw new Error('No AIWG index export or chunked manifest loaded')\n return createAiwgReviewDecisionExport(source, reviewDecisions, generatedAt)\n },\n subscribe(listener: AiwgIndexControllerListener): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n\nexport function aiwgFortemiIndexToCommunityGraph(\n index: AiwgFortemiIndexExport,\n options: AiwgIndexGraphOptions = {},\n) {\n const ids = new Set(index.items.map((item) => item.id))\n const relationshipWeights = options.relationshipWeights ?? {}\n const edgeCounts = new Map<string, { source: string; target: string; kind: string; weight: number }>()\n\n for (const item of index.items) {\n for (const relationship of item.relationships) {\n if (!ids.has(relationship.target_id) && !options.includeDanglingRelationships) continue\n const kind = relationship.type\n const baseWeight = relationshipWeights[kind] ?? 1\n const key = `${item.id}\\u0000${relationship.target_id}\\u0000${kind}`\n const existing = edgeCounts.get(key)\n if (existing) existing.weight += baseWeight\n else edgeCounts.set(key, { source: item.id, target: relationship.target_id, kind, weight: baseWeight })\n }\n }\n\n const communities = new Map<string, string[]>()\n for (const item of index.items) {\n const communityIds = communityIdsFor(item, options)\n for (const communityId of communityIds) {\n const nodes = communities.get(communityId) ?? []\n nodes.push(item.id)\n communities.set(communityId, nodes)\n }\n }\n\n return {\n nodes: index.items.map((item) => ({ id: item.id })),\n edges: Array.from(edgeCounts.values()).sort((left, right) => (\n left.source.localeCompare(right.source)\n || left.target.localeCompare(right.target)\n || left.kind.localeCompare(right.kind)\n )),\n communities: Array.from(communities.entries())\n .map(([id, nodes]) => ({ id, nodes: [...new Set(nodes)].sort() }))\n .sort((left, right) => left.id.localeCompare(right.id)),\n }\n}\n\nfunction communityIdsFor(item: AiwgFortemiRecord, options: AiwgIndexGraphOptions): string[] {\n if (options.communityFacet) {\n const values = item.facets[options.communityFacet] ?? []\n if (values.length > 0) return values.map((value) => `${options.communityFacet}:${value}`)\n }\n if (options.communityTagPrefix) {\n const prefix = options.communityTagPrefix\n const tags = item.tags.filter((tag) => tag.startsWith(prefix))\n if (tags.length > 0) return tags\n }\n if (item.concepts.length > 0) return item.concepts.map((concept) => `concept:${concept}`)\n return [`type:${item.type}`]\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hash.ts","../src/aiwg-index.ts"],"names":[],"mappings":"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","file":"aiwg-index.js","sourcesContent":["import { sha256 } from '@noble/hashes/sha256'\nimport { bytesToHex } from '@noble/hashes/utils'\n\n/**\n * Compute a SHA-256 content hash for the given byte array.\n *\n * Returns a string in `algorithm:hex` format to match the server-side\n * convention, e.g. `sha256:a3b4c5...` (64 hex characters after the prefix).\n *\n * @param data - Raw bytes to hash\n * @returns `'sha256:<64-char lowercase hex>'`\n */\nexport function computeHash(data: Uint8Array): string {\n const digest = sha256(data)\n return `sha256:${bytesToHex(digest)}`\n}\n","import { computeHash } from './hash.js'\n\nexport type AiwgFortemiKnownRecordType =\n | 'crm.contact'\n | 'crm.organization'\n | 'crm.event'\n | 'crm.interaction'\n | 'aiwg.artifact'\n | 'aiwg.kb.page'\n\nexport type AiwgFortemiRecordType = AiwgFortemiKnownRecordType | `aiwg.${string}` | `research.${string}` | `docs.${string}` | string\n\nexport type AiwgFortemiRecordSchemaVersion = 'aiwg.fortemi.index.record.v1' | 'aiwg.fortemi.index.record.v2'\nexport type AiwgFortemiIndexExportSchemaVersion = 'aiwg.fortemi.index.export.v1' | 'aiwg.fortemi.index.export.v2'\nexport type AiwgPrivacyClassification = 'private' | 'sanitized' | 'public'\nexport type AiwgProvenanceConfidence = 'source' | 'candidate' | 'reviewed' | 'rejected'\nexport type AiwgReviewAction = 'accept' | 'reject' | 'defer'\nexport type AiwgFortemiRelationshipDirection = 'upstream' | 'downstream' | 'related'\n\nexport interface AiwgFortemiRecordSource {\n path: string\n repo_relative_path: string\n locator: string\n origin?: string\n generated?: boolean\n checksum?: string\n updated_at?: string\n}\n\nexport interface AiwgFortemiRelationship {\n type: string\n target_id: string\n source_path?: string\n target_path?: string\n direction?: AiwgFortemiRelationshipDirection\n label?: string\n confidence?: number\n privacy?: AiwgPrivacyClassification\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiProvenance {\n field: string\n source: string\n path: string\n confidence: AiwgProvenanceConfidence\n privacy: AiwgPrivacyClassification\n}\n\nexport type AiwgFortemiSkosRelationType = 'broader' | 'narrower' | 'related' | string\n\nexport interface AiwgFortemiSkosConcept {\n id: string\n prefLabel: string\n definition?: string\n scheme?: string\n notation?: string\n uri?: string\n altLabels?: string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiSkosRelation {\n type: AiwgFortemiSkosRelationType\n source_id: string\n target_id: string\n source_path?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiProvenanceEvent {\n id?: string\n activity: string\n agent?: string\n started_at?: string\n ended_at?: string\n source?: string\n path?: string\n confidence?: AiwgProvenanceConfidence\n privacy?: AiwgPrivacyClassification\n attributes?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiSearchProjection {\n title?: string\n name?: string\n summary?: string\n body?: string\n triggers?: string[]\n aliases?: string[]\n capability?: string\n tags?: string[]\n phase?: string\n type?: string\n frontmatter?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiChunk {\n id?: string\n text?: string\n body?: string\n summary?: string\n source_path?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiRecordEmbedding {\n id?: string\n embedding?: number[]\n vector?: number[]\n model?: string\n granularity?: string\n input_hash?: string\n source_path?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiAttachmentReference {\n id: string\n path: string\n mime: string | null\n checksum: string\n bytes: number\n}\n\nexport interface AiwgFortemiBinarySource {\n extracted_text: string\n attachment: AiwgFortemiAttachmentReference\n}\n\nexport interface AiwgFortemiRecord {\n schema_version: AiwgFortemiRecordSchemaVersion\n id: string\n type: AiwgFortemiRecordType\n source: AiwgFortemiRecordSource\n title?: string\n text?: string\n facets: Record<string, string[]>\n tags: string[]\n concepts: string[]\n relationships: AiwgFortemiRelationship[]\n provenance: AiwgFortemiProvenance[]\n search?: AiwgFortemiSearchProjection\n chunks?: AiwgFortemiChunk[]\n binary_sources?: AiwgFortemiBinarySource[]\n embeddings?: AiwgFortemiRecordEmbedding[]\n compatibility?: Record<string, unknown>\n /** Optional rich SKOS metadata for static consumers that need labels/definitions without opening a shard. */\n skos_concepts?: AiwgFortemiSkosConcept[]\n /** Optional SKOS relationship edges among concepts referenced by this record. */\n skos_relations?: AiwgFortemiSkosRelation[]\n /** Optional W3C PROV-style activity chain for this record. */\n provenance_events?: AiwgFortemiProvenanceEvent[]\n privacy: {\n classification: AiwgPrivacyClassification\n pii: boolean\n locality?: string\n }\n updated_at: string\n}\n\nexport interface AiwgFortemiIndexExport {\n schema_version: AiwgFortemiIndexExportSchemaVersion\n generated_at: string\n source: {\n repo: string\n privacy: AiwgPrivacyClassification\n // v2-only graph metadata block; the validator gates its presence to export.v2.\n graph?: Record<string, unknown>\n }\n items: AiwgFortemiRecord[]\n // v2-only; the validator gates its presence to export.v2.\n compatibility?: Record<string, unknown>\n}\n\nexport interface AiwgFortemiChunkPartRef {\n href: string\n offset: number\n count: number\n}\n\n// Fields a scan part must retain for query/browse/rank/facet to work. The rest\n// (source, provenance, relationships, updated_at) are detail-only and may be\n// dropped from scan parts via `projection`, then resolved on demand by id.\nexport const AIWG_SCAN_REQUIRED_FIELDS: Array<keyof AiwgFortemiRecord> = [\n 'schema_version',\n 'id',\n 'type',\n 'title',\n 'text',\n 'facets',\n 'tags',\n 'concepts',\n 'privacy',\n]\n\n// A record as it appears in a scan part. With no manifest `projection`, this is a\n// full AiwgFortemiRecord. With a projection, detail-only fields are absent — read\n// them via the controller's getRecord(). Typed as the full record for ergonomics;\n// query/browse code guards the projectable fields.\nexport type AiwgFortemiProjectedRecord =\n Pick<AiwgFortemiRecord, 'schema_version' | 'id' | 'type' | 'title' | 'text' | 'facets' | 'tags' | 'concepts' | 'privacy'>\n & Partial<AiwgFortemiRecord>\n\n// How a record id is encoded into a detail filename/path segment.\n// - 'base64url': path-safe, single segment, no '%' — works on every static host,\n// including ids containing '/' (default for new builds; see #177).\n// - 'uri': encodeURIComponent — legacy. Breaks for ids containing '/' on static\n// servers that reject %2F (path-traversal protection → 404).\nexport type AiwgDetailIdEncoding = 'uri' | 'base64url'\n\n// How the controller resolves a full record by id when scan parts are projected.\nexport interface AiwgFortemiChunkDetailRef {\n // href template containing `{id}`, relative to the manifest base — e.g.\n // \"detail/{id}.json\". The `{id}` is encoded per `encoding` at substitution.\n href: string\n // id→segment encoding. Absent is treated as 'uri' for backward compatibility\n // with manifests built before #177; new builds default to 'base64url'.\n encoding?: AiwgDetailIdEncoding\n}\n\nexport interface AiwgFortemiChunkManifest {\n schema_version: 'aiwg.fortemi.index.chunk-manifest.v1'\n generated_at: string\n source: AiwgFortemiIndexExport['source']\n // The schema_version of the source index export this manifest was built from,\n // so chunked consumers (e.g. review-decision export) can report the true source\n // version rather than assuming v1 (#239 E8). Optional for backward compatibility.\n source_export_schema_version?: AiwgFortemiIndexExportSchemaVersion\n total: number\n part_size: number\n facets?: Record<string, Record<string, number>>\n // Field names present in scan-part items. Absent → scan parts carry whole records.\n // When set, must include AIWG_SCAN_REQUIRED_FIELDS.\n projection?: Array<keyof AiwgFortemiRecord>\n // Resolver for full records by id (used with `projection` to lazy-load detail).\n detail?: AiwgFortemiChunkDetailRef\n parts: AiwgFortemiChunkPartRef[]\n}\n\nexport interface AiwgFortemiChunkPart {\n schema_version: 'aiwg.fortemi.index.chunk.v1'\n manifest_schema_version: 'aiwg.fortemi.index.chunk-manifest.v1'\n offset: number\n items: AiwgFortemiRecord[]\n}\n\nexport interface AiwgIndexValidationResult {\n valid: boolean\n errors: string[]\n counts: Partial<Record<string, number>>\n}\n\nexport interface AiwgChunkedIndexValidationResult {\n valid: boolean\n errors: string[]\n}\n\nexport interface AiwgIndexQueryOptions {\n types?: AiwgFortemiRecordType[]\n facets?: Record<string, string[]>\n tags?: string[]\n concepts?: string[]\n privacy?: AiwgPrivacyClassification[]\n relationshipTargetId?: string\n limit?: number\n offset?: number\n rank?: boolean\n snippets?: boolean\n snippetLength?: number\n weights?: Partial<AiwgIndexQueryWeights>\n includeMatches?: boolean\n searchProfile?: 'default' | 'aiwg-discovery'\n}\n\nexport interface AiwgIndexQueryWeights {\n title: number\n text: number\n tag: number\n concept: number\n facet: number\n id: number\n source: number\n}\n\nexport interface AiwgIndexQueryMatch {\n field: 'title' | 'text' | 'tag' | 'concept' | 'facet' | 'id' | 'source'\n value: string\n score?: number\n reason?: string\n}\n\nexport interface AiwgIndexQueryRankedItem {\n item: AiwgFortemiRecord\n rank: number\n snippet?: string\n matches?: AiwgIndexQueryMatch[]\n}\n\nexport interface AiwgIndexQueryResult {\n items: AiwgFortemiRecord[]\n total: number\n facets: Record<string, Record<string, number>>\n rankedItems?: AiwgIndexQueryRankedItem[]\n}\n\nexport type AiwgChunkedIndexLoader = (\n part: AiwgFortemiChunkPartRef,\n manifest: AiwgFortemiChunkManifest,\n) => Promise<unknown>\n\n// Resolves a full record by id (used with projected scan parts). Returns the\n// parsed record JSON; validated by the controller before use.\nexport type AiwgChunkedIndexDetailLoader = (\n id: string,\n manifest: AiwgFortemiChunkManifest,\n) => Promise<unknown>\n\nexport interface AiwgChunkedIndexLoadOptions {\n maxCachedParts?: number\n // Required to resolve detail for projected indexes via getRecord(); ignored otherwise.\n detailLoader?: AiwgChunkedIndexDetailLoader\n maxCachedDetails?: number\n // Bounds the filtered/ranked match-set cache used to page a query without\n // re-scanning every part. Counts total cached entries across all queries\n // (LRU-evicted). Defaults to 5000. The cache is keyed on query + filters +\n // weights, so paging the same query (varying only offset/limit/sort/snippets)\n // reuses the scan; see queryChunked.\n maxCachedMatches?: number\n}\n\nexport type AiwgChunkedIndexProgressPhase = 'part' | 'query'\n\nexport interface AiwgChunkedIndexProgress {\n phase: AiwgChunkedIndexProgressPhase\n done: number\n total: number\n href?: string\n}\n\nexport interface AiwgChunkedIndexQueryOptions extends AiwgIndexQueryOptions {\n onProgress?: (progress: AiwgChunkedIndexProgress) => void\n}\n\nexport interface AiwgChunkedIndexQueryResult extends AiwgIndexQueryResult {\n manifestTotal: number\n scannedParts: number\n fetchedParts: number\n complete: boolean\n}\n\nexport interface AiwgReviewDecision {\n item_id: string\n action: AiwgReviewAction\n reason?: string\n updated_at: string\n}\n\nexport interface AiwgReviewDecisionExport {\n schema_version: 'aiwg.fortemi.review-decisions.v1'\n generated_at: string\n source_export_schema_version: string\n decisions: AiwgReviewDecision[]\n}\n\nexport interface AiwgIndexGraphOptions {\n communityFacet?: string\n communityTagPrefix?: string\n relationshipWeights?: Record<string, number>\n includeDanglingRelationships?: boolean\n}\n\nexport type AiwgRelationshipDirection = 'in' | 'out' | 'both'\nexport type AiwgRelationshipSetOperation = 'intersection' | 'union' | 'difference'\n\nexport interface AiwgRelationshipTraversalOptions {\n direction?: AiwgRelationshipDirection\n relationshipType?: string\n relationshipDirection?: AiwgFortemiRelationshipDirection\n limit?: number\n}\n\nexport interface AiwgRelationshipQueryOptions extends AiwgRelationshipTraversalOptions {\n sourceId?: string\n targetId?: string\n type?: string\n}\n\nexport interface AiwgRelationshipEdgeSummary {\n source_id: string\n target_id: string\n type: string\n source_path?: string\n target_path?: string\n direction?: AiwgFortemiRelationshipDirection\n}\n\nexport interface AiwgRelationshipNodeSummary {\n id: string\n type: AiwgFortemiRecordType\n title: string\n}\n\nexport interface AiwgRelationshipTraversalResult {\n nodes: AiwgRelationshipNodeSummary[]\n edges: AiwgRelationshipEdgeSummary[]\n complete: boolean\n scannedParts?: number\n fetchedParts?: number\n}\n\nexport interface AiwgRelationshipSetOptions extends AiwgRelationshipTraversalOptions {\n op: AiwgRelationshipSetOperation\n a: string\n b: string\n}\n\nexport interface AiwgRelationshipSetResult {\n ids: string[]\n op: AiwgRelationshipSetOperation\n}\n\nexport interface AiwgStaticEmbeddingRecord {\n record_id: string\n embedding: number[]\n embedding_id?: string\n granularity?: string\n input_hash: string\n source_path?: string\n}\n\nexport interface AiwgStaticEmbeddingSet {\n schema_version: 'aiwg.fortemi.embedding.set.v1'\n id: string\n model: string\n dimensions: number\n generated_at: string\n granularity: 'title-summary' | 'body' | 'chunked-body' | string\n metric?: 'cosine' | 'dot' | 'euclidean'\n input_hash_algorithm?: string\n embeddings: AiwgStaticEmbeddingRecord[]\n}\n\nexport interface AiwgHeadlessEmbeddingBackend {\n model: string\n dimensions: number\n embed(input: string, record: AiwgFortemiRecord): number[] | Promise<number[]>\n}\n\n// Privacy filtering for generated index/embedding artifacts (SEC6). Generation\n// is default-safe: records classified `private`, or flagged `pii`, are excluded\n// unless the caller explicitly opts them in. This keeps the query-time privacy\n// gate from being the *only* enforcement point — a leaked embedding set or scan\n// part can no longer carry private/PII-derived vectors by default.\nexport interface AiwgPrivacyFilterOptions {\n /** Include records classified `private` (default false). */\n includePrivate?: boolean\n /** Include records flagged `pii` (default false). */\n includePii?: boolean\n}\n\nfunction isPrivacyExcluded(record: AiwgFortemiRecord, options?: AiwgPrivacyFilterOptions): boolean {\n const privacy = record.privacy\n if (!privacy) return false\n if (privacy.classification === 'private' && !options?.includePrivate) return true\n if (privacy.pii && !options?.includePii) return true\n return false\n}\n\n/** Drop `private`/`pii` records unless explicitly opted in (SEC6, default-safe). */\nexport function filterAiwgRecordsByPrivacy(\n records: AiwgFortemiRecord[],\n options?: AiwgPrivacyFilterOptions,\n): AiwgFortemiRecord[] {\n return records.filter((record) => !isPrivacyExcluded(record, options))\n}\n\nexport interface BuildAiwgStaticEmbeddingSetOptions {\n id: string\n backend: AiwgHeadlessEmbeddingBackend\n records?: AiwgFortemiRecord[]\n generatedAt?: string | Date\n granularity?: AiwgStaticEmbeddingSet['granularity']\n metric?: AiwgStaticEmbeddingSet['metric']\n textForRecord?: (record: AiwgFortemiRecord) => string\n /** Privacy filtering (SEC6). Default-safe: excludes `private`/`pii` records. */\n privacy?: AiwgPrivacyFilterOptions\n}\n\nexport interface AiwgStaticSemanticQueryOptions {\n limit?: number\n offset?: number\n minScore?: number\n}\n\nexport interface AiwgStaticSemanticResult {\n item: AiwgFortemiRecord\n score: number\n embedding?: AiwgStaticEmbeddingRecord\n}\n\nexport interface AiwgStaticHybridQueryOptions extends AiwgStaticSemanticQueryOptions, AiwgIndexQueryOptions {\n lexicalWeight?: number\n semanticWeight?: number\n}\n\nexport interface AiwgStaticDuplicatePair {\n left: AiwgFortemiRecord\n right: AiwgFortemiRecord\n score: number\n}\n\nexport interface AiwgReviewInput {\n item_id: string\n action: AiwgReviewAction\n reason?: string\n}\n\nexport interface AiwgIndexControllerSnapshot {\n index: AiwgFortemiIndexExport | null\n chunked: {\n manifest: AiwgFortemiChunkManifest\n cachedParts: number\n maxCachedParts: number\n } | null\n data: AiwgIndexQueryResult | null\n error: Error | null\n reviewDecisions: AiwgReviewDecision[]\n}\n\nexport type AiwgIndexControllerListener = (snapshot: AiwgIndexControllerSnapshot) => void\n\nexport interface AiwgIndexController {\n loadIndex(value: unknown): AiwgFortemiIndexExport\n loadChunkedIndex(\n manifest: unknown,\n loader: AiwgChunkedIndexLoader,\n options?: AiwgChunkedIndexLoadOptions,\n ): AiwgFortemiChunkManifest\n getIndex(): AiwgFortemiIndexExport | null\n getChunkedManifest(): AiwgFortemiChunkManifest | null\n getSnapshot(): AiwgIndexControllerSnapshot\n query(query?: string, options?: AiwgIndexQueryOptions): AiwgIndexQueryResult\n queryChunked(query?: string, options?: AiwgChunkedIndexQueryOptions): Promise<AiwgChunkedIndexQueryResult>\n // Resolve a full record by id. For a projected chunked index, fetches detail via\n // the detailLoader (bounded cache); for a whole-record index/parts, returns the\n // record from loaded data. Rejects if detail is unavailable.\n getRecord(id: string): Promise<AiwgFortemiRecord>\n neighbors(id: string, options?: AiwgRelationshipTraversalOptions): Promise<AiwgRelationshipTraversalResult>\n relationshipQuery(options?: AiwgRelationshipQueryOptions): Promise<AiwgRelationshipTraversalResult>\n relationshipSet(options: AiwgRelationshipSetOptions): Promise<AiwgRelationshipSetResult>\n clearChunkCache(): void\n toCommunityGraph(options?: AiwgIndexGraphOptions): ReturnType<typeof aiwgFortemiIndexToCommunityGraph>\n toCommunityGraphChunked(options?: AiwgIndexGraphOptions & { onProgress?: (progress: AiwgChunkedIndexProgress) => void }): Promise<ReturnType<typeof aiwgFortemiIndexToCommunityGraph>>\n setReviewDecision(input: AiwgReviewInput): AiwgReviewDecision\n clearReviewDecision(itemId: string): void\n createReviewDecisionExport(generatedAt?: string): AiwgReviewDecisionExport\n subscribe(listener: AiwgIndexControllerListener): () => void\n}\n\nconst REQUIRED_RECORD_FIELDS: Array<keyof AiwgFortemiRecord> = [\n 'schema_version',\n 'id',\n 'type',\n 'source',\n 'facets',\n 'tags',\n 'concepts',\n 'relationships',\n 'provenance',\n 'privacy',\n 'updated_at',\n]\n\nconst DEFAULT_QUERY_WEIGHTS: AiwgIndexQueryWeights = {\n title: 4,\n tag: 3,\n concept: 2,\n text: 1,\n facet: 2,\n id: 1,\n source: 0.25,\n}\n\nfunction hasString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0\n}\n\nfunction pushFacet(counts: Record<string, Record<string, number>>, name: string, value: string) {\n // `name`/`value` come from untrusted index records (item.facets). Using a\n // prototype-bearing accumulator would let a key such as `__proto__` (or any\n // inherited name like `toString`) read through the prototype chain and mutate\n // shared built-ins. Null-prototype buckets make every access own-property\n // only, so exotic keys are counted as plain data. See SEC1 / #236.\n let bucket = counts[name]\n if (bucket === undefined) {\n bucket = Object.create(null) as Record<string, number>\n counts[name] = bucket\n }\n bucket[value] = (bucket[value] ?? 0) + 1\n}\n\nfunction hasNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === 'number' && value >= 0\n}\n\nfunction hasPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === 'number' && value > 0\n}\n\nfunction isFacetCounts(value: unknown): value is Record<string, Record<string, number>> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n return Object.values(value).every((counts) => (\n !!counts\n && typeof counts === 'object'\n && !Array.isArray(counts)\n && Object.values(counts).every((count) => hasNonNegativeInteger(count))\n ))\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isOptionalStringArray(value: unknown): boolean {\n return value === undefined || (Array.isArray(value) && value.every((item) => typeof item === 'string'))\n}\n\nfunction isSupportedIndexSchemaVersion(value: unknown): value is AiwgFortemiIndexExportSchemaVersion {\n return value === 'aiwg.fortemi.index.export.v1' || value === 'aiwg.fortemi.index.export.v2'\n}\n\nfunction isSupportedRecordSchemaVersion(value: unknown): value is AiwgFortemiRecordSchemaVersion {\n return value === 'aiwg.fortemi.index.record.v1' || value === 'aiwg.fortemi.index.record.v2'\n}\n\nfunction validateOptionalRichMetadata(item: Partial<AiwgFortemiRecord>, index: number, errors: string[]): void {\n if (item.skos_concepts !== undefined) {\n if (!Array.isArray(item.skos_concepts)) {\n errors.push('items[' + index + '].skos_concepts must be an array when present')\n } else {\n for (const [conceptIndex, concept] of item.skos_concepts.entries()) {\n if (!hasString(concept.id)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].id is required')\n if (!hasString(concept.prefLabel)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].prefLabel is required')\n if (!isOptionalStringArray(concept.altLabels)) errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].altLabels must be a string array')\n if (concept.metadata !== undefined && !isPlainRecord(concept.metadata)) {\n errors.push('items[' + index + '].skos_concepts[' + conceptIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.skos_relations !== undefined) {\n if (!Array.isArray(item.skos_relations)) {\n errors.push('items[' + index + '].skos_relations must be an array when present')\n } else {\n for (const [relationIndex, relation] of item.skos_relations.entries()) {\n if (!hasString(relation.type)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].type is required')\n if (!hasString(relation.source_id)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].source_id is required')\n if (!hasString(relation.target_id)) errors.push('items[' + index + '].skos_relations[' + relationIndex + '].target_id is required')\n if (relation.metadata !== undefined && !isPlainRecord(relation.metadata)) {\n errors.push('items[' + index + '].skos_relations[' + relationIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.provenance_events !== undefined) {\n if (!Array.isArray(item.provenance_events)) {\n errors.push('items[' + index + '].provenance_events must be an array when present')\n } else {\n for (const [eventIndex, event] of item.provenance_events.entries()) {\n if (!hasString(event.activity)) errors.push('items[' + index + '].provenance_events[' + eventIndex + '].activity is required')\n if (event.attributes !== undefined && !isPlainRecord(event.attributes)) {\n errors.push('items[' + index + '].provenance_events[' + eventIndex + '].attributes must be an object')\n }\n }\n }\n }\n if (Array.isArray(item.relationships)) {\n for (const [relationshipIndex, relationship] of item.relationships.entries()) {\n if (relationship.metadata !== undefined && !isPlainRecord(relationship.metadata)) {\n errors.push('items[' + index + '].relationships[' + relationshipIndex + '].metadata must be an object')\n }\n if (\n relationship.direction !== undefined &&\n relationship.direction !== 'upstream' &&\n relationship.direction !== 'downstream' &&\n relationship.direction !== 'related'\n ) {\n errors.push('items[' + index + '].relationships[' + relationshipIndex + '].direction must be upstream, downstream, or related')\n }\n if (relationship.target_path !== undefined && typeof relationship.target_path !== 'string') {\n errors.push('items[' + index + '].relationships[' + relationshipIndex + '].target_path must be a string')\n }\n }\n }\n if (item.search !== undefined) {\n if (!isPlainRecord(item.search)) {\n errors.push('items[' + index + '].search must be an object')\n } else {\n if (!isOptionalStringArray(item.search.triggers)) errors.push('items[' + index + '].search.triggers must be a string array')\n if (!isOptionalStringArray(item.search.aliases)) errors.push('items[' + index + '].search.aliases must be a string array')\n if (!isOptionalStringArray(item.search.tags)) errors.push('items[' + index + '].search.tags must be a string array')\n if (item.search.frontmatter !== undefined && !isPlainRecord(item.search.frontmatter)) {\n errors.push('items[' + index + '].search.frontmatter must be an object')\n }\n }\n }\n if (item.chunks !== undefined) {\n if (!Array.isArray(item.chunks)) {\n errors.push('items[' + index + '].chunks must be an array when present')\n } else {\n for (const [chunkIndex, chunk] of item.chunks.entries()) {\n if (!isPlainRecord(chunk)) errors.push('items[' + index + '].chunks[' + chunkIndex + '] must be an object')\n if (chunk.metadata !== undefined && !isPlainRecord(chunk.metadata)) {\n errors.push('items[' + index + '].chunks[' + chunkIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.embeddings !== undefined) {\n if (!Array.isArray(item.embeddings)) {\n errors.push('items[' + index + '].embeddings must be an array when present')\n } else {\n for (const [embeddingIndex, embedding] of item.embeddings.entries()) {\n if (!isPlainRecord(embedding)) errors.push('items[' + index + '].embeddings[' + embeddingIndex + '] must be an object')\n const vector = embedding.embedding ?? embedding.vector\n if (vector !== undefined && (!Array.isArray(vector) || !vector.every((entry) => typeof entry === 'number'))) {\n errors.push('items[' + index + '].embeddings[' + embeddingIndex + '].embedding/vector must be a number array')\n }\n if (embedding.metadata !== undefined && !isPlainRecord(embedding.metadata)) {\n errors.push('items[' + index + '].embeddings[' + embeddingIndex + '].metadata must be an object')\n }\n }\n }\n }\n if (item.compatibility !== undefined && !isPlainRecord(item.compatibility)) {\n errors.push('items[' + index + '].compatibility must be an object')\n }\n}\n\nfunction isPrivacyClassification(value: unknown): value is AiwgPrivacyClassification {\n return value === 'private' || value === 'sanitized' || value === 'public'\n}\n\nfunction isProvenanceConfidence(value: unknown): value is AiwgProvenanceConfidence {\n return value === 'source' || value === 'candidate' || value === 'reviewed' || value === 'rejected'\n}\n\n// Provenance item shape + enum validation (#239 A4). Each item requires\n// field/source/path and enum-valid confidence/privacy — the schema marks all five\n// required, but the parser previously only checked \"non-empty array\".\nfunction validateProvenanceItems(item: Partial<AiwgFortemiRecord>, index: number, errors: string[]): void {\n if (!Array.isArray(item.provenance)) return\n for (const [provIndex, prov] of item.provenance.entries()) {\n const at = 'items[' + index + '].provenance[' + provIndex + ']'\n if (!isPlainRecord(prov)) {\n errors.push(at + ' must be an object')\n continue\n }\n if (!hasString(prov.field)) errors.push(at + '.field is required')\n if (!hasString(prov.source)) errors.push(at + '.source is required')\n if (!hasString(prov.path)) errors.push(at + '.path is required')\n if (!isProvenanceConfidence(prov.confidence)) errors.push(at + '.confidence must be one of source, candidate, reviewed, rejected')\n if (!isPrivacyClassification(prov.privacy)) errors.push(at + '.privacy must be one of private, sanitized, public')\n }\n}\n\n// v1/v2 field forbiddance (#239 A2): a record.v1 record must not carry fields the\n// schema defines only for record.v2. Keeps the parser as strict as the schema, so\n// a too-loose generator output is rejected rather than silently accepted.\nconst V2_ONLY_RECORD_FIELDS = ['search', 'chunks', 'embeddings', 'skos_concepts', 'skos_relations', 'compatibility'] as const\nconst V2_ONLY_SOURCE_FIELDS = ['origin', 'generated', 'checksum', 'updated_at'] as const\nconst V2_ONLY_RELATIONSHIP_FIELDS = ['target_path', 'direction', 'metadata'] as const\n\nfunction forbidV2FieldsOnV1Record(item: Partial<AiwgFortemiRecord>, index: number, errors: string[]): void {\n if (item.schema_version !== 'aiwg.fortemi.index.record.v1') return\n const at = 'items[' + index + ']'\n const bag = item as Record<string, unknown>\n const v2msg = ' is a v2-only field and must be absent on a record.v1 record'\n for (const field of V2_ONLY_RECORD_FIELDS) {\n if (bag[field] !== undefined) errors.push(at + '.' + field + v2msg)\n }\n if (isPlainRecord(item.source)) {\n const src = item.source as Record<string, unknown>\n for (const field of V2_ONLY_SOURCE_FIELDS) {\n if (src[field] !== undefined) errors.push(at + '.source.' + field + v2msg)\n }\n }\n if (isPlainRecord(item.privacy) && (item.privacy as Record<string, unknown>).locality !== undefined) {\n errors.push(at + '.privacy.locality' + v2msg)\n }\n if (Array.isArray(item.relationships)) {\n for (const [relIndex, rel] of item.relationships.entries()) {\n if (!isPlainRecord(rel)) continue\n const relBag = rel as Record<string, unknown>\n for (const field of V2_ONLY_RELATIONSHIP_FIELDS) {\n if (relBag[field] !== undefined) errors.push(at + '.relationships[' + relIndex + '].' + field + v2msg)\n }\n }\n }\n}\n\nexport function validateAiwgFortemiIndexExport(value: unknown): AiwgIndexValidationResult {\n const errors: string[] = []\n const counts: Partial<Record<string, number>> = {}\n const data = value as Partial<AiwgFortemiIndexExport>\n\n if (!isSupportedIndexSchemaVersion(data?.schema_version)) {\n errors.push('schema_version must be aiwg.fortemi.index.export.v1 or aiwg.fortemi.index.export.v2')\n }\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.source?.repo)) errors.push('source.repo is required')\n if (!hasString(data?.source?.privacy)) errors.push('source.privacy is required')\n else if (!isPrivacyClassification(data?.source?.privacy)) {\n errors.push('source.privacy must be one of private, sanitized, public')\n }\n if (!Array.isArray(data?.items)) errors.push('items must be an array')\n if (data.compatibility !== undefined && !isPlainRecord(data.compatibility)) {\n errors.push('compatibility must be an object')\n }\n // A5: export-level v1/v2 gating — source.graph and compatibility are v2-only.\n if (data?.schema_version === 'aiwg.fortemi.index.export.v1') {\n if (isPlainRecord(data.source) && (data.source as Record<string, unknown>).graph !== undefined) {\n errors.push('source.graph is a v2-only field and must be absent on an export.v1 export')\n }\n if (data.compatibility !== undefined) {\n errors.push('compatibility is a v2-only field and must be absent on an export.v1 export')\n }\n }\n\n const ids = new Set<string>()\n let previousId = ''\n for (const [index, item] of (data.items ?? []).entries()) {\n for (const field of REQUIRED_RECORD_FIELDS) {\n if (!(field in item)) errors.push('items[' + index + '].' + field + ' is required')\n }\n if (!isSupportedRecordSchemaVersion(item.schema_version)) {\n errors.push('items[' + index + '].schema_version must be aiwg.fortemi.index.record.v1 or aiwg.fortemi.index.record.v2')\n }\n if (!hasString(item.id)) errors.push('items[' + index + '].id is required')\n if (hasString(item.id) && ids.has(item.id)) errors.push('duplicate id: ' + item.id)\n if (hasString(item.id)) ids.add(item.id)\n if (previousId && hasString(item.id) && previousId.localeCompare(item.id) > 0) {\n errors.push('items must be sorted by id: ' + previousId + ' before ' + item.id)\n }\n if (hasString(item.id)) previousId = item.id\n if (!hasString(item.type)) errors.push('items[' + index + '].type must be a non-empty string')\n else counts[item.type] = (counts[item.type] ?? 0) + 1\n if (!hasString(item.source?.path)) errors.push('items[' + index + '].source.path is required')\n if (!hasString(item.source?.repo_relative_path)) errors.push('items[' + index + '].source.repo_relative_path is required')\n if (!hasString(item.source?.locator)) errors.push('items[' + index + '].source.locator is required')\n if (typeof item.title !== 'string' && typeof item.search?.title !== 'string' && typeof item.search?.name !== 'string') {\n errors.push('items[' + index + '].title or search.title/search.name is required')\n }\n if (typeof item.text !== 'string' && typeof item.search?.body !== 'string' && typeof item.search?.summary !== 'string') {\n errors.push('items[' + index + '].text or search.body/search.summary is required')\n }\n if (!Array.isArray(item.tags)) errors.push('items[' + index + '].tags must be an array')\n if (!Array.isArray(item.concepts)) errors.push('items[' + index + '].concepts must be an array')\n if (!Array.isArray(item.relationships)) errors.push('items[' + index + '].relationships must be an array')\n if (!Array.isArray(item.provenance) || item.provenance.length === 0) {\n errors.push('items[' + index + '].provenance must be a non-empty array')\n }\n validateOptionalRichMetadata(item, index, errors)\n validateProvenanceItems(item, index, errors)\n forbidV2FieldsOnV1Record(item, index, errors)\n if (!item.privacy || typeof item.privacy.pii !== 'boolean' || !hasString(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy requires classification and pii')\n } else if (!isPrivacyClassification(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy.classification must be one of private, sanitized, public')\n }\n }\n\n return { valid: errors.length === 0, errors, counts }\n}\n\nexport function assertAiwgFortemiIndexExport(value: unknown): AiwgFortemiIndexExport {\n const result = validateAiwgFortemiIndexExport(value)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi index export:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiIndexExport\n}\n\nexport function validateAiwgFortemiChunkManifest(value: unknown): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgFortemiChunkManifest>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.chunk-manifest.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.chunk-manifest.v1')\n }\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.source?.repo)) errors.push('source.repo is required')\n if (!hasString(data?.source?.privacy)) errors.push('source.privacy is required')\n if (data?.source_export_schema_version !== undefined && !isSupportedIndexSchemaVersion(data.source_export_schema_version)) {\n errors.push('source_export_schema_version must be aiwg.fortemi.index.export.v1 or aiwg.fortemi.index.export.v2 when present')\n }\n if (!hasNonNegativeInteger(data?.total)) errors.push('total must be a non-negative integer')\n if (!hasPositiveInteger(data?.part_size)) errors.push('part_size must be a positive integer')\n if (data.facets !== undefined && !isFacetCounts(data.facets)) {\n errors.push('facets must be a nested string-to-number count object')\n }\n if (data.projection !== undefined) {\n if (!Array.isArray(data.projection) || !data.projection.every((field) => typeof field === 'string')) {\n errors.push('projection must be an array of field names')\n } else {\n const present = new Set(data.projection)\n for (const field of AIWG_SCAN_REQUIRED_FIELDS) {\n if (!present.has(field)) errors.push('projection must include scan-required field ' + field)\n }\n }\n }\n if (data.detail !== undefined) {\n if (!hasString(data.detail.href)) errors.push('detail.href is required')\n else if (!data.detail.href.includes('{id}')) errors.push('detail.href must contain the {id} placeholder')\n if (\n data.detail.encoding !== undefined &&\n data.detail.encoding !== 'uri' &&\n data.detail.encoding !== 'base64url'\n ) {\n errors.push(\"detail.encoding must be 'uri' or 'base64url'\")\n }\n }\n if (!Array.isArray(data?.parts)) errors.push('parts must be an array')\n\n let expectedOffset = 0\n const parts = Array.isArray(data?.parts) ? data.parts : []\n for (const [index, part] of parts.entries()) {\n if (!hasString(part.href)) errors.push('parts[' + index + '].href is required')\n if (!hasNonNegativeInteger(part.offset)) errors.push('parts[' + index + '].offset must be a non-negative integer')\n if (!hasNonNegativeInteger(part.count)) errors.push('parts[' + index + '].count must be a non-negative integer')\n if (hasNonNegativeInteger(part.offset) && part.offset !== expectedOffset) {\n errors.push('parts[' + index + '].offset must be ' + expectedOffset)\n }\n if (hasNonNegativeInteger(part.count)) expectedOffset += part.count\n }\n if (hasNonNegativeInteger(data?.total) && expectedOffset !== data.total) {\n errors.push('parts counts must add up to total')\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgFortemiChunkManifest(value: unknown): AiwgFortemiChunkManifest {\n const result = validateAiwgFortemiChunkManifest(value)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi chunk manifest:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiChunkManifest\n}\n\n// Validate projected (slim) scan-part items: scan-required fields only, ids unique + sorted.\nfunction validateProjectedRecords(items: Array<Partial<AiwgFortemiRecord>>): string[] {\n const errors: string[] = []\n const ids = new Set<string>()\n let previousId = ''\n for (const [index, item] of items.entries()) {\n if (!isSupportedRecordSchemaVersion(item.schema_version)) {\n errors.push('items[' + index + '].schema_version must be aiwg.fortemi.index.record.v1 or aiwg.fortemi.index.record.v2')\n }\n if (!hasString(item.id)) errors.push('items[' + index + '].id is required')\n if (hasString(item.id) && ids.has(item.id)) errors.push('duplicate id: ' + item.id)\n if (hasString(item.id)) ids.add(item.id)\n if (previousId && hasString(item.id) && previousId.localeCompare(item.id) > 0) {\n errors.push('items must be sorted by id: ' + previousId + ' before ' + item.id)\n }\n if (hasString(item.id)) previousId = item.id\n if (!hasString(item.type)) errors.push('items[' + index + '].type must be a non-empty string')\n if (typeof item.title !== 'string' && typeof item.search?.title !== 'string' && typeof item.search?.name !== 'string') {\n errors.push('items[' + index + '].title or search.title/search.name is required')\n }\n if (typeof item.text !== 'string' && typeof item.search?.body !== 'string' && typeof item.search?.summary !== 'string') {\n errors.push('items[' + index + '].text or search.body/search.summary is required')\n }\n if (!item.facets || typeof item.facets !== 'object' || Array.isArray(item.facets)) {\n errors.push('items[' + index + '].facets must be an object')\n }\n if (!Array.isArray(item.tags)) errors.push('items[' + index + '].tags must be an array')\n if (!Array.isArray(item.concepts)) errors.push('items[' + index + '].concepts must be an array')\n if (!item.privacy || !hasString(item.privacy.classification)) {\n errors.push('items[' + index + '].privacy.classification is required')\n }\n }\n return errors\n}\n\nexport function validateAiwgFortemiChunkPart(\n value: unknown,\n partRef?: AiwgFortemiChunkPartRef,\n manifest?: AiwgFortemiChunkManifest,\n): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgFortemiChunkPart>\n\n if (data?.schema_version !== 'aiwg.fortemi.index.chunk.v1') {\n errors.push('schema_version must be aiwg.fortemi.index.chunk.v1')\n }\n if (data?.manifest_schema_version !== 'aiwg.fortemi.index.chunk-manifest.v1') {\n errors.push('manifest_schema_version must be aiwg.fortemi.index.chunk-manifest.v1')\n }\n if (!hasNonNegativeInteger(data?.offset)) errors.push('offset must be a non-negative integer')\n if (!Array.isArray(data?.items)) errors.push('items must be an array')\n\n if (partRef && hasNonNegativeInteger(data?.offset) && data.offset !== partRef.offset) {\n errors.push('offset must match manifest part offset ' + partRef.offset)\n }\n if (partRef && Array.isArray(data?.items) && data.items.length !== partRef.count) {\n errors.push('items length must match manifest part count ' + partRef.count)\n }\n\n if (Array.isArray(data?.items)) {\n if (manifest?.projection) {\n errors.push(...validateProjectedRecords(data.items).map((error) => 'items.' + error))\n } else {\n const validation = validateAiwgFortemiIndexExport({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: manifest?.generated_at ?? '1970-01-01T00:00:00.000Z',\n source: manifest?.source ?? { repo: 'chunk', privacy: 'public' },\n items: data.items,\n })\n errors.push(...validation.errors.map((error) => 'items.' + error))\n }\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgFortemiChunkPart(\n value: unknown,\n partRef?: AiwgFortemiChunkPartRef,\n manifest?: AiwgFortemiChunkManifest,\n): AiwgFortemiChunkPart {\n const result = validateAiwgFortemiChunkPart(value, partRef, manifest)\n if (!result.valid) {\n throw new Error('Invalid AIWG Fortemi chunk part:\\n' + result.errors.join('\\n'))\n }\n return value as AiwgFortemiChunkPart\n}\n\n// Schemes an index fetch may target. Blocks file:, ftp:, ws:, etc. so a\n// manifest-controlled href cannot pivot the browser into a non-web protocol.\nconst ALLOWED_AIWG_FETCH_SCHEMES = new Set(['http:', 'https:', 'blob:', 'data:'])\n\nfunction tryParseUrl(value: string): URL | null {\n try {\n return new URL(value)\n } catch {\n return null\n }\n}\n\n// Resolve and vet a manifest-controlled fetch target (SEC2 — SSRF).\n// - With a baseUrl: the href is resolved against it and MUST stay same-origin,\n// so an absolute `href` (which `new URL` would otherwise honor, ignoring the\n// base) cannot redirect the fetch to an attacker origin.\n// - Without a baseUrl: the caller opted into a bare href; only the scheme is\n// vetted (relative hrefs are passed through unchanged).\nexport function resolveAiwgFetchUrl(href: string, baseUrl?: string | URL): string {\n if (baseUrl === undefined) {\n const absolute = tryParseUrl(href)\n if (absolute && !ALLOWED_AIWG_FETCH_SCHEMES.has(absolute.protocol)) {\n throw new Error('Refusing AIWG index fetch with disallowed scheme: ' + absolute.protocol)\n }\n return href\n }\n const base = new URL(baseUrl)\n const resolved = new URL(href, base)\n if (!ALLOWED_AIWG_FETCH_SCHEMES.has(resolved.protocol)) {\n throw new Error('Refusing AIWG index fetch with disallowed scheme: ' + resolved.protocol)\n }\n if (resolved.origin !== base.origin) {\n throw new Error('Refusing cross-origin AIWG index fetch: ' + resolved.origin + ' != ' + base.origin)\n }\n return resolved.toString()\n}\n\nexport function createAiwgFetchChunkLoader(baseUrl?: string | URL): AiwgChunkedIndexLoader {\n return async (part) => {\n const href = resolveAiwgFetchUrl(part.href, baseUrl)\n const response = await fetch(href)\n if (!response.ok) throw new Error('Failed to fetch AIWG index chunk ' + href + ': ' + response.status)\n return response.json()\n }\n}\n\n// Encode a record id into a single, path-safe detail filename segment.\n// - 'base64url' (default): UTF-8 → base64url (no '+', '/', '=', '%'). Safe for ids\n// containing '/' on static hosts that reject %2F (#177).\n// - 'uri': encodeURIComponent (legacy).\nexport function encodeAiwgDetailId(id: string, encoding: AiwgDetailIdEncoding = 'base64url'): string {\n if (encoding === 'uri') return encodeURIComponent(id)\n const bytes = new TextEncoder().encode(id)\n let binary = ''\n for (const byte of bytes) binary += String.fromCharCode(byte)\n // btoa is available in browsers and Node ≥16.\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n// Resolve a manifest detail.href template for a given id, honoring detail.encoding\n// (absent → 'uri' for backward compatibility). The writer and the loader both go\n// through this so emitted filenames and fetched paths always agree.\nexport function aiwgDetailHrefForId(detail: AiwgFortemiChunkDetailRef, id: string): string {\n return detail.href.replace('{id}', encodeAiwgDetailId(id, detail.encoding ?? 'uri'))\n}\n\n// Detail loader for projected indexes: resolves the manifest's detail.href {id}\n// template (encoded per detail.encoding) against baseUrl and fetches the full record.\nexport function createAiwgFetchDetailLoader(baseUrl?: string | URL): AiwgChunkedIndexDetailLoader {\n return async (id, manifest) => {\n if (!manifest.detail?.href) throw new Error('Manifest has no detail.href for record resolution')\n const relative = aiwgDetailHrefForId(manifest.detail, id)\n const href = resolveAiwgFetchUrl(relative, baseUrl)\n const response = await fetch(href)\n if (!response.ok) throw new Error('Failed to fetch AIWG index detail ' + href + ': ' + response.status)\n return response.json()\n }\n}\n\nexport function getAiwgFortemiFacets(items: AiwgFortemiRecord[]): Record<string, Record<string, number>> {\n // Null-prototype accumulator: untrusted facet names must never resolve to an\n // inherited property (see pushFacet / SEC1 / #236). Round-trips to a plain\n // object through JSON serialization, so no downstream consumer is affected.\n const result: Record<string, Record<string, number>> = Object.create(null)\n for (const item of items) {\n pushFacet(result, 'type', item.type)\n pushFacet(result, 'privacy', item.privacy.classification)\n for (const tag of item.tags) pushFacet(result, 'tag', tag)\n for (const concept of item.concepts) pushFacet(result, 'concept', concept)\n for (const [name, values] of Object.entries(item.facets)) {\n for (const value of values) pushFacet(result, name, value)\n }\n }\n return result\n}\n\nfunction recordTitle(item: AiwgFortemiProjectedRecord): string {\n return item.title ?? item.search?.title ?? item.search?.name ?? item.id\n}\n\nfunction recordText(item: AiwgFortemiProjectedRecord): string {\n const base = item.text\n ?? item.search?.body\n ?? item.search?.summary\n ?? item.chunks?.map((chunk) => chunk.text ?? chunk.body ?? chunk.summary ?? '').filter(Boolean).join('\\n')\n ?? ''\n const extractedText = 'binary_sources' in item\n ? item.binary_sources?.map((source) => source.extracted_text).filter(Boolean).join('\\n') ?? ''\n : ''\n return [base, extractedText].filter(Boolean).join('\\n')\n}\n\nfunction defaultEmbeddingInput(record: AiwgFortemiRecord, granularity: AiwgStaticEmbeddingSet['granularity']): string {\n const title = recordTitle(record)\n const text = recordText(record)\n if (granularity === 'title-summary') {\n const extractedText = record.binary_sources?.map((source) => source.extracted_text).filter(Boolean).join('\\n') ?? ''\n return [title, record.search?.summary ?? '', extractedText].filter(Boolean).join('\\n')\n }\n return [title, text].filter(Boolean).join('\\n')\n}\n\nfunction generatedAtString(value: string | Date | undefined): string {\n if (value instanceof Date) return value.toISOString()\n return value ?? new Date().toISOString()\n}\n\nexport async function buildAiwgStaticEmbeddingSet(\n index: AiwgFortemiIndexExport,\n options: BuildAiwgStaticEmbeddingSetOptions,\n): Promise<AiwgStaticEmbeddingSet> {\n assertAiwgFortemiIndexExport(index)\n const granularity = options.granularity ?? 'body'\n // SEC6: default-safe privacy filter over the source records.\n const records = filterAiwgRecordsByPrivacy(options.records ?? index.items, options.privacy)\n const embeddings: AiwgStaticEmbeddingRecord[] = []\n\n for (const record of records) {\n const input = options.textForRecord?.(record) ?? defaultEmbeddingInput(record, granularity)\n const embedding = await options.backend.embed(input, record)\n if (embedding.length !== options.backend.dimensions) {\n throw new Error(`Embedding for ${record.id} has ${embedding.length} dimensions; expected ${options.backend.dimensions}`)\n }\n embeddings.push({\n record_id: record.id,\n embedding,\n granularity,\n input_hash: computeHash(new TextEncoder().encode(input)),\n source_path: record.source.path,\n })\n }\n\n const embeddingSet: AiwgStaticEmbeddingSet = {\n schema_version: 'aiwg.fortemi.embedding.set.v1',\n id: options.id,\n model: options.backend.model,\n dimensions: options.backend.dimensions,\n generated_at: generatedAtString(options.generatedAt),\n granularity,\n ...(options.metric ? { metric: options.metric } : {}),\n input_hash_algorithm: 'sha256',\n embeddings,\n }\n assertAiwgStaticEmbeddingSet(embeddingSet)\n return embeddingSet\n}\n\nfunction recordSearchValues(item: AiwgFortemiProjectedRecord): string[] {\n const search = item.search\n const values = [\n item.id,\n recordTitle(item),\n recordText(item),\n search?.title,\n search?.name,\n search?.summary,\n search?.body,\n search?.capability,\n search?.phase,\n search?.type,\n ...(search?.triggers ?? []),\n ...(search?.aliases ?? []),\n ...(search?.tags ?? []),\n ...(item.chunks ?? []).flatMap((chunk) => [chunk.text, chunk.body, chunk.summary, chunk.source_path]),\n ]\n if (search?.frontmatter) {\n for (const value of Object.values(search.frontmatter)) {\n if (typeof value === 'string') values.push(value)\n else if (Array.isArray(value)) values.push(...value.filter((entry): entry is string => typeof entry === 'string'))\n }\n }\n return values.filter((value): value is string => typeof value === 'string' && value.length > 0)\n}\n\nexport interface AiwgChunkedIndexBuildOptions {\n partSize?: number\n // When set, scan parts carry only these fields; full records go to `details`.\n projection?: Array<keyof AiwgFortemiRecord>\n // Detail href template (with {id}); defaults to \"detail/{id}.json\" when projecting.\n detailHref?: string\n // id→filename encoding for detail files; defaults to 'base64url' (path-safe,\n // works for ids containing '/'; see #177).\n idEncoding?: AiwgDetailIdEncoding\n generatedAt?: string\n /** Privacy filtering (SEC6). Default-safe: excludes `private`/`pii` records. */\n privacy?: AiwgPrivacyFilterOptions\n}\n\nexport interface AiwgChunkedIndexBuildResult {\n manifest: AiwgFortemiChunkManifest\n parts: Array<{ href: string; part: AiwgFortemiChunkPart }>\n // Empty unless projecting. Each entry carries the full record plus the resolved,\n // encoding-correct `href` to host it at — write the record to that path so the\n // detail loader (which uses the same encoding) can fetch it back.\n details: Array<{ id: string; href: string; record: AiwgFortemiRecord }>\n}\n\n// Pure builder (no I/O): project an index export into the chunked manifest + parts\n// (+ detail records when projecting). The caller writes the returned objects to disk.\n// Manifest facets are computed from the full records, so global counts are exact even\n// when scan parts are slim.\nexport function buildAiwgChunkedIndex(\n index: AiwgFortemiIndexExport,\n options: AiwgChunkedIndexBuildOptions = {},\n): AiwgChunkedIndexBuildResult {\n const partSize = hasPositiveInteger(options.partSize) ? options.partSize : 500\n const projection = options.projection\n const idEncoding = options.idEncoding ?? 'base64url'\n const detailHref = options.detailHref ?? 'detail/{id}.json'\n // SEC6: default-safe privacy filter — `private`/`pii` records never enter the\n // generated scan parts, detail files, or manifest facet counts.\n const items = filterAiwgRecordsByPrivacy(index.items, options.privacy)\n const pad = (value: number): string => String(value).padStart(4, '0')\n const project = (record: AiwgFortemiRecord): AiwgFortemiRecord => {\n if (!projection) return record\n const slim: Record<string, unknown> = {}\n for (const field of projection) slim[field] = record[field]\n return slim as unknown as AiwgFortemiRecord\n }\n\n const parts: Array<{ href: string; part: AiwgFortemiChunkPart }> = []\n const partRefs: AiwgFortemiChunkPartRef[] = []\n for (let offset = 0, partIndex = 0; offset < items.length; offset += partSize, partIndex += 1) {\n const slice = items.slice(offset, offset + partSize)\n const href = 'part-' + pad(partIndex) + '.json'\n parts.push({\n href,\n part: {\n schema_version: 'aiwg.fortemi.index.chunk.v1',\n manifest_schema_version: 'aiwg.fortemi.index.chunk-manifest.v1',\n offset,\n items: slice.map(project),\n },\n })\n partRefs.push({ href, offset, count: slice.length })\n }\n\n const manifest: AiwgFortemiChunkManifest = {\n schema_version: 'aiwg.fortemi.index.chunk-manifest.v1',\n generated_at: options.generatedAt ?? index.generated_at,\n source: index.source,\n source_export_schema_version: index.schema_version,\n total: items.length,\n part_size: partSize,\n facets: getAiwgFortemiFacets(items),\n parts: partRefs,\n ...(projection ? { projection, detail: { href: detailHref, encoding: idEncoding } } : {}),\n }\n\n return {\n manifest,\n parts,\n details: projection\n ? items.map((record) => ({\n id: record.id,\n href: aiwgDetailHrefForId({ href: detailHref, encoding: idEncoding }, record.id),\n record,\n }))\n : [],\n }\n}\n\nfunction includesAll(actual: string[], expected: string[] | undefined): boolean {\n if (!expected || expected.length === 0) return true\n const actualSet = new Set(actual)\n return expected.every((value) => actualSet.has(value))\n}\n\nfunction matchesFacetFilters(item: AiwgFortemiRecord, filters: Record<string, string[]> | undefined): boolean {\n if (!filters) return true\n return Object.entries(filters).every(([name, expected]) => includesAll(item.facets[name] ?? [], expected))\n}\n\nfunction queryMatches(item: AiwgFortemiRecord, q: string): AiwgIndexQueryMatch[] {\n if (!q) return []\n const matches: AiwgIndexQueryMatch[] = []\n const title = recordTitle(item)\n const text = recordText(item)\n if (title.toLowerCase().includes(q)) matches.push({ field: 'title', value: title })\n if (text.toLowerCase().includes(q)) matches.push({ field: 'text', value: text })\n for (const tag of item.tags) {\n if (tag.toLowerCase().includes(q)) matches.push({ field: 'tag', value: tag })\n }\n for (const concept of item.concepts) {\n if (concept.toLowerCase().includes(q)) matches.push({ field: 'concept', value: concept })\n }\n for (const value of recordSearchValues(item)) {\n if (value !== title && value !== text && value.toLowerCase().includes(q)) {\n matches.push({ field: 'text', value, score: DEFAULT_QUERY_WEIGHTS.text })\n }\n }\n return matches\n}\n\nconst DISCOVERY_STOPWORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'are',\n 'as',\n 'for',\n 'from',\n 'how',\n 'i',\n 'in',\n 'is',\n 'me',\n 'of',\n 'on',\n 'or',\n 'please',\n 'the',\n 'to',\n 'use',\n 'with',\n])\n\nfunction normalizeDiscoveryText(value: string): string {\n return value.toLowerCase().replace(/[_/]+/g, ' ').replace(/[^a-z0-9.-]+/g, ' ').trim()\n}\n\nfunction canonicalDiscoveryName(value: string): string {\n return normalizeDiscoveryText(value).replace(/[\\s.-]+/g, '')\n}\n\nfunction discoveryTokens(value: string): string[] {\n return normalizeDiscoveryText(value)\n .split(/\\s+/)\n .filter((token) => token.length > 1 && !DISCOVERY_STOPWORDS.has(token))\n}\n\nfunction facetValues(item: AiwgFortemiRecord, names: string[]): string[] {\n return names.flatMap((name) => item.facets[name] ?? [])\n}\n\nfunction addDiscoveryMatch(matches: AiwgIndexQueryMatch[], match: AiwgIndexQueryMatch) {\n if (!matches.some((existing) => existing.field === match.field && existing.value === match.value && existing.reason === match.reason)) {\n matches.push(match)\n }\n}\n\nfunction tokenOverlapScore(tokens: string[], value: string): number {\n if (tokens.length === 0 || !value) return 0\n const normalized = normalizeDiscoveryText(value)\n const hits = tokens.filter((token) => normalized.includes(token)).length\n return hits / tokens.length\n}\n\nfunction discoveryMatches(item: AiwgFortemiRecord, query: string): AiwgIndexQueryMatch[] {\n if (!query) return []\n const matches: AiwgIndexQueryMatch[] = []\n const tokens = discoveryTokens(query)\n const canonicalQuery = canonicalDiscoveryName(query)\n const idParts = item.id.split(/[:/]/)\n const names = [\n item.id,\n recordTitle(item),\n item.search?.name,\n item.search?.title,\n ...(item.search?.aliases ?? []),\n ...idParts,\n ...facetValues(item, ['name', 'canonical_name', 'command', 'skill', 'agent', 'rule']),\n ].filter((value): value is string => hasString(value))\n const triggers = [\n ...facetValues(item, ['trigger', 'triggers', 'trigger_phrase', 'trigger_phrases']),\n ...(item.search?.triggers ?? []),\n ]\n const capabilities = [\n ...facetValues(item, ['capability', 'capabilities', 'summary', 'description']),\n item.search?.capability,\n item.search?.summary,\n item.search?.phase,\n item.search?.type,\n ...(item.search?.tags ?? []),\n ...item.concepts,\n ...item.tags,\n ].filter((value): value is string => hasString(value))\n const sourceValues = [item.source?.path, item.source?.repo_relative_path, item.source?.locator].filter((value): value is string => hasString(value))\n\n for (const name of names) {\n const canonicalName = canonicalDiscoveryName(name)\n if (!canonicalName) continue\n if (canonicalName === canonicalQuery) {\n addDiscoveryMatch(matches, { field: 'id', value: name, score: 80, reason: 'exact canonical name' })\n } else if (canonicalName.includes(canonicalQuery) || canonicalQuery.includes(canonicalName)) {\n addDiscoveryMatch(matches, { field: 'id', value: name, score: 48, reason: 'near canonical name' })\n }\n }\n\n const title = recordTitle(item)\n const titleOverlap = tokenOverlapScore(tokens, title)\n if (titleOverlap > 0) addDiscoveryMatch(matches, { field: 'title', value: title, score: 18 * titleOverlap, reason: 'title token overlap' })\n\n for (const trigger of triggers) {\n const overlap = tokenOverlapScore(tokens, trigger)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'facet', value: trigger, score: 34 * overlap, reason: 'trigger phrase' })\n }\n\n for (const capability of capabilities) {\n const overlap = tokenOverlapScore(tokens, capability)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'concept', value: capability, score: 22 * overlap, reason: 'capability overlap' })\n }\n\n const text = recordText(item)\n const textOverlap = tokenOverlapScore(tokens, text)\n if (textOverlap > 0) addDiscoveryMatch(matches, { field: 'text', value: text, score: 8 * textOverlap, reason: 'body token overlap' })\n\n for (const source of sourceValues) {\n const overlap = tokenOverlapScore(tokens, source)\n if (overlap > 0) addDiscoveryMatch(matches, { field: 'source', value: source, score: 2 * overlap, reason: 'path overlap' })\n }\n\n return matches\n}\n\nfunction rankMatches(matches: AiwgIndexQueryMatch[], weights: AiwgIndexQueryWeights): number {\n return matches.reduce((total, match) => total + (match.score ?? weights[match.field]), 0)\n}\n\nfunction clipSnippet(value: string, q: string, maxLength: number): string {\n const normalizedLength = Math.max(20, maxLength)\n if (!value) return ''\n if (!q) return value.length > normalizedLength ? `${value.slice(0, normalizedLength).trimEnd()}...` : value\n\n const lower = value.toLowerCase()\n const index = lower.indexOf(q)\n if (index < 0) return value.length > normalizedLength ? `${value.slice(0, normalizedLength).trimEnd()}...` : value\n\n const context = Math.max(0, Math.floor((normalizedLength - q.length) / 2))\n const start = Math.max(0, index - context)\n const end = Math.min(value.length, start + normalizedLength)\n const prefix = start > 0 ? '...' : ''\n const suffix = end < value.length ? '...' : ''\n return `${prefix}${value.slice(start, end).trim()}${suffix}`\n}\n\nfunction createSnippet(item: AiwgFortemiRecord, matches: AiwgIndexQueryMatch[], q: string, maxLength: number): string {\n const textMatch = matches.find((match) => match.field === 'text')\n const titleMatch = matches.find((match) => match.field === 'title')\n const firstMatch = textMatch ?? titleMatch ?? matches[0]\n return clipSnippet(firstMatch?.value ?? recordText(item), q, maxLength)\n}\n\ninterface AiwgRankedEntry {\n item: AiwgFortemiRecord\n ordinal: number\n rank: number\n matches: AiwgIndexQueryMatch[]\n}\n\nfunction createRankedEntries(\n items: AiwgFortemiRecord[],\n q: string,\n options: AiwgIndexQueryOptions,\n ordinalBase = 0,\n): AiwgRankedEntry[] {\n const weights = { ...DEFAULT_QUERY_WEIGHTS, ...options.weights }\n const profile = options.searchProfile ?? 'default'\n return items.map((item, ordinal) => ({\n item,\n ordinal: ordinalBase + ordinal,\n matches: profile === 'aiwg-discovery' ? discoveryMatches(item, q) : queryMatches(item, q),\n }))\n .filter(({ item, matches }) => {\n if (q && matches.length === 0) return false\n if (options.types && !options.types.includes(item.type)) return false\n if (options.privacy && !options.privacy.includes(item.privacy.classification)) return false\n if (!includesAll(item.tags, options.tags)) return false\n if (!includesAll(item.concepts, options.concepts)) return false\n if (!matchesFacetFilters(item, options.facets)) return false\n if (options.relationshipTargetId && !(item.relationships ?? []).some((rel) => rel.target_id === options.relationshipTargetId)) {\n return false\n }\n return true\n })\n .map(({ item, ordinal, matches }) => ({\n item,\n ordinal,\n rank: rankMatches(matches, weights),\n matches,\n }))\n}\n\nfunction sortRankedEntries(entries: AiwgRankedEntry[], rank?: boolean): AiwgRankedEntry[] {\n return [...entries].sort((left, right) => {\n if (rank) return right.rank - left.rank || left.ordinal - right.ordinal\n return left.ordinal - right.ordinal\n })\n}\n\nfunction createQueryResultFromRankedEntries(\n entries: AiwgRankedEntry[],\n query: string,\n options: AiwgIndexQueryOptions,\n): AiwgIndexQueryResult {\n const ranked = sortRankedEntries(entries, options.rank)\n const offset = options.offset ?? 0\n const limit = options.limit ?? ranked.length\n const page = ranked.slice(offset, offset + limit)\n const result: AiwgIndexQueryResult = {\n items: page.map((entry) => entry.item),\n total: ranked.length,\n facets: getAiwgFortemiFacets(ranked.map((entry) => entry.item)),\n }\n if (options.rank || options.snippets || options.includeMatches) {\n const snippetLength = options.snippetLength ?? 160\n result.rankedItems = page.map((entry) => ({\n item: entry.item,\n rank: entry.rank,\n ...(options.snippets ? { snippet: createSnippet(entry.item, entry.matches, query, snippetLength) } : {}),\n ...(options.includeMatches ? { matches: entry.matches } : {}),\n }))\n }\n return result\n}\n\nexport function queryAiwgFortemiIndex(\n index: AiwgFortemiIndexExport,\n query = '',\n options: AiwgIndexQueryOptions = {},\n): AiwgIndexQueryResult {\n const q = query.trim().toLowerCase()\n const entries = createRankedEntries(index.items, q, options)\n if (entries.length === 0 && q && options.searchProfile === 'aiwg-discovery') {\n const relaxed = discoveryTokens(q).join(' ')\n return createQueryResultFromRankedEntries(createRankedEntries(index.items, relaxed, options), relaxed, options)\n }\n return createQueryResultFromRankedEntries(entries, q, options)\n}\n\nfunction cosineSimilarity(left: number[], right: number[]): number {\n if (left.length !== right.length || left.length === 0) return 0\n let dot = 0\n let leftMag = 0\n let rightMag = 0\n for (let i = 0; i < left.length; i += 1) {\n const l = left[i]\n const r = right[i]\n dot += l * r\n leftMag += l * l\n rightMag += r * r\n }\n if (leftMag === 0 || rightMag === 0) return 0\n return dot / (Math.sqrt(leftMag) * Math.sqrt(rightMag))\n}\n\nexport function validateAiwgStaticEmbeddingSet(value: unknown): AiwgChunkedIndexValidationResult {\n const errors: string[] = []\n const data = value as Partial<AiwgStaticEmbeddingSet>\n if (data?.schema_version !== 'aiwg.fortemi.embedding.set.v1') errors.push('schema_version must be aiwg.fortemi.embedding.set.v1')\n if (!hasString(data?.id)) errors.push('id is required')\n if (!hasString(data?.model)) errors.push('model is required')\n if (!hasPositiveInteger(data?.dimensions)) errors.push('dimensions must be a positive integer')\n if (!hasString(data?.generated_at)) errors.push('generated_at is required')\n if (!hasString(data?.granularity)) errors.push('granularity is required')\n if (!Array.isArray(data?.embeddings)) errors.push('embeddings must be an array')\n for (const [index, embedding] of (data.embeddings ?? []).entries()) {\n if (!hasString(embedding.record_id)) errors.push('embeddings[' + index + '].record_id is required')\n if (!hasString(embedding.input_hash)) errors.push('embeddings[' + index + '].input_hash is required')\n if (!Array.isArray(embedding.embedding)) errors.push('embeddings[' + index + '].embedding must be an array')\n else if (hasPositiveInteger(data?.dimensions) && embedding.embedding.length !== data.dimensions) {\n errors.push('embeddings[' + index + '].embedding length must match dimensions')\n } else if (!embedding.embedding.every((number) => typeof number === 'number' && Number.isFinite(number))) {\n errors.push('embeddings[' + index + '].embedding must contain finite numbers')\n }\n }\n return { valid: errors.length === 0, errors }\n}\n\nexport function assertAiwgStaticEmbeddingSet(value: unknown): AiwgStaticEmbeddingSet {\n const result = validateAiwgStaticEmbeddingSet(value)\n if (!result.valid) throw new Error('Invalid AIWG Fortemi embedding set:\\n' + result.errors.join('\\n'))\n return value as AiwgStaticEmbeddingSet\n}\n\nexport function queryAiwgSemanticIndex(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n queryEmbedding: number[],\n options: AiwgStaticSemanticQueryOptions = {},\n): AiwgStaticSemanticResult[] {\n assertAiwgStaticEmbeddingSet(embeddingSet)\n if (queryEmbedding.length !== embeddingSet.dimensions) throw new Error('query embedding length must match embedding set dimensions')\n const byId = new Map(index.items.map((item) => [item.id, item]))\n const offset = options.offset ?? 0\n const limit = options.limit ?? 20\n return embeddingSet.embeddings\n .map((embedding): AiwgStaticSemanticResult | null => {\n const item = byId.get(embedding.record_id)\n if (!item) return null\n return { item, embedding, score: cosineSimilarity(queryEmbedding, embedding.embedding) }\n })\n .filter((result): result is AiwgStaticSemanticResult => result !== null && result.score >= (options.minScore ?? -1))\n .sort((left, right) => right.score - left.score || left.item.id.localeCompare(right.item.id))\n .slice(offset, offset + limit)\n}\n\nexport function queryAiwgHybridIndex(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n query: string,\n queryEmbedding: number[],\n options: AiwgStaticHybridQueryOptions = {},\n): AiwgStaticSemanticResult[] {\n const lexical = queryAiwgFortemiIndex(index, query, { ...options, rank: true })\n const semantic = queryAiwgSemanticIndex(index, embeddingSet, queryEmbedding, { limit: index.items.length })\n const lexicalWeight = options.lexicalWeight ?? 0.5\n const semanticWeight = options.semanticWeight ?? 0.5\n const lexicalScores = new Map(lexical.rankedItems?.map((entry) => [entry.item.id, entry.rank]) ?? [])\n const maxLexical = Math.max(1, ...lexicalScores.values())\n const embeddingById = new Map(semantic.flatMap((entry) => entry.embedding ? [[entry.item.id, entry.embedding] as const] : []))\n const semanticScores = new Map(semantic.map((entry) => [entry.item.id, entry.score]))\n const ids = new Set([...lexicalScores.keys(), ...semanticScores.keys()])\n const offset = options.offset ?? 0\n const limit = options.limit ?? 20\n return [...ids]\n .map((id) => {\n const item = index.items.find((candidate) => candidate.id === id)\n const embedding = embeddingById.get(id)\n if (!item) return null\n return {\n item,\n ...(embedding ? { embedding } : {}),\n score: ((lexicalScores.get(id) ?? 0) / maxLexical) * lexicalWeight + (semanticScores.get(id) ?? 0) * semanticWeight,\n }\n })\n .filter((result): result is AiwgStaticSemanticResult => result !== null && result.score >= (options.minScore ?? -1))\n .sort((left, right) => right.score - left.score || left.item.id.localeCompare(right.item.id))\n .slice(offset, offset + limit)\n}\n\n// Default cap for the pairwise duplicate scan. The scan is O(n²) in the number\n// of embeddings, so an unbounded attacker-supplied set is a CPU DoS (SEC5). At\n// the default of 5000 the worst case is ~12.5M cosine comparisons; callers with\n// a trusted, larger set can raise the cap explicitly.\nexport const DEFAULT_AIWG_DUPLICATE_SCAN_MAX_EMBEDDINGS = 5000\n\nexport function findAiwgStaticDuplicatePairs(\n index: AiwgFortemiIndexExport,\n embeddingSet: AiwgStaticEmbeddingSet,\n threshold = 0.9,\n options?: { maxEmbeddings?: number },\n): AiwgStaticDuplicatePair[] {\n assertAiwgStaticEmbeddingSet(embeddingSet)\n const maxEmbeddings = options?.maxEmbeddings ?? DEFAULT_AIWG_DUPLICATE_SCAN_MAX_EMBEDDINGS\n if (embeddingSet.embeddings.length > maxEmbeddings) {\n throw new Error(\n 'Embedding set too large for duplicate scan: ' + embeddingSet.embeddings.length +\n ' > ' + maxEmbeddings + ' (raise options.maxEmbeddings to override for trusted input)',\n )\n }\n const byId = new Map(index.items.map((item) => [item.id, item]))\n const pairs: AiwgStaticDuplicatePair[] = []\n for (let leftIndex = 0; leftIndex < embeddingSet.embeddings.length; leftIndex += 1) {\n for (let rightIndex = leftIndex + 1; rightIndex < embeddingSet.embeddings.length; rightIndex += 1) {\n const leftEmbedding = embeddingSet.embeddings[leftIndex]\n const rightEmbedding = embeddingSet.embeddings[rightIndex]\n const left = byId.get(leftEmbedding.record_id)\n const right = byId.get(rightEmbedding.record_id)\n if (!left || !right) continue\n const score = cosineSimilarity(leftEmbedding.embedding, rightEmbedding.embedding)\n if (score >= threshold) pairs.push({ left, right, score })\n }\n }\n return pairs.sort((left, right) => right.score - left.score || left.left.id.localeCompare(right.left.id))\n}\n\ninterface AiwgChunkedIndexRuntime {\n manifest: AiwgFortemiChunkManifest\n loader: AiwgChunkedIndexLoader\n maxCachedParts: number\n partCache: Map<string, AiwgFortemiChunkPart>\n detailLoader?: AiwgChunkedIndexDetailLoader\n maxCachedDetails: number\n detailCache: Map<string, AiwgFortemiRecord>\n maxCachedMatches: number\n // query+filter+weights key -> the full filtered/ranked entry set for that\n // query (offset/limit/sort/snippets independent). LRU-ordered; bounded by\n // maxCachedMatches (total entries). Lets pagination reuse a single scan.\n matchCache: Map<string, AiwgRankedEntry[]>\n}\n\nfunction chunkPartCacheKey(part: AiwgFortemiChunkPartRef): string {\n return `${part.offset}:${part.href}`\n}\n\nfunction clampMaxCachedParts(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 3\n return value\n}\n\nfunction clampMaxCachedDetails(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 32\n return value\n}\n\nfunction clampMaxCachedMatches(value: number | undefined): number {\n if (!hasPositiveInteger(value)) return 5000\n return value\n}\n\n// Stable key over the inputs that determine the filtered/ranked entry SET and\n// each entry's rank value — but not offset/limit/sort/snippets, which only shape\n// the page projected from a cached set. Caller-stable option objects (same field\n// order each page) hit the cache; a reordered object simply misses (still correct).\nfunction matchSetCacheKey(q: string, options: AiwgIndexQueryOptions): string {\n return JSON.stringify({\n q,\n types: options.types ?? null,\n facets: options.facets ?? null,\n tags: options.tags ?? null,\n concepts: options.concepts ?? null,\n privacy: options.privacy ?? null,\n rel: options.relationshipTargetId ?? null,\n weights: { ...DEFAULT_QUERY_WEIGHTS, ...options.weights },\n })\n}\n\nfunction cacheMatchEntries(runtime: AiwgChunkedIndexRuntime, key: string, entries: AiwgRankedEntry[]): void {\n runtime.matchCache.delete(key)\n runtime.matchCache.set(key, entries)\n let total = 0\n for (const set of runtime.matchCache.values()) total += set.length\n // Evict oldest sets until within budget, but always keep the just-inserted set\n // so paging a large result still benefits from the single scan.\n while (total > runtime.maxCachedMatches && runtime.matchCache.size > 1) {\n const oldest = runtime.matchCache.keys().next().value\n if (oldest === undefined || oldest === key) break\n total -= runtime.matchCache.get(oldest)?.length ?? 0\n runtime.matchCache.delete(oldest)\n }\n}\n\nfunction isDirectChunkBrowse(query: string, options: AiwgIndexQueryOptions): boolean {\n return query.trim() === ''\n && !options.rank\n && !options.snippets\n && !options.includeMatches\n && !options.types\n && !options.facets\n && !options.tags\n && !options.concepts\n && !options.privacy\n && !options.relationshipTargetId\n}\n\nfunction getPartsForRange(\n manifest: AiwgFortemiChunkManifest,\n offset: number,\n limit: number,\n): AiwgFortemiChunkPartRef[] {\n const end = offset + limit\n return manifest.parts.filter((part) => part.count > 0 && part.offset < end && part.offset + part.count > offset)\n}\n\nasync function loadChunkPart(\n runtime: AiwgChunkedIndexRuntime,\n part: AiwgFortemiChunkPartRef,\n): Promise<{ part: AiwgFortemiChunkPart; fetched: boolean }> {\n const key = chunkPartCacheKey(part)\n const cached = runtime.partCache.get(key)\n if (cached) {\n runtime.partCache.delete(key)\n runtime.partCache.set(key, cached)\n return { part: cached, fetched: false }\n }\n\n const parsed = assertAiwgFortemiChunkPart(await runtime.loader(part, runtime.manifest), part, runtime.manifest)\n runtime.partCache.set(key, parsed)\n while (runtime.partCache.size > runtime.maxCachedParts) {\n const oldest = runtime.partCache.keys().next().value\n if (oldest === undefined) break\n runtime.partCache.delete(oldest)\n }\n return { part: parsed, fetched: true }\n}\n\nasync function getChunkRecord(runtime: AiwgChunkedIndexRuntime, id: string): Promise<AiwgFortemiRecord> {\n const cached = runtime.detailCache.get(id)\n if (cached) {\n runtime.detailCache.delete(id)\n runtime.detailCache.set(id, cached)\n return cached\n }\n // Whole-record parts already in cache: serve without a detail fetch.\n if (!runtime.manifest.projection) {\n for (const part of runtime.partCache.values()) {\n const found = part.items.find((item) => item.id === id)\n if (found) return found\n }\n }\n if (!runtime.detailLoader) {\n throw new Error('No detailLoader configured to resolve record ' + id)\n }\n const raw = await runtime.detailLoader(id, runtime.manifest)\n const record = assertAiwgFortemiIndexExport({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: runtime.manifest.generated_at,\n source: runtime.manifest.source,\n items: [raw],\n }).items[0]\n if (record.id !== id) {\n throw new Error('Detail record id mismatch: expected ' + id + ', got ' + record.id)\n }\n runtime.detailCache.set(id, record)\n while (runtime.detailCache.size > runtime.maxCachedDetails) {\n const oldest = runtime.detailCache.keys().next().value\n if (oldest === undefined) break\n runtime.detailCache.delete(oldest)\n }\n return record\n}\n\nfunction relationshipTypeFilter(options?: AiwgRelationshipQueryOptions): string | undefined {\n return options?.relationshipType ?? options?.type\n}\n\nfunction edgeFromRelationship(sourceId: string, relationship: AiwgFortemiRelationship): AiwgRelationshipEdgeSummary {\n return {\n source_id: sourceId,\n target_id: relationship.target_id,\n type: relationship.type,\n ...(relationship.source_path ? { source_path: relationship.source_path } : {}),\n ...(relationship.target_path ? { target_path: relationship.target_path } : {}),\n ...(relationship.direction ? { direction: relationship.direction } : {}),\n }\n}\n\nfunction relationshipMatches(edge: AiwgRelationshipEdgeSummary, options: AiwgRelationshipQueryOptions = {}): boolean {\n const type = relationshipTypeFilter(options)\n const direction = options.direction ?? 'both'\n if (type && edge.type !== type) return false\n if (options.relationshipDirection && edge.direction !== options.relationshipDirection) return false\n if (options.sourceId && edge.source_id !== options.sourceId) return false\n if (options.targetId && edge.target_id !== options.targetId) return false\n if (direction === 'out' && options.targetId && edge.target_id !== options.targetId) return false\n if (direction === 'in' && options.sourceId && edge.source_id !== options.sourceId) return false\n return true\n}\n\nfunction nodeSummary(item: AiwgFortemiProjectedRecord): AiwgRelationshipNodeSummary {\n return { id: item.id, type: item.type, title: recordTitle(item) }\n}\n\nfunction addNode(nodes: Map<string, AiwgRelationshipNodeSummary>, item: AiwgFortemiProjectedRecord | undefined) {\n if (item) nodes.set(item.id, nodeSummary(item))\n}\n\nfunction relationshipResultFromRecords(\n records: AiwgFortemiProjectedRecord[],\n options: AiwgRelationshipQueryOptions = {},\n): AiwgRelationshipTraversalResult {\n const byId = new Map(records.map((record) => [record.id, record]))\n const edges: AiwgRelationshipEdgeSummary[] = []\n for (const record of records) {\n for (const relationship of record.relationships ?? []) {\n const edge = edgeFromRelationship(record.id, relationship)\n if (!relationshipMatches(edge, options)) continue\n edges.push(edge)\n }\n }\n const limitedEdges = (options.limit ? edges.slice(0, options.limit) : edges).sort((left, right) => (\n left.source_id.localeCompare(right.source_id)\n || left.target_id.localeCompare(right.target_id)\n || left.type.localeCompare(right.type)\n ))\n const nodes = new Map<string, AiwgRelationshipNodeSummary>()\n for (const edge of limitedEdges) {\n addNode(nodes, byId.get(edge.source_id))\n addNode(nodes, byId.get(edge.target_id))\n }\n return {\n nodes: [...nodes.values()].sort((left, right) => left.id.localeCompare(right.id)),\n edges: limitedEdges,\n complete: true,\n }\n}\n\nfunction neighborQueryOptions(id: string, options: AiwgRelationshipTraversalOptions = {}): AiwgRelationshipQueryOptions {\n const direction = options.direction ?? 'both'\n return {\n ...options,\n ...(direction === 'out' ? { sourceId: id } : {}),\n ...(direction === 'in' ? { targetId: id } : {}),\n }\n}\n\nfunction filterNeighborResult(id: string, result: AiwgRelationshipTraversalResult, options: AiwgRelationshipTraversalOptions = {}): AiwgRelationshipTraversalResult {\n const direction = options.direction ?? 'both'\n const edges = result.edges.filter((edge) => {\n if (direction === 'out') return edge.source_id === id\n if (direction === 'in') return edge.target_id === id\n return edge.source_id === id || edge.target_id === id\n })\n const ids = new Set<string>()\n for (const edge of edges) {\n ids.add(edge.source_id)\n ids.add(edge.target_id)\n }\n return {\n ...result,\n edges,\n nodes: result.nodes.filter((node) => ids.has(node.id)),\n }\n}\n\nasync function recordsFromChunkedRuntime(\n runtime: AiwgChunkedIndexRuntime,\n onProgress?: (progress: AiwgChunkedIndexProgress) => void,\n): Promise<{ records: AiwgFortemiRecord[]; scannedParts: number; fetchedParts: number }> {\n let scannedParts = 0\n let fetchedParts = 0\n const records: AiwgFortemiRecord[] = []\n for (const partRef of runtime.manifest.parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n onProgress?.({ phase: 'part', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n for (const item of loaded.part.items) {\n records.push(item.relationships ? item : await getChunkRecord(runtime, item.id))\n }\n }\n return { records, scannedParts, fetchedParts }\n}\n\nasync function relationshipResultFromChunkedRuntime(\n runtime: AiwgChunkedIndexRuntime,\n options: AiwgRelationshipQueryOptions = {},\n): Promise<AiwgRelationshipTraversalResult> {\n const loaded = await recordsFromChunkedRuntime(runtime)\n return {\n ...relationshipResultFromRecords(loaded.records, options),\n scannedParts: loaded.scannedParts,\n fetchedParts: loaded.fetchedParts,\n }\n}\n\nasync function queryChunkedAiwgFortemiIndex(\n runtime: AiwgChunkedIndexRuntime,\n query = '',\n options: AiwgChunkedIndexQueryOptions = {},\n): Promise<AiwgChunkedIndexQueryResult> {\n const q = query.trim().toLowerCase()\n let scannedParts = 0\n let fetchedParts = 0\n\n if (isDirectChunkBrowse(query, options)) {\n const offset = options.offset ?? 0\n const limit = options.limit ?? runtime.manifest.total\n const parts = getPartsForRange(runtime.manifest, offset, limit)\n const items: AiwgFortemiRecord[] = []\n for (const partRef of parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n options.onProgress?.({ phase: 'part', done: scannedParts, total: parts.length, href: partRef.href })\n const start = Math.max(0, offset - partRef.offset)\n const end = Math.min(loaded.part.items.length, offset + limit - partRef.offset)\n items.push(...loaded.part.items.slice(start, end))\n }\n return {\n items,\n total: runtime.manifest.total,\n facets: runtime.manifest.facets ?? {},\n manifestTotal: runtime.manifest.total,\n scannedParts,\n fetchedParts,\n complete: true,\n }\n }\n\n // Reuse the filtered/ranked entry set across pages of the same query: the\n // expensive part scan is offset/limit/sort/snippet independent. A hit projects\n // a new page from cached entries without touching parts (scanned/fetched = 0).\n const matchKey = matchSetCacheKey(q, options)\n const cached = runtime.matchCache.get(matchKey)\n if (cached) {\n runtime.matchCache.delete(matchKey)\n runtime.matchCache.set(matchKey, cached)\n return {\n ...createQueryResultFromRankedEntries(cached, q, options),\n manifestTotal: runtime.manifest.total,\n scannedParts: 0,\n fetchedParts: 0,\n complete: true,\n }\n }\n\n const entries: AiwgRankedEntry[] = []\n for (const partRef of runtime.manifest.parts) {\n const loaded = await loadChunkPart(runtime, partRef)\n if (loaded.fetched) fetchedParts += 1\n scannedParts += 1\n options.onProgress?.({ phase: 'part', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n entries.push(...createRankedEntries(loaded.part.items, q, options, partRef.offset))\n options.onProgress?.({ phase: 'query', done: scannedParts, total: runtime.manifest.parts.length, href: partRef.href })\n }\n cacheMatchEntries(runtime, matchKey, entries)\n\n return {\n ...createQueryResultFromRankedEntries(entries, q, options),\n manifestTotal: runtime.manifest.total,\n scannedParts,\n fetchedParts,\n complete: true,\n }\n}\n\nexport function createAiwgReviewDecisionExport(\n // Only the export schema_version is needed — so this works in chunked mode\n // (where no whole index is loaded) by passing a minimal source. See #178.\n source: Pick<AiwgFortemiIndexExport, 'schema_version'>,\n decisions: AiwgReviewDecision[],\n generatedAt = new Date().toISOString(),\n): AiwgReviewDecisionExport {\n return {\n schema_version: 'aiwg.fortemi.review-decisions.v1',\n generated_at: generatedAt,\n source_export_schema_version: source.schema_version,\n decisions: [...decisions].sort((left, right) => left.item_id.localeCompare(right.item_id)),\n }\n}\n\nexport function createAiwgIndexController(initialIndex?: AiwgFortemiIndexExport): AiwgIndexController {\n let index: AiwgFortemiIndexExport | null = initialIndex ?? null\n let chunked: AiwgChunkedIndexRuntime | null = null\n let data: AiwgIndexQueryResult | null = null\n let error: Error | null = null\n let reviewDecisions: AiwgReviewDecision[] = []\n const listeners = new Set<AiwgIndexControllerListener>()\n\n const snapshot = (): AiwgIndexControllerSnapshot => ({\n index,\n chunked: chunked\n ? {\n manifest: chunked.manifest,\n cachedParts: chunked.partCache.size,\n maxCachedParts: chunked.maxCachedParts,\n }\n : null,\n data,\n error,\n reviewDecisions: [...reviewDecisions],\n })\n const notify = () => {\n const current = snapshot()\n for (const listener of listeners) listener(current)\n }\n const requireIndex = (): AiwgFortemiIndexExport => {\n if (!index) throw new Error('No AIWG index export loaded')\n return index\n }\n\n return {\n loadIndex(value: unknown): AiwgFortemiIndexExport {\n try {\n const parsed = assertAiwgFortemiIndexExport(value)\n index = parsed\n chunked = null\n data = null\n reviewDecisions = []\n error = null\n notify()\n return parsed\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n loadChunkedIndex(\n manifest: unknown,\n loader: AiwgChunkedIndexLoader,\n options: AiwgChunkedIndexLoadOptions = {},\n ): AiwgFortemiChunkManifest {\n try {\n const parsed = assertAiwgFortemiChunkManifest(manifest)\n index = null\n chunked = {\n manifest: parsed,\n loader,\n maxCachedParts: clampMaxCachedParts(options.maxCachedParts),\n partCache: new Map(),\n detailLoader: options.detailLoader,\n maxCachedDetails: clampMaxCachedDetails(options.maxCachedDetails),\n detailCache: new Map(),\n maxCachedMatches: clampMaxCachedMatches(options.maxCachedMatches),\n matchCache: new Map(),\n }\n data = null\n reviewDecisions = []\n error = null\n notify()\n return parsed\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n getIndex(): AiwgFortemiIndexExport | null {\n return index\n },\n getChunkedManifest(): AiwgFortemiChunkManifest | null {\n return chunked?.manifest ?? null\n },\n getSnapshot(): AiwgIndexControllerSnapshot {\n return snapshot()\n },\n query(query = '', options?: AiwgIndexQueryOptions): AiwgIndexQueryResult {\n const result = queryAiwgFortemiIndex(requireIndex(), query, options)\n data = result\n error = null\n notify()\n return result\n },\n async queryChunked(query = '', options?: AiwgChunkedIndexQueryOptions): Promise<AiwgChunkedIndexQueryResult> {\n if (!chunked) throw new Error('No AIWG chunked index manifest loaded')\n try {\n const result = await queryChunkedAiwgFortemiIndex(chunked, query, options)\n data = result\n error = null\n notify()\n return result\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async getRecord(id: string): Promise<AiwgFortemiRecord> {\n if (chunked) {\n try {\n return await getChunkRecord(chunked, id)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n }\n const found = requireIndex().items.find((item) => item.id === id)\n if (!found) throw new Error('Record not found: ' + id)\n return found\n },\n async neighbors(id: string, options?: AiwgRelationshipTraversalOptions): Promise<AiwgRelationshipTraversalResult> {\n try {\n const queryOptions = neighborQueryOptions(id, options)\n const result = chunked\n ? await relationshipResultFromChunkedRuntime(chunked, queryOptions)\n : relationshipResultFromRecords(requireIndex().items, queryOptions)\n return filterNeighborResult(id, result, options)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async relationshipQuery(options?: AiwgRelationshipQueryOptions): Promise<AiwgRelationshipTraversalResult> {\n try {\n return chunked\n ? await relationshipResultFromChunkedRuntime(chunked, options)\n : relationshipResultFromRecords(requireIndex().items, options)\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err))\n notify()\n throw error\n }\n },\n async relationshipSet(options: AiwgRelationshipSetOptions): Promise<AiwgRelationshipSetResult> {\n const [left, right] = await Promise.all([\n this.neighbors(options.a, options),\n this.neighbors(options.b, options),\n ])\n const leftIds = new Set(left.nodes.map((node) => node.id).filter((id) => id !== options.a))\n const rightIds = new Set(right.nodes.map((node) => node.id).filter((id) => id !== options.b))\n let ids: string[]\n if (options.op === 'intersection') ids = [...leftIds].filter((id) => rightIds.has(id))\n else if (options.op === 'difference') ids = [...leftIds].filter((id) => !rightIds.has(id))\n else ids = [...new Set([...leftIds, ...rightIds])]\n return { op: options.op, ids: ids.sort() }\n },\n clearChunkCache(): void {\n chunked?.partCache.clear()\n chunked?.detailCache.clear()\n chunked?.matchCache.clear()\n error = null\n notify()\n },\n toCommunityGraph(options?: AiwgIndexGraphOptions) {\n return aiwgFortemiIndexToCommunityGraph(requireIndex(), options)\n },\n async toCommunityGraphChunked(options?: AiwgIndexGraphOptions & { onProgress?: (progress: AiwgChunkedIndexProgress) => void }) {\n if (!chunked) return aiwgFortemiIndexToCommunityGraph(requireIndex(), options)\n const loaded = await recordsFromChunkedRuntime(chunked, options?.onProgress)\n return aiwgFortemiIndexToCommunityGraph({\n schema_version: 'aiwg.fortemi.index.export.v1',\n generated_at: chunked.manifest.generated_at,\n source: chunked.manifest.source,\n items: loaded.records,\n }, options)\n },\n setReviewDecision(input: AiwgReviewInput): AiwgReviewDecision {\n const decision: AiwgReviewDecision = {\n ...input,\n updated_at: new Date().toISOString(),\n }\n reviewDecisions = [\n ...reviewDecisions.filter((item) => item.item_id !== decision.item_id),\n decision,\n ].sort((left, right) => left.item_id.localeCompare(right.item_id))\n error = null\n notify()\n return decision\n },\n clearReviewDecision(itemId: string): void {\n reviewDecisions = reviewDecisions.filter((item) => item.item_id !== itemId)\n error = null\n notify()\n },\n createReviewDecisionExport(generatedAt?: string): AiwgReviewDecisionExport {\n // The review-decisions export only needs the export schema_version, not the\n // items — so it works in chunked mode by synthesizing a minimal source (#178).\n const source: Pick<AiwgFortemiIndexExport, 'schema_version'> | null =\n index ??\n (chunked\n ? { schema_version: chunked.manifest.source_export_schema_version ?? 'aiwg.fortemi.index.export.v1' }\n : null)\n if (!source) throw new Error('No AIWG index export or chunked manifest loaded')\n return createAiwgReviewDecisionExport(source, reviewDecisions, generatedAt)\n },\n subscribe(listener: AiwgIndexControllerListener): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n\nexport function aiwgFortemiIndexToCommunityGraph(\n index: AiwgFortemiIndexExport,\n options: AiwgIndexGraphOptions = {},\n) {\n const ids = new Set(index.items.map((item) => item.id))\n const relationshipWeights = options.relationshipWeights ?? {}\n const edgeCounts = new Map<string, { source: string; target: string; kind: string; weight: number }>()\n\n for (const item of index.items) {\n for (const relationship of item.relationships) {\n if (!ids.has(relationship.target_id) && !options.includeDanglingRelationships) continue\n const kind = relationship.type\n const baseWeight = relationshipWeights[kind] ?? 1\n const key = `${item.id}\\u0000${relationship.target_id}\\u0000${kind}`\n const existing = edgeCounts.get(key)\n if (existing) existing.weight += baseWeight\n else edgeCounts.set(key, { source: item.id, target: relationship.target_id, kind, weight: baseWeight })\n }\n }\n\n const communities = new Map<string, string[]>()\n for (const item of index.items) {\n const communityIds = communityIdsFor(item, options)\n for (const communityId of communityIds) {\n const nodes = communities.get(communityId) ?? []\n nodes.push(item.id)\n communities.set(communityId, nodes)\n }\n }\n\n return {\n nodes: index.items.map((item) => ({ id: item.id })),\n edges: Array.from(edgeCounts.values()).sort((left, right) => (\n left.source.localeCompare(right.source)\n || left.target.localeCompare(right.target)\n || left.kind.localeCompare(right.kind)\n )),\n communities: Array.from(communities.entries())\n .map(([id, nodes]) => ({ id, nodes: [...new Set(nodes)].sort() }))\n .sort((left, right) => left.id.localeCompare(right.id)),\n }\n}\n\nfunction communityIdsFor(item: AiwgFortemiRecord, options: AiwgIndexGraphOptions): string[] {\n if (options.communityFacet) {\n const values = item.facets[options.communityFacet] ?? []\n if (values.length > 0) return values.map((value) => `${options.communityFacet}:${value}`)\n }\n if (options.communityTagPrefix) {\n const prefix = options.communityTagPrefix\n const tags = item.tags.filter((tag) => tag.startsWith(prefix))\n if (tags.length > 0) return tags\n }\n if (item.concepts.length > 0) return item.concepts.map((concept) => `concept:${concept}`)\n return [`type:${item.type}`]\n}\n"]}
|