fhir-persistence 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/LICENSE +21 -0
  3. package/README.md +225 -0
  4. package/dist/cjs/index.cjs +8869 -0
  5. package/dist/cjs/index.cjs.map +7 -0
  6. package/dist/cjs/index.d.ts +3114 -0
  7. package/dist/cjs/package.json +5 -0
  8. package/dist/esm/index.d.ts +3114 -0
  9. package/dist/esm/index.mjs +8745 -0
  10. package/dist/esm/index.mjs.map +7 -0
  11. package/dist/esm/package.json +5 -0
  12. package/dist/index.d.ts +3114 -0
  13. package/dist/lib/cache/resource-cache.d.ts +137 -0
  14. package/dist/lib/cache/resource-cache.d.ts.map +1 -0
  15. package/dist/lib/cli/reindex.d.ts +55 -0
  16. package/dist/lib/cli/reindex.d.ts.map +1 -0
  17. package/dist/lib/db/adapter.d.ts +79 -0
  18. package/dist/lib/db/adapter.d.ts.map +1 -0
  19. package/dist/lib/db/better-sqlite3-adapter.d.ts +65 -0
  20. package/dist/lib/db/better-sqlite3-adapter.d.ts.map +1 -0
  21. package/dist/lib/db/dialect.d.ts +87 -0
  22. package/dist/lib/db/dialect.d.ts.map +1 -0
  23. package/dist/lib/db/index.d.ts +18 -0
  24. package/dist/lib/db/index.d.ts.map +1 -0
  25. package/dist/lib/db/postgres-adapter.d.ts +84 -0
  26. package/dist/lib/db/postgres-adapter.d.ts.map +1 -0
  27. package/dist/lib/db/postgres-dialect.d.ts +36 -0
  28. package/dist/lib/db/postgres-dialect.d.ts.map +1 -0
  29. package/dist/lib/db/sqlite-adapter.d.ts +41 -0
  30. package/dist/lib/db/sqlite-adapter.d.ts.map +1 -0
  31. package/dist/lib/db/sqlite-dialect.d.ts +34 -0
  32. package/dist/lib/db/sqlite-dialect.d.ts.map +1 -0
  33. package/dist/lib/index.d.ts +65 -0
  34. package/dist/lib/index.d.ts.map +1 -0
  35. package/dist/lib/migration/ig-persistence-manager.d.ts +56 -0
  36. package/dist/lib/migration/ig-persistence-manager.d.ts.map +1 -0
  37. package/dist/lib/migration/migration-generator.d.ts +38 -0
  38. package/dist/lib/migration/migration-generator.d.ts.map +1 -0
  39. package/dist/lib/migration/reindex-scheduler.d.ts +82 -0
  40. package/dist/lib/migration/reindex-scheduler.d.ts.map +1 -0
  41. package/dist/lib/migration/schema-diff.d.ts +44 -0
  42. package/dist/lib/migration/schema-diff.d.ts.map +1 -0
  43. package/dist/lib/migrations/index.d.ts +8 -0
  44. package/dist/lib/migrations/index.d.ts.map +1 -0
  45. package/dist/lib/migrations/migration-runner.d.ts +102 -0
  46. package/dist/lib/migrations/migration-runner.d.ts.map +1 -0
  47. package/dist/lib/observability/search-logger.d.ts +74 -0
  48. package/dist/lib/observability/search-logger.d.ts.map +1 -0
  49. package/dist/lib/platform/platform-ig-definitions.d.ts +51 -0
  50. package/dist/lib/platform/platform-ig-definitions.d.ts.map +1 -0
  51. package/dist/lib/platform/platform-ig-loader.d.ts +30 -0
  52. package/dist/lib/platform/platform-ig-loader.d.ts.map +1 -0
  53. package/dist/lib/providers/definition-provider.d.ts +124 -0
  54. package/dist/lib/providers/definition-provider.d.ts.map +1 -0
  55. package/dist/lib/providers/fhir-definition-provider.d.ts +58 -0
  56. package/dist/lib/providers/fhir-definition-provider.d.ts.map +1 -0
  57. package/dist/lib/providers/fhir-runtime-provider.d.ts +75 -0
  58. package/dist/lib/providers/fhir-runtime-provider.d.ts.map +1 -0
  59. package/dist/lib/providers/in-memory-definition-provider.d.ts +72 -0
  60. package/dist/lib/providers/in-memory-definition-provider.d.ts.map +1 -0
  61. package/dist/lib/providers/index.d.ts +13 -0
  62. package/dist/lib/providers/index.d.ts.map +1 -0
  63. package/dist/lib/providers/property-path-runtime-provider.d.ts +34 -0
  64. package/dist/lib/providers/property-path-runtime-provider.d.ts.map +1 -0
  65. package/dist/lib/providers/runtime-provider.d.ts +84 -0
  66. package/dist/lib/providers/runtime-provider.d.ts.map +1 -0
  67. package/dist/lib/registry/element-cardinality.d.ts +15 -0
  68. package/dist/lib/registry/element-cardinality.d.ts.map +1 -0
  69. package/dist/lib/registry/index.d.ts +10 -0
  70. package/dist/lib/registry/index.d.ts.map +1 -0
  71. package/dist/lib/registry/package-registry-repo.d.ts +106 -0
  72. package/dist/lib/registry/package-registry-repo.d.ts.map +1 -0
  73. package/dist/lib/registry/search-parameter-registry.d.ts +175 -0
  74. package/dist/lib/registry/search-parameter-registry.d.ts.map +1 -0
  75. package/dist/lib/registry/structure-definition-registry.d.ts +93 -0
  76. package/dist/lib/registry/structure-definition-registry.d.ts.map +1 -0
  77. package/dist/lib/repo/errors.d.ts +61 -0
  78. package/dist/lib/repo/errors.d.ts.map +1 -0
  79. package/dist/lib/repo/history-bundle.d.ts +78 -0
  80. package/dist/lib/repo/history-bundle.d.ts.map +1 -0
  81. package/dist/lib/repo/index.d.ts +17 -0
  82. package/dist/lib/repo/index.d.ts.map +1 -0
  83. package/dist/lib/repo/indexing-pipeline.d.ts +108 -0
  84. package/dist/lib/repo/indexing-pipeline.d.ts.map +1 -0
  85. package/dist/lib/repo/lookup-table-writer.d.ts +46 -0
  86. package/dist/lib/repo/lookup-table-writer.d.ts.map +1 -0
  87. package/dist/lib/repo/reference-indexer.d.ts +56 -0
  88. package/dist/lib/repo/reference-indexer.d.ts.map +1 -0
  89. package/dist/lib/repo/row-builder.d.ts +78 -0
  90. package/dist/lib/repo/row-builder.d.ts.map +1 -0
  91. package/dist/lib/repo/row-indexer.d.ts +111 -0
  92. package/dist/lib/repo/row-indexer.d.ts.map +1 -0
  93. package/dist/lib/repo/sql-builder.d.ts +166 -0
  94. package/dist/lib/repo/sql-builder.d.ts.map +1 -0
  95. package/dist/lib/repo/types.d.ts +321 -0
  96. package/dist/lib/repo/types.d.ts.map +1 -0
  97. package/dist/lib/schema/ddl-generator.d.ts +81 -0
  98. package/dist/lib/schema/ddl-generator.d.ts.map +1 -0
  99. package/dist/lib/schema/index.d.ts +8 -0
  100. package/dist/lib/schema/index.d.ts.map +1 -0
  101. package/dist/lib/schema/table-schema-builder.d.ts +66 -0
  102. package/dist/lib/schema/table-schema-builder.d.ts.map +1 -0
  103. package/dist/lib/schema/table-schema.d.ts +236 -0
  104. package/dist/lib/schema/table-schema.d.ts.map +1 -0
  105. package/dist/lib/search/index.d.ts +22 -0
  106. package/dist/lib/search/index.d.ts.map +1 -0
  107. package/dist/lib/search/pagination.d.ts +53 -0
  108. package/dist/lib/search/pagination.d.ts.map +1 -0
  109. package/dist/lib/search/param-parser.d.ts +85 -0
  110. package/dist/lib/search/param-parser.d.ts.map +1 -0
  111. package/dist/lib/search/search-bundle.d.ts +61 -0
  112. package/dist/lib/search/search-bundle.d.ts.map +1 -0
  113. package/dist/lib/search/search-executor.d.ts +58 -0
  114. package/dist/lib/search/search-executor.d.ts.map +1 -0
  115. package/dist/lib/search/search-planner.d.ts +57 -0
  116. package/dist/lib/search/search-planner.d.ts.map +1 -0
  117. package/dist/lib/search/search-sql-builder.d.ts +86 -0
  118. package/dist/lib/search/search-sql-builder.d.ts.map +1 -0
  119. package/dist/lib/search/types.d.ts +219 -0
  120. package/dist/lib/search/types.d.ts.map +1 -0
  121. package/dist/lib/search/where-builder.d.ts +64 -0
  122. package/dist/lib/search/where-builder.d.ts.map +1 -0
  123. package/dist/lib/startup/fhir-system.d.ts +82 -0
  124. package/dist/lib/startup/fhir-system.d.ts.map +1 -0
  125. package/dist/lib/store/conditional-service.d.ts +76 -0
  126. package/dist/lib/store/conditional-service.d.ts.map +1 -0
  127. package/dist/lib/store/fhir-persistence.d.ts +81 -0
  128. package/dist/lib/store/fhir-persistence.d.ts.map +1 -0
  129. package/dist/lib/store/fhir-store.d.ts +44 -0
  130. package/dist/lib/store/fhir-store.d.ts.map +1 -0
  131. package/dist/lib/terminology/terminology-code-repo.d.ts +61 -0
  132. package/dist/lib/terminology/terminology-code-repo.d.ts.map +1 -0
  133. package/dist/lib/terminology/valueset-repo.d.ts +76 -0
  134. package/dist/lib/terminology/valueset-repo.d.ts.map +1 -0
  135. package/dist/lib/transaction/bundle-processor.d.ts +84 -0
  136. package/dist/lib/transaction/bundle-processor.d.ts.map +1 -0
  137. package/dist/lib/transaction/urn-resolver.d.ts +62 -0
  138. package/dist/lib/transaction/urn-resolver.d.ts.map +1 -0
  139. package/dist/tsdoc-metadata.json +11 -0
  140. package/package.json +87 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * SQLiteDialect — SQLite-Specific SQL Generation
3
+ *
4
+ * Implements SqlDialect for SQLite syntax differences:
5
+ * - `?` placeholders (not `$1`)
6
+ * - JSON arrays instead of native TEXT[]
7
+ * - TEXT instead of TIMESTAMPTZ
8
+ * - INTEGER instead of BOOLEAN
9
+ * - json_each() for array contains checks
10
+ *
11
+ * v2 upgrade: New file. v1 hardcoded PostgreSQL syntax.
12
+ *
13
+ * @module fhir-persistence/db
14
+ */
15
+ import type { SqlDialect } from './dialect.js';
16
+ export declare class SQLiteDialect implements SqlDialect {
17
+ readonly name: "sqlite";
18
+ placeholder(_index: number): string;
19
+ textArrayContains(column: string, paramCount: number, _paramStartIndex: number): {
20
+ sql: string;
21
+ values: unknown[];
22
+ };
23
+ like(column: string, _paramIndex: number): string;
24
+ limitOffset(_paramStartIndex: number): {
25
+ sql: string;
26
+ };
27
+ arrayLiteral(values: string[]): string;
28
+ timestampType(): string;
29
+ booleanType(): string;
30
+ textArrayType(): string;
31
+ upsertSuffix(conflictColumn: string, updateColumns: string[]): string;
32
+ autoIncrementPK(): string;
33
+ }
34
+ //# sourceMappingURL=sqlite-dialect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-dialect.d.ts","sourceRoot":"","sources":["../../../src/db/sqlite-dialect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,qBAAa,aAAc,YAAW,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAInC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG;QAC/E,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,OAAO,EAAE,CAAC;KACnB;IAQD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAIjD,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;IAItD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAItC,aAAa,IAAI,MAAM;IAIvB,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;IAIvB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM;IAKrE,eAAe,IAAI,MAAM;CAG1B"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * `fhir-persistence` — Embedded FHIR R4 Persistence Layer
3
+ *
4
+ * Provides CRUD, search, indexing, schema migration, and terminology
5
+ * for FHIR R4 resources over SQLite (sql.js / better-sqlite3) and PostgreSQL.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ export type { SqlColumnType, ColumnSchema, IndexSchema, ConstraintSchema, MainTableSchema, HistoryTableSchema, ReferencesTableSchema, ResourceTableSet, SchemaDefinition, } from './schema/index.js';
10
+ export { StructureDefinitionRegistry } from './registry/index.js';
11
+ export type { CanonicalProfile } from './registry/index.js';
12
+ export { SearchParameterRegistry } from './registry/index.js';
13
+ export type { SearchParamType, SearchStrategy, SearchColumnType, SearchParameterImpl, SearchParameterResource, SearchParameterBundle, } from './registry/index.js';
14
+ export { buildResourceTableSet, buildAllResourceTableSets, buildSchemaDefinition, } from './schema/table-schema-builder.js';
15
+ export { generateCreateMainTable, generateCreateHistoryTable, generateCreateReferencesTable, generateCreateIndex, generateResourceDDL, generateSchemaDDL, generateSchemaDDLString, } from './schema/ddl-generator.js';
16
+ export type { FhirResource, FhirMeta, PersistedResource, ResourceRepository, CreateResourceOptions, UpdateResourceOptions, HistoryOptions, HistoryEntry, SearchOptions, SearchResult, HistoryBundle, HistoryBundleEntry, BuildHistoryBundleOptions, OperationContext, } from './repo/index.js';
17
+ export { SCHEMA_VERSION, DELETED_SCHEMA_VERSION, PLATFORM_RESOURCE_TYPES, PROTECTED_RESOURCE_TYPES, PROJECT_ADMIN_RESOURCE_TYPES, } from './repo/index.js';
18
+ export { RepositoryError, ResourceNotFoundError, ResourceGoneError, ResourceVersionConflictError, } from './repo/index.js';
19
+ export { buildHistoryBundle } from './repo/index.js';
20
+ export type { SearchColumnValues } from './repo/index.js';
21
+ export { buildSearchColumns, buildResourceRowWithSearch, hashToken, extractPropertyPath, getNestedValues, } from './repo/index.js';
22
+ export type { SearchPrefix, SearchModifier, ParsedSearchParam, SortRule, SearchRequest, WhereFragment, SearchSQL, CountSQL, SearchBundle, SearchBundleEntry, BuildSearchBundleOptions, PaginationContext, } from './search/index.js';
23
+ export { SEARCH_PREFIXES, PREFIX_TYPES, DEFAULT_SEARCH_COUNT, MAX_SEARCH_COUNT, parseSearchRequest, parseParamKey, splitSearchValues, extractPrefix, parseSortParam, prefixToOperator, buildSearchBundle, buildSelfLink, buildNextLink, hasNextPage, buildPaginationContext, executeSearchV2 as executeSearch, mapRowsToResourcesV2 as mapRowsToResources, } from './search/index.js';
24
+ export type { StorageAdapter, TransactionContext } from './db/adapter.js';
25
+ export { SQLiteAdapter } from './db/sqlite-adapter.js';
26
+ export { BetterSqlite3Adapter } from './db/better-sqlite3-adapter.js';
27
+ export type { BetterSqlite3Options } from './db/better-sqlite3-adapter.js';
28
+ export { FhirStore } from './store/fhir-store.js';
29
+ export { FhirPersistence } from './store/fhir-persistence.js';
30
+ export type { FhirPersistenceOptions } from './store/fhir-persistence.js';
31
+ export { IndexingPipeline } from './repo/indexing-pipeline.js';
32
+ export type { IndexResult, IndexingPipelineOptions } from './repo/indexing-pipeline.js';
33
+ export { LookupTableWriter } from './repo/lookup-table-writer.js';
34
+ export type { ReferenceRowV2 } from './repo/reference-indexer.js';
35
+ export { extractReferencesV2 } from './repo/reference-indexer.js';
36
+ export type { LookupTableRow } from './repo/row-indexer.js';
37
+ export { buildLookupTableRows } from './repo/row-indexer.js';
38
+ export { buildInsertMainSQLv2, buildUpdateMainSQLv2, buildInsertHistorySQLv2, buildSelectByIdSQLv2, buildSelectVersionSQLv2, buildDeleteReferencesSQLv2, buildInsertReferencesSQLv2, buildInstanceHistorySQLv2, buildTypeHistorySQLv2, } from './repo/sql-builder.js';
39
+ export type { SchemaDelta, DeltaKind } from './migration/schema-diff.js';
40
+ export { compareSchemas } from './migration/schema-diff.js';
41
+ export type { GeneratedMigration } from './migration/migration-generator.js';
42
+ export { generateMigration } from './migration/migration-generator.js';
43
+ export { PackageRegistryRepo } from './registry/package-registry-repo.js';
44
+ export { IGPersistenceManager } from './migration/ig-persistence-manager.js';
45
+ export { ReindexScheduler } from './migration/reindex-scheduler.js';
46
+ export { MigrationRunnerV2 } from './migrations/index.js';
47
+ export type { MigrationV2, MigrationResultV2 } from './migrations/index.js';
48
+ export { TerminologyCodeRepo } from './terminology/terminology-code-repo.js';
49
+ export { ValueSetRepo } from './terminology/valueset-repo.js';
50
+ export { PLATFORM_SEARCH_PARAMETERS, PLATFORM_PACKAGE_NAME, PLATFORM_PACKAGE_VERSION } from './platform/platform-ig-definitions.js';
51
+ export { buildPlatformTableSets, initializePlatformIG } from './platform/platform-ig-loader.js';
52
+ export { buildWhereFragmentV2, buildWhereClauseV2 } from './search/where-builder.js';
53
+ export { buildSearchSQLv2, buildCountSQLv2, buildTwoPhaseSearchSQLv2 } from './search/search-sql-builder.js';
54
+ export type { TwoPhaseSearchSQL } from './search/search-sql-builder.js';
55
+ export type { SearchPlan, SearchPlannerOptions } from './search/search-planner.js';
56
+ export { planSearch } from './search/search-planner.js';
57
+ export { ResourceCacheV2 } from './cache/resource-cache.js';
58
+ export { SearchLogger } from './observability/search-logger.js';
59
+ export { reindexResourceTypeV2, reindexAllV2 } from './cli/reindex.js';
60
+ export { FhirSystem } from './startup/fhir-system.js';
61
+ export type { FhirSystemOptions, FhirSystemReady } from './startup/fhir-system.js';
62
+ export { FhirDefinitionBridge } from './providers/fhir-definition-provider.js';
63
+ export { FhirRuntimeProvider, createFhirRuntimeProvider } from './providers/fhir-runtime-provider.js';
64
+ export type { FhirRuntimeProviderOptions } from './providers/fhir-runtime-provider.js';
65
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * IG Persistence Manager — v2
3
+ *
4
+ * Orchestrates the initialization flow when an IG package is loaded:
5
+ * 1. Check PackageRegistry for existing installation (checksum compare)
6
+ * 2. Three-way branch: new / upgrade / consistent
7
+ * 3. For new/upgrade: SchemaDiff → MigrationGenerator → MigrationRunnerV2
8
+ * 4. Schedule reindex jobs for SP expression changes
9
+ *
10
+ * @module fhir-persistence/migration
11
+ */
12
+ import type { StorageAdapter } from '../db/adapter.js';
13
+ import type { ResourceTableSet } from '../schema/table-schema.js';
14
+ import type { DDLDialect } from '../schema/ddl-generator.js';
15
+ export interface IGPackageInput {
16
+ /** Package name (e.g., "hl7.fhir.r4.core"). */
17
+ name: string;
18
+ /** Package version (e.g., "4.0.1"). */
19
+ version: string;
20
+ /** Content checksum for change detection. */
21
+ checksum: string;
22
+ /** The new schema table sets generated from this package. */
23
+ tableSets: ResourceTableSet[];
24
+ }
25
+ export type IGInitAction = 'new' | 'upgrade' | 'consistent';
26
+ export interface IGInitResult {
27
+ /** What action was taken. */
28
+ action: IGInitAction;
29
+ /** Package name. */
30
+ packageName: string;
31
+ /** Package version. */
32
+ packageVersion: string;
33
+ /** Number of DDL statements applied (0 for 'consistent'). */
34
+ ddlCount: number;
35
+ /** Number of reindex jobs scheduled. */
36
+ reindexCount: number;
37
+ /** Error message if any step failed. */
38
+ error?: string;
39
+ }
40
+ export declare class IGPersistenceManager {
41
+ private readonly dialect;
42
+ private readonly packageRepo;
43
+ private readonly migrationRunner;
44
+ private readonly reindexScheduler;
45
+ constructor(adapter: StorageAdapter, dialect?: DDLDialect);
46
+ /**
47
+ * Initialize an IG package — the main entry point.
48
+ *
49
+ * Three-way branch based on checksum comparison:
50
+ * - **new**: Fresh install → apply full schema DDL
51
+ * - **upgrade**: Checksum changed → diff + apply migration
52
+ * - **consistent**: Checksum matches → no-op
53
+ */
54
+ initialize(input: IGPackageInput): Promise<IGInitResult>;
55
+ }
56
+ //# sourceMappingURL=ig-persistence-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ig-persistence-manager.d.ts","sourceRoot":"","sources":["../../../src/migration/ig-persistence-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAW7D,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAExC,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,UAAqB;IAOnE;;;;;;;OAOG;IACG,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;CAuF/D"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Migration Generator — v2
3
+ *
4
+ * Generates SQL DDL statements from SchemaDelta[].
5
+ * Dialect-aware: produces SQLite or PostgreSQL DDL.
6
+ *
7
+ * Key design decisions:
8
+ * - ADD_TABLE delegates to existing DDLGenerator (generateResourceDDL)
9
+ * - ADD_COLUMN → ALTER TABLE ADD COLUMN
10
+ * - DROP_COLUMN → ALTER TABLE DROP COLUMN (PG only; SQLite ignores)
11
+ * - ADD_INDEX → CREATE INDEX IF NOT EXISTS
12
+ * - DROP_INDEX → DROP INDEX IF EXISTS
13
+ * - REINDEX → no DDL (metadata only, handled by ReindexScheduler)
14
+ * - ALTER_COLUMN → not supported in SQLite (logged as warning)
15
+ *
16
+ * @module fhir-persistence/migration
17
+ */
18
+ import type { SchemaDelta } from './schema-diff.js';
19
+ import type { DDLDialect } from '../schema/ddl-generator.js';
20
+ export interface GeneratedMigration {
21
+ /** SQL statements to apply (up). */
22
+ up: string[];
23
+ /** SQL statements to revert (down). Best-effort; some are irreversible. */
24
+ down: string[];
25
+ /** Deltas that require reindex (no DDL, just scheduling). */
26
+ reindexDeltas: SchemaDelta[];
27
+ /** Human-readable description of changes. */
28
+ description: string;
29
+ }
30
+ /**
31
+ * Generate SQL DDL from a list of schema deltas.
32
+ *
33
+ * @param deltas - Schema changes to apply.
34
+ * @param dialect - Target SQL dialect.
35
+ * @returns Generated migration with up/down SQL and reindex info.
36
+ */
37
+ export declare function generateMigration(deltas: SchemaDelta[], dialect: DDLDialect): GeneratedMigration;
38
+ //# sourceMappingURL=migration-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-generator.d.ts","sourceRoot":"","sources":["../../../src/migration/migration-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAU7D,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,2EAA2E;IAC3E,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6DAA6D;IAC7D,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,EAAE,UAAU,GAClB,kBAAkB,CAsHpB"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Reindex Scheduler — v2
3
+ *
4
+ * Schedules and tracks asynchronous reindex jobs when a SearchParameter
5
+ * expression changes (detected by SchemaDiff as REINDEX deltas).
6
+ *
7
+ * Design decisions:
8
+ * - Jobs stored in `_reindex_jobs` table (auto-created)
9
+ * - Keyset pagination: processes resources by lastUpdated > cursor
10
+ * - Jobs are independent per (resourceType, searchParamCode)
11
+ * - Status tracking: pending / running / completed / failed
12
+ *
13
+ * @module fhir-persistence/migration
14
+ */
15
+ import type { StorageAdapter } from '../db/adapter.js';
16
+ import type { SchemaDelta } from './schema-diff.js';
17
+ export type ReindexJobStatus = 'pending' | 'running' | 'completed' | 'failed';
18
+ export interface ReindexJob {
19
+ /** Auto-assigned job ID. */
20
+ id: number;
21
+ /** Resource type to reindex (e.g., "Patient"). */
22
+ resourceType: string;
23
+ /** Search parameter code that changed (e.g., "birthdate"). */
24
+ searchParamCode: string;
25
+ /** New FHIRPath expression. */
26
+ expression: string;
27
+ /** Current job status. */
28
+ status: ReindexJobStatus;
29
+ /** Cursor for keyset pagination (lastUpdated of last processed resource). */
30
+ cursor: string | null;
31
+ /** Number of resources processed so far. */
32
+ processedCount: number;
33
+ /** When the job was created. */
34
+ createdAt: string;
35
+ /** When the job was last updated. */
36
+ updatedAt: string;
37
+ }
38
+ export declare class ReindexScheduler {
39
+ private readonly adapter;
40
+ constructor(adapter: StorageAdapter);
41
+ /**
42
+ * Ensure the reindex jobs table exists.
43
+ */
44
+ ensureTable(): Promise<void>;
45
+ /**
46
+ * Schedule reindex jobs from REINDEX deltas.
47
+ *
48
+ * @param deltas - REINDEX deltas from SchemaDiff (filtered by caller).
49
+ * @returns Number of jobs scheduled.
50
+ */
51
+ schedule(deltas: SchemaDelta[]): Promise<number>;
52
+ /**
53
+ * Get all pending reindex jobs.
54
+ */
55
+ getPendingJobs(): Promise<ReindexJob[]>;
56
+ /**
57
+ * Get a specific job by ID.
58
+ */
59
+ getJob(id: number): Promise<ReindexJob | undefined>;
60
+ /**
61
+ * Get all jobs (any status).
62
+ */
63
+ getAllJobs(): Promise<ReindexJob[]>;
64
+ /**
65
+ * Update job status and cursor.
66
+ */
67
+ updateJob(id: number, update: {
68
+ status?: ReindexJobStatus;
69
+ cursor?: string;
70
+ processedCount?: number;
71
+ }): Promise<void>;
72
+ /**
73
+ * Get status summary of all jobs.
74
+ */
75
+ getStatus(): Promise<{
76
+ pending: number;
77
+ running: number;
78
+ completed: number;
79
+ failed: number;
80
+ }>;
81
+ }
82
+ //# sourceMappingURL=reindex-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex-scheduler.d.ts","sourceRoot":"","sources":["../../../src/migration/reindex-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AA0BD,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;;;;OAKG;IACG,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBtD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAO7C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAQzD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAOzC;;OAEG;IACG,SAAS,CACb,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9E,OAAO,CAAC,IAAI,CAAC;IA0BhB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAcpG"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Schema Diff — v2
3
+ *
4
+ * Compares old vs new ResourceTableSet[] to produce SchemaDelta[].
5
+ * Used by IGPersistenceManager to detect what changed when an IG
6
+ * package is upgraded.
7
+ *
8
+ * Key design decisions:
9
+ * - Compares by column name + type (not by position)
10
+ * - Compares indexes by name
11
+ * - Detects SP expression changes for reindex scheduling
12
+ * - Works from in-memory schema objects (no DB introspection)
13
+ *
14
+ * @module fhir-persistence/migration
15
+ */
16
+ import type { ResourceTableSet, ColumnSchema, IndexSchema, SearchParamMeta } from '../schema/table-schema.js';
17
+ export type DeltaKind = 'ADD_TABLE' | 'DROP_TABLE' | 'ADD_COLUMN' | 'DROP_COLUMN' | 'ALTER_COLUMN' | 'ADD_INDEX' | 'DROP_INDEX' | 'REINDEX';
18
+ export interface SchemaDelta {
19
+ /** The type of schema change. */
20
+ kind: DeltaKind;
21
+ /** The resource type affected (e.g., "Patient"). */
22
+ resourceType: string;
23
+ /** The table name affected (e.g., "Patient", "Patient_History"). */
24
+ tableName: string;
25
+ /** Column details (for ADD_COLUMN, DROP_COLUMN, ALTER_COLUMN). */
26
+ column?: ColumnSchema;
27
+ /** Previous column details (for ALTER_COLUMN). */
28
+ oldColumn?: ColumnSchema;
29
+ /** Index details (for ADD_INDEX, DROP_INDEX). */
30
+ index?: IndexSchema;
31
+ /** Search parameter details (for REINDEX). */
32
+ searchParam?: SearchParamMeta;
33
+ /** The full ResourceTableSet (for ADD_TABLE). */
34
+ tableSet?: ResourceTableSet;
35
+ }
36
+ /**
37
+ * Compare two sets of ResourceTableSets and produce a list of deltas.
38
+ *
39
+ * @param oldSets - The previously installed schema (from PackageRegistry).
40
+ * @param newSets - The newly generated schema (from current IG).
41
+ * @returns Array of SchemaDelta describing all changes.
42
+ */
43
+ export declare function compareSchemas(oldSets: ResourceTableSet[], newSets: ResourceTableSet[]): SchemaDelta[];
44
+ //# sourceMappingURL=schema-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-diff.d.ts","sourceRoot":"","sources":["../../../src/migration/schema-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,2BAA2B,CAAC;AAMnC,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,aAAa,GACb,cAAc,GACd,WAAW,GACX,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,IAAI,EAAE,SAAS,CAAC;IAChB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,iDAAiD;IACjD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,iDAAiD;IACjD,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,OAAO,EAAE,gBAAgB,EAAE,GAC1B,WAAW,EAAE,CAuDf"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Schema Migration Module (v2)
3
+ *
4
+ * @module fhir-persistence/migrations
5
+ */
6
+ export { MigrationRunnerV2 } from './migration-runner.js';
7
+ export type { MigrationV2, MigrationRecordV2, MigrationResultV2, MigrationStatusV2, } from './migration-runner.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Schema Migration Runner (v2)
3
+ *
4
+ * Manages incremental database schema migrations with version tracking
5
+ * using StorageAdapter (SQLite / PostgreSQL).
6
+ *
7
+ * Features:
8
+ * - Automatic `_migrations` tracking table creation
9
+ * - Sequential up/down migration execution
10
+ * - Idempotent: skips already-applied migrations
11
+ * - Transaction-per-migration for safety
12
+ * - IG migrations (forward-only, auto-versioned)
13
+ * - Status reporting (current version, pending migrations)
14
+ *
15
+ * @module fhir-persistence/migrations
16
+ */
17
+ import type { StorageAdapter } from '../db/adapter.js';
18
+ import type { GeneratedMigration } from '../migration/migration-generator.js';
19
+ /**
20
+ * v2 migration types — adds `type` field for IG vs file distinction.
21
+ */
22
+ export interface MigrationV2 {
23
+ /** Unique version number. Must be positive integer. */
24
+ version: number;
25
+ /** Human-readable description. */
26
+ description: string;
27
+ /** SQL statements to apply this migration. */
28
+ up: string[];
29
+ /** SQL statements to revert this migration. Empty for IG migrations (forward-only). */
30
+ down: string[];
31
+ /** Migration source type: 'ig' for IG-driven, 'file' for manual file-based. */
32
+ type: 'ig' | 'file';
33
+ }
34
+ export interface MigrationRecordV2 {
35
+ version: number;
36
+ description: string;
37
+ type: string;
38
+ applied_at: string;
39
+ }
40
+ export interface MigrationResultV2 {
41
+ action: 'up' | 'down' | 'none';
42
+ applied: number[];
43
+ currentVersion: number;
44
+ errors: Array<{
45
+ version: number;
46
+ error: string;
47
+ }>;
48
+ }
49
+ export interface MigrationStatusV2 {
50
+ currentVersion: number;
51
+ appliedVersions: number[];
52
+ availableVersions: number[];
53
+ pendingVersions: number[];
54
+ }
55
+ /**
56
+ * v2: Manages schema migrations using StorageAdapter (SQLite / PG).
57
+ *
58
+ * Key differences from v1:
59
+ * - Uses `StorageAdapter` instead of `DatabaseClient`
60
+ * - `?` placeholders instead of `$1`
61
+ * - Supports `type` field: 'ig' | 'file'
62
+ * - IG migrations are forward-only (no down/revert)
63
+ * - Tracking table uses `datetime('now')` for SQLite
64
+ */
65
+ export declare class MigrationRunnerV2 {
66
+ private readonly adapter;
67
+ private readonly migrations;
68
+ constructor(adapter: StorageAdapter, migrations?: MigrationV2[]);
69
+ /**
70
+ * Ensure the tracking table exists.
71
+ */
72
+ ensureTrackingTable(): Promise<void>;
73
+ /**
74
+ * Apply all pending migrations (or up to a target version).
75
+ */
76
+ up(targetVersion?: number): Promise<MigrationResultV2>;
77
+ /**
78
+ * Revert migrations down to a target version.
79
+ * IG migrations (type='ig') cannot be reverted — they are skipped.
80
+ */
81
+ down(targetVersion?: number): Promise<MigrationResultV2>;
82
+ /**
83
+ * Get the current migration status.
84
+ */
85
+ status(): Promise<MigrationStatusV2>;
86
+ /**
87
+ * Get all applied migration records.
88
+ */
89
+ getRecords(): Promise<MigrationRecordV2[]>;
90
+ /**
91
+ * Apply an IG-generated migration directly.
92
+ *
93
+ * Assigns the next available version number automatically.
94
+ * This is the primary entry point for IGPersistenceManager.
95
+ */
96
+ applyIGMigration(generated: GeneratedMigration): Promise<MigrationResultV2>;
97
+ private getAppliedVersions;
98
+ private applyMigration;
99
+ private revertMigration;
100
+ private maxApplied;
101
+ }
102
+ //# sourceMappingURL=migration-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-runner.d.ts","sourceRoot":"","sources":["../../../src/migrations/migration-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,uFAAuF;IACvF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+EAA+E;IAC/E,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAaD;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;gBAE/B,OAAO,EAAE,cAAc,EAAE,UAAU,GAAE,WAAW,EAAO;IASnE;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1C;;OAEG;IACG,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0C5D;;;OAGG;IACG,IAAI,CAAC,aAAa,GAAE,MAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0CjE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAe1C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAOhD;;;;;OAKG;IACG,gBAAgB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAsCnE,kBAAkB;YAOlB,cAAc;YAYd,eAAe;IAY7B,OAAO,CAAC,UAAU;CAInB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Search Logger — Execution Time Observability
3
+ *
4
+ * Wraps search operations with timing and result counting.
5
+ * Provides slow query detection, recent log buffer, and stats.
6
+ *
7
+ * @module fhir-persistence/observability
8
+ */
9
+ export interface SearchLogEntry {
10
+ /** Resource type being searched. */
11
+ resourceType: string;
12
+ /** Number of search parameters used. */
13
+ paramCount: number;
14
+ /** Number of results returned. */
15
+ resultCount: number;
16
+ /** Execution duration in milliseconds. */
17
+ durationMs: number;
18
+ /** ISO 8601 timestamp. */
19
+ timestamp: string;
20
+ /** Whether this was flagged as slow. */
21
+ slow: boolean;
22
+ }
23
+ export interface SearchLoggerConfig {
24
+ /** Whether logging is enabled. Default: true. */
25
+ enabled?: boolean;
26
+ /** Slow query threshold in milliseconds. Default: 1000. */
27
+ slowThresholdMs?: number;
28
+ /** Maximum number of log entries to retain. Default: 100. */
29
+ maxEntries?: number;
30
+ /** Custom log handler. Called for every search log entry. */
31
+ onLog?: (entry: SearchLogEntry) => void;
32
+ }
33
+ export interface SearchStats {
34
+ /** Total number of logged searches. */
35
+ totalSearches: number;
36
+ /** Average duration in ms. */
37
+ avgDurationMs: number;
38
+ /** Maximum duration in ms. */
39
+ maxDurationMs: number;
40
+ /** Minimum duration in ms. */
41
+ minDurationMs: number;
42
+ /** Number of slow queries. */
43
+ slowCount: number;
44
+ }
45
+ export declare class SearchLogger {
46
+ private readonly entries;
47
+ private readonly enabled;
48
+ private readonly slowThresholdMs;
49
+ private readonly maxEntries;
50
+ private readonly onLog?;
51
+ constructor(config?: SearchLoggerConfig);
52
+ /**
53
+ * Log a completed search operation.
54
+ */
55
+ log(resourceType: string, paramCount: number, resultCount: number, durationMs: number): void;
56
+ /**
57
+ * Get the most recent N log entries.
58
+ */
59
+ getRecentLogs(count?: number): SearchLogEntry[];
60
+ /**
61
+ * Get entries flagged as slow queries.
62
+ */
63
+ getSlowQueries(): SearchLogEntry[];
64
+ /**
65
+ * Get aggregate statistics.
66
+ */
67
+ getStats(): SearchStats;
68
+ /**
69
+ * Clear all log entries.
70
+ */
71
+ clearLogs(): void;
72
+ get isEnabled(): boolean;
73
+ }
74
+ //# sourceMappingURL=search-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-logger.d.ts","sourceRoot":"","sources":["../../../src/observability/search-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAkC;gBAE7C,MAAM,CAAC,EAAE,kBAAkB;IAOvC;;OAEG;IACH,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAwB5F;;OAEG;IACH,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAK/C;;OAEG;IACH,cAAc,IAAI,cAAc,EAAE;IAIlC;;OAEG;IACH,QAAQ,IAAI,WAAW;IAiBvB;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Platform IG Definitions — medxai.core
3
+ *
4
+ * In-memory StructureDefinition (as CanonicalProfile) and SearchParameter
5
+ * definitions for MedXAI platform resources: User, Bot, Project, Agent,
6
+ * ClientApplication.
7
+ *
8
+ * These replace the v1 hardcoded PLATFORM_RESOURCE_TYPES approach.
9
+ * Tables are now generated through the IG pipeline (Stage 5).
10
+ *
11
+ * @module fhir-persistence/platform
12
+ */
13
+ import type { SearchParameterResource } from '../registry/search-parameter-registry.js';
14
+ export declare const PLATFORM_PACKAGE_NAME = "medxai.core";
15
+ export declare const PLATFORM_PACKAGE_VERSION = "1.0.0";
16
+ /**
17
+ * Minimal CanonicalProfile shape matching @medxai/fhir-core.
18
+ * We define our own to avoid hard dependency on @medxai/fhir-core at this layer.
19
+ */
20
+ export interface PlatformProfile {
21
+ url: string;
22
+ name: string;
23
+ kind: 'resource' | 'complex-type' | 'primitive-type' | 'logical';
24
+ type: string;
25
+ abstract: boolean;
26
+ elements: Map<string, unknown>;
27
+ }
28
+ export declare const PLATFORM_PROFILES: PlatformProfile[];
29
+ /**
30
+ * Get all platform profiles.
31
+ */
32
+ export declare function getPlatformProfiles(): PlatformProfile[];
33
+ /**
34
+ * Get all platform resource type names.
35
+ */
36
+ export declare function getPlatformResourceTypes(): string[];
37
+ export declare const PLATFORM_SEARCH_PARAMETERS: SearchParameterResource[];
38
+ /**
39
+ * Get all platform search parameters.
40
+ */
41
+ export declare function getPlatformSearchParameters(): SearchParameterResource[];
42
+ /**
43
+ * Get search parameters for a specific platform resource type.
44
+ */
45
+ export declare function getSearchParametersForType(resourceType: string): SearchParameterResource[];
46
+ /**
47
+ * Generate a deterministic checksum for the platform IG package.
48
+ * Based on sorted JSON of profiles + search parameters.
49
+ */
50
+ export declare function getPackageChecksum(): string;
51
+ //# sourceMappingURL=platform-ig-definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-ig-definitions.d.ts","sourceRoot":"","sources":["../../../src/platform/platform-ig-definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAMxF,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AACnD,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAMhD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAmBD,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAM9C,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD;AAyBD,eAAO,MAAM,0BAA0B,EAAE,uBAAuB,EA0B/D,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,uBAAuB,EAAE,CAEvE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAE1F;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAgB3C"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Platform IG Loader — medxai.core
3
+ *
4
+ * Loads platform resource definitions, builds ResourceTableSets,
5
+ * and feeds them into the IGPersistenceManager pipeline for
6
+ * automatic table creation and migration.
7
+ *
8
+ * @module fhir-persistence/platform
9
+ */
10
+ import type { StorageAdapter } from '../db/adapter.js';
11
+ import type { ResourceTableSet } from '../schema/table-schema.js';
12
+ import type { IGInitResult } from '../migration/ig-persistence-manager.js';
13
+ /**
14
+ * Build ResourceTableSets for all platform resource types.
15
+ *
16
+ * Uses StructureDefinitionRegistry + SearchParameterRegistry
17
+ * populated with platform definitions to generate the table schemas.
18
+ */
19
+ export declare function buildPlatformTableSets(): ResourceTableSet[];
20
+ /**
21
+ * Initialize the platform IG — create or upgrade platform resource tables.
22
+ *
23
+ * This is the main entry point for bootstrapping platform tables on startup.
24
+ * Uses IGPersistenceManager for checksum-based change detection.
25
+ *
26
+ * @param adapter - StorageAdapter (SQLite or PostgreSQL).
27
+ * @returns IGInitResult with action taken (new/upgrade/consistent).
28
+ */
29
+ export declare function initializePlatformIG(adapter: StorageAdapter): Promise<IGInitResult>;
30
+ //# sourceMappingURL=platform-ig-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-ig-loader.d.ts","sourceRoot":"","sources":["../../../src/platform/platform-ig-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAKlE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAa3E;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,EAAE,CAyB3D;AAMD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAWzF"}