@sixb/pg 0.1.16 → 0.1.17

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 (92) hide show
  1. package/README.md +125 -0
  2. package/dist/index.d.ts +15 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3201 -1473
  5. package/dist/index.js.map +32 -25
  6. package/dist/migrations.d.ts.map +1 -1
  7. package/dist/objects/aggregate-admission.d.ts +10 -0
  8. package/dist/objects/aggregate-admission.d.ts.map +1 -0
  9. package/dist/objects/preparation-lock.d.ts +6 -0
  10. package/dist/objects/preparation-lock.d.ts.map +1 -0
  11. package/dist/objects/prepare-queries.d.ts +5 -0
  12. package/dist/objects/prepare-queries.d.ts.map +1 -0
  13. package/dist/objects/query-compiler.d.ts +19 -0
  14. package/dist/objects/query-compiler.d.ts.map +1 -1
  15. package/dist/objects/query-indexes.d.ts +43 -0
  16. package/dist/objects/query-indexes.d.ts.map +1 -0
  17. package/dist/objects/reader.d.ts +7 -1
  18. package/dist/objects/reader.d.ts.map +1 -1
  19. package/dist/objects/storage.d.ts +1 -1
  20. package/dist/objects/storage.d.ts.map +1 -1
  21. package/dist/objects/text-count-index.d.ts +24 -0
  22. package/dist/objects/text-count-index.d.ts.map +1 -0
  23. package/dist/ontology-storage/index.d.ts +2 -0
  24. package/dist/ontology-storage/index.d.ts.map +1 -1
  25. package/dist/ontology-storage/materialization-session.d.ts +18 -38
  26. package/dist/ontology-storage/materialization-session.d.ts.map +1 -1
  27. package/dist/ontology-storage/materialization-state.d.ts +3 -26
  28. package/dist/ontology-storage/materialization-state.d.ts.map +1 -1
  29. package/dist/ontology-storage/materialization-writer.d.ts +51 -9
  30. package/dist/ontology-storage/materialization-writer.d.ts.map +1 -1
  31. package/dist/ontology-storage/materializations.d.ts +5 -7
  32. package/dist/ontology-storage/materializations.d.ts.map +1 -1
  33. package/dist/ontology-storage/outbox.d.ts.map +1 -1
  34. package/dist/ontology-storage/replacement-plans.d.ts +36 -0
  35. package/dist/ontology-storage/replacement-plans.d.ts.map +1 -0
  36. package/dist/ontology-storage/shared.d.ts +11 -5
  37. package/dist/ontology-storage/shared.d.ts.map +1 -1
  38. package/dist/ontology-storage/source-cleanup.d.ts.map +1 -1
  39. package/dist/ontology-storage/source-roots.d.ts +14 -1
  40. package/dist/ontology-storage/source-roots.d.ts.map +1 -1
  41. package/dist/ontology-storage/sources.d.ts +1 -2
  42. package/dist/ontology-storage/sources.d.ts.map +1 -1
  43. package/dist/pg-ai-cost-storage.d.ts.map +1 -1
  44. package/dist/pg-ai-limit-storage.d.ts.map +1 -1
  45. package/dist/pg-ai-usage-storage.d.ts +2 -0
  46. package/dist/pg-ai-usage-storage.d.ts.map +1 -1
  47. package/dist/pg-execution-storage.d.ts +28 -0
  48. package/dist/pg-execution-storage.d.ts.map +1 -1
  49. package/dist/pg-file-download-grant-storage.d.ts +11 -0
  50. package/dist/pg-file-download-grant-storage.d.ts.map +1 -0
  51. package/dist/pg-projection-run-storage.d.ts.map +1 -1
  52. package/dist/pg-rules-storage.d.ts.map +1 -1
  53. package/dist/transactions.d.ts +6 -2
  54. package/dist/transactions.d.ts.map +1 -1
  55. package/package.json +3 -3
  56. package/src/index.ts +53 -3
  57. package/src/migrations/053-replacement-plans.sql +72 -0
  58. package/src/migrations/054-slim-ontology-outbox.sql +108 -0
  59. package/src/migrations/055-object-query-preparation.sql +11 -0
  60. package/src/migrations/056-commit-touches.sql +41 -0
  61. package/src/migrations/057-audio-transcription.sql +10 -0
  62. package/src/migrations/058-reranking-model-kind.sql +11 -0
  63. package/src/migrations/059-file-download-grants.sql +16 -0
  64. package/src/migrations/060-drained-source-versions.sql +11 -0
  65. package/src/migrations.ts +20 -0
  66. package/src/objects/aggregate-admission.ts +21 -0
  67. package/src/objects/preparation-lock.ts +15 -0
  68. package/src/objects/prepare-queries.ts +181 -0
  69. package/src/objects/query-compiler.ts +404 -114
  70. package/src/objects/query-indexes.ts +348 -0
  71. package/src/objects/reader.ts +140 -51
  72. package/src/objects/storage.ts +15 -3
  73. package/src/objects/text-count-index.ts +455 -0
  74. package/src/ontology-storage/index.ts +3 -0
  75. package/src/ontology-storage/materialization-session.ts +116 -275
  76. package/src/ontology-storage/materialization-state.ts +8 -259
  77. package/src/ontology-storage/materialization-writer.ts +618 -508
  78. package/src/ontology-storage/materializations.ts +106 -289
  79. package/src/ontology-storage/outbox.ts +46 -15
  80. package/src/ontology-storage/replacement-plans.ts +1110 -0
  81. package/src/ontology-storage/shared.ts +27 -15
  82. package/src/ontology-storage/source-cleanup.ts +22 -10
  83. package/src/ontology-storage/source-roots.ts +35 -8
  84. package/src/ontology-storage/sources.ts +0 -30
  85. package/src/pg-ai-cost-storage.ts +12 -0
  86. package/src/pg-ai-limit-storage.ts +13 -2
  87. package/src/pg-ai-usage-storage.ts +8 -0
  88. package/src/pg-execution-storage.ts +8 -3
  89. package/src/pg-file-download-grant-storage.ts +76 -0
  90. package/src/pg-projection-run-storage.ts +6 -1
  91. package/src/pg-rules-storage.ts +7 -3
  92. package/src/transactions.ts +10 -3
package/dist/index.js.map CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/agents/checkpoints.ts", "../src/storage-errors.ts", "../src/transactions.ts", "../src/agents/rows.ts", "../src/agents/messages.ts", "../src/agents/runs.ts", "../src/run-list-query.ts", "../src/agents/threads.ts", "../src/agents/agent-storage.ts", "../src/auth-storage/auth-storage.ts", "../src/auth-storage/access-tokens.ts", "../src/auth-storage/rows.ts", "../src/auth-storage/shared.ts", "../src/auth-storage/device-authorizations.ts", "../src/auth-storage/group-memberships.ts", "../src/auth-storage/identities.ts", "../src/auth-storage/invitations.ts", "../src/auth-storage/magic-links.ts", "../src/auth-storage/oidc-attempts.ts", "../src/auth-storage/service-account-group-memberships.ts", "../src/auth-storage/service-accounts.ts", "../src/auth-storage/sessions.ts", "../src/auth-storage/users.ts", "../src/connector-connection-storage.ts", "../src/migrations.ts", "../src/objects/storage.ts", "../src/objects/query-compiler.ts", "../src/objects/reader.ts", "../src/objects/rows.ts", "../src/objects/selected-reader.ts", "../src/objects/read-scope.ts", "../src/ontology-storage/shared.ts", "../src/ontology-storage/commits.ts", "../src/ontology-storage/materializations.ts", "../src/ontology-storage/materialization-session.ts", "../src/ontology-storage/materialization-state.ts", "../src/ontology-storage/source-roots.ts", "../src/ontology-storage/materialization-writer.ts", "../src/ontology-storage/outbox.ts", "../src/ontology-storage/sources.ts", "../src/ontology-storage/source-cleanup.ts", "../src/ontology-storage/vector-indexing.ts", "../src/ontology-storage/vectors.ts", "../src/ontology-storage/index.ts", "../src/pg-action-run-storage.ts", "../src/pg-ai-cost-storage.ts", "../src/ai-cost-groups.ts", "../src/pg-ai-usage-storage.ts", "../src/pg-ai-limit-storage.ts", "../src/pg-client.ts", "../src/pg-execution-storage.ts", "../src/pg-file-upload-session-storage.ts", "../src/pg-pipeline-run-storage.ts", "../src/latest-run-query.ts", "../src/pg-projection-run-storage.ts", "../src/pg-rules-storage.ts", "../src/pg-sync-run-storage.ts", "../src/pg-timeseries-storage.ts", "../src/pg-webhook-run-storage.ts", "../src/pg-workflow-intervention-storage.ts", "../src/pg-workflow-run-storage.ts", "../src/share-grant-storage.ts", "../src/share-session-storage.ts", "../src/testing.ts"],
3
+ "sources": ["../src/index.ts", "../src/agents/checkpoints.ts", "../src/storage-errors.ts", "../src/transactions.ts", "../src/agents/rows.ts", "../src/agents/messages.ts", "../src/agents/runs.ts", "../src/run-list-query.ts", "../src/agents/threads.ts", "../src/agents/agent-storage.ts", "../src/auth-storage/auth-storage.ts", "../src/auth-storage/access-tokens.ts", "../src/auth-storage/rows.ts", "../src/auth-storage/shared.ts", "../src/auth-storage/device-authorizations.ts", "../src/auth-storage/group-memberships.ts", "../src/auth-storage/identities.ts", "../src/auth-storage/invitations.ts", "../src/auth-storage/magic-links.ts", "../src/auth-storage/oidc-attempts.ts", "../src/auth-storage/service-account-group-memberships.ts", "../src/auth-storage/service-accounts.ts", "../src/auth-storage/sessions.ts", "../src/auth-storage/users.ts", "../src/connector-connection-storage.ts", "../src/migrations.ts", "../src/objects/storage.ts", "../src/objects/aggregate-admission.ts", "../src/objects/query-compiler.ts", "../src/objects/reader.ts", "../src/objects/query-indexes.ts", "../src/objects/preparation-lock.ts", "../src/objects/rows.ts", "../src/objects/text-count-index.ts", "../src/objects/selected-reader.ts", "../src/objects/read-scope.ts", "../src/objects/prepare-queries.ts", "../src/ontology-storage/shared.ts", "../src/ontology-storage/commits.ts", "../src/ontology-storage/materializations.ts", "../src/ontology-storage/materialization-session.ts", "../src/ontology-storage/materialization-state.ts", "../src/ontology-storage/source-roots.ts", "../src/ontology-storage/replacement-plans.ts", "../src/ontology-storage/materialization-writer.ts", "../src/ontology-storage/outbox.ts", "../src/pg-execution-storage.ts", "../src/ontology-storage/sources.ts", "../src/ontology-storage/source-cleanup.ts", "../src/ontology-storage/vector-indexing.ts", "../src/ontology-storage/vectors.ts", "../src/ontology-storage/index.ts", "../src/pg-action-run-storage.ts", "../src/pg-ai-cost-storage.ts", "../src/ai-cost-groups.ts", "../src/pg-ai-usage-storage.ts", "../src/pg-ai-limit-storage.ts", "../src/pg-client.ts", "../src/pg-file-download-grant-storage.ts", "../src/pg-file-upload-session-storage.ts", "../src/pg-pipeline-run-storage.ts", "../src/latest-run-query.ts", "../src/pg-projection-run-storage.ts", "../src/pg-rules-storage.ts", "../src/pg-sync-run-storage.ts", "../src/pg-timeseries-storage.ts", "../src/pg-webhook-run-storage.ts", "../src/pg-workflow-intervention-storage.ts", "../src/pg-workflow-run-storage.ts", "../src/share-grant-storage.ts", "../src/share-session-storage.ts", "../src/testing.ts"],
4
4
  "sourcesContent": [
5
- "// Keep SQL module declarations visible to downstream workspaces that typecheck this package from\n// source.\n/// <reference path=\"./sql.d.ts\" />\n\nimport { AsyncLocalStorage } from \"node:async_hooks\"\nimport type {\n MigrationCapableStorage,\n Storage,\n StorageMigrator,\n StorageTransactionOptions,\n} from \"@sixb/core\"\nimport { ProviderMaterializationTransactionLifecycle } from \"@sixb/core/internal/ontology-storage-provider\"\nimport {\n createTransactionStorageProxy,\n throwNestedStorageTransaction,\n} from \"@sixb/core/internal/storage\"\nimport {\n createAgentOperationScope,\n createAuthOperationScope,\n createObjectOperationScope,\n createOntologyOperationScope,\n createOperationScopedFacade,\n createStorageOperationScope,\n createWorkflowRunOperationScope,\n} from \"@sixb/core/internal/storage-operation-scope\"\nimport {\n type AiCostStorage,\n type AiLimitStorage,\n type AiUsageStorage,\n type ObjectStorage,\n StorageTransactionError,\n} from \"@sixb/core/storage\"\nimport { PgAgentStorage } from \"./agents\"\nimport { PgAuthStorage } from \"./auth-storage\"\nimport { PgConnectorConnectionStorage } from \"./connector-connection-storage\"\nimport { createPostgresStorageMigrators, dropSchema } from \"./migrations\"\nimport { PgObjectStorage } from \"./objects\"\nimport { PgOntologyStorage, type PgOntologyTransactionContext } from \"./ontology-storage\"\nimport { PgActionRunStorage } from \"./pg-action-run-storage\"\nimport { PgAiCostStorage } from \"./pg-ai-cost-storage\"\nimport { PgAiLimitStorage } from \"./pg-ai-limit-storage\"\nimport { PgAiUsageStorage } from \"./pg-ai-usage-storage\"\nimport { createPgClient, type SQL, type SQLClient } from \"./pg-client\"\nimport { PgExecutionStorage } from \"./pg-execution-storage\"\nimport { PgFileUploadSessionStorage } from \"./pg-file-upload-session-storage\"\nimport { PgPipelineRunStorage } from \"./pg-pipeline-run-storage\"\nimport { PgProjectionRunStorage } from \"./pg-projection-run-storage\"\nimport { PgRulesStorage } from \"./pg-rules-storage\"\nimport { PgSyncRunStorage } from \"./pg-sync-run-storage\"\nimport { PgTimeseriesStorage } from \"./pg-timeseries-storage\"\nimport { PgWebhookRunStorage } from \"./pg-webhook-run-storage\"\nimport { PgWorkflowInterventionStorage } from \"./pg-workflow-intervention-storage\"\nimport { PgWorkflowRunStorage } from \"./pg-workflow-run-storage\"\nimport { PgShareGrantStorage } from \"./share-grant-storage\"\nimport { PgShareSessionStorage } from \"./share-session-storage\"\nimport { isRetryableTransactionConflict } from \"./storage-errors\"\nimport { registerPostgresStorageTestingAdapter } from \"./testing\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport interface PostgresStorageOptions {\n /**\n * Full connection string (e.g. DATABASE_URL). Takes precedence over individual fields.\n *\n * Add `sslnegotiation=direct` (with `sslmode=require`, `verify-ca` or `verify-full`) to open TLS\n * directly, as libpq does against PostgreSQL 17 or later. It saves a round trip per connection\n * and avoids a Bun 1.4.0–1.4.2 bug that keeps in memory every byte read over a TLS connection\n * negotiated the classic way.\n */\n connectionString?: string\n\n /** PostgreSQL host. Defaults to 'localhost'. */\n host?: string\n /** PostgreSQL port. Defaults to 5432. */\n port?: number\n /** Database name. */\n database?: string\n /** Database user. */\n user?: string\n /** Database password. */\n password?: string\n\n /** Maximum number of connections in the pool. Defaults to 10. */\n max?: number\n /** Idle connection timeout in milliseconds. Defaults to 30000. */\n idleTimeoutMillis?: number\n\n /**\n * Server-side `statement_timeout` (ms) applied to every connection in the pool. A query\n * exceeding it is cancelled by PostgreSQL, which frees its pooled connection instead of\n * pinning it indefinitely. Without this, a single stalled query can starve a small pool\n * until the process is restarted. Unset by default (no timeout). Set per role — keep it\n * generous or unset for workers that run long migrations/bulk writes.\n */\n statementTimeoutMillis?: number\n /**\n * Server-side `idle_in_transaction_session_timeout` (ms) applied to every connection. A\n * transaction left open and idle beyond it is aborted by PostgreSQL, releasing the\n * connection. Unset by default (no timeout).\n */\n idleInTransactionSessionTimeoutMillis?: number\n\n /**\n * Grace period (ms) for {@link PostgresStorage.close}. On shutdown the pool stops\n * accepting new queries and waits up to this long for in-flight queries to finish before\n * destroying the connections, so a restart drains cleanly instead of severing live work.\n * Defaults to 5000.\n */\n shutdownTimeoutMillis?: number\n\n /** Seconds to wait when establishing a connection. Defaults to 10000. */\n connectTimeoutMillis?: number\n /**\n * Whether to use server-side prepared statements (porsager's default, faster against a\n * direct Postgres connection). Behind PgBouncer transaction mode they require PgBouncer\n * >= 1.21 with `max_prepared_statements > 0`; set `false` for an older PgBouncer or when\n * that setting is 0. Defaults to `true`.\n */\n prepare?: boolean\n\n /** PostgreSQL schema name for all Sixb tables. Defaults to 'sixb'. */\n schemaName?: string\n\n /** SSL configuration. */\n ssl?: boolean | \"require\" | \"prefer\"\n}\n\n/**\n * PostgreSQL storage provider for Sixb.\n *\n * Bundles Sixb storage adapters, including the AI accounting ledger, behind a shared PostgreSQL\n * connection pool (porsager `postgres`), which reliably reclaims connections under load.\n *\n * The storage exposes a core `StorageMigrator`. Sixb CLI startup and\n * `sixb db migrate` run it automatically through `migrateStorage(storage)`.\n *\n * Usage:\n * ```ts\n * const pg = new PostgresStorage({\n * connectionString: process.env.DATABASE_URL!,\n * })\n *\n * export const sixb = createSixb({\n * broker: myBroker,\n * storage: pg,\n * })\n * ```\n */\nexport class PostgresStorage implements MigrationCapableStorage {\n readonly objects: ObjectStorage\n readonly ontology: PgOntologyStorage\n readonly auth: PgAuthStorage\n readonly executions: PgExecutionStorage\n readonly agents: PgAgentStorage\n readonly aiUsage: AiUsageStorage\n readonly aiCosts: AiCostStorage\n readonly aiLimits: AiLimitStorage\n readonly actionRuns: PgActionRunStorage\n readonly pipelineRuns: PgPipelineRunStorage\n readonly workflowRuns: PgWorkflowRunStorage\n readonly workflowInterventions: PgWorkflowInterventionStorage\n readonly syncRuns: PgSyncRunStorage\n readonly projectionRuns: PgProjectionRunStorage\n readonly timeseries: Storage[\"timeseries\"]\n readonly webhookRuns: PgWebhookRunStorage\n readonly rules: PgRulesStorage\n readonly connectorConnections: PgConnectorConnectionStorage\n readonly shareGrants: PgShareGrantStorage\n readonly shareSessions: PgShareSessionStorage\n readonly fileUploadSessions: PgFileUploadSessionStorage\n readonly migrators: readonly StorageMigrator[]\n\n private readonly sql: SQL\n private readonly schemaName: string\n private readonly shutdownTimeoutSeconds: number\n private readonly transactionScope = new AsyncLocalStorage<boolean>()\n\n constructor(options: PostgresStorageOptions) {\n this.schemaName = options.schemaName ?? \"sixb\"\n this.shutdownTimeoutSeconds = Math.max(\n 1,\n Math.round((options.shutdownTimeoutMillis ?? 5000) / 1000)\n )\n\n this.sql = createPgClient({\n ...(options.connectionString !== undefined\n ? { connectionString: options.connectionString }\n : {}),\n ...(options.host !== undefined ? { host: options.host } : {}),\n ...(options.port !== undefined ? { port: options.port } : {}),\n ...(options.database !== undefined ? { database: options.database } : {}),\n ...(options.user !== undefined ? { user: options.user } : {}),\n ...(options.password !== undefined ? { password: options.password } : {}),\n max: options.max ?? 10,\n schemaName: this.schemaName,\n ...(options.idleTimeoutMillis !== undefined\n ? { idleTimeoutMillis: options.idleTimeoutMillis }\n : {}),\n ...(resolveTimeoutMillis(options.statementTimeoutMillis, \"statementTimeoutMillis\") !==\n undefined\n ? { statementTimeoutMillis: options.statementTimeoutMillis }\n : {}),\n ...(resolveTimeoutMillis(\n options.idleInTransactionSessionTimeoutMillis,\n \"idleInTransactionSessionTimeoutMillis\"\n ) !== undefined\n ? { idleInTransactionSessionTimeoutMillis: options.idleInTransactionSessionTimeoutMillis }\n : {}),\n ...(resolveTimeoutMillis(options.connectTimeoutMillis, \"connectTimeoutMillis\") !== undefined\n ? { connectTimeoutMillis: options.connectTimeoutMillis }\n : {}),\n ...(options.prepare !== undefined ? { prepare: options.prepare } : {}),\n ...(options.ssl !== undefined ? { ssl: options.ssl } : {}),\n })\n\n this.migrators = createPostgresStorageMigrators(this.sql, this.schemaName)\n const stores = createPostgresStores(this.sql, {\n runOntologyOperation: (run) => runPgTransaction(this.sql, run),\n transactionContext: null,\n })\n const scope = createStorageOperationScope(\n async (run) => {\n this.assertRootOperationAvailable()\n return run()\n },\n () => this.assertRootOperationAvailable()\n )\n this.objects = createObjectOperationScope(stores.objects, scope)\n this.ontology = createOntologyOperationScope(stores.ontology, scope)\n this.auth = createAuthOperationScope(stores.auth, scope)\n this.executions = createOperationScopedFacade(stores.executions, scope)\n this.agents = createAgentOperationScope(stores.agents, scope)\n this.aiUsage = createOperationScopedFacade(stores.aiUsage, scope)\n this.aiCosts = createOperationScopedFacade(stores.aiCosts, scope)\n this.aiLimits = createOperationScopedFacade(stores.aiLimits, scope)\n this.actionRuns = createOperationScopedFacade(stores.actionRuns, scope)\n this.pipelineRuns = createOperationScopedFacade(stores.pipelineRuns, scope)\n this.workflowRuns = createWorkflowRunOperationScope(stores.workflowRuns, scope)\n this.workflowInterventions = createOperationScopedFacade(stores.workflowInterventions, scope)\n this.syncRuns = createOperationScopedFacade(stores.syncRuns, scope)\n this.projectionRuns = createOperationScopedFacade(stores.projectionRuns, scope)\n this.timeseries = createOperationScopedFacade(stores.timeseries, scope)\n this.webhookRuns = createOperationScopedFacade(stores.webhookRuns, scope)\n this.rules = createOperationScopedFacade(stores.rules, scope)\n this.connectorConnections = createOperationScopedFacade(stores.connectorConnections, scope)\n this.shareGrants = createOperationScopedFacade(stores.shareGrants, scope)\n this.shareSessions = createOperationScopedFacade(stores.shareSessions, scope)\n this.fileUploadSessions = createOperationScopedFacade(stores.fileUploadSessions, scope)\n registerPostgresStorageTestingAdapter(this, (durationMs) =>\n stores.connectorConnections.advanceTimeForTesting(durationMs)\n )\n }\n\n async ping(): Promise<void> {\n this.assertRootOperationAvailable()\n await this.sql`SELECT 1`\n }\n\n async transaction<T>(\n run: (tx: Storage) => Promise<T> | T,\n options: StorageTransactionOptions = {}\n ): Promise<T> {\n if (this.transactionScope.getStore()) {\n throwNestedStorageTransaction()\n }\n\n try {\n return await runPgTransaction(\n this.sql,\n async (client) => {\n let active = true\n const transactionContext: PgOntologyTransactionContext = {\n id: {},\n materializations: new ProviderMaterializationTransactionLifecycle(),\n active: true,\n }\n const txStorage = this.createTransactionStorage(client, transactionContext)\n const tx = createTransactionStorageProxy(txStorage, () => active)\n\n try {\n const result = await this.transactionScope.run(true, () => run(tx))\n transactionContext.materializations.assertCommittable()\n return result\n } finally {\n await txStorage.aiLimits.settleOperations()\n transactionContext.active = false\n txStorage.ontology.deactivateSessions()\n transactionContext.materializations.deactivate()\n active = false\n }\n },\n { isolation: options.isolation === \"serializable\" ? \"serializable\" : undefined }\n )\n } catch (error) {\n if (isRetryableTransactionConflict(error)) {\n throw new StorageTransactionError(\n \"[SixbPg] Storage transaction failed due to a serialization conflict or deadlock and may be retried.\",\n { cause: error, code: \"serialization_failure\" }\n )\n }\n throw error\n }\n }\n\n private assertRootOperationAvailable(): void {\n if (!this.transactionScope.getStore()) return\n throw new StorageTransactionError(\n \"[SixbPg] Root storage cannot be used inside a transaction callback; use the provided tx storage.\"\n )\n }\n\n /**\n * Close the connection pool. Should be called on shutdown.\n *\n * Stops accepting new queries and waits up to `shutdownTimeoutMillis` for in-flight\n * queries to finish before destroying connections.\n */\n async close(): Promise<void> {\n await this.sql.end({ timeout: this.shutdownTimeoutSeconds })\n }\n\n /**\n * Drop all Sixb tables and schema. Useful for test cleanup.\n * WARNING: This permanently deletes all data.\n */\n async dropSchema(): Promise<void> {\n await dropSchema(this.sql, this.schemaName)\n }\n\n private createTransactionStorage(\n client: PgStoreClient,\n transactionContext: PgOntologyTransactionContext\n ): Storage & { readonly ontology: PgOntologyStorage; readonly aiLimits: PgAiLimitStorage } {\n return {\n ...createPostgresStores(client, {\n runOntologyOperation: async (run) => run(client),\n transactionContext,\n }),\n ping: async () => {\n await client`SELECT 1`\n },\n transaction: async <T>(): Promise<T> => {\n throwNestedStorageTransaction()\n },\n }\n }\n}\n\nfunction createPostgresStores(\n sql: PgStoreClient,\n options: {\n readonly runOntologyOperation: <T>(run: (sql: SQLClient) => Promise<T>) => Promise<T>\n readonly transactionContext: PgOntologyTransactionContext | null\n }\n): PostgresStoreSet {\n const auth = new PgAuthStorage({ sql })\n const shareGrants = new PgShareGrantStorage(sql)\n const shareSessions = new PgShareSessionStorage(sql)\n const executions = new PgExecutionStorage(sql, auth, shareSessions)\n return {\n objects: new PgObjectStorage(sql),\n ontology: new PgOntologyStorage({\n sql,\n runRootOperation: options.runOntologyOperation,\n transactionContext: options.transactionContext,\n }),\n auth,\n executions,\n agents: new PgAgentStorage({ sql, executions }),\n aiUsage: new PgAiUsageStorage(sql),\n aiCosts: new PgAiCostStorage(sql),\n aiLimits: new PgAiLimitStorage(sql),\n actionRuns: new PgActionRunStorage(sql, executions),\n pipelineRuns: new PgPipelineRunStorage(sql, executions),\n workflowRuns: new PgWorkflowRunStorage(sql, executions),\n workflowInterventions: new PgWorkflowInterventionStorage(sql),\n syncRuns: new PgSyncRunStorage(sql, executions),\n projectionRuns: new PgProjectionRunStorage(sql, executions),\n timeseries: new PgTimeseriesStorage(sql),\n webhookRuns: new PgWebhookRunStorage(sql, executions),\n rules: new PgRulesStorage(sql),\n connectorConnections: new PgConnectorConnectionStorage(sql),\n shareGrants,\n shareSessions,\n fileUploadSessions: new PgFileUploadSessionStorage(sql),\n }\n}\n\ninterface PostgresStoreSet {\n readonly objects: PgObjectStorage\n readonly ontology: PgOntologyStorage\n readonly auth: PgAuthStorage\n readonly executions: PgExecutionStorage\n readonly agents: PgAgentStorage\n readonly aiUsage: PgAiUsageStorage\n readonly aiCosts: PgAiCostStorage\n readonly aiLimits: PgAiLimitStorage\n readonly actionRuns: PgActionRunStorage\n readonly pipelineRuns: PgPipelineRunStorage\n readonly workflowRuns: PgWorkflowRunStorage\n readonly workflowInterventions: PgWorkflowInterventionStorage\n readonly syncRuns: PgSyncRunStorage\n readonly projectionRuns: PgProjectionRunStorage\n readonly timeseries: PgTimeseriesStorage\n readonly webhookRuns: PgWebhookRunStorage\n readonly rules: PgRulesStorage\n readonly connectorConnections: PgConnectorConnectionStorage\n readonly shareGrants: PgShareGrantStorage\n readonly shareSessions: PgShareSessionStorage\n readonly fileUploadSessions: PgFileUploadSessionStorage\n}\n\nfunction resolveTimeoutMillis(value: number | undefined, label: string): number | undefined {\n if (value === undefined) {\n return undefined\n }\n\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`[Sixb] PostgresStorage ${label} must be a non-negative finite number.`)\n }\n\n return Math.trunc(value)\n}\n\nexport { migratePostgresStorage } from \"./migrations\"\n",
5
+ "/// <reference path=\"./sql.d.ts\" />\n// Keep SQL module declarations visible to downstream workspaces that typecheck this package from\n// source.\n\nimport { AsyncLocalStorage } from \"node:async_hooks\"\nimport type {\n MigrationCapableStorage,\n Storage,\n StorageMigrator,\n StorageTransactionOptions,\n} from \"@sixb/core\"\nimport { ProviderMaterializationTransactionLifecycle } from \"@sixb/core/internal/ontology-storage-provider\"\nimport {\n createTransactionStorageProxy,\n throwNestedStorageTransaction,\n} from \"@sixb/core/internal/storage\"\nimport {\n createAgentOperationScope,\n createAuthOperationScope,\n createObjectOperationScope,\n createOntologyOperationScope,\n createOperationScopedFacade,\n createStorageOperationScope,\n createWorkflowRunOperationScope,\n} from \"@sixb/core/internal/storage-operation-scope\"\nimport {\n type AiCostStorage,\n type AiLimitStorage,\n type AiUsageStorage,\n type ObjectQueryPreparationPlan,\n type ObjectQueryPreparationResult,\n type ObjectStorage,\n type QueryPreparationCapableStorage,\n StorageTransactionError,\n} from \"@sixb/core/storage\"\nimport { PgAgentStorage } from \"./agents\"\nimport { PgAuthStorage } from \"./auth-storage\"\nimport { PgConnectorConnectionStorage } from \"./connector-connection-storage\"\nimport { createPostgresStorageMigrators, dropSchema } from \"./migrations\"\nimport { PgObjectStorage } from \"./objects\"\nimport { preparePgObjectQueries } from \"./objects/prepare-queries\"\nimport { ensurePgObjectQueryIndexes, type PgObjectQueryIndex } from \"./objects/query-indexes\"\n\nexport type { PgObjectQueryIndex, PgObjectQueryIndexScope } from \"./objects/query-indexes\"\n\nimport { type PgObjectTextCountIndex, preparePgObjectTextCounts } from \"./objects/text-count-index\"\n\nexport type { PgObjectTextCountIndex } from \"./objects/text-count-index\"\n\nimport { PgOntologyStorage, type PgOntologyTransactionContext } from \"./ontology-storage\"\nimport { PgActionRunStorage } from \"./pg-action-run-storage\"\nimport { PgAiCostStorage } from \"./pg-ai-cost-storage\"\nimport { PgAiLimitStorage } from \"./pg-ai-limit-storage\"\nimport { PgAiUsageStorage } from \"./pg-ai-usage-storage\"\nimport { createPgClient, type SQL, type SQLClient } from \"./pg-client\"\nimport { PgExecutionStorage } from \"./pg-execution-storage\"\nimport { PgFileDownloadGrantStorage } from \"./pg-file-download-grant-storage\"\nimport { PgFileUploadSessionStorage } from \"./pg-file-upload-session-storage\"\nimport { PgPipelineRunStorage } from \"./pg-pipeline-run-storage\"\nimport { PgProjectionRunStorage } from \"./pg-projection-run-storage\"\nimport { PgRulesStorage } from \"./pg-rules-storage\"\nimport { PgSyncRunStorage } from \"./pg-sync-run-storage\"\nimport { PgTimeseriesStorage } from \"./pg-timeseries-storage\"\nimport { PgWebhookRunStorage } from \"./pg-webhook-run-storage\"\nimport { PgWorkflowInterventionStorage } from \"./pg-workflow-intervention-storage\"\nimport { PgWorkflowRunStorage } from \"./pg-workflow-run-storage\"\nimport { PgShareGrantStorage } from \"./share-grant-storage\"\nimport { PgShareSessionStorage } from \"./share-session-storage\"\nimport { isRetryableTransactionConflict } from \"./storage-errors\"\nimport { registerPostgresStorageTestingAdapter } from \"./testing\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport interface PostgresStorageOptions {\n /**\n * Full connection string (e.g. DATABASE_URL). Takes precedence over individual fields.\n *\n * Add `sslnegotiation=direct` (with `sslmode=require`, `verify-ca` or `verify-full`) to open TLS\n * directly, as libpq does against PostgreSQL 17 or later. It saves a round trip per connection\n * and avoids a Bun 1.4.0–1.4.2 bug that keeps in memory every byte read over a TLS connection\n * negotiated the classic way.\n */\n connectionString?: string\n\n /** PostgreSQL host. Defaults to 'localhost'. */\n host?: string\n /** PostgreSQL port. Defaults to 5432. */\n port?: number\n /** Database name. */\n database?: string\n /** Database user. */\n user?: string\n /** Database password. */\n password?: string\n\n /** Maximum number of connections in the pool. Defaults to 10. */\n max?: number\n /** Concurrent root count/facet calculations per instance; defaults to 1. */\n maxConcurrentAggregates?: number\n /** Idle connection timeout in milliseconds. Defaults to 30000. */\n idleTimeoutMillis?: number\n\n /**\n * Server-side `statement_timeout` (ms) applied to every connection in the pool. A query\n * exceeding it is cancelled by PostgreSQL, which frees its pooled connection instead of\n * pinning it indefinitely. Without this, a single stalled query can starve a small pool\n * until the process is restarted. Unset by default (no timeout). Set per role — keep it\n * generous or unset for workers that run long migrations/bulk writes.\n */\n statementTimeoutMillis?: number\n /**\n * Server-side `idle_in_transaction_session_timeout` (ms) applied to every connection. A\n * transaction left open and idle beyond it is aborted by PostgreSQL, releasing the\n * connection. Unset by default (no timeout).\n */\n idleInTransactionSessionTimeoutMillis?: number\n\n /**\n * Grace period (ms) for {@link PostgresStorage.close}. On shutdown the pool stops\n * accepting new queries and waits up to this long for in-flight queries to finish before\n * destroying the connections, so a restart drains cleanly instead of severing live work.\n * Defaults to 5000.\n */\n shutdownTimeoutMillis?: number\n\n /** Seconds to wait when establishing a connection. Defaults to 10000. */\n connectTimeoutMillis?: number\n /**\n * Whether to use server-side prepared statements (porsager's default, faster against a\n * direct Postgres connection). Behind PgBouncer transaction mode they require PgBouncer\n * >= 1.21 with `max_prepared_statements > 0`; set `false` for an older PgBouncer or when\n * that setting is 0. Defaults to `true`.\n */\n prepare?: boolean\n\n /** PostgreSQL schema name for all Sixb tables. Defaults to 'sixb'. */\n schemaName?: string\n\n /** SSL configuration. */\n ssl?: boolean | \"require\" | \"prefer\"\n}\n\n/**\n * PostgreSQL storage provider for Sixb.\n *\n * Bundles Sixb storage adapters, including the AI accounting ledger, behind a shared PostgreSQL\n * connection pool (porsager `postgres`), which reliably reclaims connections under load.\n *\n * The storage exposes a core `StorageMigrator`. Sixb CLI startup and\n * `sixb db migrate` run it automatically through `migrateStorage(storage)`.\n *\n * Usage:\n * ```ts\n * const pg = new PostgresStorage({\n * connectionString: process.env.DATABASE_URL!,\n * })\n *\n * export const sixb = createSixb({\n * broker: myBroker,\n * storage: pg,\n * })\n * ```\n */\nexport class PostgresStorage implements MigrationCapableStorage, QueryPreparationCapableStorage {\n readonly objects: ObjectStorage\n readonly ontology: PgOntologyStorage\n readonly auth: PgAuthStorage\n readonly executions: PgExecutionStorage\n readonly agents: PgAgentStorage\n readonly aiUsage: AiUsageStorage\n readonly aiCosts: AiCostStorage\n readonly aiLimits: AiLimitStorage\n readonly actionRuns: PgActionRunStorage\n readonly pipelineRuns: PgPipelineRunStorage\n readonly workflowRuns: PgWorkflowRunStorage\n readonly workflowInterventions: PgWorkflowInterventionStorage\n readonly syncRuns: PgSyncRunStorage\n readonly projectionRuns: PgProjectionRunStorage\n readonly timeseries: Storage[\"timeseries\"]\n readonly webhookRuns: PgWebhookRunStorage\n readonly rules: PgRulesStorage\n readonly connectorConnections: PgConnectorConnectionStorage\n readonly shareGrants: PgShareGrantStorage\n readonly shareSessions: PgShareSessionStorage\n readonly fileUploadSessions: PgFileUploadSessionStorage\n readonly fileDownloadGrants: PgFileDownloadGrantStorage\n readonly migrators: readonly StorageMigrator[]\n\n private readonly sql: SQL\n private readonly schemaName: string\n private readonly shutdownTimeoutSeconds: number\n private readonly transactionScope = new AsyncLocalStorage<boolean>()\n\n constructor(options: PostgresStorageOptions) {\n if (\n options.maxConcurrentAggregates !== undefined &&\n (!Number.isSafeInteger(options.maxConcurrentAggregates) ||\n options.maxConcurrentAggregates < 1)\n )\n throw new Error(\"[SixbPg] maxConcurrentAggregates must be a positive integer\")\n this.schemaName = options.schemaName ?? \"sixb\"\n this.shutdownTimeoutSeconds = Math.max(\n 1,\n Math.round((options.shutdownTimeoutMillis ?? 5000) / 1000)\n )\n\n this.sql = createPgClient({\n ...(options.connectionString !== undefined\n ? { connectionString: options.connectionString }\n : {}),\n ...(options.host !== undefined ? { host: options.host } : {}),\n ...(options.port !== undefined ? { port: options.port } : {}),\n ...(options.database !== undefined ? { database: options.database } : {}),\n ...(options.user !== undefined ? { user: options.user } : {}),\n ...(options.password !== undefined ? { password: options.password } : {}),\n max: options.max ?? 10,\n schemaName: this.schemaName,\n ...(options.idleTimeoutMillis !== undefined\n ? { idleTimeoutMillis: options.idleTimeoutMillis }\n : {}),\n ...(resolveTimeoutMillis(options.statementTimeoutMillis, \"statementTimeoutMillis\") !==\n undefined\n ? { statementTimeoutMillis: options.statementTimeoutMillis }\n : {}),\n ...(resolveTimeoutMillis(\n options.idleInTransactionSessionTimeoutMillis,\n \"idleInTransactionSessionTimeoutMillis\"\n ) !== undefined\n ? { idleInTransactionSessionTimeoutMillis: options.idleInTransactionSessionTimeoutMillis }\n : {}),\n ...(resolveTimeoutMillis(options.connectTimeoutMillis, \"connectTimeoutMillis\") !== undefined\n ? { connectTimeoutMillis: options.connectTimeoutMillis }\n : {}),\n ...(options.prepare !== undefined ? { prepare: options.prepare } : {}),\n ...(options.ssl !== undefined ? { ssl: options.ssl } : {}),\n })\n\n this.migrators = createPostgresStorageMigrators(this.sql, this.schemaName)\n const stores = createPostgresStores(this.sql, {\n maxConcurrentAggregates: options.maxConcurrentAggregates,\n runOntologyOperation: (run) => runPgTransaction(this.sql, run),\n transactionContext: null,\n })\n const scope = createStorageOperationScope(\n async (run) => {\n this.assertRootOperationAvailable()\n return run()\n },\n () => this.assertRootOperationAvailable()\n )\n this.objects = createObjectOperationScope(stores.objects, scope)\n this.ontology = createOntologyOperationScope(stores.ontology, scope)\n this.auth = createAuthOperationScope(stores.auth, scope)\n this.executions = createOperationScopedFacade(stores.executions, scope)\n this.agents = createAgentOperationScope(stores.agents, scope)\n this.aiUsage = createOperationScopedFacade(stores.aiUsage, scope)\n this.aiCosts = createOperationScopedFacade(stores.aiCosts, scope)\n this.aiLimits = createOperationScopedFacade(stores.aiLimits, scope)\n this.actionRuns = createOperationScopedFacade(stores.actionRuns, scope)\n this.pipelineRuns = createOperationScopedFacade(stores.pipelineRuns, scope)\n this.workflowRuns = createWorkflowRunOperationScope(stores.workflowRuns, scope)\n this.workflowInterventions = createOperationScopedFacade(stores.workflowInterventions, scope)\n this.syncRuns = createOperationScopedFacade(stores.syncRuns, scope)\n this.projectionRuns = createOperationScopedFacade(stores.projectionRuns, scope)\n this.timeseries = createOperationScopedFacade(stores.timeseries, scope)\n this.webhookRuns = createOperationScopedFacade(stores.webhookRuns, scope)\n this.rules = createOperationScopedFacade(stores.rules, scope)\n this.connectorConnections = createOperationScopedFacade(stores.connectorConnections, scope)\n this.shareGrants = createOperationScopedFacade(stores.shareGrants, scope)\n this.shareSessions = createOperationScopedFacade(stores.shareSessions, scope)\n this.fileUploadSessions = createOperationScopedFacade(stores.fileUploadSessions, scope)\n this.fileDownloadGrants = createOperationScopedFacade(stores.fileDownloadGrants, scope)\n registerPostgresStorageTestingAdapter(this, (durationMs) =>\n stores.connectorConnections.advanceTimeForTesting(durationMs)\n )\n }\n\n async ping(): Promise<void> {\n this.assertRootOperationAvailable()\n await this.sql`SELECT 1`\n }\n\n async transaction<T>(\n run: (tx: Storage) => Promise<T> | T,\n options: StorageTransactionOptions = {}\n ): Promise<T> {\n if (this.transactionScope.getStore()) {\n throwNestedStorageTransaction()\n }\n\n try {\n return await runPgTransaction(\n this.sql,\n async (client) => {\n let active = true\n const transactionContext: PgOntologyTransactionContext = {\n id: {},\n materializations: new ProviderMaterializationTransactionLifecycle(),\n active: true,\n }\n const txStorage = this.createTransactionStorage(client, transactionContext)\n const tx = createTransactionStorageProxy(txStorage, () => active)\n\n try {\n const result = await this.transactionScope.run(true, () => run(tx))\n transactionContext.materializations.assertCommittable()\n return result\n } finally {\n await txStorage.aiLimits.settleOperations()\n transactionContext.active = false\n txStorage.ontology.deactivateSessions()\n transactionContext.materializations.deactivate()\n active = false\n }\n },\n { isolation: options.isolation === \"serializable\" ? \"serializable\" : undefined }\n )\n } catch (error) {\n if (isRetryableTransactionConflict(error)) {\n throw new StorageTransactionError(\n \"[SixbPg] Storage transaction failed due to a serialization conflict or deadlock and may be retried.\",\n { cause: error, code: \"serialization_failure\" }\n )\n }\n throw error\n }\n }\n\n async prepareObjectQueries(\n plan: ObjectQueryPreparationPlan\n ): Promise<ObjectQueryPreparationResult> {\n this.assertRootOperationAvailable()\n return preparePgObjectQueries(this.sql, this.schemaName, plan)\n }\n\n /** Build workload-specific indexes concurrently, after migrations, outside transactions. */\n async ensureObjectQueryIndexes(\n indexes: readonly PgObjectQueryIndex[]\n ): Promise<readonly string[]> {\n this.assertRootOperationAvailable()\n return ensurePgObjectQueryIndexes(this.sql, this.schemaName, indexes)\n }\n\n /** Offline maintenance: STORED columns rewrite the objects table before concurrent index builds. */\n async prepareObjectTextCounts(\n indexes: readonly PgObjectTextCountIndex[]\n ): Promise<readonly string[]> {\n this.assertRootOperationAvailable()\n return preparePgObjectTextCounts(this.sql, this.schemaName, indexes)\n }\n\n private assertRootOperationAvailable(): void {\n if (!this.transactionScope.getStore()) return\n throw new StorageTransactionError(\n \"[SixbPg] Root storage cannot be used inside a transaction callback; use the provided tx storage.\"\n )\n }\n\n /**\n * Close the connection pool. Should be called on shutdown.\n *\n * Stops accepting new queries and waits up to `shutdownTimeoutMillis` for in-flight\n * queries to finish before destroying connections.\n */\n async close(): Promise<void> {\n await this.sql.end({ timeout: this.shutdownTimeoutSeconds })\n }\n\n /**\n * Drop all Sixb tables and schema. Useful for test cleanup.\n * WARNING: This permanently deletes all data.\n */\n async dropSchema(): Promise<void> {\n await dropSchema(this.sql, this.schemaName)\n }\n\n private createTransactionStorage(\n client: PgStoreClient,\n transactionContext: PgOntologyTransactionContext\n ): Storage & { readonly ontology: PgOntologyStorage; readonly aiLimits: PgAiLimitStorage } {\n return {\n ...createPostgresStores(client, {\n runOntologyOperation: async (run) => run(client),\n transactionContext,\n }),\n ping: async () => {\n await client`SELECT 1`\n },\n transaction: async <T>(): Promise<T> => {\n throwNestedStorageTransaction()\n },\n }\n }\n}\n\nfunction createPostgresStores(\n sql: PgStoreClient,\n options: {\n readonly runOntologyOperation: <T>(run: (sql: SQLClient) => Promise<T>) => Promise<T>\n readonly transactionContext: PgOntologyTransactionContext | null\n readonly maxConcurrentAggregates?: number\n }\n): PostgresStoreSet {\n const auth = new PgAuthStorage({ sql })\n const shareGrants = new PgShareGrantStorage(sql)\n const shareSessions = new PgShareSessionStorage(sql)\n const executions = new PgExecutionStorage(sql, auth, shareSessions)\n return {\n objects: new PgObjectStorage(sql, options.maxConcurrentAggregates),\n ontology: new PgOntologyStorage({\n sql,\n runRootOperation: options.runOntologyOperation,\n transactionContext: options.transactionContext,\n }),\n auth,\n executions,\n agents: new PgAgentStorage({ sql, executions }),\n aiUsage: new PgAiUsageStorage(sql),\n aiCosts: new PgAiCostStorage(sql),\n aiLimits: new PgAiLimitStorage(sql),\n actionRuns: new PgActionRunStorage(sql, executions),\n pipelineRuns: new PgPipelineRunStorage(sql, executions),\n workflowRuns: new PgWorkflowRunStorage(sql, executions),\n workflowInterventions: new PgWorkflowInterventionStorage(sql),\n syncRuns: new PgSyncRunStorage(sql, executions),\n projectionRuns: new PgProjectionRunStorage(sql, executions),\n timeseries: new PgTimeseriesStorage(sql),\n webhookRuns: new PgWebhookRunStorage(sql, executions),\n rules: new PgRulesStorage(sql),\n connectorConnections: new PgConnectorConnectionStorage(sql),\n shareGrants,\n shareSessions,\n fileUploadSessions: new PgFileUploadSessionStorage(sql),\n fileDownloadGrants: new PgFileDownloadGrantStorage(sql),\n }\n}\n\ninterface PostgresStoreSet {\n readonly objects: PgObjectStorage\n readonly ontology: PgOntologyStorage\n readonly auth: PgAuthStorage\n readonly executions: PgExecutionStorage\n readonly agents: PgAgentStorage\n readonly aiUsage: PgAiUsageStorage\n readonly aiCosts: PgAiCostStorage\n readonly aiLimits: PgAiLimitStorage\n readonly actionRuns: PgActionRunStorage\n readonly pipelineRuns: PgPipelineRunStorage\n readonly workflowRuns: PgWorkflowRunStorage\n readonly workflowInterventions: PgWorkflowInterventionStorage\n readonly syncRuns: PgSyncRunStorage\n readonly projectionRuns: PgProjectionRunStorage\n readonly timeseries: PgTimeseriesStorage\n readonly webhookRuns: PgWebhookRunStorage\n readonly rules: PgRulesStorage\n readonly connectorConnections: PgConnectorConnectionStorage\n readonly shareGrants: PgShareGrantStorage\n readonly shareSessions: PgShareSessionStorage\n readonly fileUploadSessions: PgFileUploadSessionStorage\n readonly fileDownloadGrants: PgFileDownloadGrantStorage\n}\n\nfunction resolveTimeoutMillis(value: number | undefined, label: string): number | undefined {\n if (value === undefined) {\n return undefined\n }\n\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`[Sixb] PostgresStorage ${label} must be a non-negative finite number.`)\n }\n\n return Math.trunc(value)\n}\n\nexport { migratePostgresStorage } from \"./migrations\"\n",
6
6
  "import {\n agentContextCheckpointMatchesCreateInput,\n assertAgentContextCheckpointAnchors,\n assertAgentContextCheckpointAuthority,\n assertAgentContextCheckpointReplayState,\n assertCreateAgentContextCheckpointInput,\n} from \"@sixb/core/internal/agent-run-storage-provider\"\nimport {\n type AgentContextCheckpointRecord,\n type AgentContextCheckpointStore,\n AgentStorageError,\n type CreateAgentContextCheckpointInput,\n} from \"@sixb/core/storage\"\nimport { isUniqueViolation } from \"../storage-errors\"\nimport { type PgStoreClient, runPgTransaction } from \"../transactions\"\nimport {\n type AgentContextCheckpointRow,\n type AgentMessageRow,\n type AgentRunRow,\n type AgentThreadRow,\n rowToContextCheckpointRecord,\n rowToMessageRecord,\n rowToRunRecord,\n rowToThreadRecord,\n} from \"./rows\"\n\nconst PG_CHECKPOINT_RUN_ID_BATCH_SIZE = 10_000\n\nexport class PgAgentContextCheckpointStore implements AgentContextCheckpointStore {\n constructor(private readonly sql: PgStoreClient) {}\n\n async create(input: CreateAgentContextCheckpointInput): Promise<AgentContextCheckpointRecord> {\n assertCreateAgentContextCheckpointInput(input, \"SixbPg\")\n\n try {\n return await runPgTransaction(this.sql, async (tx) => {\n // Match run finalization's lock order (run, then thread) to avoid a cross-operation deadlock.\n const [runRow] = await tx<AgentRunRow[]>`\n SELECT * FROM agent_runs\n WHERE project_id = ${input.projectId} AND id = ${input.createdByRunId}\n FOR UPDATE\n `\n const [threadRow] = await tx<AgentThreadRow[]>`\n SELECT * FROM agent_threads\n WHERE project_id = ${input.projectId} AND id = ${input.threadId}\n FOR UPDATE\n `\n assertAgentContextCheckpointAuthority({\n create: input,\n run: runRow ? rowToRunRecord(runRow) : null,\n thread: threadRow ? rowToThreadRecord(threadRow) : null,\n prefix: \"SixbPg\",\n })\n\n const [latestRow] = await tx<AgentContextCheckpointRow[]>`\n SELECT * FROM agent_context_checkpoints\n WHERE project_id = ${input.projectId} AND thread_id = ${input.threadId}\n ORDER BY summarized_through_seq DESC, created_at DESC, id DESC\n LIMIT 1\n `\n const latest = latestRow ? rowToContextCheckpointRecord(latestRow) : null\n const [headRow] = await tx<{ seq: number | string }[]>`\n SELECT COALESCE(MAX(seq), 0) AS seq FROM agent_messages\n WHERE project_id = ${input.projectId} AND thread_id = ${input.threadId}\n `\n const headSeq = Number(headRow?.seq ?? 0)\n\n const [existingForRunRow] = await tx<AgentContextCheckpointRow[]>`\n SELECT * FROM agent_context_checkpoints\n WHERE project_id = ${input.projectId} AND created_by_run_id = ${input.createdByRunId}\n `\n if (existingForRunRow) {\n const record = rowToContextCheckpointRecord(existingForRunRow)\n if (agentContextCheckpointMatchesCreateInput(record, input)) {\n assertAgentContextCheckpointReplayState({\n create: input,\n existing: record,\n latest,\n headSeq,\n prefix: \"SixbPg\",\n })\n return record\n }\n throw new AgentStorageError(\n \"invalid_state\",\n `[SixbPg] Agent run '${input.createdByRunId}' already created a different context checkpoint.`\n )\n }\n\n const [duplicateId] = await tx<{ present: number }[]>`\n SELECT 1 AS present FROM agent_context_checkpoints\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n if (duplicateId) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[SixbPg] Agent context checkpoint '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const [firstRetainedRow] = await tx<AgentMessageRow[]>`\n SELECT * FROM agent_messages\n WHERE\n project_id = ${input.projectId}\n AND thread_id = ${input.threadId}\n AND seq > ${input.summarizedThroughSeq}\n ORDER BY seq ASC\n LIMIT 1\n `\n assertAgentContextCheckpointAnchors({\n create: input,\n latest,\n headSeq,\n firstRetained: firstRetainedRow ? rowToMessageRecord(firstRetainedRow) : null,\n prefix: \"SixbPg\",\n })\n\n const [row] = await tx<AgentContextCheckpointRow[]>`\n INSERT INTO agent_context_checkpoints (\n project_id,\n id,\n thread_id,\n created_by_run_id,\n previous_checkpoint_id,\n reason,\n summary,\n summary_format_version,\n summarized_through_seq,\n observed_head_seq,\n estimated_input_tokens_before,\n estimated_input_tokens_after,\n summary_model_id,\n created_at\n ) VALUES (\n ${input.projectId},\n ${input.id},\n ${input.threadId},\n ${input.createdByRunId},\n ${input.expectedPreviousCheckpointId},\n ${input.reason},\n ${input.summary},\n ${input.summaryFormatVersion},\n ${input.summarizedThroughSeq},\n ${input.observedHeadSeq},\n ${input.estimatedInputTokensBefore},\n ${input.estimatedInputTokensAfter},\n ${input.summaryModelId},\n ${input.createdAt ?? new Date()}\n )\n RETURNING *\n `\n return rowToContextCheckpointRecord(row)\n })\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[SixbPg] Agent context checkpoint '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n throw error\n }\n }\n\n async getLatest(input: {\n readonly projectId: string\n readonly threadId: string\n }): Promise<AgentContextCheckpointRecord | null> {\n const [row] = await this.sql<AgentContextCheckpointRow[]>`\n SELECT * FROM agent_context_checkpoints\n WHERE project_id = ${input.projectId} AND thread_id = ${input.threadId}\n ORDER BY summarized_through_seq DESC, created_at DESC, id DESC\n LIMIT 1\n `\n return row ? rowToContextCheckpointRecord(row) : null\n }\n\n async getByRunIds(input: {\n readonly projectId: string\n readonly runIds: readonly string[]\n }): Promise<readonly AgentContextCheckpointRecord[]> {\n const runIds = [...new Set(input.runIds)]\n if (runIds.length === 0) return []\n\n const rows: AgentContextCheckpointRow[] = []\n for (let offset = 0; offset < runIds.length; offset += PG_CHECKPOINT_RUN_ID_BATCH_SIZE) {\n const batch = runIds.slice(offset, offset + PG_CHECKPOINT_RUN_ID_BATCH_SIZE)\n const placeholders = batch.map((_, index) => `$${index + 2}`).join(\", \")\n rows.push(\n ...(await this.sql.unsafe<AgentContextCheckpointRow[]>(\n `SELECT * FROM agent_context_checkpoints WHERE project_id = $1 AND created_by_run_id IN (${placeholders})`,\n [input.projectId, ...batch]\n ))\n )\n }\n const byRunId = new Map(\n rows.map((row) => [row.created_by_run_id, rowToContextCheckpointRecord(row)] as const)\n )\n return runIds.flatMap((runId) => {\n const checkpoint = byRunId.get(runId)\n return checkpoint ? [checkpoint] : []\n })\n }\n}\n",
7
7
  "import { createSixbError } from \"@sixb/core/internal/errors\"\n\n// Map thrown errors to their PostgreSQL/porsager meaning by code rather than by matching\n// message text. Database errors arrive in the native Postgres format with a SQLSTATE on\n// `.code` and the server's `severity`; connection-layer failures arrive with porsager's own\n// codes or the socket's system error code.\n\n/** PostgreSQL SQLSTATE for a unique-constraint violation. */\nconst UNIQUE_VIOLATION = \"23505\"\nconst FOREIGN_KEY_VIOLATION = \"23503\"\n\n/**\n * PostgreSQL SQLSTATEs in class 40 (transaction rollback) that are transient and safe to retry by\n * replaying the whole transaction: `40001` (serialization_failure) and `40P01` (deadlock_detected).\n * Under `SERIALIZABLE` the server raises *either* — a serialization anomaly surfaces as `40001`,\n * while two transactions taking row locks in crossing order surface as `40P01` — and both clear on\n * a fresh attempt. The other class-40 codes (`40002` integrity-constraint violation, `40003`\n * statement-completion unknown) are deliberately excluded: they are not safe to blindly replay.\n */\nconst RETRYABLE_TRANSACTION_CONFLICT_CODES = new Set([\"40001\", \"40P01\"])\n\n/**\n * Codes that mean the connection itself is gone, not that a statement failed: porsager's own codes\n * for a connection that closed under a query or that the pool destroyed, and the socket errors a\n * live connection can die with. Connect-time failures (`ECONNREFUSED`, `CONNECT_TIMEOUT`, ...) are\n * left out on purpose: they reject before any session exists, so there is nothing to give up.\n */\nconst CONNECTION_LOST_CODES = new Set([\n \"CONNECTION_CLOSED\",\n \"CONNECTION_DESTROYED\",\n \"ECONNRESET\",\n \"EPIPE\",\n \"ETIMEDOUT\",\n])\n\n/**\n * Codes of a connection that could not be opened: refused, unresolvable, unreachable, or not\n * answered in time. A server that accepts the socket and then refuses the session (too many\n * connections, starting up) answers with a `FATAL` error, which `isConnectionLost` covers.\n */\nconst CONNECT_FAILED_CODES = new Set([\n \"CONNECT_TIMEOUT\",\n \"ECONNREFUSED\",\n \"ENOTFOUND\",\n \"EAI_AGAIN\",\n \"EHOSTUNREACH\",\n \"ENETUNREACH\",\n])\n\n/**\n * The shared lock tables PostgreSQL can fill, keyed by the setting its hint names. Both raise\n * SQLSTATE 53200 (`out_of_memory`) with the message \"out of shared memory\", which reads like the\n * server ran out of RAM; the hint is the only part that says which table filled up.\n */\nconst LOCK_TABLES = [\n {\n setting: \"max_pred_locks_per_transaction\",\n table: \"predicate lock table\",\n note:\n \" A long serializable transaction also keeps the predicate locks of every serializable\" +\n \" transaction that commits while it is open.\",\n },\n { setting: \"max_locks_per_transaction\", table: \"lock table\", note: \"\" },\n] as const\n\nconst OUT_OF_MEMORY = \"53200\"\n\n/** The SQLSTATE / system error code carried by a thrown database or connection error. */\nexport function pgErrorCode(error: unknown): string | undefined {\n if (error instanceof Error) {\n const code = (error as { readonly code?: unknown }).code\n if (typeof code === \"string\") {\n return code\n }\n }\n return undefined\n}\n\n/** True when the error is a PostgreSQL unique-constraint violation (SQLSTATE 23505). */\nexport function isUniqueViolation(error: unknown): boolean {\n return pgErrorCode(error) === UNIQUE_VIOLATION\n}\n\n/** True when the error is a PostgreSQL foreign-key violation (SQLSTATE 23503). */\nexport function isForeignKeyViolation(error: unknown): boolean {\n return pgErrorCode(error) === FOREIGN_KEY_VIOLATION\n}\n\n/**\n * True when the error is a transient transaction-rollback conflict that is safe to retry by\n * replaying the transaction — a serialization failure (SQLSTATE 40001) or a deadlock (40P01).\n * See {@link RETRYABLE_TRANSACTION_CONFLICT_CODES}.\n */\nexport function isRetryableTransactionConflict(error: unknown): boolean {\n const code = pgErrorCode(error)\n return code !== undefined && RETRYABLE_TRANSACTION_CONFLICT_CODES.has(code)\n}\n\n/**\n * True when the error means the session is gone: PostgreSQL has already rolled back its open\n * transaction and released its locks, and nothing more may be sent on that connection.\n *\n * PostgreSQL ends the session after every `FATAL` or `PANIC` error — `pg_terminate_backend` (57P01),\n * a server shutdown (57P02), `idle_in_transaction_session_timeout` (25P03) — so the severity decides\n * rather than a list of SQLSTATEs.\n */\nexport function isConnectionLost(error: unknown): boolean {\n const code = pgErrorCode(error)\n if (code !== undefined && CONNECTION_LOST_CODES.has(code)) {\n return true\n }\n const severity =\n error instanceof Error ? (error as { readonly severity?: unknown }).severity : null\n return severity === \"FATAL\" || severity === \"PANIC\"\n}\n\n/**\n * Replace an error that says something about the database rather than the statement: a lost or\n * unopenable connection becomes the retryable `storage.unavailable`, a full lock table an error\n * naming the table and the setting that sizes it. Every other error is returned unchanged.\n */\nexport function explainPgError(error: unknown): unknown {\n if (isStorageUnavailable(error)) {\n return storageUnavailable(error)\n }\n if (!(error instanceof Error) || pgErrorCode(error) !== OUT_OF_MEMORY) {\n return error\n }\n const hint = (error as { readonly hint?: unknown }).hint\n const lockTable =\n typeof hint === \"string\" ? LOCK_TABLES.find(({ setting }) => hint.includes(setting)) : undefined\n if (!lockTable) {\n return error\n }\n\n const { setting, table, note } = lockTable\n return new Error(\n `[SixbPg] PostgreSQL aborted the transaction because its shared ${table} is full ` +\n `(SQLSTATE 53200 \"${error.message}\"). The table holds ${setting} × (max_connections + ` +\n `max_prepared_transactions) entries shared by all sessions.${note} Raise ${setting} ` +\n \"(applied at server restart) or shorten the transactions that overlap.\",\n { cause: error }\n )\n}\n\nfunction isStorageUnavailable(error: unknown): boolean {\n const code = pgErrorCode(error)\n return isConnectionLost(error) || (code !== undefined && CONNECT_FAILED_CODES.has(code))\n}\n\n/**\n * Whether a lost connection's transaction committed is unknown when the loss interrupted its\n * COMMIT, so the message does not say it rolled back. Retrying is still safe for Sixb's own\n * writes: each is fenced or idempotent.\n */\nfunction storageUnavailable(error: unknown): Error {\n const code = pgErrorCode(error)\n const reason = error instanceof Error ? error.message : String(error)\n return createSixbError(\n \"storage.unavailable\",\n `[SixbPg] PostgreSQL is unavailable: the connection was lost or could not be opened (${code ?? \"no code\"}: ${reason}).`,\n { cause: error, ...(code === undefined ? {} : { details: { code } }) }\n )\n}\n",
8
- "import { createHash } from \"node:crypto\"\nimport type { ReservedSQL, SQL, SQLClient } from \"./pg-client\"\nimport { explainPgError, isConnectionLost } from \"./storage-errors\"\n\n// Why transactions are driven here instead of through porsager's `sql.begin`:\n//\n// postgres.js 3.4.9 writes to a connection without checking that its socket is still open. When\n// the server or the network drops a connection during a transaction, `sql.begin` answers the\n// failed statement by sending ROLLBACK on it; the write is deferred to `setImmediate` and throws\n// `null is not an object (evaluating 'socket.write')` there, outside any promise, which kills the\n// process. `reserve().release()` has the matching flaw: it hands the connection back to the pool\n// without looking at it, and the next query sent on it crashes the same way.\n//\n// Holding a reserved connection and sending BEGIN/COMMIT/ROLLBACK ourselves lets us act on the\n// loss first. PostgreSQL has already rolled the transaction back and ended the session, so nothing\n// more is sent on that connection and it is never released: the pool reconnects a closed\n// connection on its own. The upstream fix is porsager/postgres#1209; until a release carries it,\n// a connection that drops *between* two statements still crashes, because nothing reports the loss\n// before the next statement's deferred write.\n\nexport type PgStoreClient = SQL | SQLClient\n\nexport interface RunPgTransactionOptions {\n /** Open the transaction at an explicit isolation; omit for the server default. */\n readonly isolation?: \"repeatableRead\" | \"serializable\"\n}\n\ntype PgTransactionIsolation = \"unverifiedDefault\" | \"repeatableRead\" | \"serializable\"\n\n// The isolation level is folded into `BEGIN` rather than a separate `SET TRANSACTION`: one\n// round-trip instead of two, and the level takes effect before any statement of the transaction.\nconst BEGIN_STATEMENTS: Readonly<Record<PgTransactionIsolation, string>> = {\n unverifiedDefault: \"BEGIN\",\n repeatableRead: \"BEGIN ISOLATION LEVEL REPEATABLE READ\",\n serializable: \"BEGIN ISOLATION LEVEL SERIALIZABLE\",\n}\n\n/** Every client handed to a transaction callback; a reserved connection can never start one. */\nconst pgTransactionClients = new WeakSet<PgStoreClient>()\nconst activePgTransactions = new WeakMap<PgStoreClient, PgTransactionIsolation>()\n\nexport async function runPgTransaction<T>(\n sql: PgStoreClient,\n run: (tx: SQLClient) => Promise<T>,\n options: RunPgTransactionOptions = {}\n): Promise<T> {\n if (!canStartPgTransaction(sql)) {\n return run(sql)\n }\n\n const isolation = options.isolation ?? \"unverifiedDefault\"\n try {\n return await withReservedPgConnection(sql, (tx) => {\n pgTransactionClients.add(tx)\n return runPgTransactionOn(\n tx,\n async () => {\n activePgTransactions.set(tx, isolation)\n try {\n return await run(tx)\n } finally {\n activePgTransactions.delete(tx)\n }\n },\n isolation\n )\n })\n } catch (error) {\n throw explainPgError(error)\n }\n}\n\n/**\n * Hold one pool connection for `run`, and hand it back to the pool only while it is still usable.\n * A connection whose session is gone stays out of the pool, which replaces it on its own.\n */\nexport async function withReservedPgConnection<T>(\n sql: SQL,\n run: (connection: ReservedSQL) => Promise<T>\n): Promise<T> {\n const connection = await sql.reserve()\n let usable = true\n try {\n return await run(connection)\n } catch (error) {\n usable = !isConnectionLost(error)\n throw error\n } finally {\n if (usable) {\n connection.release()\n }\n }\n}\n\n/**\n * Run `run` inside one transaction on a reserved connection.\n *\n * PostgreSQL answers COMMIT with a `ROLLBACK` tag, not an error, when a statement of the\n * transaction failed and the callback caught that error and carried on. That outcome is surfaced\n * as an error: returning normally would report writes that were discarded.\n */\nexport async function runPgTransactionOn<T>(\n connection: ReservedSQL,\n run: () => Promise<T>,\n isolation: PgTransactionIsolation = \"unverifiedDefault\"\n): Promise<T> {\n await connection.unsafe(BEGIN_STATEMENTS[isolation])\n const result = await undoOnFailure(run, () => connection.unsafe(\"ROLLBACK\"))\n const commit = await connection.unsafe(\"COMMIT\")\n if (commit.command !== \"COMMIT\") {\n throw new Error(\n \"[SixbPg] PostgreSQL rolled the transaction back instead of committing it: a statement in it\" +\n \" failed and its error was caught without being rethrown. A failed statement aborts the\" +\n \" whole transaction, so let its error propagate out of the transaction callback.\"\n )\n }\n return result\n}\n\n/**\n * Run `run`; when it throws, first undo the session state it left on its connection (an open\n * transaction, a session lock), then rethrow. Nothing is undone when the connection itself was lost:\n * the server has already discarded that state, and anything more sent on it would crash\n * postgres.js (see the top of this file).\n */\nexport async function undoOnFailure<T>(\n run: () => Promise<T>,\n undo: () => Promise<unknown>\n): Promise<T> {\n try {\n return await run()\n } catch (error) {\n if (!isConnectionLost(error)) {\n await undo()\n }\n throw error\n }\n}\n\n/**\n * Run a multi-statement read against one proven PostgreSQL snapshot.\n *\n * A provider-owned repeatable-read or serializable transaction may be reused. An external\n * transaction client is rejected because postgres.js does not expose its current isolation.\n */\nexport async function runPgRepeatableReadTransaction<T>(\n sql: PgStoreClient,\n run: (tx: SQLClient) => Promise<T>\n): Promise<T> {\n if (canStartPgTransaction(sql)) {\n return runPgTransaction(sql, run, { isolation: \"repeatableRead\" })\n }\n\n const isolation = activePgTransactions.get(sql)\n if (isolation === \"repeatableRead\" || isolation === \"serializable\") {\n return run(sql)\n }\n\n throw new Error(\n '[SixbPg] Selected object reads cannot join an unverified PostgreSQL transaction. Use storage.transaction(..., { isolation: \"serializable\" }) when reading through tx.objects.'\n )\n}\n\nexport function authLockKey(kind: string, ...parts: readonly string[]): string {\n return [\"auth\", kind, ...parts].join(\":\")\n}\n\nexport async function lockAdvisoryKeys(sql: SQLClient, keys: readonly string[]): Promise<void> {\n const locks = [...new Set(keys)].sort().map(advisoryLockParts)\n if (locks.length === 0) return\n\n await sql`\n SELECT pg_advisory_xact_lock(locks.first_key, locks.second_key)\n FROM unnest(\n ${sql.array(locks.map(([first]) => first))}::integer[],\n ${sql.array(locks.map(([, second]) => second))}::integer[]\n ) WITH ORDINALITY AS locks(first_key, second_key, lock_order)\n ORDER BY locks.lock_order\n `\n}\n\nfunction advisoryLockParts(key: string): readonly [number, number] {\n const hash = createHash(\"sha256\").update(key).digest()\n return [hash.readInt32BE(0), hash.readInt32BE(4)]\n}\n\nfunction canStartPgTransaction(sql: PgStoreClient): sql is SQL {\n return (\n !pgTransactionClients.has(sql) &&\n typeof (sql as { readonly reserve?: unknown }).reserve === \"function\"\n )\n}\n",
8
+ "import { createHash } from \"node:crypto\"\nimport type { ReservedSQL, SQL, SQLClient } from \"./pg-client\"\nimport { explainPgError, isConnectionLost } from \"./storage-errors\"\n\n// Why transactions are driven here instead of through porsager's `sql.begin`:\n//\n// postgres.js 3.4.9 writes to a connection without checking that its socket is still open. When\n// the server or the network drops a connection during a transaction, `sql.begin` answers the\n// failed statement by sending ROLLBACK on it; the write is deferred to `setImmediate` and throws\n// `null is not an object (evaluating 'socket.write')` there, outside any promise, which kills the\n// process. `reserve().release()` has the matching flaw: it hands the connection back to the pool\n// without looking at it, and the next query sent on it crashes the same way.\n//\n// Holding a reserved connection and sending BEGIN/COMMIT/ROLLBACK ourselves lets us act on the\n// loss first. PostgreSQL has already rolled the transaction back and ended the session, so nothing\n// more is sent on that connection and it is never released: the pool reconnects a closed\n// connection on its own. The upstream fix is porsager/postgres#1209; until a release carries it,\n// a connection that drops *between* two statements still crashes, because nothing reports the loss\n// before the next statement's deferred write.\n\nexport type PgStoreClient = SQL | SQLClient\n\nexport interface RunPgTransactionOptions {\n /** Open the transaction at an explicit isolation; omit for the server default. */\n readonly isolation?: \"repeatableRead\" | \"serializable\"\n}\n\ntype PgTransactionIsolation = \"unverifiedDefault\" | \"repeatableRead\" | \"serializable\"\n\n// The isolation level is folded into `BEGIN` rather than a separate `SET TRANSACTION`: one\n// round-trip instead of two, and the level takes effect before any statement of the transaction.\nconst BEGIN_STATEMENTS: Readonly<Record<PgTransactionIsolation, string>> = {\n unverifiedDefault: \"BEGIN\",\n repeatableRead: \"BEGIN ISOLATION LEVEL REPEATABLE READ\",\n serializable: \"BEGIN ISOLATION LEVEL SERIALIZABLE\",\n}\n\n/** Every client handed to a transaction callback; a reserved connection can never start one. */\nconst pgTransactionClients = new WeakSet<PgStoreClient>()\nconst activePgTransactions = new WeakMap<PgStoreClient, PgTransactionIsolation>()\n\nexport async function runPgTransaction<T>(\n sql: PgStoreClient,\n run: (tx: SQLClient) => Promise<T>,\n options: RunPgTransactionOptions = {}\n): Promise<T> {\n if (!canStartPgTransaction(sql)) {\n return run(sql)\n }\n\n const isolation = options.isolation ?? \"unverifiedDefault\"\n try {\n return await withReservedPgConnection(sql, (tx) => {\n pgTransactionClients.add(tx)\n return runPgTransactionOn(\n tx,\n async () => {\n activePgTransactions.set(tx, isolation)\n try {\n return await run(tx)\n } finally {\n activePgTransactions.delete(tx)\n }\n },\n isolation\n )\n })\n } catch (error) {\n throw explainPgError(error)\n }\n}\n\n/**\n * Hold one pool connection for `run`, or reuse a caller-owned reserved connection.\n * Hand an owned connection back to the pool only while it is still usable.\n * A connection whose session is gone stays out of the pool, which replaces it on its own.\n */\nexport async function withReservedPgConnection<T>(\n sql: SQL | ReservedSQL,\n run: (connection: ReservedSQL) => Promise<T>\n): Promise<T> {\n if (!(\"reserve\" in sql)) return run(sql)\n const connection = await sql.reserve()\n let usable = true\n try {\n return await run(connection)\n } catch (error) {\n usable = !isConnectionLost(error)\n throw error\n } finally {\n if (usable) {\n connection.release()\n }\n }\n}\n\n/**\n * Run `run` inside one transaction on a reserved connection.\n *\n * PostgreSQL answers COMMIT with a `ROLLBACK` tag, not an error, when a statement of the\n * transaction failed and the callback caught that error and carried on. That outcome is surfaced\n * as an error: returning normally would report writes that were discarded.\n */\nexport async function runPgTransactionOn<T>(\n connection: ReservedSQL,\n run: () => Promise<T>,\n isolation: PgTransactionIsolation = \"unverifiedDefault\"\n): Promise<T> {\n await connection.unsafe(BEGIN_STATEMENTS[isolation])\n const result = await undoOnFailure(run, () => connection.unsafe(\"ROLLBACK\"))\n const commit = await connection.unsafe(\"COMMIT\")\n if (commit.command !== \"COMMIT\") {\n throw new Error(\n \"[SixbPg] PostgreSQL rolled the transaction back instead of committing it: a statement in it\" +\n \" failed and its error was caught without being rethrown. A failed statement aborts the\" +\n \" whole transaction, so let its error propagate out of the transaction callback.\"\n )\n }\n return result\n}\n\n/**\n * Run `run`; when it throws, first undo the session state it left on its connection (an open\n * transaction, a session lock), then rethrow. Nothing is undone when the connection itself was lost:\n * the server has already discarded that state, and anything more sent on it would crash\n * postgres.js (see the top of this file).\n */\nexport async function undoOnFailure<T>(\n run: () => Promise<T>,\n undo: () => Promise<unknown>\n): Promise<T> {\n try {\n return await run()\n } catch (error) {\n if (!isConnectionLost(error)) {\n await undo()\n }\n throw error\n }\n}\n\n/**\n * Run a multi-statement read against one proven PostgreSQL snapshot.\n *\n * A provider-owned repeatable-read or serializable transaction may be reused. An external\n * transaction client is rejected because postgres.js does not expose its current isolation.\n */\nexport async function runPgRepeatableReadTransaction<T>(\n sql: PgStoreClient,\n run: (tx: SQLClient) => Promise<T>\n): Promise<T> {\n if (canStartPgTransaction(sql)) {\n return runPgTransaction(sql, run, { isolation: \"repeatableRead\" })\n }\n\n const isolation = activePgTransactions.get(sql)\n if (isolation === \"repeatableRead\" || isolation === \"serializable\") {\n return run(sql)\n }\n\n throw new Error(\n '[SixbPg] Selected object reads cannot join an unverified PostgreSQL transaction. Use storage.transaction(..., { isolation: \"serializable\" }) when reading through tx.objects.'\n )\n}\n\nexport function authLockKey(kind: string, ...parts: readonly string[]): string {\n return [\"auth\", kind, ...parts].join(\":\")\n}\n\nexport async function lockAdvisoryKeys(sql: SQLClient, keys: readonly string[]): Promise<void> {\n const locks = [...new Set(keys)].sort().map(advisoryLockParts)\n if (locks.length === 0) return\n\n await sql`\n SELECT pg_advisory_xact_lock(locks.first_key, locks.second_key)\n FROM unnest(\n ${sql.array(locks.map(([first]) => first))}::integer[],\n ${sql.array(locks.map(([, second]) => second))}::integer[]\n ) WITH ORDINALITY AS locks(first_key, second_key, lock_order)\n ORDER BY locks.lock_order\n `\n}\n\nfunction advisoryLockParts(key: string): readonly [number, number] {\n const hash = createHash(\"sha256\").update(key).digest()\n return [hash.readInt32BE(0), hash.readInt32BE(4)]\n}\n\n/** Whether `sql` already runs within a transaction, provider-owned or external. */\nexport function isWithinPgTransaction(sql: PgStoreClient): boolean {\n return !canStartPgTransaction(sql)\n}\n\nexport function canStartPgTransaction(sql: PgStoreClient): sql is SQL {\n return (\n !pgTransactionClients.has(sql) &&\n typeof (sql as { readonly reserve?: unknown }).reserve === \"function\"\n )\n}\n",
9
9
  "import type { AgentMessagePart, JsonValue, Principal } from \"@sixb/core\"\nimport { snapshotAgentThreadSandboxParams } from \"@sixb/core/internal/agent-run-storage-provider\"\nimport { parseSixbFailure } from \"@sixb/core/internal/errors\"\nimport {\n AGENT_RUN_FAILURE_CODES,\n type AgentContextCheckpointRecord,\n type AgentMessageRecord,\n type AgentRunDiagnostic,\n type AgentRunRecord,\n type AgentThreadRecord,\n type AgentThreadSandboxState,\n type ConversationAgentRunSpec,\n coerceAgentRunFinishReason,\n type SubagentRunResult,\n type SubagentRunSpec,\n} from \"@sixb/core/storage\"\nimport type { SQLClient, SqlParameter } from \"../pg-client\"\n\n// ── row shapes (porsager returns timestamptz as Date, jsonb parsed, int as number — typed loosely\n// to tolerate the string forms some drivers/poolers surface) ──────────────────────────────────\n\nexport interface AgentThreadRow {\n project_id: string\n id: string\n owner_principal_type: Principal[\"type\"]\n owner_principal_id: string\n title: string | null\n sandbox_params: JsonValue | string | null\n sandbox_state: AgentThreadSandboxState | string | null\n status: AgentThreadRecord[\"status\"]\n active_run_id: string | null\n last_message_at: Date | string | null\n message_count: number | string\n created_at: Date | string\n updated_at: Date | string\n}\n\nexport interface AgentRunRow {\n project_id: string\n id: string\n execution_id: string\n kind: AgentRunRecord[\"kind\"]\n thread_id: string | null\n trigger_message_id: string | null\n parent_run_id: string | null\n spawn_key: string | null\n spec: ConversationAgentRunSpec | SubagentRunSpec | string | null\n result: SubagentRunResult | string | null\n status: AgentRunRecord[\"status\"]\n model_id: string | null\n finish_reason: string | null\n error: JsonValue | null\n diagnostics: AgentRunDiagnostic[] | string | null\n attempt: number | string\n execution_token: string | null\n execution_queue_lease_expires_at: Date | string | null\n created_at: Date | string\n started_at: Date | string | null\n completed_at: Date | string | null\n}\n\nexport interface AgentMessageRow {\n project_id: string\n id: string\n thread_id: string\n run_id: string | null\n role: AgentMessageRecord[\"role\"]\n author_principal_type: Principal[\"type\"] | null\n author_principal_id: string | null\n seq: number | string\n parts: AgentMessagePart[] | string\n metadata: unknown\n content_version: number | string\n created_at: Date | string\n completed_at: Date | string | null\n}\n\nexport interface AgentContextCheckpointRow {\n project_id: string\n id: string\n thread_id: string\n created_by_run_id: string\n previous_checkpoint_id: string | null\n reason: AgentContextCheckpointRecord[\"reason\"]\n summary: string\n summary_format_version: number | string\n summarized_through_seq: number | string\n observed_head_seq: number | string\n estimated_input_tokens_before: number | string\n estimated_input_tokens_after: number | string\n summary_model_id: string\n created_at: Date | string\n}\n\n// ── row → record mappers ────────────────────────────────────────────────────────────────────────\n\nexport function rowToThreadRecord(row: AgentThreadRow): AgentThreadRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n ownerPrincipal: { type: row.owner_principal_type, id: row.owner_principal_id },\n title: row.title ?? undefined,\n ...(row.sandbox_state == null\n ? {}\n : {\n sandboxState:\n typeof row.sandbox_state === \"string\"\n ? JSON.parse(row.sandbox_state)\n : row.sandbox_state,\n }),\n ...(row.sandbox_params == null\n ? {}\n : {\n sandboxParams: snapshotAgentThreadSandboxParams(\n typeof row.sandbox_params === \"string\"\n ? JSON.parse(row.sandbox_params)\n : row.sandbox_params\n ),\n }),\n status: row.status,\n activeRunId: row.active_run_id,\n lastMessageAt: row.last_message_at ? new Date(row.last_message_at) : undefined,\n messageCount: Number(row.message_count),\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n }\n}\n\nexport function rowToRunRecord(row: AgentRunRow): AgentRunRecord {\n const base = {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n status: row.status,\n modelId: row.model_id ?? undefined,\n finishReason: coerceAgentRunFinishReason(row.finish_reason),\n error: row.error === null ? undefined : parseSixbFailure(row.error, AGENT_RUN_FAILURE_CODES),\n diagnostics: normalizeDiagnostics(row.diagnostics),\n attempt: Number(row.attempt),\n execution:\n row.execution_token && row.execution_queue_lease_expires_at\n ? {\n token: row.execution_token,\n queueLeaseExpiresAt: new Date(row.execution_queue_lease_expires_at),\n }\n : undefined,\n createdAt: new Date(row.created_at),\n startedAt: row.started_at ? new Date(row.started_at) : undefined,\n completedAt: row.completed_at ? new Date(row.completed_at) : undefined,\n }\n if (row.kind === \"conversation\") {\n if (!row.thread_id || !row.trigger_message_id) {\n throw new Error(`[SixbPg] Conversational Agent run '${row.id}' has invalid persisted fields.`)\n }\n return {\n ...base,\n kind: \"conversation\",\n threadId: row.thread_id,\n triggerMessageId: row.trigger_message_id,\n ...(row.spec === null ? {} : { spec: parseJsonColumn<ConversationAgentRunSpec>(row.spec) }),\n }\n }\n if (!row.parent_run_id || !row.spawn_key || row.spec === null) {\n throw new Error(`[SixbPg] Subagent run '${row.id}' has invalid persisted fields.`)\n }\n return {\n ...base,\n kind: \"subagent\",\n parentRunId: row.parent_run_id,\n spawnKey: row.spawn_key,\n spec: parseJsonColumn<SubagentRunSpec>(row.spec),\n ...(row.result === null ? {} : { result: parseJsonColumn<SubagentRunResult>(row.result) }),\n }\n}\n\nexport function rowToMessageRecord(row: AgentMessageRow): AgentMessageRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n threadId: row.thread_id,\n runId: row.run_id,\n role: row.role,\n authorPrincipal: principalFromColumns(row.author_principal_type, row.author_principal_id),\n seq: Number(row.seq),\n parts:\n typeof row.parts === \"string\" ? (JSON.parse(row.parts) as AgentMessagePart[]) : row.parts,\n // A null/absent column and an explicit JSON `null` both mean \"no metadata\" — jsonb cannot tell\n // SQL NULL from a json null on read, so both backends normalise to `undefined` for parity.\n metadata: normalizeMetadata(row.metadata),\n contentVersion: Number(row.content_version),\n createdAt: new Date(row.created_at),\n completedAt: row.completed_at ? new Date(row.completed_at) : undefined,\n }\n}\n\nexport function rowToContextCheckpointRecord(\n row: AgentContextCheckpointRow\n): AgentContextCheckpointRecord {\n const summaryFormatVersion = Number(row.summary_format_version)\n if (summaryFormatVersion !== 1) {\n throw new Error(\n `[SixbPg] Unsupported agent context checkpoint summary format version '${summaryFormatVersion}'.`\n )\n }\n return {\n id: row.id,\n projectId: row.project_id,\n threadId: row.thread_id,\n createdByRunId: row.created_by_run_id,\n previousCheckpointId: row.previous_checkpoint_id ?? undefined,\n reason: row.reason,\n summary: row.summary,\n summaryFormatVersion: 1,\n summarizedThroughSeq: Number(row.summarized_through_seq),\n observedHeadSeq: Number(row.observed_head_seq),\n estimatedInputTokensBefore: Number(row.estimated_input_tokens_before),\n estimatedInputTokensAfter: Number(row.estimated_input_tokens_after),\n summaryModelId: row.summary_model_id,\n createdAt: new Date(row.created_at),\n }\n}\n\nfunction principalFromColumns(\n type: Principal[\"type\"] | null | undefined,\n id: string | null | undefined\n): Principal | undefined {\n return type && id ? { type, id } : undefined\n}\n\nfunction normalizeMetadata(value: unknown): AgentMessageRecord[\"metadata\"] {\n if (value === null || value === undefined) {\n return undefined\n }\n const parsed = typeof value === \"string\" ? JSON.parse(value) : value\n return parsed === null ? undefined : (parsed as AgentMessageRecord[\"metadata\"])\n}\n\nfunction normalizeDiagnostics(\n value: AgentRunRow[\"diagnostics\"]\n): readonly AgentRunDiagnostic[] | undefined {\n if (value === null) {\n return undefined\n }\n return typeof value === \"string\" ? (JSON.parse(value) as AgentRunDiagnostic[]) : value\n}\n\nfunction parseJsonColumn<T>(value: unknown): T {\n return typeof value === \"string\" ? (JSON.parse(value) as T) : (value as T)\n}\n\n// ── offset pagination (threads / messages order by their own column, not started_at) ─────────────\n\nexport async function queryAgentList<TRow>(input: {\n readonly sql: SQLClient\n readonly table: \"agent_threads\" | \"agent_messages\"\n readonly whereClauses: readonly string[]\n readonly params: readonly SqlParameter[]\n readonly nextIndex: number\n readonly orderBy: string\n readonly limit?: number\n readonly offset?: number\n}): Promise<{ readonly rows: readonly TRow[]; readonly total: number; readonly hasMore: boolean }> {\n const where = `WHERE ${input.whereClauses.join(\" AND \")}`\n const offset = input.offset ?? 0\n\n const [totalRow] = await input.sql.unsafe<{ count: string | number }[]>(\n `SELECT COUNT(*)::bigint AS count FROM ${input.table} ${where}`,\n [...input.params] as SqlParameter[]\n )\n\n const queryParams = [...input.params] as SqlParameter[]\n let query = `SELECT * FROM ${input.table} ${where} ORDER BY ${input.orderBy}`\n let nextIndex = input.nextIndex\n\n if (input.limit !== undefined) {\n query += ` LIMIT $${nextIndex++} OFFSET $${nextIndex++}`\n queryParams.push(input.limit, offset)\n } else if (offset > 0) {\n query += ` OFFSET $${nextIndex++}`\n queryParams.push(offset)\n }\n\n const rows = await input.sql.unsafe<TRow[]>(query, queryParams)\n const total = Number(totalRow?.count ?? 0)\n return { rows, total, hasMore: offset + rows.length < total }\n}\n",
10
10
  "import { AGENT_MESSAGE_CONTENT_VERSION } from \"@sixb/core/internal/agents\"\nimport {\n type AgentMessageRecord,\n type AgentMessageStore,\n AgentStorageError,\n type AppendAgentMessageInput,\n type DeleteAgentMessagesByRunInput,\n type ListAgentMessagesInput,\n type ListAgentMessagesResult,\n} from \"@sixb/core/storage\"\nimport type { SqlParameter } from \"../pg-client\"\nimport { isUniqueViolation } from \"../storage-errors\"\nimport { type PgStoreClient, runPgTransaction } from \"../transactions\"\nimport { type AgentMessageRow, queryAgentList, rowToMessageRecord } from \"./rows\"\n\nexport class PgAgentMessageStore implements AgentMessageStore {\n constructor(private readonly sql: PgStoreClient) {}\n\n async append(input: AppendAgentMessageInput): Promise<AgentMessageRecord> {\n const createdAt = input.createdAt ?? new Date()\n\n try {\n return await runPgTransaction(this.sql, async (tx) => {\n // Assistant finalization appends and finishes in one outer transaction. Lock its run first\n // so every operation that needs both rows follows the same run -> thread order.\n if (input.runId !== null) {\n const [run] = await tx<{ id: string }[]>`\n SELECT id FROM agent_runs\n WHERE project_id = ${input.projectId} AND id = ${input.runId}\n FOR UPDATE\n `\n\n if (!run) {\n throw new AgentStorageError(\n \"run_not_found\",\n `[SixbPg] Agent run '${input.runId}' not found for project '${input.projectId}'.`\n )\n }\n }\n\n const [thread] = await tx<{ id: string }[]>`\n SELECT id FROM agent_threads\n WHERE project_id = ${input.projectId} AND id = ${input.threadId}\n FOR UPDATE\n `\n\n if (!thread) {\n throw new AgentStorageError(\n \"thread_not_found\",\n `[SixbPg] Agent thread '${input.threadId}' not found for project '${input.projectId}'.`\n )\n }\n\n const [seqRow] = await tx<{ next: number | string }[]>`\n SELECT COALESCE(MAX(seq), 0) + 1 AS next FROM agent_messages\n WHERE project_id = ${input.projectId} AND thread_id = ${input.threadId}\n `\n\n const [row] = await tx<AgentMessageRow[]>`\n INSERT INTO agent_messages (\n project_id,\n id,\n thread_id,\n run_id,\n role,\n author_principal_type,\n author_principal_id,\n seq,\n parts,\n metadata,\n content_version,\n created_at,\n completed_at\n ) VALUES (\n ${input.projectId},\n ${input.id},\n ${input.threadId},\n ${input.runId},\n ${input.role},\n ${input.authorPrincipal?.type ?? null},\n ${input.authorPrincipal?.id ?? null},\n ${Number(seqRow.next)},\n ${JSON.stringify(input.parts)}::text::jsonb,\n ${input.metadata === undefined ? null : JSON.stringify(input.metadata)}::text::jsonb,\n ${AGENT_MESSAGE_CONTENT_VERSION},\n ${createdAt},\n ${input.completedAt ?? null}\n )\n RETURNING *\n `\n\n await tx`\n UPDATE agent_threads\n SET message_count = message_count + 1, last_message_at = ${createdAt}, updated_at = ${createdAt}\n WHERE project_id = ${input.projectId} AND id = ${input.threadId}\n `\n\n return rowToMessageRecord(row)\n })\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[SixbPg] Agent message '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n throw error\n }\n }\n\n async deleteByRunId(input: DeleteAgentMessagesByRunInput): Promise<number> {\n return runPgTransaction(this.sql, async (tx) => {\n const [thread] = await tx<{ id: string }[]>`\n SELECT id FROM agent_threads\n WHERE project_id = ${input.projectId} AND id = ${input.threadId}\n FOR UPDATE\n `\n\n if (!thread) {\n throw new AgentStorageError(\n \"thread_not_found\",\n `[SixbPg] Agent thread '${input.threadId}' not found for project '${input.projectId}'.`\n )\n }\n\n const deleted = await tx<{ id: string }[]>`\n DELETE FROM agent_messages\n WHERE project_id = ${input.projectId}\n AND thread_id = ${input.threadId}\n AND run_id = ${input.runId}\n RETURNING id\n `\n if (deleted.length === 0) {\n return 0\n }\n\n const updatedAt = new Date()\n await tx`\n UPDATE agent_threads\n SET\n message_count = (\n SELECT COUNT(*) FROM agent_messages\n WHERE project_id = ${input.projectId} AND thread_id = ${input.threadId}\n ),\n last_message_at = (\n SELECT created_at FROM agent_messages\n WHERE project_id = ${input.projectId} AND thread_id = ${input.threadId}\n ORDER BY seq DESC\n LIMIT 1\n ),\n updated_at = ${updatedAt}\n WHERE project_id = ${input.projectId} AND id = ${input.threadId}\n `\n\n return deleted.length\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<AgentMessageRecord | null> {\n const [row] = await this.sql<AgentMessageRow[]>`\n SELECT * FROM agent_messages WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n\n return row ? rowToMessageRecord(row) : null\n }\n\n async list(input: ListAgentMessagesInput): Promise<ListAgentMessagesResult> {\n if (input.roles !== undefined && input.roles.length === 0) {\n return { messages: [], hasMore: false, total: 0 }\n }\n\n const whereClauses = [\"project_id = $1\", \"thread_id = $2\"]\n const params: SqlParameter[] = [input.projectId, input.threadId]\n let index = 3\n\n if (input.afterSeq !== undefined) {\n whereClauses.push(`seq > $${index++}`)\n params.push(input.afterSeq)\n }\n\n if (input.roles) {\n const placeholders = input.roles.map(() => `$${index++}`)\n whereClauses.push(`role IN (${placeholders.join(\", \")})`)\n params.push(...input.roles)\n }\n\n const dir = input.order === \"desc\" ? \"DESC\" : \"ASC\"\n const { rows, total, hasMore } = await queryAgentList<AgentMessageRow>({\n sql: this.sql,\n table: \"agent_messages\",\n whereClauses,\n params,\n nextIndex: index,\n orderBy: `seq ${dir}`,\n limit: input.limit,\n offset: input.offset,\n })\n\n return { messages: rows.map(rowToMessageRecord), hasMore, total }\n }\n}\n",
11
11
  "import {\n assertAgentRunExecution,\n assertConversationAgentRunSpec,\n assertCreateSubagentRunInput,\n assertSubagentRunResult,\n subagentRunMatchesCreateInput,\n} from \"@sixb/core/internal/agent-run-storage-provider\"\nimport { serializeSixbFailure } from \"@sixb/core/internal/errors\"\nimport {\n AGENT_RUN_FAILURE_CODES,\n type AgentRunRecord,\n type AgentRunStore,\n AgentStorageError,\n type ConfirmAgentRunExecutionOwnershipInput,\n type ConversationAgentRunRecord,\n type CreateAgentRunInput,\n type CreateSubagentRunInput,\n type ExecutionStorage,\n type FinishAgentRunInput,\n type FinishQueuedAgentRunInput,\n type ListAgentRunsInput,\n type ListAgentRunsResult,\n type ReclaimAgentRunInput,\n type StartAgentRunInput,\n type SubagentRunRecord,\n} from \"@sixb/core/storage\"\nimport type { SQLClient, SqlParameter } from \"../pg-client\"\nimport { appendRunListFilters, hasEmptyStatuses, queryRunList } from \"../run-list-query\"\nimport { isUniqueViolation } from \"../storage-errors\"\nimport { type PgStoreClient, runPgTransaction } from \"../transactions\"\nimport { type AgentRunRow, rowToRunRecord } from \"./rows\"\n\nconst PG_RUN_ID_BATCH_SIZE = 10_000\n\nexport class PgAgentRunStore implements AgentRunStore {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly executions: ExecutionStorage\n ) {}\n\n async create(input: CreateAgentRunInput): Promise<ConversationAgentRunRecord> {\n assertConversationAgentRunSpec(input.spec, \"SixbPg\")\n const createdAt = input.createdAt ?? new Date()\n await assertAgentRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n })\n\n try {\n return await runPgTransaction(this.sql, async (tx) => {\n const [thread] = await tx<{ active_run_id: string | null }[]>`\n SELECT active_run_id FROM agent_threads\n WHERE project_id = ${input.projectId} AND id = ${input.threadId}\n FOR UPDATE\n `\n\n if (!thread) {\n throw new AgentStorageError(\n \"thread_not_found\",\n `[SixbPg] Agent thread '${input.threadId}' not found for project '${input.projectId}'.`\n )\n }\n if (thread.active_run_id !== null) {\n throw new AgentStorageError(\n \"active_run_exists\",\n `[SixbPg] Agent thread '${input.threadId}' already has an active run '${thread.active_run_id}'.`\n )\n }\n\n const [row] = await tx<AgentRunRow[]>`\n INSERT INTO agent_runs (\n project_id,\n id,\n execution_id,\n kind,\n thread_id,\n trigger_message_id,\n spec,\n status,\n attempt,\n created_at\n ) VALUES (\n ${input.projectId},\n ${input.id},\n ${input.executionId},\n ${\"conversation\"},\n ${input.threadId},\n ${input.triggerMessageId},\n ${JSON.stringify(input.spec)}::text::jsonb,\n ${\"queued\"},\n ${0},\n ${createdAt}\n )\n RETURNING *\n `\n\n await tx`\n UPDATE agent_threads SET active_run_id = ${input.id}, updated_at = ${createdAt}\n WHERE project_id = ${input.projectId} AND id = ${input.threadId}\n `\n\n const created = rowToRunRecord(row)\n if (created.kind !== \"conversation\") {\n throw new Error(`[SixbPg] Agent run insert '${input.id}' returned the wrong run kind.`)\n }\n return created\n })\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[SixbPg] Agent run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n throw error\n }\n }\n\n async createSubagent(input: CreateSubagentRunInput): Promise<SubagentRunRecord> {\n assertCreateSubagentRunInput(input, \"SixbPg\")\n const execution = await assertAgentRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n })\n\n try {\n return await runPgTransaction(this.sql, async (tx) => {\n const [parent] = await tx<AgentRunRow[]>`\n SELECT * FROM agent_runs\n WHERE project_id = ${input.projectId} AND id = ${input.parentRunId}\n FOR UPDATE\n `\n if (!parent || parent.kind !== \"conversation\") {\n throw new AgentStorageError(\n \"run_not_found\",\n `[SixbPg] Parent Agent run '${input.parentRunId}' was not found.`\n )\n }\n\n const [existingRow] = await tx<AgentRunRow[]>`\n SELECT * FROM agent_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n if (existingRow) {\n const existing = rowToRunRecord(existingRow)\n if (subagentRunMatchesCreateInput(existing, input)) return existing\n throw new AgentStorageError(\n \"duplicate_id\",\n `[SixbPg] Subagent run '${input.id}' already exists with different immutable inputs.`\n )\n }\n if (parent.status !== \"running\") {\n throw new AgentStorageError(\n \"invalid_state\",\n `[SixbPg] Parent Agent run '${parent.id}' is not running (status '${parent.status}').`\n )\n }\n if (\n execution.source.type !== \"execution\" ||\n execution.source.executionId !== parent.execution_id\n ) {\n throw new AgentStorageError(\n \"invalid_input\",\n `[SixbPg] Subagent execution '${execution.id}' is not a child of parent execution '${parent.execution_id}'.`\n )\n }\n if (parent.execution_token !== input.parentExecutionToken) {\n throw new AgentStorageError(\n \"execution_lost\",\n `[SixbPg] Parent Agent run '${parent.id}' is no longer owned by this execution.`\n )\n }\n\n const [countRow] = await tx<{ count: string | number }[]>`\n SELECT COUNT(*)::bigint AS count FROM agent_runs\n WHERE project_id = ${input.projectId}\n AND parent_run_id = ${input.parentRunId}\n AND status IN (${\"queued\"}, ${\"running\"})\n `\n const activeChildren = Number(countRow?.count ?? 0)\n if (activeChildren >= input.maxActiveChildren) {\n throw new AgentStorageError(\n \"active_child_limit\",\n `[SixbPg] Agent run '${parent.id}' already has ${activeChildren} active subagents.`\n )\n }\n\n const [row] = await tx<AgentRunRow[]>`\n INSERT INTO agent_runs (\n project_id, id, execution_id, kind, parent_run_id, spawn_key, spec,\n status, attempt, created_at\n ) VALUES (\n ${input.projectId}, ${input.id}, ${input.executionId}, ${\"subagent\"},\n ${input.parentRunId}, ${input.spawnKey},\n ${JSON.stringify(input.spec)}::text::jsonb,\n ${\"queued\"}, ${0}, ${input.createdAt ?? new Date()}\n )\n RETURNING *\n `\n const created = rowToRunRecord(row)\n if (created.kind !== \"subagent\") {\n throw new Error(`[SixbPg] Subagent insert '${input.id}' returned the wrong run kind.`)\n }\n return created\n })\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[SixbPg] Subagent run '${input.id}' conflicts with an existing durable spawn.`\n )\n }\n throw error\n }\n }\n\n async start(input: StartAgentRunInput): Promise<AgentRunRecord> {\n const startedAt = input.startedAt ?? new Date()\n return runPgTransaction(this.sql, async (tx) => {\n await this.lockStatus(tx, input.projectId, input.id, \"queued\")\n const [row] = await tx<AgentRunRow[]>`\n UPDATE agent_runs\n SET\n status = ${\"running\"},\n model_id = ${input.modelId ?? null},\n attempt = ${1},\n execution_token = ${input.execution.token},\n execution_queue_lease_expires_at = ${input.execution.queueLeaseExpiresAt},\n started_at = ${startedAt}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n return rowToRunRecord(row)\n })\n }\n\n async finishQueued(input: FinishQueuedAgentRunInput): Promise<AgentRunRecord> {\n const completedAt = input.completedAt ?? new Date()\n return runPgTransaction(this.sql, async (tx) => {\n const run = await this.lockStatus(tx, input.projectId, input.id, \"queued\")\n const [row] = await tx<AgentRunRow[]>`\n UPDATE agent_runs\n SET\n status = ${input.status},\n error = ${input.error === undefined ? null : serializeSixbFailure(input.error, AGENT_RUN_FAILURE_CODES)}::text::jsonb,\n completed_at = ${completedAt}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n await this.releaseThread(tx, run, completedAt)\n return rowToRunRecord(row)\n })\n }\n\n async reclaim(input: ReclaimAgentRunInput): Promise<AgentRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n await this.lockRunning(tx, input.projectId, input.id)\n const [row] = await tx<AgentRunRow[]>`\n UPDATE agent_runs\n SET\n attempt = attempt + 1,\n execution_token = ${input.execution.token},\n execution_queue_lease_expires_at = ${input.execution.queueLeaseExpiresAt}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n return rowToRunRecord(row)\n })\n }\n\n async confirmExecutionOwnership(\n input: ConfirmAgentRunExecutionOwnershipInput\n ): Promise<AgentRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const run = await this.lockRunning(tx, input.projectId, input.id)\n if (run.execution_token !== input.executionToken) {\n throw new AgentStorageError(\n \"execution_lost\",\n `[SixbPg] Execution token is no longer current on agent run '${input.id}'.`\n )\n }\n\n const [row] = await tx<AgentRunRow[]>`\n UPDATE agent_runs\n SET execution_queue_lease_expires_at = GREATEST(\n execution_queue_lease_expires_at,\n ${input.queueLeaseExpiresAt}\n )\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n return rowToRunRecord(row)\n })\n }\n\n async finish(input: FinishAgentRunInput): Promise<AgentRunRecord> {\n const completedAt = input.completedAt ?? new Date()\n const errorValue =\n input.status === \"succeeded\" || input.error === undefined\n ? null\n : serializeSixbFailure(input.error, AGENT_RUN_FAILURE_CODES)\n\n return runPgTransaction(this.sql, async (tx) => {\n const run = await this.lockRunning(tx, input.projectId, input.id)\n\n if (input.status === \"succeeded\" && run.kind === \"subagent\") {\n assertSubagentRunResult(input.result, run.id, \"SixbPg\")\n }\n if (\n input.status === \"succeeded\" &&\n run.kind === \"conversation\" &&\n input.result !== undefined\n ) {\n throw new AgentStorageError(\n \"invalid_input\",\n `[SixbPg] Conversational Agent run '${run.id}' cannot persist a subagent result.`\n )\n }\n\n if (run.execution_token !== input.executionToken) {\n throw new AgentStorageError(\n \"execution_lost\",\n `[SixbPg] Execution token is no longer current on agent run '${input.id}'.`\n )\n }\n\n const [row] = await tx<AgentRunRow[]>`\n UPDATE agent_runs\n SET\n status = ${input.status},\n model_id = COALESCE(${input.modelId ?? null}, model_id),\n finish_reason = ${input.finishReason ?? null},\n error = ${errorValue}::text::jsonb,\n diagnostics = ${input.diagnostics === undefined ? null : JSON.stringify(input.diagnostics)}::text::jsonb,\n result = ${input.status === \"succeeded\" && input.result !== undefined ? JSON.stringify(input.result) : null}::text::jsonb,\n execution_token = ${null},\n execution_queue_lease_expires_at = ${null},\n completed_at = ${completedAt}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n await this.releaseThread(tx, run, completedAt)\n\n return rowToRunRecord(row)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<AgentRunRecord | null> {\n const [row] = await this.sql<AgentRunRow[]>`\n SELECT * FROM agent_runs WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n\n return row ? rowToRunRecord(row) : null\n }\n\n async getByIds(params: {\n projectId: string\n ids: readonly string[]\n }): Promise<readonly AgentRunRecord[]> {\n const ids = [...new Set(params.ids)]\n if (ids.length === 0) {\n return []\n }\n\n const rows: AgentRunRow[] = []\n for (let offset = 0; offset < ids.length; offset += PG_RUN_ID_BATCH_SIZE) {\n const batch = ids.slice(offset, offset + PG_RUN_ID_BATCH_SIZE)\n const placeholders = batch.map((_, index) => `$${index + 2}`).join(\", \")\n rows.push(\n ...(await this.sql.unsafe<AgentRunRow[]>(\n `SELECT * FROM agent_runs WHERE project_id = $1 AND id IN (${placeholders})`,\n [params.projectId, ...batch] as SqlParameter[]\n ))\n )\n }\n const byId = new Map(rows.map((row) => [row.id, rowToRunRecord(row)]))\n return ids.flatMap((id) => {\n const run = byId.get(id)\n return run ? [run] : []\n })\n }\n\n async list(input: ListAgentRunsInput): Promise<ListAgentRunsResult> {\n if (hasEmptyStatuses(input) || input.kinds?.length === 0) {\n return { runs: [], hasMore: false, total: 0 }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.kinds) {\n whereClauses.push(`kind = ANY($${index++}::text[])`)\n params.push(input.kinds as string[])\n }\n\n if (input.threadId) {\n whereClauses.push(`thread_id = $${index++}`)\n params.push(input.threadId)\n }\n\n if (input.parentRunId) {\n whereClauses.push(`parent_run_id = $${index++}`)\n params.push(input.parentRunId)\n }\n\n index = appendRunListFilters(\n whereClauses,\n params,\n index,\n input,\n \"COALESCE(started_at, created_at)\"\n )\n\n const { rows, total, hasMore } = await queryRunList<AgentRunRow>({\n sql: this.sql,\n tableName: \"agent_runs\",\n whereClauses,\n params,\n nextIndex: index,\n order: input.order,\n limit: input.limit,\n offset: input.offset,\n })\n\n return { runs: rows.map(rowToRunRecord), hasMore, total }\n }\n\n private lockRunning(sql: SQLClient, projectId: string, id: string): Promise<AgentRunRow> {\n return this.lockStatus(sql, projectId, id, \"running\")\n }\n\n private async lockStatus(\n sql: SQLClient,\n projectId: string,\n id: string,\n status: AgentRunRecord[\"status\"]\n ): Promise<AgentRunRow> {\n const [row] = await sql<AgentRunRow[]>`\n SELECT * FROM agent_runs\n WHERE project_id = ${projectId} AND id = ${id}\n FOR UPDATE\n `\n\n if (!row) {\n throw new AgentStorageError(\n \"run_not_found\",\n `[SixbPg] Agent run '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (row.status !== status) {\n throw new AgentStorageError(\n \"invalid_state\",\n `[SixbPg] Agent run '${id}' is not ${status} (status '${row.status}').`\n )\n }\n\n return row\n }\n\n private async releaseThread(sql: SQLClient, run: AgentRunRow, completedAt: Date): Promise<void> {\n if (run.kind !== \"conversation\") return\n await sql`\n UPDATE agent_threads SET active_run_id = ${null}, updated_at = ${completedAt}\n WHERE project_id = ${run.project_id} AND id = ${run.thread_id} AND active_run_id = ${run.id}\n `\n }\n}\n",
@@ -27,38 +27,45 @@
27
27
  "import type { AuthSessionAudience } from \"@sixb/core\"\nimport type {\n AuthSessionStore,\n CreateAuthSessionInput,\n RotateSessionRefreshTokenResult,\n SessionRecord,\n} from \"@sixb/core/storage\"\nimport { AuthStorageError } from \"@sixb/core/storage\"\nimport {\n authLockKey,\n lockAdvisoryKeys,\n type PgStoreClient,\n runPgTransaction,\n} from \"../transactions\"\nimport type { PgAuthSessionRow } from \"./rows\"\nimport { rowToSessionRecord } from \"./rows\"\nimport {\n createSession,\n getSessionById,\n getSessionRowById,\n requireSessionById,\n revokeActiveSessionsForUser,\n} from \"./shared\"\n\nexport class PgAuthSessionStore implements AuthSessionStore {\n constructor(private readonly sql: PgStoreClient) {}\n\n async create(input: CreateAuthSessionInput): Promise<SessionRecord> {\n // Session ids are random UUIDs and the table has a primary-key guard, so\n // concurrent inserts cannot collide; no advisory lock is needed here.\n return runPgTransaction(this.sql, (tx) => createSession(tx, input))\n }\n\n async getById(params: {\n readonly projectId: string\n readonly id: string\n }): Promise<SessionRecord | null> {\n return getSessionById(this.sql, params)\n }\n\n async getActiveByUserId(params: {\n readonly projectId: string\n readonly userId: string\n readonly audience: AuthSessionAudience\n readonly now: Date\n }): Promise<SessionRecord | null> {\n const [row] = await this.sql<PgAuthSessionRow[]>`\n SELECT *\n FROM auth_sessions\n WHERE project_id = ${params.projectId}\n AND user_id = ${params.userId}\n AND audience = ${params.audience}\n AND revoked_at IS NULL\n AND expires_at > ${params.now}\n AND (absolute_expires_at IS NULL OR absolute_expires_at > ${params.now})\n ORDER BY created_at DESC, id DESC\n LIMIT 1\n `\n\n return row ? rowToSessionRecord(row) : null\n }\n\n async listActiveByUserId(params: {\n readonly projectId: string\n readonly userId: string\n readonly now: Date\n }): Promise<readonly SessionRecord[]> {\n const rows = (await this.sql`\n SELECT *\n FROM auth_sessions\n WHERE project_id = ${params.projectId}\n AND user_id = ${params.userId}\n AND revoked_at IS NULL\n AND expires_at > ${params.now}\n AND (absolute_expires_at IS NULL OR absolute_expires_at > ${params.now})\n ORDER BY COALESCE(last_seen_at, created_at) DESC, created_at DESC, id DESC\n `) as PgAuthSessionRow[]\n\n return rows.map(rowToSessionRecord)\n }\n\n async findValidByTokenHash(params: {\n readonly projectId: string\n readonly id: string\n readonly audience: AuthSessionAudience\n readonly tokenHash: string\n readonly now: Date\n }): Promise<SessionRecord | null> {\n const row = await getSessionRowById(this.sql, params)\n\n if (\n !row ||\n row.refresh_token_hash !== null ||\n row.audience !== params.audience ||\n row.token_hash !== params.tokenHash ||\n !isLiveSessionRow(row, params.now)\n ) {\n return null\n }\n\n return rowToSessionRecord(row)\n }\n\n async findValidByAccessTokenHash(params: {\n readonly projectId: string\n readonly id: string\n readonly tokenHash: string\n readonly now: Date\n }): Promise<SessionRecord | null> {\n const row = await getSessionRowById(this.sql, params)\n if (\n !row ||\n row.access_expires_at === null ||\n row.token_hash !== params.tokenHash ||\n new Date(row.access_expires_at) <= params.now ||\n !isLiveSessionRow(row, params.now)\n ) {\n return null\n }\n\n return rowToSessionRecord(row)\n }\n\n async rotateRefreshToken(\n params: Parameters<AuthSessionStore[\"rotateRefreshToken\"]>[0]\n ): Promise<RotateSessionRefreshTokenResult> {\n return runPgTransaction(this.sql, async (tx): Promise<RotateSessionRefreshTokenResult> => {\n const row = await getSessionRowById(tx, params, { forUpdate: true })\n if (!row?.refresh_token_hash || !isLiveSessionRow(row, params.now)) {\n return { status: \"invalid\" }\n }\n\n const replacedRecently =\n row.previous_refresh_token_hash === params.refreshTokenHash &&\n row.refreshed_at !== null &&\n params.now.getTime() - new Date(row.refreshed_at).getTime() <= params.reuseGraceMs\n if (row.refresh_token_hash !== params.refreshTokenHash && !replacedRecently) {\n if (row.previous_refresh_token_hash !== params.refreshTokenHash) {\n return { status: \"invalid\" }\n }\n await tx`\n UPDATE auth_sessions SET revoked_at = ${params.now}\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n return { status: \"reused\" }\n }\n\n const [rotated] = await tx<PgAuthSessionRow[]>`\n UPDATE auth_sessions\n SET token_hash = ${params.next.tokenHash},\n access_expires_at = ${params.next.accessExpiresAt},\n previous_refresh_token_hash = refresh_token_hash,\n refresh_token_hash = ${params.next.refreshTokenHash},\n refreshed_at = ${params.now},\n last_seen_at = ${params.now},\n expires_at = GREATEST(\n expires_at,\n LEAST(${params.next.expiresAt}, COALESCE(absolute_expires_at, ${params.next.expiresAt}))\n )\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n RETURNING *\n `\n return rotated\n ? { status: \"rotated\", session: rowToSessionRecord(rotated) }\n : { status: \"invalid\" }\n })\n }\n\n async renewIfValid(params: {\n readonly projectId: string\n readonly id: string\n readonly audience: AuthSessionAudience\n readonly tokenHash: string\n readonly now: Date\n readonly expiresAt: Date\n }): Promise<SessionRecord | null> {\n const [row] = await this.sql<PgAuthSessionRow[]>`\n UPDATE auth_sessions\n SET expires_at = GREATEST(\n expires_at,\n LEAST(\n ${params.expiresAt},\n COALESCE(absolute_expires_at, ${params.expiresAt})\n )\n ),\n last_seen_at = ${params.now}\n WHERE project_id = ${params.projectId}\n AND id = ${params.id}\n AND audience = ${params.audience}\n AND token_hash = ${params.tokenHash}\n AND refresh_token_hash IS NULL\n AND revoked_at IS NULL\n AND expires_at > ${params.now}\n AND (absolute_expires_at IS NULL OR absolute_expires_at > ${params.now})\n RETURNING *\n `\n\n return row ? rowToSessionRecord(row) : null\n }\n\n async revoke(params: {\n readonly projectId: string\n readonly id: string\n readonly revokedAt: Date\n }): Promise<SessionRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existing = await getSessionRowById(tx, params, { forUpdate: true })\n\n if (!existing) {\n throw new AuthStorageError(\n \"missing_session\",\n `[Sixb] Session '${params.id}' not found for project '${params.projectId}'.`\n )\n }\n\n const [row] = await tx<PgAuthSessionRow[]>`\n UPDATE auth_sessions\n SET revoked_at = ${params.revokedAt}\n WHERE project_id = ${params.projectId}\n AND id = ${params.id}\n RETURNING *\n `\n\n return rowToSessionRecord(row)\n })\n }\n\n async revokeActiveForUser(params: {\n readonly projectId: string\n readonly userId: string\n readonly audience?: AuthSessionAudience\n readonly revokedAt: Date\n }): Promise<readonly SessionRecord[]> {\n return runPgTransaction(this.sql, async (tx) => {\n const locks = [authLockKey(\"sessions\", params.projectId, params.userId)]\n if (params.audience) {\n locks.push(authLockKey(\"sessions\", params.projectId, params.userId, params.audience))\n }\n await lockAdvisoryKeys(tx, locks)\n return revokeActiveSessionsForUser(tx, params)\n })\n }\n\n async touch(params: {\n readonly projectId: string\n readonly id: string\n readonly lastSeenAt: Date\n }): Promise<SessionRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n await requireSessionById(tx, params)\n\n const [row] = await tx<PgAuthSessionRow[]>`\n UPDATE auth_sessions\n SET last_seen_at = ${params.lastSeenAt}\n WHERE project_id = ${params.projectId}\n AND id = ${params.id}\n RETURNING *\n `\n\n return rowToSessionRecord(row)\n })\n }\n}\n\nfunction isLiveSessionRow(row: PgAuthSessionRow, now: Date): boolean {\n return (\n row.revoked_at === null &&\n new Date(row.expires_at) > now &&\n (row.absolute_expires_at === null || new Date(row.absolute_expires_at) > now)\n )\n}\n",
28
28
  "import type {\n AuthUserStore,\n CreateAuthUserInput,\n ListAuthUsersInput,\n ListAuthUsersResult,\n UpdateAuthUserProfileInput,\n UpdateAuthUserStatusInput,\n UserRecord,\n} from \"@sixb/core/storage\"\nimport { AuthStorageError } from \"@sixb/core/storage\"\nimport type { PgStoreClient } from \"../transactions\"\nimport type { PgAuthUserRow } from \"./rows\"\nimport { rowToUserRecord } from \"./rows\"\nimport {\n appendPagination,\n assertNonEmpty,\n dateOrNow,\n getUserRowByEmail,\n getUserRowById,\n hasEmptyFilter,\n mapUniqueConstraintError,\n normalizeEmail,\n type PgValue,\n} from \"./shared\"\n\nexport class PgAuthUserStore implements AuthUserStore {\n constructor(private readonly sql: PgStoreClient) {}\n\n async create(input: CreateAuthUserInput): Promise<UserRecord> {\n const id = assertNonEmpty(input.id, \"User id\")\n const projectId = assertNonEmpty(input.projectId, \"Project id\")\n const email = normalizeEmail(input.email)\n\n if (await getUserRowById(this.sql, { projectId, id })) {\n throw new AuthStorageError(\n \"duplicate_user\",\n `[Sixb] User '${id}' already exists for project '${projectId}'.`\n )\n }\n\n if (await getUserRowByEmail(this.sql, { projectId, email })) {\n throw new AuthStorageError(\n \"duplicate_user\",\n `[Sixb] User email '${email}' already exists for project '${projectId}'.`\n )\n }\n\n const createdAt = dateOrNow(input.createdAt)\n const updatedAt = input.updatedAt ? new Date(input.updatedAt) : createdAt\n\n try {\n const [row] = await this.sql<PgAuthUserRow[]>`\n INSERT INTO auth_users (\n project_id,\n id,\n email,\n display_name,\n avatar_url,\n status,\n created_at,\n updated_at\n ) VALUES (\n ${projectId},\n ${id},\n ${email},\n ${input.displayName ?? null},\n ${input.avatarUrl ?? null},\n ${input.status ?? \"active\"},\n ${createdAt},\n ${updatedAt}\n )\n RETURNING *\n `\n\n return rowToUserRecord(row)\n } catch (error) {\n mapUniqueConstraintError(\n error,\n \"duplicate_user\",\n `[Sixb] User '${id}' already exists for project '${projectId}'.`\n )\n }\n }\n\n async getById(params: {\n readonly projectId: string\n readonly id: string\n }): Promise<UserRecord | null> {\n const row = await getUserRowById(this.sql, params)\n return row ? rowToUserRecord(row) : null\n }\n\n async getByEmail(params: {\n readonly projectId: string\n readonly email: string\n }): Promise<UserRecord | null> {\n const row = await getUserRowByEmail(this.sql, params)\n return row ? rowToUserRecord(row) : null\n }\n\n async updateProfile(input: UpdateAuthUserProfileInput): Promise<UserRecord> {\n const existing = await getUserRowById(this.sql, {\n projectId: input.projectId,\n id: input.id,\n })\n\n if (!existing) {\n throw new AuthStorageError(\n \"missing_user\",\n `[Sixb] User '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n const updatedAt = dateOrNow(input.updatedAt)\n const [row] = await this.sql<PgAuthUserRow[]>`\n UPDATE auth_users\n SET display_name = ${input.displayName ?? null},\n avatar_url = ${input.avatarUrl ?? null},\n updated_at = ${updatedAt}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n RETURNING *\n `\n\n return rowToUserRecord(row)\n }\n\n async updateStatus(input: UpdateAuthUserStatusInput): Promise<UserRecord> {\n const existing = await getUserRowById(this.sql, {\n projectId: input.projectId,\n id: input.id,\n })\n\n if (!existing) {\n throw new AuthStorageError(\n \"missing_user\",\n `[Sixb] User '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n const updatedAt = dateOrNow(input.updatedAt)\n const [row] = await this.sql<PgAuthUserRow[]>`\n UPDATE auth_users\n SET status = ${input.status},\n updated_at = ${updatedAt}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n RETURNING *\n `\n\n return rowToUserRecord(row)\n }\n\n async list(input: ListAuthUsersInput): Promise<ListAuthUsersResult> {\n if (hasEmptyFilter(input.statuses)) {\n return { users: [], hasMore: false, total: 0 }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: PgValue[] = [input.projectId]\n let nextIndex = 2\n\n if (input.statuses) {\n whereClauses.push(`status IN (${input.statuses.map(() => `$${nextIndex++}`).join(\", \")})`)\n params.push(...input.statuses)\n }\n\n const where = `WHERE ${whereClauses.join(\" AND \")}`\n const order = input.order === \"asc\" ? \"ASC\" : \"DESC\"\n const [totalRow] = await this.sql.unsafe<{ readonly count: string | number }[]>(\n `SELECT COUNT(*)::bigint AS count FROM auth_users ${where}`,\n [...params]\n )\n\n const queryParams = [...params]\n const query = appendPagination(\n `\n SELECT *\n FROM auth_users\n ${where}\n ORDER BY created_at ${order}, id ${order}\n `,\n queryParams,\n nextIndex,\n input\n )\n const rows = await this.sql.unsafe<PgAuthUserRow[]>(query, queryParams)\n const total = Number(totalRow?.count ?? 0)\n\n return {\n users: rows.map(rowToUserRecord),\n hasMore: (input.offset ?? 0) + rows.length < total,\n total,\n }\n }\n}\n",
29
29
  "import {\n type ConnectorConnectionPersistence,\n type ConnectorConnectionPersistenceBackend,\n type ConnectorConnectionPersistenceScope,\n DurableConnectorConnectionStorage,\n} from \"@sixb/core/internal/connector-connection-storage-provider\"\nimport type {\n ConnectorAuthorizationAttemptRecord,\n ConnectorAuthorizationRecord,\n ConnectorConnectionRecord,\n ConnectorConnectionRunRecord,\n ConnectorCredentialMutation,\n ConnectorStagedCredentials,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"./pg-client\"\nimport { isUniqueViolation } from \"./storage-errors\"\nimport { lockAdvisoryKeys, type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport class PgConnectorConnectionStorage extends DurableConnectorConnectionStorage {\n private readonly clock: ConnectorConnectionTestClock\n\n constructor(sql: PgStoreClient) {\n const clock = { offsetMs: 0 }\n super(new PgConnectorConnectionPersistenceBackend(sql, clock))\n this.clock = clock\n }\n\n /** Internal deterministic clock control used only by the provider contract suite. */\n advanceTimeForTesting(durationMs: number): void {\n this.clock.offsetMs += durationMs\n }\n}\n\nclass PgConnectorConnectionPersistenceBackend implements ConnectorConnectionPersistenceBackend {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly clock: ConnectorConnectionTestClock\n ) {}\n\n read<T>(\n scope: ConnectorConnectionPersistenceScope,\n run: (persistence: ConnectorConnectionPersistence) => Promise<T>\n ): Promise<T> {\n return run(new PgConnectorConnectionPersistence(this.sql, scope, false, this.clock))\n }\n\n transaction<T>(\n scope: ConnectorConnectionPersistenceScope,\n run: (persistence: ConnectorConnectionPersistence) => Promise<T>\n ): Promise<T> {\n return runPgTransaction(this.sql, async (tx) => {\n if (scope.connectorId) {\n await lockAdvisoryKeys(tx, [\n [\"connector-connections\", scope.projectId, scope.connectorId].join(\":\"),\n ])\n }\n return run(new PgConnectorConnectionPersistence(tx, scope, true, this.clock))\n })\n }\n}\n\nclass PgConnectorConnectionPersistence implements ConnectorConnectionPersistence {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly scope: ConnectorConnectionPersistenceScope,\n private readonly locking: boolean,\n private readonly clock: ConnectorConnectionTestClock\n ) {}\n\n async now(): Promise<Date> {\n const [row] = await this.sql<{ readonly now: Date | string }[]>`\n SELECT clock_timestamp() AS now\n `\n if (!row) throw new Error(\"[SixbPg] Database clock returned no row.\")\n return new Date(new Date(row.now).getTime() + this.clock.offsetMs)\n }\n\n async insertAuthorizationAttempt(record: ConnectorAuthorizationAttemptRecord): Promise<boolean> {\n try {\n await this.sql`\n INSERT INTO connector_authorization_attempts (\n project_id, connector_id, id, slot, initiated_by_execution_id,\n state_hash, code_verifier, redirect_uri, connection_run_id, return_to,\n callback_binding_hash, reauthorization_id, reauthorization_revision,\n reauthorization_connection_ids, created_at, expires_at\n ) VALUES (\n ${record.projectId}, ${record.connectorId}, ${record.id}, ${record.slot},\n ${record.initiatedByExecutionId}, ${record.stateHash},\n ${record.codeVerifier === undefined ? null : jsonParameter(this.sql, record.codeVerifier)}, ${record.redirectUri},\n ${record.connectionRunId ?? null}, ${record.returnTo ?? null},\n ${record.callbackBindingHash ?? null}, ${record.reauthorizationId ?? null},\n ${record.reauthorizationRevision ?? null},\n ${\n record.reauthorizationConnectionIds\n ? jsonParameter(this.sql, record.reauthorizationConnectionIds)\n : null\n },\n ${record.createdAt}, ${record.expiresAt}\n )\n `\n return true\n } catch (error) {\n if (isUniqueViolation(error)) return false\n throw error\n }\n }\n\n async getAuthorizationAttempt(id: string): Promise<ConnectorAuthorizationAttemptRecord | null> {\n const rows = this.scope.connectorId\n ? await this.sql<PgAuthorizationAttemptRow[]>`\n SELECT * FROM connector_authorization_attempts\n WHERE project_id = ${this.scope.projectId}\n AND connector_id = ${this.scope.connectorId}\n AND id = ${id}\n ${this.lockClause()}\n `\n : await this.sql<PgAuthorizationAttemptRow[]>`\n SELECT * FROM connector_authorization_attempts\n WHERE project_id = ${this.scope.projectId} AND id = ${id}\n ${this.lockClause()}\n `\n return rows[0] ? authorizationAttemptFromRow(rows[0]) : null\n }\n\n async getAuthorizationAttemptByConnectionRunId(\n connectionRunId: string\n ): Promise<ConnectorAuthorizationAttemptRecord | null> {\n if (!this.scope.connectorId) return null\n const rows = await this.sql<PgAuthorizationAttemptRow[]>`\n SELECT * FROM connector_authorization_attempts\n WHERE project_id = ${this.scope.projectId}\n AND connector_id = ${this.scope.connectorId}\n AND connection_run_id = ${connectionRunId}\n ${this.lockClause()}\n `\n return rows[0] ? authorizationAttemptFromRow(rows[0]) : null\n }\n\n async deleteAuthorizationAttempt(id: string): Promise<boolean> {\n const rows = this.scope.connectorId\n ? await this.sql<{ readonly id: string }[]>`\n DELETE FROM connector_authorization_attempts\n WHERE project_id = ${this.scope.projectId}\n AND connector_id = ${this.scope.connectorId}\n AND id = ${id}\n RETURNING id\n `\n : await this.sql<{ readonly id: string }[]>`\n DELETE FROM connector_authorization_attempts\n WHERE project_id = ${this.scope.projectId} AND id = ${id}\n RETURNING id\n `\n return rows.length === 1\n }\n\n async insertConnectionRun(record: ConnectorConnectionRunRecord): Promise<boolean> {\n try {\n const values = runValues(record)\n await this.sql`\n INSERT INTO connector_connection_runs (\n project_id, connector_id, id, kind, slot, initiated_by_execution_id,\n status, waiting_for, processing_id, callback_started_at,\n expires_at, authorization_id, cleanup_authorization_id, connections, error,\n created_at, updated_at, finished_at\n ) VALUES (\n ${record.projectId}, ${record.connectorId}, ${record.id}, ${values.kind},\n ${values.slot}, ${values.initiatedByExecutionId}, ${values.status},\n ${values.waitingFor}, ${values.processingId},\n ${values.callbackStartedAt}, ${values.expiresAt}, ${values.authorizationId},\n ${values.cleanupAuthorizationId},\n ${values.connections ? jsonParameter(this.sql, values.connections) : null},\n ${values.error ? jsonParameter(this.sql, values.error) : null},\n ${record.createdAt}, ${record.updatedAt}, ${values.finishedAt}\n )\n `\n return true\n } catch (error) {\n if (isUniqueViolation(error)) return false\n throw error\n }\n }\n\n async listPendingConnectionRuns(): Promise<readonly ConnectorConnectionRunRecord[]> {\n if (!this.scope.connectorId) return []\n const rows = await this.sql<PgConnectionRunRow[]>`\n SELECT * FROM connector_connection_runs\n WHERE project_id = ${this.scope.projectId} AND connector_id = ${this.scope.connectorId}\n AND (status = 'running' OR (status = 'waiting' AND waiting_for = 'account_selection'))\n `\n return rows.map(connectionRunFromRow)\n }\n\n async getConnectionRun(id: string): Promise<ConnectorConnectionRunRecord | null> {\n const rows = await this.runById(id)\n return rows[0] ? connectionRunFromRow(rows[0]) : null\n }\n\n async updateConnectionRun(record: ConnectorConnectionRunRecord): Promise<void> {\n const values = runValues(record)\n const rows = await this.sql<{ readonly id: string }[]>`\n UPDATE connector_connection_runs\n SET kind = ${values.kind}, slot = ${values.slot},\n initiated_by_execution_id = ${values.initiatedByExecutionId}, status = ${values.status},\n waiting_for = ${values.waitingFor},\n processing_id = ${values.processingId}, callback_started_at = ${values.callbackStartedAt},\n expires_at = ${values.expiresAt}, authorization_id = ${values.authorizationId},\n cleanup_authorization_id = ${values.cleanupAuthorizationId},\n connections = ${values.connections ? jsonParameter(this.sql, values.connections) : null},\n error = ${values.error ? jsonParameter(this.sql, values.error) : null},\n updated_at = ${record.updatedAt}, finished_at = ${values.finishedAt}\n WHERE project_id = ${record.projectId} AND connector_id = ${record.connectorId}\n AND id = ${record.id}\n RETURNING id\n `\n assertChanged(rows, \"connector connection run\", record.id)\n }\n\n async insertAuthorization(record: ConnectorAuthorizationRecord): Promise<boolean> {\n try {\n const values = authorizationValues(record)\n await this.sql`\n INSERT INTO connector_authorizations (\n project_id, connector_id, id, authorized_by, credentials, credential_expires_at,\n scopes, accounts, status, selection_expires_at, revision, mutation_id, mutation_kind,\n mutation_phase, mutation_holder_id, mutation_expires_at, mutation_deadline_at,\n mutation_expected_connection_ids, staged_credentials, staged_credential_expires_at,\n staged_scopes, created_at, updated_at\n ) VALUES (\n ${record.projectId}, ${record.connectorId}, ${record.id},\n ${jsonParameter(this.sql, record.authorizedBy)},\n ${record.credentials ? jsonParameter(this.sql, record.credentials) : null},\n ${record.credentialExpiresAt ?? null}, ${jsonParameter(this.sql, record.scopes)},\n ${jsonParameter(this.sql, record.accounts)}, ${record.status},\n ${record.selectionExpiresAt ?? null}, ${record.revision}, ${values.mutationId},\n ${values.mutationKind}, ${values.mutationPhase}, ${values.mutationHolderId},\n ${values.mutationExpiresAt}, ${values.mutationDeadlineAt},\n ${\n values.mutationExpectedConnectionIds\n ? jsonParameter(this.sql, values.mutationExpectedConnectionIds)\n : null\n },\n ${values.stagedCredentials ? jsonParameter(this.sql, values.stagedCredentials) : null},\n ${values.stagedCredentialExpiresAt},\n ${values.stagedScopes ? jsonParameter(this.sql, values.stagedScopes) : null},\n ${record.createdAt}, ${record.updatedAt}\n )\n `\n return true\n } catch (error) {\n if (isUniqueViolation(error)) return false\n throw error\n }\n }\n\n async getAuthorization(id: string): Promise<ConnectorAuthorizationRecord | null> {\n const rows = await this.authorizationById(id)\n return rows[0] ? authorizationFromRow(rows[0]) : null\n }\n\n async updateAuthorization(record: ConnectorAuthorizationRecord): Promise<void> {\n const values = authorizationValues(record)\n const rows = await this.sql<{ readonly id: string }[]>`\n UPDATE connector_authorizations\n SET authorized_by = ${jsonParameter(this.sql, record.authorizedBy)},\n credentials = ${record.credentials ? jsonParameter(this.sql, record.credentials) : null},\n credential_expires_at = ${record.credentialExpiresAt ?? null},\n scopes = ${jsonParameter(this.sql, record.scopes)},\n accounts = ${jsonParameter(this.sql, record.accounts)}, status = ${record.status},\n selection_expires_at = ${record.selectionExpiresAt ?? null}, revision = ${record.revision},\n mutation_id = ${values.mutationId}, mutation_kind = ${values.mutationKind},\n mutation_phase = ${values.mutationPhase}, mutation_holder_id = ${values.mutationHolderId},\n mutation_expires_at = ${values.mutationExpiresAt},\n mutation_deadline_at = ${values.mutationDeadlineAt},\n mutation_expected_connection_ids = ${\n values.mutationExpectedConnectionIds\n ? jsonParameter(this.sql, values.mutationExpectedConnectionIds)\n : null\n },\n staged_credentials = ${\n values.stagedCredentials ? jsonParameter(this.sql, values.stagedCredentials) : null\n },\n staged_credential_expires_at = ${values.stagedCredentialExpiresAt},\n staged_scopes = ${\n values.stagedScopes ? jsonParameter(this.sql, values.stagedScopes) : null\n },\n updated_at = ${record.updatedAt}\n WHERE project_id = ${record.projectId} AND connector_id = ${record.connectorId}\n AND id = ${record.id}\n RETURNING id\n `\n assertChanged(rows, \"connector authorization\", record.id)\n }\n\n async insertConnection(record: ConnectorConnectionRecord): Promise<boolean> {\n try {\n await this.sql`\n INSERT INTO connector_connections (\n project_id, connector_id, id, authorization_id, slot, account,\n account_id, status, disconnected_at, created_at, updated_at\n ) VALUES (\n ${record.projectId}, ${record.connectorId}, ${record.id}, ${record.authorizationId},\n ${record.slot}, ${jsonParameter(this.sql, record.account)},\n ${record.account.id}, ${record.status}, ${record.disconnectedAt ?? null},\n ${record.createdAt}, ${record.updatedAt}\n )\n `\n return true\n } catch (error) {\n if (isUniqueViolation(error)) return false\n throw error\n }\n }\n\n async getConnectionById(id: string): Promise<ConnectorConnectionRecord | null> {\n const rows = await this.connectionById(id)\n return rows[0] ? connectionFromRow(rows[0]) : null\n }\n\n async getConnectionBySelector(input: {\n readonly owner: { readonly type: \"project\" }\n readonly slot: string\n }): Promise<ConnectorConnectionRecord | null> {\n if (!this.scope.connectorId) return null\n const rows = await this.sql<PgConnectionRow[]>`\n SELECT * FROM connector_connections\n WHERE project_id = ${this.scope.projectId} AND connector_id = ${this.scope.connectorId}\n AND slot = ${input.slot}\n ${this.lockClause()}\n `\n return rows[0] ? connectionFromRow(rows[0]) : null\n }\n\n async listConnections(): Promise<readonly ConnectorConnectionRecord[]> {\n if (!this.scope.connectorId) return []\n const rows = await this.sql<PgConnectionRow[]>`\n SELECT * FROM connector_connections\n WHERE project_id = ${this.scope.projectId} AND connector_id = ${this.scope.connectorId}\n ORDER BY id\n ${this.lockClause()}\n `\n return rows.map(connectionFromRow)\n }\n\n async listConnectionsByAuthorization(\n authorizationId: string,\n options: { readonly connectedOnly?: boolean } = {}\n ): Promise<readonly ConnectorConnectionRecord[]> {\n if (!this.scope.connectorId) return []\n const rows = options.connectedOnly\n ? await this.sql<PgConnectionRow[]>`\n SELECT * FROM connector_connections\n WHERE project_id = ${this.scope.projectId} AND connector_id = ${this.scope.connectorId}\n AND authorization_id = ${authorizationId} AND status = 'connected'\n ORDER BY id\n ${this.lockClause()}\n `\n : await this.sql<PgConnectionRow[]>`\n SELECT * FROM connector_connections\n WHERE project_id = ${this.scope.projectId} AND connector_id = ${this.scope.connectorId}\n AND authorization_id = ${authorizationId}\n ORDER BY id\n ${this.lockClause()}\n `\n return rows.map(connectionFromRow)\n }\n\n async updateConnection(record: ConnectorConnectionRecord): Promise<void> {\n const rows = await this.sql<{ readonly id: string }[]>`\n UPDATE connector_connections\n SET authorization_id = ${record.authorizationId}, slot = ${record.slot},\n account = ${jsonParameter(this.sql, record.account)},\n account_id = ${record.account.id}, status = ${record.status},\n disconnected_at = ${record.disconnectedAt ?? null}, updated_at = ${record.updatedAt}\n WHERE project_id = ${record.projectId} AND connector_id = ${record.connectorId}\n AND id = ${record.id}\n RETURNING id\n `\n assertChanged(rows, \"connector connection\", record.id)\n }\n\n private runById(id: string): Promise<PgConnectionRunRow[]> {\n return this.scope.connectorId\n ? this.sql<PgConnectionRunRow[]>`\n SELECT * FROM connector_connection_runs\n WHERE project_id = ${this.scope.projectId}\n AND connector_id = ${this.scope.connectorId} AND id = ${id}\n ${this.lockClause()}\n `\n : this.sql<PgConnectionRunRow[]>`\n SELECT * FROM connector_connection_runs\n WHERE project_id = ${this.scope.projectId} AND id = ${id}\n ${this.lockClause()}\n `\n }\n\n private authorizationById(id: string): Promise<PgAuthorizationRow[]> {\n return this.scope.connectorId\n ? this.sql<PgAuthorizationRow[]>`\n SELECT * FROM connector_authorizations\n WHERE project_id = ${this.scope.projectId}\n AND connector_id = ${this.scope.connectorId} AND id = ${id}\n ${this.lockClause()}\n `\n : this.sql<PgAuthorizationRow[]>`\n SELECT * FROM connector_authorizations\n WHERE project_id = ${this.scope.projectId} AND id = ${id}\n ${this.lockClause()}\n `\n }\n\n private connectionById(id: string): Promise<PgConnectionRow[]> {\n return this.scope.connectorId\n ? this.sql<PgConnectionRow[]>`\n SELECT * FROM connector_connections\n WHERE project_id = ${this.scope.projectId}\n AND connector_id = ${this.scope.connectorId} AND id = ${id}\n ${this.lockClause()}\n `\n : this.sql<PgConnectionRow[]>`\n SELECT * FROM connector_connections\n WHERE project_id = ${this.scope.projectId} AND id = ${id}\n ${this.lockClause()}\n `\n }\n\n private lockClause() {\n return this.locking ? this.sql`FOR UPDATE` : this.sql``\n }\n}\n\nfunction authorizationAttemptFromRow(\n row: PgAuthorizationAttemptRow\n): ConnectorAuthorizationAttemptRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n connectorId: row.connector_id,\n owner: { type: \"project\" },\n slot: row.slot,\n initiatedByExecutionId: row.initiated_by_execution_id,\n stateHash: row.state_hash,\n ...(row.code_verifier === null ? {} : { codeVerifier: row.code_verifier }),\n redirectUri: row.redirect_uri,\n ...(row.connection_run_id === null ? {} : { connectionRunId: row.connection_run_id }),\n ...(row.return_to === null ? {} : { returnTo: row.return_to }),\n ...(row.callback_binding_hash === null\n ? {}\n : { callbackBindingHash: row.callback_binding_hash }),\n ...(row.reauthorization_id === null ? {} : { reauthorizationId: row.reauthorization_id }),\n ...(row.reauthorization_revision === null\n ? {}\n : { reauthorizationRevision: row.reauthorization_revision }),\n ...(row.reauthorization_connection_ids === null\n ? {}\n : { reauthorizationConnectionIds: row.reauthorization_connection_ids }),\n createdAt: date(row.created_at),\n expiresAt: date(row.expires_at),\n }\n}\n\nfunction runValues(record: ConnectorConnectionRunRecord) {\n return {\n kind: record.kind,\n slot: record.slot,\n initiatedByExecutionId: record.initiatedByExecutionId,\n status: record.status,\n waitingFor: record.status === \"waiting\" ? record.waitingFor : null,\n processingId: record.status === \"running\" ? record.processingId : null,\n callbackStartedAt: record.status === \"running\" ? record.callbackStartedAt : null,\n expiresAt: record.status === \"waiting\" || record.status === \"running\" ? record.expiresAt : null,\n authorizationId: \"authorizationId\" in record ? (record.authorizationId ?? null) : null,\n cleanupAuthorizationId:\n record.status === \"succeeded\" ? (record.cleanupAuthorizationId ?? null) : null,\n connections: record.status === \"succeeded\" ? record.connections : null,\n error: record.status === \"failed\" ? record.error : null,\n finishedAt:\n record.status === \"succeeded\" ||\n record.status === \"failed\" ||\n record.status === \"cancelled\" ||\n record.status === \"expired\"\n ? record.finishedAt\n : null,\n }\n}\n\nfunction connectionRunFromRow(row: PgConnectionRunRow): ConnectorConnectionRunRecord {\n const base = {\n id: row.id,\n projectId: row.project_id,\n connectorId: row.connector_id,\n kind: row.kind,\n owner: { type: \"project\" as const },\n slot: row.slot,\n initiatedByExecutionId: row.initiated_by_execution_id,\n createdAt: date(row.created_at),\n updatedAt: date(row.updated_at),\n }\n if (row.status === \"waiting\" && row.waiting_for === \"provider_authorization\") {\n return {\n ...base,\n status: \"waiting\",\n waitingFor: \"provider_authorization\",\n expiresAt: date(required(row.expires_at, \"run expiry\")),\n }\n }\n if (row.status === \"waiting\" && row.waiting_for === \"account_selection\") {\n return {\n ...base,\n status: \"waiting\",\n waitingFor: \"account_selection\",\n authorizationId: required(row.authorization_id, \"authorization id\"),\n expiresAt: date(required(row.expires_at, \"run expiry\")),\n }\n }\n if (row.status === \"running\") {\n return {\n ...base,\n status: \"running\",\n processingId: required(row.processing_id, \"processing id\"),\n callbackStartedAt: date(required(row.callback_started_at, \"callback start\")),\n expiresAt: date(required(row.expires_at, \"run expiry\")),\n ...(row.authorization_id === null ? {} : { authorizationId: row.authorization_id }),\n }\n }\n const finishedAt = date(required(row.finished_at, \"run finish\"))\n if (row.status === \"succeeded\") {\n return {\n ...base,\n status: \"succeeded\",\n authorizationId: required(row.authorization_id, \"authorization id\"),\n ...(row.cleanup_authorization_id === null\n ? {}\n : { cleanupAuthorizationId: row.cleanup_authorization_id }),\n connections: required(row.connections, \"connections\").map(connectionFromSerialized),\n finishedAt,\n }\n }\n if (row.status === \"failed\") {\n return {\n ...base,\n status: \"failed\",\n error: required(row.error, \"run error\"),\n ...(row.authorization_id === null ? {} : { authorizationId: row.authorization_id }),\n finishedAt,\n }\n }\n if (row.status === \"cancelled\") {\n return {\n ...base,\n status: \"cancelled\",\n ...(row.authorization_id === null ? {} : { authorizationId: row.authorization_id }),\n finishedAt,\n }\n }\n if (row.status === \"expired\") {\n return {\n ...base,\n status: \"expired\",\n ...(row.authorization_id === null ? {} : { authorizationId: row.authorization_id }),\n finishedAt,\n }\n }\n throw new Error(`[SixbPg] Stored connector connection run status '${row.status}' is invalid.`)\n}\n\nfunction authorizationValues(record: ConnectorAuthorizationRecord) {\n const mutation = record.credentialMutation\n return {\n mutationId: mutation?.id ?? null,\n mutationKind: mutation?.kind ?? null,\n mutationPhase: mutation?.phase ?? null,\n mutationHolderId: mutation?.holderId ?? null,\n mutationExpiresAt: mutation?.expiresAt ?? null,\n mutationDeadlineAt: mutation?.deadlineAt ?? null,\n mutationExpectedConnectionIds: mutation?.expectedConnectionIds ?? null,\n stagedCredentials: mutation?.stagedCredentials?.credentials ?? null,\n stagedCredentialExpiresAt: mutation?.stagedCredentials?.credentialExpiresAt ?? null,\n stagedScopes: mutation?.stagedCredentials?.scopes ?? null,\n }\n}\n\nfunction authorizationFromRow(row: PgAuthorizationRow): ConnectorAuthorizationRecord {\n const mutation = mutationFromRow(row)\n return {\n id: row.id,\n projectId: row.project_id,\n connectorId: row.connector_id,\n authorizedBy: row.authorized_by,\n ...(row.credentials === null ? {} : { credentials: row.credentials }),\n ...(row.credential_expires_at === null\n ? {}\n : { credentialExpiresAt: date(row.credential_expires_at) }),\n scopes: row.scopes,\n accounts: row.accounts,\n status: row.status,\n ...(row.selection_expires_at === null\n ? {}\n : { selectionExpiresAt: date(row.selection_expires_at) }),\n revision: row.revision,\n ...(mutation === undefined ? {} : { credentialMutation: mutation }),\n createdAt: date(row.created_at),\n updatedAt: date(row.updated_at),\n }\n}\n\nfunction mutationFromRow(row: PgAuthorizationRow): ConnectorCredentialMutation | undefined {\n if (row.mutation_id === null) return undefined\n const stagedCredentials: ConnectorStagedCredentials | undefined =\n row.staged_credentials === null\n ? undefined\n : {\n credentials: row.staged_credentials,\n ...(row.staged_credential_expires_at === null\n ? {}\n : { credentialExpiresAt: date(row.staged_credential_expires_at) }),\n scopes: required(row.staged_scopes, \"staged credential scopes\"),\n }\n return {\n id: row.mutation_id,\n kind: required(row.mutation_kind, \"credential mutation kind\"),\n phase: required(row.mutation_phase, \"credential mutation phase\"),\n holderId: required(row.mutation_holder_id, \"credential mutation holder\"),\n expiresAt: date(required(row.mutation_expires_at, \"credential mutation expiry\")),\n deadlineAt: date(required(row.mutation_deadline_at, \"credential mutation deadline\")),\n ...(row.mutation_expected_connection_ids === null\n ? {}\n : { expectedConnectionIds: row.mutation_expected_connection_ids }),\n ...(stagedCredentials === undefined ? {} : { stagedCredentials }),\n }\n}\n\nfunction connectionFromRow(row: PgConnectionRow): ConnectorConnectionRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n connectorId: row.connector_id,\n authorizationId: row.authorization_id,\n owner: { type: \"project\" },\n slot: row.slot,\n account: row.account,\n status: row.status,\n ...(row.disconnected_at === null ? {} : { disconnectedAt: date(row.disconnected_at) }),\n createdAt: date(row.created_at),\n updatedAt: date(row.updated_at),\n }\n}\n\ntype SerializedConnectorConnection = Omit<\n ConnectorConnectionRecord,\n \"createdAt\" | \"updatedAt\" | \"disconnectedAt\"\n> & {\n readonly createdAt: string\n readonly updatedAt: string\n readonly disconnectedAt?: string\n}\n\nfunction connectionFromSerialized(\n record: SerializedConnectorConnection\n): ConnectorConnectionRecord {\n const { createdAt, updatedAt, disconnectedAt, ...connection } = record\n return {\n ...connection,\n createdAt: new Date(createdAt),\n updatedAt: new Date(updatedAt),\n ...(disconnectedAt === undefined ? {} : { disconnectedAt: new Date(disconnectedAt) }),\n }\n}\n\ntype PgJsonValue = Parameters<SQLClient[\"json\"]>[0]\n\nfunction jsonParameter(sql: PgStoreClient, value: unknown): ReturnType<PgStoreClient[\"json\"]> {\n return sql.json(value as PgJsonValue)\n}\n\nfunction date(value: Date | string): Date {\n return new Date(value)\n}\n\nfunction required<T>(value: T | null, label: string): T {\n if (value !== null) return value\n throw new Error(`[SixbPg] Stored ${label} is missing.`)\n}\n\nfunction assertChanged(rows: readonly unknown[], label: string, id: string): void {\n if (rows.length === 1) return\n throw new Error(`[SixbPg] Stored ${label} '${id}' is unavailable.`)\n}\n\ninterface ConnectorConnectionTestClock {\n offsetMs: number\n}\n\ninterface PgAuthorizationAttemptRow {\n readonly project_id: string\n readonly connector_id: string\n readonly id: string\n readonly slot: string\n readonly initiated_by_execution_id: string\n readonly state_hash: string\n readonly code_verifier: NonNullable<ConnectorAuthorizationAttemptRecord[\"codeVerifier\"]> | null\n readonly redirect_uri: string\n readonly connection_run_id: string | null\n readonly return_to: string | null\n readonly callback_binding_hash: string | null\n readonly reauthorization_id: string | null\n readonly reauthorization_revision: number | null\n readonly reauthorization_connection_ids: readonly string[] | null\n readonly created_at: Date | string\n readonly expires_at: Date | string\n}\n\ninterface PgConnectionRunRow {\n readonly project_id: string\n readonly connector_id: string\n readonly id: string\n readonly kind: ConnectorConnectionRunRecord[\"kind\"]\n readonly slot: string\n readonly initiated_by_execution_id: string\n readonly status: ConnectorConnectionRunRecord[\"status\"]\n readonly waiting_for: \"provider_authorization\" | \"account_selection\" | null\n readonly processing_id: string | null\n readonly callback_started_at: Date | string | null\n readonly expires_at: Date | string | null\n readonly authorization_id: string | null\n readonly cleanup_authorization_id: string | null\n readonly connections: readonly SerializedConnectorConnection[] | null\n readonly error: Extract<ConnectorConnectionRunRecord, { status: \"failed\" }>[\"error\"] | null\n readonly created_at: Date | string\n readonly updated_at: Date | string\n readonly finished_at: Date | string | null\n}\n\ninterface PgAuthorizationRow {\n readonly project_id: string\n readonly connector_id: string\n readonly id: string\n readonly authorized_by: ConnectorAuthorizationRecord[\"authorizedBy\"]\n readonly credentials: ConnectorAuthorizationRecord[\"credentials\"] | null\n readonly credential_expires_at: Date | string | null\n readonly scopes: readonly string[]\n readonly accounts: ConnectorAuthorizationRecord[\"accounts\"]\n readonly status: ConnectorAuthorizationRecord[\"status\"]\n readonly selection_expires_at: Date | string | null\n readonly revision: number\n readonly mutation_id: string | null\n readonly mutation_kind: ConnectorCredentialMutation[\"kind\"] | null\n readonly mutation_phase: ConnectorCredentialMutation[\"phase\"] | null\n readonly mutation_holder_id: string | null\n readonly mutation_expires_at: Date | string | null\n readonly mutation_deadline_at: Date | string | null\n readonly mutation_expected_connection_ids: readonly string[] | null\n readonly staged_credentials: ConnectorStagedCredentials[\"credentials\"] | null\n readonly staged_credential_expires_at: Date | string | null\n readonly staged_scopes: readonly string[] | null\n readonly created_at: Date | string\n readonly updated_at: Date | string\n}\n\ninterface PgConnectionRow {\n readonly project_id: string\n readonly connector_id: string\n readonly id: string\n readonly authorization_id: string\n readonly slot: string\n readonly account: ConnectorConnectionRecord[\"account\"]\n readonly status: ConnectorConnectionRecord[\"status\"]\n readonly disconnected_at: Date | string | null\n readonly created_at: Date | string\n readonly updated_at: Date | string\n}\n",
30
- "import { createHash } from \"node:crypto\"\nimport type { StorageMigrator } from \"@sixb/core\"\nimport type {\n MigrationHistoryStore,\n MigrationRecord,\n MigrationSet,\n MigrationStep,\n MigrationStepOptions,\n} from \"@sixb/core/storage\"\nimport {\n defineMigrations,\n describeMigrationHistory,\n runMigrationSet,\n step,\n} from \"@sixb/core/storage\"\nimport initialSchemaSql from \"./migrations/001-initial-schema.sql\" with { type: \"text\" }\nimport workflowRunOutputSql from \"./migrations/002-workflow-run-output.sql\" with { type: \"text\" }\nimport mergeSyncRunsSql from \"./migrations/003-merge-sync-runs.sql\" with { type: \"text\" }\nimport executionsSql from \"./migrations/004-executions.sql\" with { type: \"text\" }\nimport workflowExecutionsSql from \"./migrations/005-workflow-executions.sql\" with { type: \"text\" }\nimport narrowOntologySourceRootIndexSql from \"./migrations/006-narrow-ontology-source-root-index.sql\" with {\n type: \"text\",\n}\nimport splitOverridesSql from \"./migrations/007-split-overrides.sql\" with { type: \"text\" }\nimport actionExecutionsSql from \"./migrations/008-action-executions.sql\" with { type: \"text\" }\nimport agentExecutionsSql from \"./migrations/009-agent-executions.sql\" with { type: \"text\" }\nimport aiUsageAccountingFoundationSql from \"./migrations/010-ai-usage-accounting-foundation.sql\" with {\n type: \"text\",\n}\nimport syncFailureRecordSql from \"./migrations/011-sync-failure-record.sql\" with { type: \"text\" }\nimport pipelineFailureRecordSql from \"./migrations/012-pipeline-failure-record.sql\" with {\n type: \"text\",\n}\nimport workflowFailureRecordSql from \"./migrations/013-workflow-failure-record.sql\" with {\n type: \"text\",\n}\nimport agentFailureRecordSql from \"./migrations/014-agent-failure-record.sql\" with { type: \"text\" }\nimport projectionFailureRecordSql from \"./migrations/015-projection-failure-record.sql\" with {\n type: \"text\",\n}\nimport webhookRunFailureRecordSql from \"./migrations/016-webhook-run-failure-record.sql\" with {\n type: \"text\",\n}\nimport actionFailureRecordSql from \"./migrations/017-action-failure-record.sql\" with {\n type: \"text\",\n}\nimport ontologyOutboxFailureRecordSql from \"./migrations/018-ontology-outbox-failure-record.sql\" with {\n type: \"text\",\n}\nimport webhookDeliveryFailureRecordSql from \"./migrations/019-webhook-delivery-failure-record.sql\" with {\n type: \"text\",\n}\nimport dropRunUsageProjectionsSql from \"./migrations/020-drop-run-usage-projections.sql\" with {\n type: \"text\",\n}\nimport syncPipelineExecutionsSql from \"./migrations/021-sync-pipeline-executions.sql\" with {\n type: \"text\",\n}\nimport projectionExecutionsSql from \"./migrations/022-projection-executions.sql\" with {\n type: \"text\",\n}\nimport webhookExecutionsSql from \"./migrations/023-webhook-executions.sql\" with { type: \"text\" }\nimport ontologyCommitExecutionsSql from \"./migrations/024-ontology-commit-executions.sql\" with {\n type: \"text\",\n}\nimport connectorConnectionsSql from \"./migrations/025-connector-connections.sql\" with {\n type: \"text\",\n}\nimport aiCostAccountingSql from \"./migrations/026-ai-cost-accounting.sql\" with { type: \"text\" }\nimport agentContextCheckpointsSql from \"./migrations/027-agent-context-checkpoints.sql\" with {\n type: \"text\",\n}\nimport objectOverrideEditTimesSql from \"./migrations/028-object-override-edit-times.sql\" with {\n type: \"text\",\n}\nimport modelAccountingSql from \"./migrations/029-model-accounting.sql\" with { type: \"text\" }\nimport aiUsageLimitsSql from \"./migrations/030-ai-usage-limits.sql\" with { type: \"text\" }\nimport subagentRunsSql from \"./migrations/031-subagent-runs.sql\" with { type: \"text\" }\nimport conversationRunSpecSql from \"./migrations/032-conversation-run-spec.sql\" with {\n type: \"text\",\n}\nimport retireAgentDefinitionsSql from \"./migrations/033-retire-agent-definitions.sql\" with {\n type: \"text\",\n}\nimport deviceAuthorizationsSql from \"./migrations/034-device-authorizations.sql\" with {\n type: \"text\",\n}\nimport shareGrantsSql from \"./migrations/035-share-grants.sql\" with { type: \"text\" }\nimport shareSessionsSql from \"./migrations/036-share-sessions.sql\" with { type: \"text\" }\nimport projectionSourceRootsSql from \"./migrations/039-projection-source-roots.sql\" with {\n type: \"text\",\n}\nimport agentThreadWorkspacesSql from \"./migrations/041-agent-thread-workspaces.sql\" with {\n type: \"text\",\n}\nimport vectorProfilesSql from \"./migrations/042-vector-profiles.sql\" with { type: \"text\" }\nimport vectorIndexingSql from \"./migrations/043-vector-indexing.sql\" with { type: \"text\" }\nimport vectorBatchingSql from \"./migrations/044-vector-batching.sql\" with { type: \"text\" }\nimport agentThreadSandboxStateSql from \"./migrations/045-agent-thread-sandbox-state.sql\" with {\n type: \"text\",\n}\nimport workflowInterventionPrincipalsSql from \"./migrations/046-workflow-intervention-principals.sql\" with {\n type: \"text\",\n}\nimport ontologyCommitAttributionSql from \"./migrations/047-ontology-commit-attribution.sql\" with {\n type: \"text\",\n}\nimport nativeSessionsSql from \"./migrations/049-native-sessions.sql\" with { type: \"text\" }\nimport directoryGroupMembershipsSql from \"./migrations/050-directory-group-memberships.sql\" with {\n type: \"text\",\n}\nimport projectionRunSupersessionSql from \"./migrations/051-projection-run-supersession.sql\" with {\n type: \"text\",\n}\nimport compactSourceStorageSql from \"./migrations/052-compact-source-storage.sql\" with {\n type: \"text\",\n}\nimport type { ReservedSQL, SQL, SQLClient } from \"./pg-client\"\nimport { runPgTransactionOn, undoOnFailure, withReservedPgConnection } from \"./transactions\"\n\nexport interface PostgresMigrationContext {\n exec(sqlText: string): Promise<void>\n}\n\nexport const POSTGRES_STORAGE_ADAPTER_ID = \"SixbPostgresStorage\"\n\nexport function pgSql(id: string, sqlText: string): MigrationStep<PostgresMigrationContext> {\n return pgStep(id, (context) => context.exec(sqlText), { checksum: checksum(sqlText) })\n}\n\nexport function pgStep(\n id: string,\n up: (context: PostgresMigrationContext) => void | Promise<void>,\n options: MigrationStepOptions = {}\n): MigrationStep<PostgresMigrationContext> {\n return step<PostgresMigrationContext>(id, up, options)\n}\n\nexport function createPostgresStorageMigrators(\n sql: SQL,\n schemaName: string\n): readonly StorageMigrator[] {\n return [\n createPostgresMigrator({\n sql,\n schemaName,\n migrations: postgresStorageMigrations,\n }),\n ]\n}\n\nexport function createPostgresMigrator(params: {\n readonly sql: SQL\n readonly schemaName: string\n readonly migrations: MigrationSet<PostgresMigrationContext>\n}): StorageMigrator {\n return {\n adapterId: params.migrations.adapterId,\n latestVersion: params.migrations.latestVersion,\n async status() {\n return describeMigrationHistory({\n migrations: params.migrations,\n rows: await readPostgresHistory(params.sql, params.schemaName, params.migrations.adapterId),\n })\n },\n migrate() {\n return withPostgresMigrationLock(params, async (sql) => {\n const session = postgresMigrationSession(sql, params.schemaName)\n return runMigrationSet({\n context: session.context,\n migrations: params.migrations,\n state: session.state,\n })\n })\n },\n }\n}\n\nexport async function migratePostgresStorage(sql: SQL, schemaName: string): Promise<void> {\n await createPostgresMigrator({\n sql,\n schemaName,\n migrations: postgresStorageMigrations,\n }).migrate()\n}\n\nexport async function dropSchema(sql: SQL, schemaName: string): Promise<void> {\n await sql.unsafe(`DROP SCHEMA IF EXISTS ${quoteIdent(schemaName)} CASCADE`)\n}\n\nexport function quoteIdent(identifier: string): string {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier)) {\n throw new Error(`[SixbPg] Invalid identifier: ${identifier}`)\n }\n return `\"${identifier}\"`\n}\n\nfunction postgresMigrationSession(\n sql: ReservedSQL,\n schemaName: string\n): { context: PostgresMigrationContext; state: MigrationHistoryStore } {\n const schema = quoteIdent(schemaName)\n const migrationsTable = `${schema}.sixb_migrations`\n // Migration steps receive a stable context; route exec() through the active transaction.\n let active: SQLClient | null = null\n const connection = (): SQLClient => active ?? sql\n\n return {\n context: {\n async exec(sqlText) {\n await connection().unsafe(sqlText)\n },\n },\n state: {\n async ensure() {\n await sql.unsafe(`\n CREATE SCHEMA IF NOT EXISTS ${schema};\n\n CREATE TABLE IF NOT EXISTS ${migrationsTable} (\n adapter_id TEXT NOT NULL,\n version INTEGER NOT NULL,\n id TEXT NOT NULL,\n checksum TEXT,\n status TEXT NOT NULL CHECK (status IN ('started', 'applied')),\n started_at TIMESTAMPTZ NOT NULL,\n finished_at TIMESTAMPTZ,\n PRIMARY KEY (adapter_id, version)\n );\n `)\n },\n async readHistory(adapterId) {\n const rows = await sql.unsafe<PostgresMigrationRow[]>(\n `SELECT * FROM ${migrationsTable} WHERE adapter_id = $1 ORDER BY version`,\n [adapterId]\n )\n return rows.map(rowToMigrationRecord)\n },\n async markStarted(adapterId, migration, at) {\n await connection().unsafe(\n `\n INSERT INTO ${migrationsTable} (\n adapter_id, version, id, checksum, status, started_at, finished_at\n ) VALUES ($1, $2, $3, $4, 'started', $5, NULL)\n ON CONFLICT(adapter_id, version) DO UPDATE SET\n id = excluded.id,\n checksum = excluded.checksum,\n status = excluded.status,\n started_at = excluded.started_at,\n finished_at = NULL\n `,\n [adapterId, migration.version, migration.id, migration.checksum ?? null, at]\n )\n },\n async markApplied(adapterId, migration, at) {\n await connection().unsafe(\n `\n UPDATE ${migrationsTable}\n SET status = 'applied', finished_at = $1\n WHERE adapter_id = $2 AND version = $3\n `,\n [at, adapterId, migration.version]\n )\n },\n async transaction(run) {\n // `sql` is the reserved connection holding the migration advisory lock. porsager's\n // `.begin` would open the transaction on another pool connection, so drive it on this one\n // and route exec()/markStarted()/markApplied() through it via `active`.\n const previous = active\n active = sql\n try {\n return await runPgTransactionOn(sql, async () => {\n await sql.unsafe(`SET LOCAL search_path TO ${schema}`)\n return run()\n })\n } finally {\n active = previous\n }\n },\n },\n }\n}\n\n/**\n * Reads migration history without DDL and without the advisory lock. `null` means the\n * history table does not exist, which is a state and not a failure.\n *\n * `migrate()` cannot be used for this: it calls `ensure()` first, so it runs\n * `CREATE SCHEMA`/`CREATE TABLE` and reserves a connection to hold\n * `pg_advisory_lock`. A probe must need no DDL grant — `/ready` is public and\n * unauthenticated — and must not serialize N replicas behind one lock.\n *\n * `to_regclass` returns NULL for a missing relation (including a missing schema)\n * instead of raising, and needs no catalog privileges.\n */\nasync function readPostgresHistory(\n sql: SQL,\n schemaName: string,\n adapterId: string\n): Promise<readonly MigrationRecord[] | null> {\n const schema = quoteIdent(schemaName)\n const probe = await sql.unsafe<{ oid: string | null }[]>(`SELECT to_regclass($1) AS oid`, [\n `${schema}.sixb_migrations`,\n ])\n if (!probe[0]?.oid) {\n return null\n }\n\n const rows = await sql.unsafe<PostgresMigrationRow[]>(\n `SELECT * FROM ${schema}.sixb_migrations WHERE adapter_id = $1 ORDER BY version`,\n [adapterId]\n )\n return rows.map(rowToMigrationRecord)\n}\n\nasync function withPostgresMigrationLock<T>(\n params: {\n readonly sql: SQL\n readonly schemaName: string\n readonly migrations: MigrationSet<PostgresMigrationContext>\n },\n run: (sql: ReservedSQL) => Promise<T>\n): Promise<T> {\n const [first, second] = advisoryLockParts(\n `storage:migration:${params.schemaName}:${params.migrations.adapterId}`\n )\n\n // A session-level lock outlives any transaction, so it is released before the connection goes\n // back to the pool — except when the connection was lost, which already released it.\n return withReservedPgConnection(params.sql, async (sql) => {\n const unlock = () => sql`SELECT pg_advisory_unlock(${first}, ${second})`\n await sql`SELECT pg_advisory_lock(${first}, ${second})`\n const result = await undoOnFailure(() => run(sql), unlock)\n await unlock()\n return result\n })\n}\n\nfunction advisoryLockParts(key: string): readonly [number, number] {\n const hash = createHash(\"sha256\").update(key).digest()\n return [hash.readInt32BE(0), hash.readInt32BE(4)]\n}\n\nfunction rowToMigrationRecord(row: PostgresMigrationRow): MigrationRecord {\n return {\n adapterId: row.adapter_id,\n version: row.version,\n id: row.id,\n checksum: row.checksum ?? undefined,\n status: row.status,\n startedAt: toIsoString(row.started_at),\n finishedAt: row.finished_at ? toIsoString(row.finished_at) : undefined,\n }\n}\n\nfunction toIsoString(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n\nfunction checksum(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\")\n}\n\nexport const postgresStorageMigrations = defineMigrations<PostgresMigrationContext>({\n adapterId: POSTGRES_STORAGE_ADAPTER_ID,\n steps: [\n pgSql(\"001-initial-schema\", initialSchemaSql),\n pgSql(\"002-workflow-run-output\", workflowRunOutputSql),\n pgSql(\"003-merge-sync-runs\", mergeSyncRunsSql),\n pgSql(\"004-executions\", executionsSql),\n pgSql(\"005-workflow-executions\", workflowExecutionsSql),\n pgSql(\"006-narrow-ontology-source-root-index\", narrowOntologySourceRootIndexSql),\n pgSql(\"007-split-overrides\", splitOverridesSql),\n pgSql(\"008-action-executions\", actionExecutionsSql),\n pgSql(\"009-agent-executions\", agentExecutionsSql),\n pgSql(\"010-ai-usage-accounting-foundation\", aiUsageAccountingFoundationSql),\n pgSql(\"011-sync-failure-record\", syncFailureRecordSql),\n pgSql(\"012-pipeline-failure-record\", pipelineFailureRecordSql),\n pgSql(\"013-workflow-failure-record\", workflowFailureRecordSql),\n pgSql(\"014-agent-failure-record\", agentFailureRecordSql),\n pgSql(\"015-projection-failure-record\", projectionFailureRecordSql),\n pgSql(\"016-webhook-run-failure-record\", webhookRunFailureRecordSql),\n pgSql(\"017-action-failure-record\", actionFailureRecordSql),\n pgSql(\"018-ontology-outbox-failure-record\", ontologyOutboxFailureRecordSql),\n pgSql(\"019-webhook-delivery-failure-record\", webhookDeliveryFailureRecordSql),\n pgSql(\"020-drop-run-usage-projections\", dropRunUsageProjectionsSql),\n pgSql(\"021-sync-pipeline-executions\", syncPipelineExecutionsSql),\n pgSql(\"022-projection-executions\", projectionExecutionsSql),\n pgSql(\"023-webhook-executions\", webhookExecutionsSql),\n pgSql(\"024-ontology-commit-executions\", ontologyCommitExecutionsSql),\n pgSql(\"025-connector-connections\", connectorConnectionsSql),\n pgSql(\"026-ai-cost-accounting\", aiCostAccountingSql),\n pgSql(\"027-agent-context-checkpoints\", agentContextCheckpointsSql),\n pgSql(\"028-object-override-edit-times\", objectOverrideEditTimesSql),\n pgSql(\"029-model-accounting\", modelAccountingSql),\n pgSql(\"030-ai-usage-limits\", aiUsageLimitsSql),\n pgSql(\"031-subagent-runs\", subagentRunsSql),\n pgSql(\"032-conversation-run-spec\", conversationRunSpecSql),\n pgSql(\"033-retire-agent-definitions\", retireAgentDefinitionsSql),\n pgSql(\"034-device-authorizations\", deviceAuthorizationsSql),\n pgSql(\"035-share-grants\", shareGrantsSql),\n pgSql(\"036-share-sessions\", shareSessionsSql),\n pgSql(\"037-execution-requester-groups\", executionRequesterGroupsSql),\n pgSql(\"038-outbox-publication-order\", outboxPublicationOrderSql),\n pgSql(\"039-projection-source-roots\", projectionSourceRootsSql),\n pgSql(\"040-connector-optional-pkce\", connectorOptionalPkceSql),\n pgSql(\"041-agent-thread-workspaces\", agentThreadWorkspacesSql),\n pgSql(\"042-vector-profiles\", vectorProfilesSql),\n pgSql(\"043-vector-indexing\", vectorIndexingSql),\n pgSql(\"044-vector-batching\", vectorBatchingSql),\n pgSql(\"045-agent-thread-sandbox-state\", agentThreadSandboxStateSql),\n pgSql(\"046-workflow-intervention-principals\", workflowInterventionPrincipalsSql),\n pgSql(\"047-ontology-commit-attribution\", ontologyCommitAttributionSql),\n pgSql(\"048-file-upload-sessions\", fileUploadSessionsSql),\n pgSql(\"049-native-sessions\", nativeSessionsSql),\n pgSql(\"050-directory-group-memberships\", directoryGroupMembershipsSql),\n pgSql(\"051-projection-run-supersession\", projectionRunSupersessionSql),\n pgSql(\"052-compact-source-storage\", compactSourceStorageSql),\n ],\n})\n\ninterface PostgresMigrationRow {\n readonly adapter_id: string\n readonly version: number\n readonly id: string\n readonly checksum: string | null\n readonly status: MigrationRecord[\"status\"]\n readonly started_at: Date | string\n readonly finished_at: Date | string | null\n}\n\nimport executionRequesterGroupsSql from \"./migrations/037-execution-requester-groups.sql\" with {\n type: \"text\",\n}\nimport outboxPublicationOrderSql from \"./migrations/038-outbox-publication-order.sql\" with {\n type: \"text\",\n}\n\nimport connectorOptionalPkceSql from \"./migrations/040-connector-optional-pkce.sql\" with {\n type: \"text\",\n}\nimport fileUploadSessionsSql from \"./migrations/048-file-upload-sessions.sql\" with { type: \"text\" }\n",
31
- "import { hasVectorProfile } from \"@sixb/core/internal/query\"\nimport type {\n CompiledSelectedObjectReadScope,\n CountObjectsInput,\n CountObjectsResult,\n ExistsObjectsInput,\n ExistsObjectsResult,\n FacetObjectsInput,\n FacetObjectsResult,\n LinkBatchKey,\n LinkDirection,\n ObjectBatchKey,\n ObjectLinkRow,\n ObjectQueryCapabilities,\n ObjectReadExecutionLimits,\n ObjectReadStorage,\n ObjectRow,\n ObjectStorage,\n QueryObjectLinksInput,\n QueryObjectLinksResult,\n QueryObjectsInput,\n QueryObjectsResult,\n} from \"@sixb/core/storage\"\nimport type { SQLClient, SqlParameter } from \"../pg-client\"\nimport { type PgStoreClient, runPgRepeatableReadTransaction } from \"../transactions\"\nimport { DEFAULT_OBJECT_QUERY_SOURCE } from \"./query-compiler\"\nimport { assertLinkQueryLimit, PgObjectReader } from \"./reader\"\nimport {\n type LinkDatabaseRow,\n linkIdentity,\n type ObjectDatabaseRow,\n rowToLink,\n rowToObject,\n} from \"./rows\"\nimport { createPgSelectedReader } from \"./selected-reader\"\n\nconst PG_OBJECT_QUERY_CAPABILITIES: ObjectQueryCapabilities = {\n queryObjects: true,\n countObjects: true,\n existsObjects: true,\n facetObjects: true,\n nodes: {\n start: true,\n refs: true,\n filter: true,\n text: true,\n vector: true,\n sort: true,\n limit: true,\n page: true,\n traverse: true,\n set: true,\n project: true,\n expand: true,\n },\n predicateOps: {\n and: true,\n or: true,\n not: true,\n eq: true,\n neq: true,\n lt: true,\n lte: true,\n gt: true,\n gte: true,\n in: true,\n exists: true,\n contains: true,\n },\n sortKinds: {\n property: true,\n },\n traversalDirections: {\n outgoing: true,\n incoming: true,\n },\n setOps: {\n union: true,\n intersect: true,\n subtract: true,\n },\n scalarOperations: {\n string: { equality: true, ordering: true },\n uuid: { equality: true, ordering: true },\n boolean: { equality: true },\n integer: { equality: true, ordering: true },\n double: { equality: true, ordering: true },\n decimal: { equality: true, ordering: true },\n date: { equality: true, ordering: true },\n timestamp: { equality: true, ordering: true },\n // jsonb equality and containment compare both fields of `{ type, id }`, whatever key order.\n userRef: { equality: true },\n },\n limits: {\n totalCount: true,\n stablePageTokens: true,\n },\n notes: [\n \"PostgreSQL object query pushdown supports start/refs/filter/text/sort/limit/page/traverse/set/project/expand over JSONB properties and object links.\",\n \"expand hydrates linked objects in-database (top-N per parent via LATERAL + jsonb_agg); core resolves each expansion's cardinality before pushdown, and a mixed/unresolved one stays on the fallback.\",\n \"Exact decimal predicates, ordering, and keyset pagination use PostgreSQL numeric casts.\",\n \"Relevance sorting and unresolved start.includeSubtypes remain planner fallback or rejection cases.\",\n ],\n}\n\n/** PostgreSQL object provider; interactive reads share one source-aware reader. */\nexport class PgObjectStorage implements ObjectStorage {\n private readonly reader: PgObjectReader\n\n constructor(private readonly sql: PgStoreClient) {\n this.reader = new PgObjectReader(sql, DEFAULT_OBJECT_QUERY_SOURCE)\n }\n\n queryCapabilities(): ObjectQueryCapabilities {\n return PG_OBJECT_QUERY_CAPABILITIES\n }\n\n createSelectedReadScope(params: {\n projectId: string\n scope: CompiledSelectedObjectReadScope\n limits: ObjectReadExecutionLimits\n }): ObjectReadStorage {\n return createPgSelectedReader(this.sql, params, () => this.queryCapabilities())\n }\n\n async queryObjects(params: QueryObjectsInput): Promise<QueryObjectsResult> {\n if (hasVectorProfile(params.query))\n return runPgRepeatableReadTransaction(this.sql, (tx) =>\n new PgObjectReader(tx, DEFAULT_OBJECT_QUERY_SOURCE).queryObjects(params)\n )\n return this.reader.queryObjects(params)\n }\n\n async countObjects(params: CountObjectsInput): Promise<CountObjectsResult> {\n if (hasVectorProfile(params.query))\n return runPgRepeatableReadTransaction(this.sql, (tx) =>\n new PgObjectReader(tx, DEFAULT_OBJECT_QUERY_SOURCE).countObjects(params)\n )\n return this.reader.countObjects(params)\n }\n\n async existsObjects(params: ExistsObjectsInput): Promise<ExistsObjectsResult> {\n if (hasVectorProfile(params.query))\n return runPgRepeatableReadTransaction(this.sql, (tx) =>\n new PgObjectReader(tx, DEFAULT_OBJECT_QUERY_SOURCE).existsObjects(params)\n )\n return this.reader.existsObjects(params)\n }\n\n async facetObjects(params: FacetObjectsInput): Promise<FacetObjectsResult> {\n if (hasVectorProfile(params.query))\n return runPgRepeatableReadTransaction(this.sql, (tx) =>\n new PgObjectReader(tx, DEFAULT_OBJECT_QUERY_SOURCE).facetObjects(params)\n )\n return this.reader.facetObjects(params)\n }\n\n async getByPrimaryId(params: {\n projectId: string\n objectTypeId: string\n primaryId: string\n }): Promise<ObjectRow | null> {\n return this.reader.getByPrimaryId(params)\n }\n\n async selectsObjectProperties(\n params: Parameters<ObjectReadStorage[\"selectsObjectProperties\"]>[0]\n ): Promise<readonly boolean[]> {\n return this.reader.selectsObjectProperties(params)\n }\n\n async listLinks(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n linkId?: string\n direction?: LinkDirection\n }): Promise<readonly ObjectLinkRow[]> {\n return this.reader.listLinks(params)\n }\n\n async getByPrimaryIdBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; primaryId: string }[]\n }): Promise<Map<ObjectBatchKey, ObjectRow>> {\n return this.reader.getByPrimaryIdBatch(params)\n }\n\n async listLinksBatch(params: {\n projectId: string\n direction?: LinkDirection\n items: readonly { objectTypeId: string; objectId: string; linkId: string }[]\n }): Promise<Map<LinkBatchKey, ObjectLinkRow[]>> {\n return this.reader.listLinksBatch(params)\n }\n\n async queryLinks(params: QueryObjectLinksInput): Promise<QueryObjectLinksResult> {\n assertLinkQueryLimit(params.limit)\n return this.reader.queryLinks(params)\n }\n\n async listIncidentLinksBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; objectId: string }[]\n }): Promise<readonly ObjectLinkRow[]> {\n if (params.items.length === 0) return []\n const tuples = params.items.map((item) => [item.objectTypeId, item.objectId])\n\n // Cover both link directions with two index-friendly equality joins (source-side, then\n // target-side) rather than a single OR-join, which would defeat index usage. This is a constant\n // number of round trips regardless of the requested object count. They are issued sequentially\n // because callers may run on a serializable transaction's single connection. A link incident to\n // two listed objects matches both halves and is de-duplicated below.\n const sourceRows = await valuesJoin<LinkDatabaseRow>(\n this.sql,\n \"SELECT l.* FROM links l\",\n [\"source_type_id\", \"source_id\"],\n tuples,\n \"WHERE l.project_id = $1\",\n [params.projectId]\n )\n const targetRows = await valuesJoin<LinkDatabaseRow>(\n this.sql,\n \"SELECT l.* FROM links l\",\n [\"target_type_id\", \"target_id\"],\n tuples,\n \"WHERE l.project_id = $1\",\n [params.projectId]\n )\n\n const deduped = new Map<string, ObjectLinkRow>()\n for (const row of [...sourceRows, ...targetRows]) {\n const link = rowToLink(row)\n deduped.set(linkIdentity(link), link)\n }\n return [...deduped.values()]\n }\n\n async listByPrimaryIdPage(params: {\n projectId: string\n objectTypeId: string\n afterPrimaryId?: string\n limit: number\n }): Promise<{ objects: readonly ObjectRow[]; nextPrimaryId?: string }> {\n assertReconciliationPageLimit(params.limit)\n const rows = await this.sql<ObjectDatabaseRow[]>`\n SELECT * FROM objects\n WHERE project_id = ${params.projectId}\n AND object_type_id = ${params.objectTypeId}\n ${params.afterPrimaryId ? this.sql`AND primary_id > ${params.afterPrimaryId}` : this.sql``}\n ORDER BY primary_id ASC\n LIMIT ${params.limit + 1}\n `\n const hasMore = rows.length > params.limit\n const objects = rows.slice(0, params.limit).map((row) => rowToObject(row))\n const last = objects.at(-1)\n return {\n objects,\n ...(hasMore && last ? { nextPrimaryId: last.primaryId } : {}),\n }\n }\n\n async list(params: {\n projectId: string\n objectTypeId?: string | readonly string[]\n primaryIdPrefix?: string\n primaryIdSuffix?: string\n updatedAfter?: Date\n updatedBefore?: Date\n createdAfter?: Date\n createdBefore?: Date\n limit?: number\n offset?: number\n orderBy?: \"createdAt\" | \"updatedAt\" | \"primaryId\"\n order?: \"asc\" | \"desc\"\n }): Promise<{ objects: readonly ObjectRow[]; hasMore: boolean; total: number }> {\n return this.reader.list(params)\n }\n}\n\n/**\n * Build a `SELECT ... JOIN (VALUES ...) AS t(...) ON ... WHERE ...` query\n * with positional parameters. Bun SQL's tagged-template helpers don't\n * support VALUES inside SELECT/JOIN, so we construct the query string\n * manually while keeping all user data in the parameter array.\n */\nfunction valuesJoin<Row = unknown>(\n sql: SQLClient,\n select: string,\n columns: string[],\n tuples: unknown[][],\n where: string,\n whereParams: unknown[]\n): Promise<Row[]> {\n const alias = \"t\"\n const colWidth = columns.length\n\n // $1 … $N are reserved for the WHERE params that come first.\n const base = whereParams.length\n const valuePlaceholders = tuples\n .map((_, i) => {\n const cols = columns.map((_, j) => `$${base + i * colWidth + j + 1}`)\n return `(${cols.join(\",\")})`\n })\n .join(\",\")\n\n const onClause = columns\n .map((c) => {\n // Infer the table alias from the SELECT clause (first word after SELECT ... FROM)\n const srcAlias = select.match(/FROM\\s+\\w+\\s+(\\w+)/i)?.[1] ?? select.split(\" \").pop()\n return `${srcAlias}.${c} = ${alias}.${c}`\n })\n .join(\" AND \")\n\n const query = `${select} JOIN (VALUES ${valuePlaceholders}) AS ${alias}(${columns.join(\",\")}) ON ${onClause} ${where}`\n const params = [...whereParams, ...tuples.flat()]\n\n return sql.unsafe(query, params as SqlParameter[]) as unknown as Promise<Row[]>\n}\n\nfunction assertReconciliationPageLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Object reconciliation page limit must be a positive safe integer.\")\n }\n}\n",
32
- "import {\n type ObjectExpansion,\n type ObjectQuery,\n ObjectQueryExecutionError,\n type ObjectQueryPredicate,\n type ObjectQuerySetOperation,\n type ObjectQuerySortField,\n type QueryScalarKind,\n} from \"@sixb/core\"\nimport {\n hasVectorProfile,\n isVectorProfileQuery,\n normalizeVector,\n vectorSearchCandidateLimit,\n} from \"@sixb/core/internal/query\"\n\nexport interface PgObjectQueryPageRow {\n object_type_id: string\n primary_id: string\n properties: unknown\n _cursor_properties?: unknown\n}\n\nexport interface CompiledPgObjectQuery {\n vectorProbe?: { sql: string; args: unknown[]; limit: number }\n sql: string\n args: unknown[]\n totalSql: string\n totalArgs: unknown[]\n order: CompiledOrder\n hasMoreProbe?: CompiledHasMoreProbe\n hasMore(rowCount: number, total?: number): boolean\n trimRows<T>(rows: readonly T[]): readonly T[]\n nextPageToken(rows: readonly PgObjectQueryPageRow[], rowCount: number): string | undefined\n}\n\nexport interface CompiledPgScalarQuery {\n sql: string\n args: unknown[]\n}\n\nexport interface CompiledPgFacetQuery {\n sql: string\n args: unknown[]\n}\n\ninterface CompiledHasMoreProbe {\n sql: string\n args: unknown[]\n hasMore(rowCount: number): boolean\n}\n\ninterface CompileContext {\n probeLimit: boolean\n source: PgObjectQuerySource\n}\n\ninterface CompiledPredicate {\n sql: string\n args: unknown[]\n}\n\ninterface CompiledAggregateSource {\n sql: string\n args: unknown[]\n}\n\ninterface CompiledOrder {\n sql: string\n args: unknown[]\n fields: readonly CompiledOrderField[]\n propertyColumn: string\n}\n\ntype CompiledOrderField =\n | {\n kind: \"property\"\n propertyId: string\n direction: \"asc\" | \"desc\"\n scalarKind?: QueryScalarKind\n }\n | {\n kind: \"column\"\n column: \"object_type_id\" | \"primary_id\" | \"_vector_score\"\n binary?: boolean\n direction: \"asc\" | \"desc\"\n }\n\ninterface EncodedPageToken {\n version: 1\n order: readonly string[]\n values: readonly EncodedCursorValue[]\n}\n\ninterface EncodedCursorValue {\n nullish: boolean\n value?: unknown\n}\n\nconst PAGE_TOKEN_PREFIX = \"keyset:\"\n// Per-parent fanout the core executor bakes into every pushed-down expansion;\n// this default only guards a malformed (un-baked) IR and mirrors the core cap.\nconst DEFAULT_EXPANSION_FANOUT = 1_000\n\nexport function compilePgObjectQuery(\n projectId: string,\n query: ObjectQuery,\n options: { includeTotal?: boolean; source?: PgObjectQuerySource } = {}\n): CompiledPgObjectQuery {\n if (hasVectorProfile(query) && !isVectorProfileQuery(query)) {\n throw new ObjectQueryExecutionError(\n \"unsupported_vector_composition\",\n \"Vector search supports one profile with filters, traversals or sets before ranking and limit/project after.\"\n )\n }\n const source = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n const compiled = source.wrapQuery(\n compileObjectQueryInternal(projectId, query, {\n probeLimit: options.includeTotal === false,\n source,\n })\n )\n return {\n ...compiled,\n sql: numberPlaceholders(compiled.sql),\n totalSql: numberPlaceholders(compiled.totalSql),\n vectorProbe: compiled.vectorProbe\n ? { ...compiled.vectorProbe, sql: numberPlaceholders(compiled.vectorProbe.sql) }\n : undefined,\n hasMoreProbe: compiled.hasMoreProbe\n ? {\n ...compiled.hasMoreProbe,\n sql: numberPlaceholders(compiled.hasMoreProbe.sql),\n }\n : undefined,\n }\n}\n\n/** Physical relations used by the PostgreSQL object-query compiler. */\nexport interface PgObjectQuerySource {\n readonly objectsTable: string\n readonly linksTable: string\n readonly objectPropertyPermissionsTable?: string\n /** Wrap a terminal SELECT without its own WITH clause; the selected source owns the only WITH. */\n wrapStatement(\n sql: string,\n args?: readonly unknown[]\n ): {\n readonly sql: string\n readonly args: unknown[]\n }\n wrapQuery(query: CompiledPgObjectQuery): CompiledPgObjectQuery\n}\n\n/** Prefix an optional query source, then assign PostgreSQL positional placeholders. */\nexport function compilePgObjectStatement(\n sql: string,\n args: readonly unknown[] = [],\n source?: PgObjectQuerySource\n): CompiledPgScalarQuery {\n return numberCompiledQuery((source ?? DEFAULT_OBJECT_QUERY_SOURCE).wrapStatement(sql, args))\n}\n\nexport const DEFAULT_OBJECT_QUERY_SOURCE: PgObjectQuerySource = {\n objectsTable: \"objects\",\n linksTable: \"links\",\n wrapStatement: (sql, args = []) => ({ sql, args: [...args] }),\n wrapQuery: (query) => query,\n}\n\nfunction exactContext(ctx: CompileContext): CompileContext {\n return ctx.probeLimit ? { ...ctx, probeLimit: false } : ctx\n}\n\nexport function compilePgObjectCountQuery(\n projectId: string,\n query: ObjectQuery,\n options: { source?: PgObjectQuerySource } = {}\n): CompiledPgScalarQuery {\n const querySource = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n const source = compileAggregateSource(projectId, query, querySource)\n return numberCompiledQuery(\n querySource.wrapStatement(\n `\n SELECT COUNT(*)::bigint AS count\n FROM (${source.sql}) AS input\n `,\n source.args\n )\n )\n}\n\nexport function compilePgObjectExistsQuery(\n projectId: string,\n query: ObjectQuery,\n options: { source?: PgObjectQuerySource } = {}\n): CompiledPgScalarQuery {\n const querySource = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n const source = compileAggregateSource(projectId, query, querySource)\n return numberCompiledQuery(\n querySource.wrapStatement(\n `\n SELECT 1\n FROM (${source.sql}) AS input\n LIMIT 1\n `,\n source.args\n )\n )\n}\n\nexport function compilePgObjectFacetQuery(\n projectId: string,\n query: ObjectQuery,\n propertyId: string,\n limit: number,\n options: { source?: PgObjectQuerySource } = {}\n): CompiledPgFacetQuery {\n const querySource = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n const source = compileAggregateSource(projectId, query, querySource)\n return numberCompiledQuery(\n querySource.wrapStatement(\n `\n SELECT facet.value_type, facet.value_text, COUNT(*)::bigint AS count\n FROM (\n SELECT\n jsonb_typeof(input.properties -> (?::text)) AS value_type,\n input.properties ->> (?::text) AS value_text\n FROM (${source.sql}) AS input\n WHERE jsonb_exists(input.properties, ?::text)\n ) AS facet\n GROUP BY facet.value_type, facet.value_text\n ORDER BY count DESC, facet.value_text ASC\n LIMIT ?\n `,\n [propertyId, propertyId, ...source.args, propertyId, limit]\n )\n )\n}\n\nfunction compileObjectQueryInternal(\n projectId: string,\n query: ObjectQuery,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n switch (query.kind) {\n case \"start\":\n return compileStart(projectId, query, ctx)\n case \"refs\":\n return compileRefs(projectId, query, ctx)\n case \"filter\":\n return compileFilter(projectId, query.input, query.predicate, ctx)\n case \"sort\":\n return compileSort(projectId, query.input, query.fields, ctx)\n case \"limit\":\n return compileLimit(projectId, query.input, query.limit, ctx)\n case \"page\":\n return compilePage(projectId, query.input, query.pageSize, query.pageToken, ctx)\n case \"traverse\":\n return compileTraversal(\n projectId,\n query.input,\n query.linkId,\n query.direction,\n query.sourceObjectTypeId,\n ctx\n )\n case \"set\":\n return compileSet(projectId, query.op, query.inputs, ctx)\n case \"project\":\n return compileProject(projectId, query.input, query.properties, ctx)\n case \"text\":\n return compileText(\n projectId,\n query.input,\n query.query,\n query.fields,\n query.fieldsByObjectType,\n ctx\n )\n case \"expand\":\n return compileExpand(projectId, query.input, query.expansions, ctx)\n case \"vector\":\n return compileVector(projectId, query, ctx)\n }\n}\n\nfunction compileVector(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"vector\" }>,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n if (\n typeof query.vector === \"string\" ||\n !isVectorProfileQuery(query) ||\n !query.configuration ||\n !Number.isSafeInteger(query.k) ||\n query.k < 1 ||\n query.k > 1000 ||\n query.vector.length < 1 ||\n query.vector.length > 16000\n ) {\n throw new ObjectQueryExecutionError(\n \"invalid_vector_query\",\n \"A validated named vector profile is required.\"\n )\n }\n const input = compileObjectQueryInternal(projectId, query.input, exactContext(ctx))\n const permissions = ctx.source.objectPropertyPermissionsTable\n const permissionJoin = permissions\n ? `JOIN (\n SELECT project_id, object_type_id, primary_id, array_agg(property_id) AS property_ids\n FROM ${permissions}\n GROUP BY project_id, object_type_id, primary_id\n ) AS vector_permissions ON vector_permissions.project_id = vectors.project_id\n AND vector_permissions.object_type_id = vectors.object_type_id\n AND vector_permissions.primary_id = vectors.primary_id`\n : \"\"\n const authorized = permissions ? `AND vectors.source <@ vector_permissions.property_ids` : \"\"\n const candidates = `FROM (${input.sql}) AS input\n JOIN object_vectors AS vectors ON vectors.project_id = input.project_id\n AND vectors.object_type_id = input.object_type_id AND vectors.primary_id = input.primary_id\n ${permissionJoin}\n WHERE vectors.profile = ? AND vectors.configuration = ?\n AND cardinality(vectors.embedding) = ? ${authorized}`\n const candidateArgs = [...input.args, query.profile!, query.configuration, query.vector.length]\n // Bound distance work, not just returned rows. Exceeding the envelope fails before ranking.\n const limit = vectorSearchCandidateLimit(query.vector.length)\n const values = normalizeVector(query.vector, query.vector.length)\n const order = compileOrder([\n { kind: \"column\", column: \"_vector_score\", direction: \"desc\" },\n ...identityOrderFields().map((field) => ({ ...field, binary: true })),\n ])\n const sql = `SELECT * FROM (SELECT input.*, 1 - (vectors.embedding::public.vector OPERATOR(public.<=>) ?::public.vector) AS _vector_score\n ${candidates}) AS ranked ORDER BY ${order.sql} LIMIT ?`\n const args = [JSON.stringify(values), ...candidateArgs, query.k]\n return {\n sql,\n args,\n // Top-k cardinality depends on eligibility, not distances or ranking.\n totalSql: `SELECT COUNT(*)::bigint AS total FROM (SELECT 1 ${candidates} LIMIT ?) AS eligible`,\n totalArgs: [...candidateArgs, query.k],\n order,\n vectorProbe: {\n sql: `SELECT COUNT(*)::bigint AS total FROM (SELECT 1 ${candidates} LIMIT ?) AS candidates`,\n args: [...candidateArgs, limit + 1],\n limit,\n },\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileStart(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"start\" }>,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n if (query.includeSubtypes === true) {\n throw new Error(\"[SixbPg] PostgreSQL object storage does not support start.includeSubtypes\")\n }\n\n const order = compileOrder(identityOrderFields())\n const sql = `\n SELECT *, properties AS _cursor_properties\n FROM ${ctx.source.objectsTable}\n WHERE project_id = ? AND object_type_id = ?\n ORDER BY ${order.sql}\n `\n\n return {\n sql,\n args: [projectId, query.objectTypeId, ...order.args],\n totalSql: `SELECT COUNT(*)::bigint AS total FROM ${ctx.source.objectsTable} WHERE project_id = ? AND object_type_id = ?`,\n totalArgs: [projectId, query.objectTypeId],\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileRefs(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"refs\" }>,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n if (query.refs.length === 0) {\n throw new Error(\"[SixbPg] PostgreSQL object storage requires at least one ref\")\n }\n\n const order = compileOrder(identityOrderFields())\n const selectedOrder = compileOrder(identityOrderFields(), \"selected\")\n const refsJson = JSON.stringify(query.refs)\n const requested = `\n SELECT DISTINCT\n ref.value ->> 'objectTypeId' AS object_type_id,\n ref.value ->> 'primaryId' AS primary_id\n FROM jsonb_array_elements(?::text::jsonb) AS ref(value)\n `\n const sql = `\n SELECT selected.*, selected.properties AS _cursor_properties\n FROM (${requested}) AS requested\n JOIN ${ctx.source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = requested.object_type_id\n AND selected.primary_id = requested.primary_id\n ORDER BY ${selectedOrder.sql}\n `\n\n return {\n sql,\n args: [refsJson, projectId, ...selectedOrder.args],\n totalSql: `\n SELECT COUNT(*)::bigint AS total\n FROM (${requested}) AS requested\n JOIN ${ctx.source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = requested.object_type_id\n AND selected.primary_id = requested.primary_id\n `,\n totalArgs: [refsJson, projectId],\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileFilter(\n projectId: string,\n inputQuery: ObjectQuery,\n predicateNode: ObjectQueryPredicate,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n return compileWhere(projectId, inputQuery, compilePredicate(predicateNode), ctx)\n}\n\nfunction compileWhere(\n projectId: string,\n inputQuery: ObjectQuery,\n predicate: CompiledPredicate,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, exactContext(ctx))\n const sql = `\n SELECT *\n FROM (${input.sql}) AS input\n WHERE ${predicate.sql}\n ORDER BY ${input.order.sql}\n `\n\n return {\n sql,\n args: [...input.args, ...predicate.args, ...input.order.args],\n totalSql: `\n SELECT COUNT(*)::bigint AS total\n FROM (${input.sql}) AS input\n WHERE ${predicate.sql}\n `,\n totalArgs: [...input.args, ...predicate.args],\n vectorProbe: input.vectorProbe,\n order: input.order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileText(\n projectId: string,\n inputQuery: ObjectQuery,\n query: string,\n fields: readonly string[] | undefined,\n fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n return compileWhere(\n projectId,\n inputQuery,\n compileTextSearchPredicate(query, fields, fieldsByObjectType),\n ctx\n )\n}\n\nfunction compileSort(\n projectId: string,\n inputQuery: ObjectQuery,\n fields: readonly ObjectQuerySortField[],\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, exactContext(ctx))\n const probeInput =\n ctx.probeLimit && needsLimitProbe(inputQuery)\n ? compileObjectQueryInternal(projectId, inputQuery, ctx)\n : undefined\n const order = compileOrder(sortOrderFields(fields))\n\n return {\n sql: `\n SELECT\n input.project_id,\n input.object_type_id,\n input.primary_id,\n input.properties,\n input.properties AS _cursor_properties,\n input.created_at,\n input.updated_at,\n input.version,\n input.last_commit_id${input.vectorProbe ? \", input._vector_score\" : \"\"}\n FROM (${input.sql}) AS input\n ORDER BY ${order.sql}\n `,\n args: [...input.args, ...order.args],\n totalSql: input.totalSql,\n totalArgs: input.totalArgs,\n order,\n hasMoreProbe: probeInput ? hasMoreProbeFor(probeInput) : input.hasMoreProbe,\n hasMore: input.hasMore,\n trimRows: input.trimRows,\n nextPageToken: input.nextPageToken,\n }\n}\n\nfunction compileLimit(\n projectId: string,\n inputQuery: ObjectQuery,\n rawLimit: number,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, exactContext(ctx))\n const limit = Math.max(0, rawLimit)\n const rowLimit = ctx.probeLimit ? limit + 1 : limit\n\n return {\n sql: `\n SELECT *\n FROM (${input.sql}) AS input\n ORDER BY ${input.order.sql}\n LIMIT ?\n `,\n args: [...input.args, ...input.order.args, rowLimit],\n totalSql: `\n SELECT COUNT(*)::bigint AS total\n FROM (${input.sql}) AS input\n `,\n totalArgs: input.args,\n vectorProbe: input.vectorProbe,\n order: input.order,\n hasMore: (rowCount, total) =>\n total === undefined ? ctx.probeLimit && rowCount > limit : limit < total,\n trimRows: ctx.probeLimit ? (rows) => rows.slice(0, limit) : identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compilePage(\n projectId: string,\n inputQuery: ObjectQuery,\n rawPageSize: number,\n pageToken: string | undefined,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, exactContext(ctx))\n const pageSize = Math.max(0, rawPageSize)\n const cursor = pageToken ? decodePageToken(pageToken, input.order.fields) : undefined\n const cursorPredicate = cursor\n ? compileKeysetPredicate(input.order.fields, cursor, input.order.propertyColumn)\n : undefined\n const whereSql = cursorPredicate ? `WHERE ${cursorPredicate.sql}` : \"\"\n\n return {\n sql: `\n SELECT *\n FROM (${input.sql}) AS input\n ${whereSql}\n ORDER BY ${input.order.sql}\n LIMIT ?\n `,\n args: [...input.args, ...(cursorPredicate?.args ?? []), ...input.order.args, pageSize + 1],\n totalSql: `\n SELECT COUNT(*)::bigint AS total\n FROM (${input.sql}) AS input\n `,\n totalArgs: input.args,\n vectorProbe: input.vectorProbe,\n order: input.order,\n hasMore: (rowCount) => rowCount > pageSize,\n trimRows: (rows) => rows.slice(0, pageSize),\n nextPageToken: (rows, rowCount) => {\n if (rowCount <= pageSize || rows.length === 0) return undefined\n return encodePageToken(rows[rows.length - 1], input.order.fields)\n },\n }\n}\n\nfunction compileTraversal(\n projectId: string,\n inputQuery: ObjectQuery,\n linkId: string,\n direction: \"outgoing\" | \"incoming\",\n sourceObjectTypeId: string | undefined,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, exactContext(ctx))\n const outputAlias = direction === \"outgoing\" ? \"target_object\" : \"source_object\"\n const joinSql =\n direction === \"outgoing\"\n ? `\n JOIN ${ctx.source.linksTable} AS edge\n ON edge.project_id = input.project_id\n AND edge.source_type_id = input.object_type_id\n AND edge.source_id = input.primary_id\n AND edge.link_id = ?\n JOIN ${ctx.source.objectsTable} AS target_object\n ON target_object.project_id = edge.project_id\n AND target_object.object_type_id = edge.target_type_id\n AND target_object.primary_id = edge.target_id\n `\n : `\n JOIN ${ctx.source.linksTable} AS edge\n ON edge.project_id = input.project_id\n AND edge.target_type_id = input.object_type_id\n AND edge.target_id = input.primary_id\n AND edge.link_id = ?${sourceObjectTypeId === undefined ? \"\" : \"\\n AND edge.source_type_id = ?\"}\n JOIN ${ctx.source.objectsTable} AS source_object\n ON source_object.project_id = edge.project_id\n AND source_object.object_type_id = edge.source_type_id\n AND source_object.primary_id = edge.source_id\n `\n const order = compileOrder(identityOrderFields())\n const qualifiedOrder = compileOrder(identityOrderFields(), outputAlias)\n const sql = `\n SELECT DISTINCT ${outputAlias}.*, ${outputAlias}.properties AS _cursor_properties\n FROM (${input.sql}) AS input\n ${joinSql}\n ORDER BY ${qualifiedOrder.sql}\n `\n const args = [\n ...input.args,\n linkId,\n ...(sourceObjectTypeId === undefined ? [] : [sourceObjectTypeId]),\n ...qualifiedOrder.args,\n ]\n\n return {\n sql,\n args,\n totalSql: `SELECT COUNT(*)::bigint AS total FROM (${sql}) AS traversed`,\n totalArgs: args,\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\n/** Correlation handle for an expansion: the parent row's identity columns. */\ninterface ExpansionParent {\n project: string\n type: string\n id: string\n}\n\n// `expand` attaches linked objects to each result row without changing which\n// objects match (unlike `traverse`, which pivots to the targets). Each expansion\n// becomes a correlated subquery that hydrates its links into a JSONB value, and\n// all expansions are folded into one `_expand` object column the row mapper reads\n// back. The input set is otherwise untouched, so pagination/order pass through.\nfunction compileExpand(\n projectId: string,\n inputQuery: ObjectQuery,\n expansions: readonly ObjectExpansion[],\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, exactContext(ctx))\n const expand = compileExpansionsObject(\n expansions,\n { project: \"input.project_id\", type: \"input.object_type_id\", id: \"input.primary_id\" },\n \"\",\n ctx\n )\n const inputOrder = compileOrder(input.order.fields, \"input\", \"input._cursor_properties\")\n const sql = `\n SELECT input.*, ${expand.sql} AS _expand\n FROM (${input.sql}) AS input\n ORDER BY ${inputOrder.sql}\n `\n\n return {\n sql,\n args: [...expand.args, ...input.args, ...inputOrder.args],\n totalSql: input.totalSql,\n totalArgs: input.totalArgs,\n vectorProbe: input.vectorProbe,\n order: input.order,\n hasMoreProbe: input.hasMoreProbe,\n hasMore: input.hasMore,\n trimRows: input.trimRows,\n nextPageToken: input.nextPageToken,\n }\n}\n\n// `jsonb_build_object(linkId, value, ...)` over a set of expansions sharing one\n// parent. Link ids are user data, so they ride as parameters. Used both for the\n// outer `_expand` column and for each child's nested `links`.\nfunction compileExpansionsObject(\n expansions: readonly ObjectExpansion[],\n parent: ExpansionParent,\n pathPrefix: string,\n ctx: CompileContext\n): CompiledPredicate {\n const parts: string[] = []\n const args: unknown[] = []\n expansions.forEach((expansion, index) => {\n const path = pathPrefix === \"\" ? `${index}` : `${pathPrefix}_${index}`\n const value = compileExpansionValue(expansion, parent, path, ctx)\n parts.push(\"?::text\", value.sql)\n args.push(expansion.linkId, ...value.args)\n })\n return { sql: `jsonb_build_object(${parts.join(\", \")})`, args }\n}\n\n// One expansion's hydrated value. `row_number()` numbers a parent's links by the\n// order from `compileExpansionOrder` (the expansion's `orderBy` against the target\n// object's properties, then an identity tiebreak); `WHERE _ord <= N` keeps the\n// top-N per parent in-DB; each retained neighbour becomes a JSONB object; and the\n// value is an ordered array (\"many\") or the first element or null (\"one\"). The\n// cardinality is core-resolved before pushdown.\nfunction compileExpansionValue(\n expansion: ObjectExpansion,\n parent: ExpansionParent,\n path: string,\n ctx: CompileContext\n): CompiledPredicate {\n const edge = `edge_${path}`\n const target = `tgt_${path}`\n const ranked = `ranked_${path}`\n const incoming = expansion.direction === \"incoming\"\n // The hydrated neighbour is the link target (outgoing) or source (incoming);\n // the parent sits on the opposite end, mirroring `compileTraversal`.\n const neighborType = incoming ? `${edge}.source_type_id` : `${edge}.target_type_id`\n const neighborId = incoming ? `${edge}.source_id` : `${edge}.target_id`\n const parentType = incoming ? `${edge}.target_type_id` : `${edge}.source_type_id`\n const parentId = incoming ? `${edge}.target_id` : `${edge}.source_id`\n\n const child = compileExpansionChildJson(expansion, edge, target, path, ctx)\n const order = compileExpansionOrder(expansion, target, neighborType, neighborId)\n\n const whereParts = [\n `${edge}.project_id = ${parent.project}`,\n `${parentType} = ${parent.type}`,\n `${parentId} = ${parent.id}`,\n `${edge}.link_id = ?::text`,\n ]\n const whereArgs: unknown[] = [expansion.linkId]\n if (incoming && expansion.sourceObjectTypeId !== undefined) {\n whereParts.push(`${edge}.source_type_id = ?::text`)\n whereArgs.push(expansion.sourceObjectTypeId)\n }\n\n const inner = `\n SELECT ${child.sql} AS elem, row_number() OVER (ORDER BY ${order.sql}) AS _ord\n FROM ${ctx.source.linksTable} AS ${edge}\n JOIN ${ctx.source.objectsTable} AS ${target}\n ON ${target}.project_id = ${edge}.project_id\n AND ${target}.object_type_id = ${neighborType}\n AND ${target}.primary_id = ${neighborId}\n WHERE ${whereParts.join(\" AND \")}\n `\n const innerArgs = [...child.args, ...order.args, ...whereArgs]\n\n if (expansion.cardinality === \"one\") {\n return {\n sql: `(SELECT ${ranked}.elem FROM (${inner}) AS ${ranked} WHERE ${ranked}._ord = 1)`,\n args: innerArgs,\n }\n }\n\n // The fanout cap is baked into `limit` by the core executor before pushdown.\n const limit = expansion.limit ?? DEFAULT_EXPANSION_FANOUT\n return {\n sql: `COALESCE((SELECT jsonb_agg(${ranked}.elem ORDER BY ${ranked}._ord) FROM (${inner}) AS ${ranked} WHERE ${ranked}._ord <= ?), '[]'::jsonb)`,\n args: [...innerArgs, limit],\n }\n}\n\n// Build one hydrated neighbour as an `ExpandedObjectRow`-shaped JSONB object.\n// `linkProperties` always rides along (the mapper drops it when empty), and\n// nested expansions recurse under `links`, correlated on this neighbour.\nfunction compileExpansionChildJson(\n expansion: ObjectExpansion,\n edge: string,\n target: string,\n path: string,\n ctx: CompileContext\n): CompiledPredicate {\n const fields = [\n `'projectId', ${target}.project_id`,\n `'objectTypeId', ${target}.object_type_id`,\n `'primaryId', ${target}.primary_id`,\n `'properties', ${target}.properties`,\n `'createdAt', ${target}.created_at`,\n `'updatedAt', ${target}.updated_at`,\n `'version', ${target}.version`,\n `'lastCommitId', ${target}.last_commit_id`,\n `'linkProperties', ${edge}.properties`,\n ]\n const args: unknown[] = []\n\n if (expansion.expand && expansion.expand.length > 0) {\n const nested = compileExpansionsObject(\n expansion.expand,\n {\n project: `${target}.project_id`,\n type: `${target}.object_type_id`,\n id: `${target}.primary_id`,\n },\n path,\n ctx\n )\n fields.push(`'links', ${nested.sql}`)\n args.push(...nested.args)\n }\n\n return { sql: `jsonb_build_object(${fields.join(\", \")})`, args }\n}\n\n// Order a parent's links the way the fallback's per-parent trim does: each\n// property sorts nulls last with the requested direction (against the neighbour's\n// JSONB properties), then a deterministic identity tiebreak on the neighbour.\nfunction compileExpansionOrder(\n expansion: ObjectExpansion,\n target: string,\n neighborType: string,\n neighborId: string\n): CompiledPredicate {\n const propertyColumn = `${target}.properties`\n const clauses: string[] = []\n const args: unknown[] = []\n\n for (const field of expansion.orderBy ?? []) {\n // Relevance is a no-op in the fallback comparator; mirror that by skipping it.\n if (field.kind !== \"property\") continue\n const direction = field.direction === \"desc\" ? \"DESC\" : \"ASC\"\n clauses.push(\n `CASE WHEN ${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null' THEN 1 ELSE 0 END ASC`,\n `${\n field.scalarKind === \"decimal\"\n ? `(${jsonTextExpression(propertyColumn)})::numeric`\n : jsonValueExpression(propertyColumn)\n } ${direction}`\n )\n args.push(field.propertyId, field.propertyId, field.propertyId)\n }\n\n clauses.push(`${neighborType} ASC`, `${neighborId} ASC`)\n return { sql: clauses.join(\", \"), args }\n}\n\nfunction compileSet(\n projectId: string,\n op: ObjectQuerySetOperation,\n inputs: readonly ObjectQuery[],\n ctx: CompileContext\n): CompiledPgObjectQuery {\n if (inputs.length === 0) {\n const order = compileOrder(identityOrderFields())\n return {\n sql: `\n SELECT *, properties AS _cursor_properties\n FROM ${ctx.source.objectsTable}\n WHERE 1 = 0\n ORDER BY ${order.sql}\n `,\n args: order.args,\n totalSql: \"SELECT 0::bigint AS total\",\n totalArgs: [],\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n }\n\n const compiledInputs = inputs.map((input) =>\n compileObjectQueryInternal(projectId, input, exactContext(ctx))\n )\n const identities = compileSetIdentities(op, compiledInputs)\n const order = compileOrder(identityOrderFields())\n const selectedOrder = compileOrder(identityOrderFields(), \"selected\")\n const sql = `\n SELECT selected.*, selected.properties AS _cursor_properties\n FROM (${identities.sql}) AS ids\n JOIN ${ctx.source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = ids.object_type_id\n AND selected.primary_id = ids.primary_id\n ORDER BY ${selectedOrder.sql}\n `\n\n return {\n sql,\n args: [...identities.args, projectId, ...selectedOrder.args],\n totalSql: `SELECT COUNT(*)::bigint AS total FROM (${identities.sql}) AS ids`,\n totalArgs: identities.args,\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileProject(\n projectId: string,\n inputQuery: ObjectQuery,\n properties: readonly string[] | undefined,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, ctx)\n if (!properties) return input\n\n const projection = compileProjectionExpression(properties)\n const inputOrder = compileOrder(input.order.fields, \"input\", \"input._cursor_properties\")\n const outputOrder = compileOrder(input.order.fields, undefined, \"_cursor_properties\")\n\n return {\n sql: `\n SELECT\n input.project_id,\n input.object_type_id,\n input.primary_id,\n ${projection.sql} AS properties,\n input._cursor_properties AS _cursor_properties,\n input.created_at,\n input.updated_at,\n input.version,\n input.last_commit_id${input.vectorProbe ? \", input._vector_score\" : \"\"}\n FROM (${input.sql}) AS input\n ORDER BY ${inputOrder.sql}\n `,\n args: [...projection.args, ...input.args, ...inputOrder.args],\n totalSql: input.totalSql,\n totalArgs: input.totalArgs,\n vectorProbe: input.vectorProbe,\n order: outputOrder,\n hasMoreProbe: input.hasMoreProbe,\n hasMore: input.hasMore,\n trimRows: input.trimRows,\n nextPageToken: input.nextPageToken,\n }\n}\n\nfunction compileAggregateSource(\n projectId: string,\n query: ObjectQuery,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n switch (query.kind) {\n case \"start\":\n return compileAggregateStart(projectId, query, source)\n case \"refs\":\n return compileAggregateRefs(projectId, query, source)\n case \"filter\":\n return compileAggregateWhere(\n projectId,\n query.input,\n compilePredicate(query.predicate),\n source\n )\n case \"text\": {\n return compileAggregateWhere(\n projectId,\n query.input,\n compileTextSearchPredicate(query.query, query.fields, query.fieldsByObjectType),\n source\n )\n }\n case \"traverse\":\n return compileAggregateTraversal(\n projectId,\n query.input,\n query.linkId,\n query.direction,\n query.sourceObjectTypeId,\n source\n )\n case \"set\":\n return compileAggregateSet(projectId, query.op, query.inputs, source)\n case \"sort\":\n case \"project\":\n // `expand` is output-shaping, like sort/project: aggregates ignore it.\n case \"expand\":\n return compileAggregateSource(projectId, query.input, source)\n case \"limit\":\n case \"page\":\n return compileRowQueryAggregateSource(projectId, query, source)\n case \"vector\":\n return compileRowQueryAggregateSource(projectId, query, source)\n }\n}\n\nfunction compileAggregateStart(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"start\" }>,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n if (query.includeSubtypes === true) {\n throw new Error(\"[SixbPg] PostgreSQL object storage does not support start.includeSubtypes\")\n }\n\n return {\n sql: `\n SELECT project_id, object_type_id, primary_id, properties\n FROM ${source.objectsTable}\n WHERE project_id = ? AND object_type_id = ?\n `,\n args: [projectId, query.objectTypeId],\n }\n}\n\nfunction compileAggregateRefs(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"refs\" }>,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n if (query.refs.length === 0) {\n throw new Error(\"[SixbPg] PostgreSQL object storage requires at least one ref\")\n }\n\n return {\n sql: `\n SELECT selected.project_id, selected.object_type_id, selected.primary_id, selected.properties\n FROM (\n SELECT DISTINCT\n ref.value ->> 'objectTypeId' AS object_type_id,\n ref.value ->> 'primaryId' AS primary_id\n FROM jsonb_array_elements(?::text::jsonb) AS ref(value)\n ) AS requested\n JOIN ${source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = requested.object_type_id\n AND selected.primary_id = requested.primary_id\n `,\n args: [JSON.stringify(query.refs), projectId],\n }\n}\n\nfunction compileAggregateWhere(\n projectId: string,\n inputQuery: ObjectQuery,\n predicate: CompiledPredicate,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n const input = compileAggregateSource(projectId, inputQuery, source)\n return {\n sql: `\n SELECT input.project_id, input.object_type_id, input.primary_id, input.properties\n FROM (${input.sql}) AS input\n WHERE ${predicate.sql}\n `,\n args: [...input.args, ...predicate.args],\n }\n}\n\nfunction compileAggregateTraversal(\n projectId: string,\n inputQuery: ObjectQuery,\n linkId: string,\n direction: \"outgoing\" | \"incoming\",\n sourceObjectTypeId: string | undefined,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n const input = compileAggregateSource(projectId, inputQuery, source)\n const outputAlias = direction === \"outgoing\" ? \"target_object\" : \"source_object\"\n const joinSql =\n direction === \"outgoing\"\n ? `\n JOIN ${source.linksTable} AS edge\n ON edge.project_id = input.project_id\n AND edge.source_type_id = input.object_type_id\n AND edge.source_id = input.primary_id\n AND edge.link_id = ?\n JOIN ${source.objectsTable} AS target_object\n ON target_object.project_id = edge.project_id\n AND target_object.object_type_id = edge.target_type_id\n AND target_object.primary_id = edge.target_id\n `\n : `\n JOIN ${source.linksTable} AS edge\n ON edge.project_id = input.project_id\n AND edge.target_type_id = input.object_type_id\n AND edge.target_id = input.primary_id\n AND edge.link_id = ?${sourceObjectTypeId === undefined ? \"\" : \"\\n AND edge.source_type_id = ?\"}\n JOIN ${source.objectsTable} AS source_object\n ON source_object.project_id = edge.project_id\n AND source_object.object_type_id = edge.source_type_id\n AND source_object.primary_id = edge.source_id\n `\n\n return {\n sql: `\n SELECT DISTINCT\n ${outputAlias}.project_id,\n ${outputAlias}.object_type_id,\n ${outputAlias}.primary_id,\n ${outputAlias}.properties\n FROM (${input.sql}) AS input\n ${joinSql}\n `,\n args: [\n ...input.args,\n linkId,\n ...(sourceObjectTypeId === undefined ? [] : [sourceObjectTypeId]),\n ],\n }\n}\n\nfunction compileAggregateSet(\n projectId: string,\n op: ObjectQuerySetOperation,\n inputs: readonly ObjectQuery[],\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n if (inputs.length === 0) {\n return {\n sql: `\n SELECT project_id, object_type_id, primary_id, properties\n FROM ${source.objectsTable}\n WHERE 1 = 0\n `,\n args: [],\n }\n }\n\n const compiledInputs = inputs.map((input) => compileAggregateSource(projectId, input, source))\n const identities = compileSetIdentities(op, compiledInputs)\n return {\n sql: `\n SELECT selected.project_id, selected.object_type_id, selected.primary_id, selected.properties\n FROM (${identities.sql}) AS ids\n JOIN ${source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = ids.object_type_id\n AND selected.primary_id = ids.primary_id\n `,\n args: [...identities.args, projectId],\n }\n}\n\nfunction compileRowQueryAggregateSource(\n projectId: string,\n query: ObjectQuery,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n const rowQuery = compileObjectQueryInternal(projectId, query, {\n probeLimit: false,\n source,\n })\n return {\n sql: `\n SELECT input.project_id, input.object_type_id, input.primary_id, input.properties\n FROM (${rowQuery.sql}) AS input\n `,\n args: rowQuery.args,\n }\n}\n\nfunction needsLimitProbe(query: ObjectQuery): boolean {\n switch (query.kind) {\n case \"limit\":\n return true\n case \"project\":\n case \"sort\":\n return needsLimitProbe(query.input)\n default:\n return false\n }\n}\n\nfunction hasMoreProbeFor(compiled: CompiledPgObjectQuery): CompiledHasMoreProbe {\n return (\n compiled.hasMoreProbe ?? {\n sql: compiled.sql,\n args: compiled.args,\n hasMore: (rowCount) => compiled.hasMore(rowCount, undefined),\n }\n )\n}\n\nfunction compileSetIdentities(\n op: ObjectQuerySetOperation,\n inputs: readonly { sql: string; args: readonly unknown[] }[]\n): CompiledPredicate {\n const operator = op === \"union\" ? \"UNION\" : op === \"intersect\" ? \"INTERSECT\" : \"EXCEPT\"\n const identitySqls = inputs.map(\n (input) => `SELECT object_type_id, primary_id FROM (${input.sql}) AS input`\n )\n\n return {\n sql: identitySqls.join(` ${operator} `),\n args: inputs.flatMap((input) => input.args),\n }\n}\n\nfunction compileProjectionExpression(properties: readonly string[]): CompiledPredicate {\n if (properties.length === 0) return { sql: \"'{}'::jsonb\", args: [] }\n\n return {\n sql: `\n COALESCE(\n (\n SELECT jsonb_object_agg(projected.key, projected.value)\n FROM jsonb_each(input.properties) AS projected(key, value)\n WHERE projected.key IN (${properties.map(() => \"?::text\").join(\", \")})\n ),\n '{}'::jsonb\n )\n `,\n args: [...properties],\n }\n}\n\nfunction compilePredicate(predicate: ObjectQueryPredicate): CompiledPredicate {\n switch (predicate.op) {\n case \"and\":\n case \"or\": {\n const items = predicate.items.map(compilePredicate)\n const joiner = predicate.op === \"and\" ? \" AND \" : \" OR \"\n return {\n sql: `(${items.map((item) => item.sql).join(joiner)})`,\n args: items.flatMap((item) => item.args),\n }\n }\n case \"not\": {\n const item = compilePredicate(predicate.item)\n return negatePredicate(item)\n }\n case \"eq\":\n return predicate.scalarKind === \"decimal\"\n ? compileDecimalEqualityPredicate(predicate.propertyId, \"eq\", predicate.value)\n : compileEqualityPredicate(predicate.propertyId, \"eq\", predicate.value)\n case \"neq\":\n return predicate.scalarKind === \"decimal\"\n ? compileDecimalEqualityPredicate(predicate.propertyId, \"neq\", predicate.value)\n : compileEqualityPredicate(predicate.propertyId, \"neq\", predicate.value)\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n const op = sqlComparisonOperator(predicate.op)\n if (predicate.scalarKind === \"decimal\") {\n return {\n sql: `(${jsonTypeExpression()} = 'string' AND (${jsonTextExpression()})::numeric ${op} ?::numeric)`,\n args: [predicate.propertyId, predicate.propertyId, predicate.value],\n }\n }\n return {\n sql: `${jsonValueExpression()} ${op} ?::text::jsonb`,\n args: [predicate.propertyId, jsonbValue(predicate.value)],\n }\n }\n case \"in\":\n return predicate.scalarKind === \"decimal\"\n ? compileDecimalInPredicate(predicate.propertyId, predicate.values)\n : compileInPredicate(predicate.propertyId, predicate.values)\n case \"exists\": {\n const sql = `jsonb_exists(properties, ?::text)`\n const item: CompiledPredicate = { sql, args: [predicate.propertyId] }\n return predicate.value ? item : negatePredicate(item)\n }\n case \"contains\":\n return compileContainsPredicate(predicate.propertyId, predicate.value)\n }\n}\n\nfunction compileDecimalEqualityPredicate(\n propertyId: string,\n op: \"eq\" | \"neq\",\n value: unknown\n): CompiledPredicate {\n if (value === null) {\n const sql = `${jsonTypeExpression()} = 'null'`\n const item: CompiledPredicate = { sql, args: [propertyId] }\n return op === \"eq\" ? item : negatePredicate(item)\n }\n\n if (op === \"eq\") {\n return {\n sql: `(${jsonTypeExpression()} = 'string' AND (${jsonTextExpression()})::numeric = ?::numeric)`,\n args: [propertyId, propertyId, value],\n }\n }\n\n return {\n sql: `(${jsonTypeExpression()} IS NULL OR ${jsonTypeExpression()} = 'null' OR ${jsonTypeExpression()} <> 'string' OR (${jsonTextExpression()})::numeric <> ?::numeric)`,\n args: [propertyId, propertyId, propertyId, propertyId, value],\n }\n}\n\nfunction compileDecimalInPredicate(\n propertyId: string,\n values: readonly unknown[]\n): CompiledPredicate {\n if (values.length === 0) return { sql: \"0 = 1\", args: [] }\n const nonNullValues = values.filter((value) => value !== null)\n const clauses: string[] = []\n const args: unknown[] = []\n\n if (nonNullValues.length !== values.length) {\n clauses.push(`${jsonTypeExpression()} = 'null'`)\n args.push(propertyId)\n }\n\n if (nonNullValues.length > 0) {\n clauses.push(\n `(${jsonTypeExpression()} = 'string' AND (${jsonTextExpression()})::numeric IN (${nonNullValues\n .map(() => \"?::numeric\")\n .join(\", \")}))`\n )\n args.push(propertyId, propertyId, ...nonNullValues)\n }\n\n return {\n sql: `(${clauses.join(\" OR \")})`,\n args,\n }\n}\n\nfunction negatePredicate(predicate: CompiledPredicate): CompiledPredicate {\n return {\n sql: `(NOT COALESCE((${predicate.sql}), false))`,\n args: predicate.args,\n }\n}\n\nfunction compileEqualityPredicate(\n propertyId: string,\n op: \"eq\" | \"neq\",\n value: unknown\n): CompiledPredicate {\n if (value === null) {\n const sql = `${jsonTypeExpression()} = 'null'`\n const item: CompiledPredicate = { sql, args: [propertyId] }\n return op === \"eq\" ? item : negatePredicate(item)\n }\n\n if (typeof value === \"string\") {\n if (op === \"eq\") {\n return {\n sql: `(${jsonTypeExpression()} = 'string' AND ${jsonTextExpression()} = ?::text)`,\n args: [propertyId, propertyId, value],\n }\n }\n\n return {\n sql: `(${jsonTypeExpression()} IS NULL OR ${jsonTypeExpression()} = 'null' OR ${jsonTypeExpression()} <> 'string' OR ${jsonTextExpression()} <> ?::text)`,\n args: [propertyId, propertyId, propertyId, propertyId, value],\n }\n }\n\n if (op === \"eq\") {\n return {\n sql: `${jsonValueExpression()} = ?::text::jsonb`,\n args: [propertyId, jsonbValue(value)],\n }\n }\n\n return {\n sql: `(${jsonTypeExpression()} IS NULL OR ${jsonTypeExpression()} = 'null' OR ${jsonValueExpression()} <> ?::text::jsonb)`,\n args: [propertyId, propertyId, propertyId, jsonbValue(value)],\n }\n}\n\nfunction compileInPredicate(propertyId: string, values: readonly unknown[]): CompiledPredicate {\n if (values.length === 0) return { sql: \"0 = 1\", args: [] }\n\n const nonNullValues = values.filter((value) => value !== null)\n const stringValues = nonNullValues.filter((value): value is string => typeof value === \"string\")\n const jsonbValues = nonNullValues.filter((value) => typeof value !== \"string\")\n const clauses: string[] = []\n const args: unknown[] = []\n\n if (values.length !== nonNullValues.length) {\n clauses.push(`${jsonTypeExpression()} = 'null'`)\n args.push(propertyId)\n }\n\n if (stringValues.length > 0) {\n clauses.push(\n `(${jsonTypeExpression()} = 'string' AND ${jsonTextExpression()} IN (${stringValues\n .map(() => \"?::text\")\n .join(\", \")}))`\n )\n args.push(propertyId, propertyId, ...stringValues)\n }\n\n if (jsonbValues.length > 0) {\n clauses.push(\n `${jsonValueExpression()} IN (${jsonbValues.map(() => \"?::text::jsonb\").join(\", \")})`\n )\n args.push(propertyId, ...jsonbValues.map(jsonbValue))\n }\n\n return {\n sql: `(${clauses.join(\" OR \")})`,\n args,\n }\n}\n\nfunction compileContainsPredicate(propertyId: string, value: unknown): CompiledPredicate {\n const clauses: string[] = []\n const args: unknown[] = []\n\n if (typeof value === \"string\") {\n clauses.push(\n `(${jsonTypeExpression()} = 'string' AND position(?::text in ${jsonTextExpression()}) > 0)`\n )\n args.push(propertyId, value, propertyId)\n }\n\n clauses.push(\n `(${jsonTypeExpression()} = 'array' AND ${jsonValueExpression()} @> jsonb_build_array(?::text::jsonb))`\n )\n args.push(propertyId, propertyId, jsonbValue(value))\n\n if (typeof value === \"string\") {\n clauses.push(\n `(${jsonTypeExpression()} = 'object' AND jsonb_exists(${jsonValueExpression()}, ?::text))`\n )\n args.push(propertyId, propertyId, value)\n }\n\n return { sql: `(${clauses.join(\" OR \")})`, args }\n}\n\nfunction compileTextPredicate(query: string, fields: readonly string[]): CompiledPredicate {\n const terms = tokenize(query)\n if (terms.length === 0) return { sql: \"0 = 1\", args: [] }\n\n const clauses = terms.map(() => {\n const fieldClauses = fields.map(\n () => `position(?::text in lower(coalesce(${jsonTextExpression()}, ''))) > 0`\n )\n return `(${fieldClauses.join(\" OR \")})`\n })\n const args = terms.flatMap((term) => fields.flatMap((field) => [term, field]))\n\n return { sql: `(${clauses.join(\" AND \")})`, args }\n}\n\nfunction compileTextSearchPredicate(\n query: string,\n fields: readonly string[] | undefined,\n fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined\n): CompiledPredicate {\n const predicate =\n fields && fields.length > 0\n ? compileTextPredicate(query, fields)\n : compileScopedTextPredicate(query, fieldsByObjectType)\n\n if (!predicate) {\n throw new Error(\n \"[SixbPg] PostgreSQL object text search requires fields or resolved text defaults\"\n )\n }\n\n return predicate\n}\n\nfunction compileScopedTextPredicate(\n query: string,\n fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined\n): CompiledPredicate | null {\n const scopedPredicates: CompiledPredicate[] = []\n\n for (const [objectTypeId, fields] of Object.entries(fieldsByObjectType ?? {})) {\n if (fields.length === 0) continue\n const predicate = compileTextPredicate(query, fields)\n scopedPredicates.push({\n sql: `(object_type_id = ? AND ${predicate.sql})`,\n args: [objectTypeId, ...predicate.args],\n })\n }\n\n if (scopedPredicates.length === 0) return null\n\n return {\n sql: `(${scopedPredicates.map((predicate) => predicate.sql).join(\" OR \")})`,\n args: scopedPredicates.flatMap((predicate) => predicate.args),\n }\n}\n\nfunction compileOrder(\n fields: readonly CompiledOrderField[],\n qualifier?: string,\n propertyColumn = \"properties\"\n): CompiledOrder {\n const clauses: string[] = []\n const args: unknown[] = []\n\n for (const field of fields) {\n if (field.kind === \"column\") {\n clauses.push(\n `${columnExpression(field.column, qualifier)}${field.binary ? ' COLLATE \"C\"' : \"\"} ${field.direction.toUpperCase()}`\n )\n continue\n }\n\n const direction = field.direction === \"desc\" ? \"DESC\" : \"ASC\"\n clauses.push(\n `CASE WHEN ${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null' THEN 1 ELSE 0 END ASC`,\n `${compiledPropertyValueExpression(field, propertyColumn)} ${direction}`\n )\n args.push(field.propertyId, field.propertyId, field.propertyId)\n }\n\n return { sql: clauses.join(\", \"), args, fields, propertyColumn }\n}\n\nfunction sortOrderFields(fields: readonly ObjectQuerySortField[]): readonly CompiledOrderField[] {\n const orderFields: CompiledOrderField[] = []\n for (const field of fields) {\n if (field.kind !== \"property\") {\n throw new Error(\"[SixbPg] PostgreSQL object storage does not support relevance sorting\")\n }\n\n orderFields.push({\n kind: \"property\",\n propertyId: field.propertyId,\n direction: field.direction === \"desc\" ? \"desc\" : \"asc\",\n scalarKind: field.scalarKind,\n })\n }\n orderFields.push(...identityOrderFields())\n return orderFields\n}\n\nfunction identityOrderFields(): readonly CompiledOrderField[] {\n return [\n { kind: \"column\", column: \"object_type_id\", direction: \"asc\" },\n { kind: \"column\", column: \"primary_id\", direction: \"asc\" },\n ]\n}\n\nfunction compileKeysetPredicate(\n fields: readonly CompiledOrderField[],\n cursor: readonly EncodedCursorValue[],\n propertyColumn = \"properties\"\n): CompiledPredicate {\n const disjuncts: CompiledPredicate[] = []\n\n for (let index = 0; index < fields.length; index += 1) {\n const equalityPredicates = fields\n .slice(0, index)\n .map((field, equalityIndex) =>\n compileFieldEquality(field, cursor[equalityIndex], propertyColumn)\n )\n const advancePredicate = compileFieldAfter(fields[index], cursor[index], propertyColumn)\n if (!advancePredicate) continue\n\n const parts = [...equalityPredicates, advancePredicate]\n disjuncts.push({\n sql: `(${parts.map((part) => part.sql).join(\" AND \")})`,\n args: parts.flatMap((part) => part.args),\n })\n }\n\n if (disjuncts.length === 0) return { sql: \"0 = 1\", args: [] }\n\n return {\n sql: `(${disjuncts.map((part) => part.sql).join(\" OR \")})`,\n args: disjuncts.flatMap((part) => part.args),\n }\n}\n\nfunction compileFieldEquality(\n field: CompiledOrderField,\n cursor: EncodedCursorValue,\n propertyColumn = \"properties\"\n): CompiledPredicate {\n if (field.kind === \"column\") {\n return {\n sql: `${columnExpression(field.column)} = ?`,\n args: [cursor.value],\n }\n }\n\n if (cursor.nullish) {\n return {\n sql: `(${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null')`,\n args: [field.propertyId, field.propertyId],\n }\n }\n\n return {\n sql: `(${jsonTypeExpression(propertyColumn)} IS NOT NULL AND ${jsonTypeExpression(propertyColumn)} != 'null' AND ${compiledPropertyValueExpression(field, propertyColumn)} = ${field.scalarKind === \"decimal\" ? \"?::numeric\" : \"?::text::jsonb\"})`,\n args: [\n field.propertyId,\n field.propertyId,\n field.propertyId,\n field.scalarKind === \"decimal\" ? cursor.value : jsonbValue(cursor.value),\n ],\n }\n}\n\nfunction compileFieldAfter(\n field: CompiledOrderField,\n cursor: EncodedCursorValue,\n propertyColumn = \"properties\"\n): CompiledPredicate | null {\n if (field.kind === \"column\") {\n return {\n sql: `${columnExpression(field.column)} ${field.direction === \"desc\" ? \"<\" : \">\"} ?`,\n args: [cursor.value],\n }\n }\n\n if (cursor.nullish) return null\n\n const rankSql = `CASE WHEN ${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null' THEN 1 ELSE 0 END`\n const valueOperator = field.direction === \"desc\" ? \"<\" : \">\"\n\n return {\n sql: `(${rankSql} > 0 OR (${rankSql} = 0 AND ${compiledPropertyValueExpression(field, propertyColumn)} ${valueOperator} ${field.scalarKind === \"decimal\" ? \"?::numeric\" : \"?::text::jsonb\"}))`,\n args: [\n field.propertyId,\n field.propertyId,\n field.propertyId,\n field.propertyId,\n field.propertyId,\n field.scalarKind === \"decimal\" ? cursor.value : jsonbValue(cursor.value),\n ],\n }\n}\n\nfunction encodePageToken(row: PgObjectQueryPageRow, fields: readonly CompiledOrderField[]): string {\n const properties = objectProperties(row._cursor_properties ?? row.properties)\n const token: EncodedPageToken = {\n version: 1,\n order: fields.map(orderFieldKey),\n values: fields.map((field) => cursorValueForField(row, properties, field)),\n }\n return `${PAGE_TOKEN_PREFIX}${Buffer.from(JSON.stringify(token)).toString(\"base64url\")}`\n}\n\nfunction decodePageToken(\n token: string,\n fields: readonly CompiledOrderField[]\n): readonly EncodedCursorValue[] {\n if (!token.startsWith(PAGE_TOKEN_PREFIX)) {\n throwInvalidPageToken(\"Invalid PostgreSQL object query page token\")\n }\n\n const raw = token.slice(PAGE_TOKEN_PREFIX.length)\n let decoded: unknown\n try {\n decoded = JSON.parse(Buffer.from(raw, \"base64url\").toString(\"utf8\"))\n } catch {\n throwInvalidPageToken(\"Invalid PostgreSQL object query page token\")\n }\n\n if (!isEncodedPageToken(decoded)) {\n throwInvalidPageToken(\"Invalid PostgreSQL object query page token\")\n }\n\n const expectedOrder = fields.map(orderFieldKey)\n if (\n decoded.order.length !== expectedOrder.length ||\n decoded.order.some((field, index) => field !== expectedOrder[index])\n ) {\n throwInvalidPageToken(\"PostgreSQL object query page token does not match query order\")\n }\n\n return decoded.values\n}\n\nfunction throwInvalidPageToken(message: string): never {\n throw new ObjectQueryExecutionError(\"invalid_page_token\", message, \"$.pageToken\")\n}\n\nfunction isEncodedPageToken(value: unknown): value is EncodedPageToken {\n if (!isPlainObject(value)) return false\n if (value.version !== 1) return false\n if (!Array.isArray(value.order) || value.order.some((item) => typeof item !== \"string\")) {\n return false\n }\n if (!Array.isArray(value.values)) return false\n return value.values.every(\n (item) =>\n isPlainObject(item) &&\n typeof item.nullish === \"boolean\" &&\n (item.nullish || Object.hasOwn(item, \"value\"))\n )\n}\n\nfunction cursorValueForField(\n row: PgObjectQueryPageRow,\n properties: Record<string, unknown>,\n field: CompiledOrderField\n): EncodedCursorValue {\n const value =\n field.kind === \"column\"\n ? field.column === \"object_type_id\"\n ? row.object_type_id\n : row.primary_id\n : properties[field.propertyId]\n\n return value === null || value === undefined ? { nullish: true } : { nullish: false, value }\n}\n\nfunction orderFieldKey(field: CompiledOrderField): string {\n return field.kind === \"column\"\n ? `column:${field.column}:${field.direction}`\n : `property:${field.propertyId}:${field.scalarKind ?? \"json\"}:${field.direction}`\n}\n\nfunction compiledPropertyValueExpression(\n field: Extract<CompiledOrderField, { kind: \"property\" }>,\n propertyColumn = \"properties\"\n): string {\n return field.scalarKind === \"decimal\"\n ? `(${jsonTextExpression(propertyColumn)})::numeric`\n : jsonValueExpression(propertyColumn)\n}\n\nfunction columnExpression(\n column: \"object_type_id\" | \"primary_id\" | \"_vector_score\",\n qualifier?: string\n): string {\n return qualifier ? `${qualifier}.${column}` : column\n}\n\nfunction jsonValueExpression(column = \"properties\"): string {\n return `${column} -> (?::text)`\n}\n\nfunction jsonTextExpression(column = \"properties\"): string {\n return `${column} ->> (?::text)`\n}\n\nfunction jsonTypeExpression(column = \"properties\"): string {\n return `jsonb_typeof(${jsonValueExpression(column)})`\n}\n\nfunction jsonbValue(value: unknown): string {\n if (value instanceof Date) return JSON.stringify(value.toISOString())\n const json = JSON.stringify(value)\n return json === undefined ? \"null\" : json\n}\n\nfunction tokenize(query: string): string[] {\n return query\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter((term) => term.length > 0)\n}\n\nfunction sqlComparisonOperator(op: \"lt\" | \"lte\" | \"gt\" | \"gte\"): \"<\" | \"<=\" | \">\" | \">=\" {\n switch (op) {\n case \"lt\":\n return \"<\"\n case \"lte\":\n return \"<=\"\n case \"gt\":\n return \">\"\n case \"gte\":\n return \">=\"\n }\n}\n\nfunction numberPlaceholders(sql: string): string {\n let index = 0\n return sql.replace(/\\?/g, () => `$${++index}`)\n}\n\nfunction numberCompiledQuery<T extends { sql: string; args: unknown[] }>(compiled: T): T {\n return {\n ...compiled,\n sql: numberPlaceholders(compiled.sql),\n }\n}\n\nfunction objectProperties(value: unknown): Record<string, unknown> {\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown\n return isPlainObject(parsed) ? parsed : {}\n }\n\n return isPlainObject(value) ? value : {}\n}\n\nfunction identityRows<T>(rows: readonly T[]): readonly T[] {\n return rows\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
33
- "import { type ObjectQuery, ObjectQueryExecutionError } from \"@sixb/core\"\nimport { hasVectorProfile } from \"@sixb/core/internal/query\"\nimport type {\n CountObjectsInput,\n CountObjectsResult,\n ExistsObjectsInput,\n ExistsObjectsResult,\n FacetObjectsInput,\n FacetObjectsResult,\n LinkBatchKey,\n LinkDirection,\n ObjectBatchKey,\n ObjectFacetResult,\n ObjectLinkRow,\n ObjectReadStorage,\n ObjectRow,\n QueryObjectLinksInput,\n QueryObjectLinksResult,\n QueryObjectsInput,\n QueryObjectsResult,\n} from \"@sixb/core/storage\"\nimport { linkBatchKey, objectBatchKey } from \"@sixb/core/storage\"\nimport type { SQLClient, SqlParameter } from \"../pg-client\"\nimport {\n type CompiledPgObjectQuery,\n compilePgObjectCountQuery,\n compilePgObjectExistsQuery,\n compilePgObjectFacetQuery,\n compilePgObjectQuery,\n compilePgObjectStatement,\n type PgObjectQuerySource,\n} from \"./query-compiler\"\nimport type { PgSelectedObjectReadSource } from \"./read-scope\"\n\nimport {\n type FacetDatabaseRow,\n type LinkBatchDatabaseRow,\n type LinkDatabaseRow,\n linkIdentity,\n type ObjectBatchDatabaseRow,\n type ObjectDatabaseRow,\n type ObjectQueryDatabaseRow,\n type PropertyPermissionBatchDatabaseRow,\n queryRowToObject,\n rowToLink,\n rowToObject,\n} from \"./rows\"\n\nexport class PgObjectReader {\n constructor(\n private readonly sql: SQLClient,\n private readonly source: PgObjectQuerySource | PgSelectedObjectReadSource\n ) {}\n\n private async assertVectorSearch(\n params: QueryObjectsInput | CountObjectsInput | ExistsObjectsInput | FacetObjectsInput\n ): Promise<void> {\n if (!hasVectorProfile(params.query)) return\n const compiled = compilePgObjectQuery(params.projectId, params.query, { source: this.source })\n if (!compiled.vectorProbe) return\n const extensions = await this.sql.unsafe<{ ready: boolean }[]>(\n \"SELECT EXISTS (SELECT 1 FROM pg_extension e JOIN pg_namespace n ON n.oid = e.extnamespace WHERE e.extname = 'vector' AND n.nspname = 'public') AS ready\"\n )\n if (!extensions[0]?.ready)\n throw new ObjectQueryExecutionError(\n \"vector_extension_missing\",\n \"PostgreSQL vector search requires pgvector installed in schema public (CREATE EXTENSION vector WITH SCHEMA public).\"\n )\n const probe = compiled.vectorProbe\n const [row] = await this.sql.unsafe<{ total: string | number }[]>(\n probe.sql,\n probe.args as SqlParameter[]\n )\n if (Number(row?.total ?? 0) > probe.limit) {\n throw new ObjectQueryExecutionError(\n \"vector_work_limit_exceeded\",\n `Exact vector search supports at most ${probe.limit} eligible vectors at this dimension. Narrow the query filters.`\n )\n }\n }\n\n async queryObjects(params: QueryObjectsInput): Promise<QueryObjectsResult> {\n await this.assertVectorSearch(params)\n const sql = this.sql\n const source = this.source\n const compiled = compilePgObjectQuery(params.projectId, params.query, {\n includeTotal: params.includeTotal,\n source,\n })\n const total = params.includeTotal === false ? undefined : await readTotal(sql, compiled)\n const rawRows = await sql.unsafe<ObjectQueryDatabaseRow[]>(\n compiled.sql,\n compiled.args as SqlParameter[]\n )\n const rows = compiled.trimRows(rawRows) as readonly ObjectQueryDatabaseRow[]\n const hasMore =\n total === undefined && compiled.hasMoreProbe\n ? compiled.hasMoreProbe.hasMore(\n (\n await sql.unsafe(\n compiled.hasMoreProbe.sql,\n compiled.hasMoreProbe.args as SqlParameter[]\n )\n ).length\n )\n : compiled.hasMore(rawRows.length, total)\n\n return {\n objects: rows.map((row) => queryRowToObject(row)),\n hasMore,\n nextPageToken: compiled.nextPageToken(rows, rawRows.length),\n ...(total === undefined ? {} : { total }),\n }\n }\n\n async countObjects(params: CountObjectsInput): Promise<CountObjectsResult> {\n await this.assertVectorSearch(params)\n const sql = this.sql\n const source = this.source\n const compiled = compilePgObjectCountQuery(params.projectId, stripOuterRowShape(params.query), {\n source,\n })\n const [row] = await sql.unsafe<{ count: string | number | bigint }[]>(\n compiled.sql,\n compiled.args as SqlParameter[]\n )\n return { count: Number(row?.count ?? 0) }\n }\n\n async existsObjects(params: ExistsObjectsInput): Promise<ExistsObjectsResult> {\n await this.assertVectorSearch(params)\n const sql = this.sql\n const source = this.source\n const compiled = compilePgObjectExistsQuery(\n params.projectId,\n stripOuterRowShape(params.query),\n { source }\n )\n const [row] = await sql.unsafe<unknown[]>(compiled.sql, compiled.args as SqlParameter[])\n return { exists: row !== undefined }\n }\n\n async facetObjects(params: FacetObjectsInput): Promise<FacetObjectsResult> {\n await this.assertVectorSearch(params)\n const sql = this.sql\n const source = this.source\n const facets: ObjectFacetResult[] = []\n for (const facet of params.facets) {\n facets.push({\n propertyId: facet.propertyId,\n buckets: await readFacetBuckets(\n sql,\n compilePgObjectFacetQuery(\n params.projectId,\n stripOuterRowShape(params.query),\n facet.propertyId,\n facet.limit,\n { source }\n )\n ),\n })\n }\n return { facets }\n }\n\n async getByPrimaryId(params: {\n projectId: string\n objectTypeId: string\n primaryId: string\n }): Promise<ObjectRow | null> {\n const sql = this.sql\n const source = this.source\n const statement = compilePgObjectStatement(\n `\n SELECT *\n FROM ${source.objectsTable}\n WHERE project_id = ? AND object_type_id = ? AND primary_id = ?\n `,\n [params.projectId, params.objectTypeId, params.primaryId],\n source\n )\n const [row] = await sql.unsafe<ObjectDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n\n return row ? rowToObject(row) : null\n }\n\n async selectsObjectProperties(\n params: Parameters<ObjectReadStorage[\"selectsObjectProperties\"]>[0]\n ): Promise<readonly boolean[]> {\n const sql = this.sql\n const source = this.source\n const result = params.items.map(() => false)\n if (params.items.length === 0) return result\n\n const items = params.items.map((item, batchIndex) => ({ ...item, batchIndex }))\n const selected = \"objectPropertyPermissionsTable\" in source\n const storedTable = selected ? source.objectPropertyPermissionsTable : source.objectsTable\n const propertyJoin = selected ? 'AND stored.property_id = requested.\"propertyId\"' : \"\"\n const statement = compilePgObjectStatement(\n `\n SELECT DISTINCT requested.\"batchIndex\" AS _batch_index\n FROM ${storedTable} AS stored\n JOIN jsonb_to_recordset(?::text::jsonb)\n AS requested(\n \"objectTypeId\" text,\n \"primaryId\" text,\n \"propertyId\" text,\n \"batchIndex\" integer\n )\n ON stored.object_type_id = requested.\"objectTypeId\"\n AND stored.primary_id = requested.\"primaryId\"\n ${propertyJoin}\n WHERE stored.project_id = ?\n `,\n [JSON.stringify(items), params.projectId],\n source\n )\n const rows = await sql.unsafe<PropertyPermissionBatchDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n for (const row of rows) result[row._batch_index] = true\n return result\n }\n\n async listLinks(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n linkId?: string\n direction?: LinkDirection\n }): Promise<readonly ObjectLinkRow[]> {\n const sql = this.sql\n const source = this.source\n const direction = params.direction ?? \"outgoing\"\n const directionWhere =\n direction === \"incoming\"\n ? \"target_type_id = ? AND target_id = ?\"\n : direction === \"both\"\n ? \"((source_type_id = ? AND source_id = ?) OR (target_type_id = ? AND target_id = ?))\"\n : \"source_type_id = ? AND source_id = ?\"\n const args: unknown[] =\n direction === \"both\"\n ? [\n params.projectId,\n params.objectTypeId,\n params.objectId,\n params.objectTypeId,\n params.objectId,\n ]\n : [params.projectId, params.objectTypeId, params.objectId]\n const query = `SELECT * FROM ${source.linksTable} WHERE project_id = ? AND ${directionWhere}${\n params.linkId ? \" AND link_id = ?\" : \"\"\n }`\n if (params.linkId) args.push(params.linkId)\n const statement = compilePgObjectStatement(query, args, source)\n const rows = await sql.unsafe<LinkDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n\n return rows.map((row) => rowToLink(row))\n }\n\n async getByPrimaryIdBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; primaryId: string }[]\n }): Promise<Map<ObjectBatchKey, ObjectRow>> {\n const sql = this.sql\n const source = this.source\n const result = new Map<ObjectBatchKey, ObjectRow>()\n if (params.items.length === 0) return result\n const items = params.items.map((item, batchIndex) => ({ ...item, batchIndex }))\n const statement = compilePgObjectStatement(\n `\n SELECT object.*, requested.\"batchIndex\" AS _batch_index\n FROM jsonb_to_recordset(?::text::jsonb)\n AS requested(\"objectTypeId\" text, \"primaryId\" text, \"batchIndex\" integer)\n JOIN ${source.objectsTable} AS object\n ON object.project_id = ?\n AND object.object_type_id = requested.\"objectTypeId\"\n AND object.primary_id = requested.\"primaryId\"\n `,\n [JSON.stringify(items), params.projectId],\n source\n )\n const rows = await sql.unsafe<ObjectBatchDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n const rowsByIndex = new Map(rows.map((row) => [row._batch_index, row]))\n for (const [index, item] of params.items.entries()) {\n const row = rowsByIndex.get(index)\n if (row) result.set(objectBatchKey(item.objectTypeId, item.primaryId), rowToObject(row))\n }\n return result\n }\n\n async listLinksBatch(params: {\n projectId: string\n direction?: LinkDirection\n items: readonly { objectTypeId: string; objectId: string; linkId: string }[]\n }): Promise<Map<LinkBatchKey, ObjectLinkRow[]>> {\n const sql = this.sql\n const source = this.source\n const result = new Map<LinkBatchKey, ObjectLinkRow[]>()\n if (params.items.length === 0) return result\n\n const direction = params.direction ?? \"outgoing\"\n const outgoing =\n 'stored.source_type_id = requested.\"objectTypeId\" AND stored.source_id = requested.\"objectId\"'\n const incoming =\n 'stored.target_type_id = requested.\"objectTypeId\" AND stored.target_id = requested.\"objectId\"'\n const items = params.items.map((item, batchIndex) => ({ ...item, batchIndex }))\n const requestedSql = `\n jsonb_to_recordset(?::text::jsonb)\n AS requested(\n \"objectTypeId\" text,\n \"objectId\" text,\n \"linkId\" text,\n \"batchIndex\" integer\n )\n `\n const table = source.linksTable\n const selectedSql =\n direction === \"both\"\n ? `\n SELECT stored.*, requested.\"batchIndex\" AS _batch_index\n FROM ${requestedSql}\n CROSS JOIN LATERAL (\n SELECT outgoing_link.*\n FROM ${table} AS outgoing_link\n WHERE outgoing_link.project_id = ?\n AND outgoing_link.source_type_id = requested.\"objectTypeId\"\n AND outgoing_link.source_id = requested.\"objectId\"\n AND outgoing_link.link_id = requested.\"linkId\"\n\n UNION\n\n SELECT incoming_link.*\n FROM ${table} AS incoming_link\n WHERE incoming_link.project_id = ?\n AND incoming_link.target_type_id = requested.\"objectTypeId\"\n AND incoming_link.target_id = requested.\"objectId\"\n AND incoming_link.link_id = requested.\"linkId\"\n ) AS stored\n `\n : `\n SELECT stored.*, requested.\"batchIndex\" AS _batch_index\n FROM ${requestedSql}\n JOIN ${table} AS stored\n ON ${direction === \"incoming\" ? incoming : outgoing}\n AND stored.link_id = requested.\"linkId\"\n WHERE stored.project_id = ?\n `\n const statement = compilePgObjectStatement(\n `\n ${selectedSql}\n ORDER BY\n _batch_index,\n source_type_id COLLATE \"C\",\n source_id COLLATE \"C\",\n link_id COLLATE \"C\",\n target_type_id COLLATE \"C\",\n target_id COLLATE \"C\"\n `,\n direction === \"both\"\n ? [JSON.stringify(items), params.projectId, params.projectId]\n : [JSON.stringify(items), params.projectId],\n source\n )\n const rows = await sql.unsafe<LinkBatchDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n const rowsByIndex = params.items.map(() => new Map<string, ObjectLinkRow>())\n for (const row of rows) {\n const link = rowToLink(row)\n rowsByIndex[row._batch_index]?.set(linkIdentity(link), link)\n }\n for (const [index, item] of params.items.entries()) {\n const links = [...(rowsByIndex[index]?.values() ?? [])]\n if (links.length > 0) {\n result.set(linkBatchKey(item.objectTypeId, item.objectId, item.linkId), links)\n }\n }\n return result\n }\n\n async queryLinks(params: QueryObjectLinksInput): Promise<QueryObjectLinksResult> {\n const sql = this.sql\n const source = this.source\n if (params.objectRefs.length === 0 || params.endpointObjectTypeIds?.length === 0) {\n return { links: [], hasMore: false }\n }\n\n const requestedJson = JSON.stringify(params.objectRefs)\n const args: unknown[] =\n params.direction === \"both\"\n ? [requestedJson, params.projectId, params.projectId]\n : [requestedJson, params.projectId]\n const addArg = (value: unknown): string => {\n args.push(value)\n return \"?\"\n }\n const requestedSql = `\n jsonb_to_recordset(?::text::jsonb)\n AS requested(\"objectTypeId\" text, \"primaryId\" text)\n `\n const table = source.linksTable\n const incidentSql =\n params.direction === \"both\"\n ? `\n SELECT DISTINCT link.*\n FROM ${requestedSql}\n CROSS JOIN LATERAL (\n SELECT outgoing_link.*\n FROM ${table} AS outgoing_link\n WHERE outgoing_link.project_id = ?\n AND outgoing_link.source_type_id = requested.\"objectTypeId\"\n AND outgoing_link.source_id = requested.\"primaryId\"\n\n UNION\n\n SELECT incoming_link.*\n FROM ${table} AS incoming_link\n WHERE incoming_link.project_id = ?\n AND incoming_link.target_type_id = requested.\"objectTypeId\"\n AND incoming_link.target_id = requested.\"primaryId\"\n ) AS link\n `\n : `\n SELECT DISTINCT link.*\n FROM ${requestedSql}\n JOIN ${table} AS link\n ON requested.\"objectTypeId\" = link.${params.direction === \"incoming\" ? \"target_type_id\" : \"source_type_id\"}\n AND requested.\"primaryId\" = link.${params.direction === \"incoming\" ? \"target_id\" : \"source_id\"}\n WHERE link.project_id = ?\n `\n\n const predicates: string[] = []\n if (params.linkId !== undefined) {\n predicates.push(`link_id = ${addArg(params.linkId)}::text`)\n }\n if (params.endpointObjectTypeIds !== undefined) {\n const allowedTypes = JSON.stringify([...new Set(params.endpointObjectTypeIds)])\n predicates.push(\n `source_type_id IN (SELECT jsonb_array_elements_text(${addArg(allowedTypes)}::text::jsonb))`,\n `target_type_id IN (SELECT jsonb_array_elements_text(${addArg(allowedTypes)}::text::jsonb))`\n )\n }\n if (params.after) {\n const cursor = params.after.map((value) => `${addArg(value)}::text COLLATE \"C\"`)\n predicates.push(\n `(\n source_type_id COLLATE \"C\",\n source_id COLLATE \"C\",\n link_id COLLATE \"C\",\n target_type_id COLLATE \"C\",\n target_id COLLATE \"C\"\n ) > (${cursor.join(\", \")})`\n )\n }\n const limit = addArg(params.limit + 1)\n const whereSql = predicates.length > 0 ? `WHERE ${predicates.join(\" AND \")}` : \"\"\n const statement = compilePgObjectStatement(\n `\n SELECT *\n FROM (${incidentSql}) AS incident\n ${whereSql}\n ORDER BY\n source_type_id COLLATE \"C\",\n source_id COLLATE \"C\",\n link_id COLLATE \"C\",\n target_type_id COLLATE \"C\",\n target_id COLLATE \"C\"\n LIMIT ${limit}\n `,\n args,\n source\n )\n const rows = await sql.unsafe<LinkDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n\n return {\n links: rows.slice(0, params.limit).map((row) => rowToLink(row)),\n hasMore: rows.length > params.limit,\n }\n }\n\n async list(\n params: Parameters<ObjectReadStorage[\"list\"]>[0]\n ): Promise<{ objects: readonly ObjectRow[]; hasMore: boolean; total: number }> {\n const sql = this.sql\n const source = this.source\n const queryOffset = params.offset ?? 0\n const limit = params.limit ?? 50\n const orderBy = params.orderBy ?? \"updatedAt\"\n const order = params.order ?? \"desc\"\n const orderColumn =\n orderBy === \"primaryId\" ? \"primary_id\" : orderBy === \"createdAt\" ? \"created_at\" : \"updated_at\"\n const filters = [\"project_id = ?\"]\n const args: unknown[] = [params.projectId]\n if (typeof params.objectTypeId === \"string\") {\n filters.push(\"object_type_id = ?\")\n args.push(params.objectTypeId)\n } else if (params.objectTypeId !== undefined) {\n filters.push(\"object_type_id IN (SELECT jsonb_array_elements_text(?::text::jsonb))\")\n args.push(JSON.stringify(params.objectTypeId))\n }\n if (params.primaryIdPrefix) {\n filters.push(\"primary_id LIKE ?\")\n args.push(`${params.primaryIdPrefix}%`)\n }\n if (params.primaryIdSuffix) {\n filters.push(\"primary_id LIKE ?\")\n args.push(`%${params.primaryIdSuffix}`)\n }\n if (params.updatedAfter) {\n filters.push(\"updated_at >= ?\")\n args.push(params.updatedAfter)\n }\n if (params.updatedBefore) {\n filters.push(\"updated_at <= ?\")\n args.push(params.updatedBefore)\n }\n if (params.createdAfter) {\n filters.push(\"created_at >= ?\")\n args.push(params.createdAfter)\n }\n if (params.createdBefore) {\n filters.push(\"created_at <= ?\")\n args.push(params.createdBefore)\n }\n\n const objectsTable = source.objectsTable\n const whereSql = filters.join(\" AND \")\n const countStatement = compilePgObjectStatement(\n `SELECT COUNT(*)::int AS total FROM ${objectsTable} WHERE ${whereSql}`,\n args,\n source\n )\n const [countResult] = await sql.unsafe<{ total: number }[]>(\n countStatement.sql,\n countStatement.args as SqlParameter[]\n )\n const total = countResult?.total ?? 0\n\n if (limit === 0) return { objects: [], hasMore: queryOffset < total, total }\n\n const fetchLimit = limit + 1\n const rowsStatement = compilePgObjectStatement(\n `\n SELECT * FROM ${objectsTable}\n WHERE ${whereSql}\n ORDER BY ${orderColumn} ${order === \"asc\" ? \"ASC\" : \"DESC\"}\n LIMIT ? OFFSET ?\n `,\n [...args, fetchLimit, queryOffset],\n source\n )\n const rows = await sql.unsafe<ObjectDatabaseRow[]>(\n rowsStatement.sql,\n rowsStatement.args as SqlParameter[]\n )\n\n const hasMore = rows.length > limit\n const objects = rows.slice(0, limit).map((row) => rowToObject(row))\n\n return { objects, hasMore, total }\n }\n}\n\nasync function readTotal(sql: SQLClient, compiled: CompiledPgObjectQuery): Promise<number> {\n const [row] = await sql.unsafe<\n {\n total: string | number | bigint\n }[]\n >(compiled.totalSql, compiled.totalArgs as SqlParameter[])\n return Number(row?.total ?? 0)\n}\n\nasync function readFacetBuckets(\n sql: SQLClient,\n compiled: { sql: string; args: readonly unknown[] }\n): Promise<{ value: unknown; count: number }[]> {\n const rows = await sql.unsafe<FacetDatabaseRow[]>(compiled.sql, [\n ...compiled.args,\n ] as SqlParameter[])\n\n return rows.map((row) => ({\n value: pgFacetValue(row.value_type, row.value_text),\n count: Number(row.count),\n }))\n}\n\nfunction pgFacetValue(valueType: string | null, valueText: string | null): unknown {\n switch (valueType) {\n case \"string\":\n return valueText ?? \"\"\n case \"number\":\n return valueText === null ? null : Number(valueText)\n case \"boolean\":\n return valueText === \"true\"\n case \"null\":\n return null\n case \"array\":\n case \"object\":\n return valueText === null ? null : JSON.parse(valueText)\n default:\n return valueText\n }\n}\n\nfunction stripOuterRowShape(query: ObjectQuery): ObjectQuery {\n switch (query.kind) {\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"sort\":\n return stripOuterRowShape(query.input)\n default:\n return query\n }\n}\n\nexport function assertLinkQueryLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Object link query limit must be a positive safe integer.\")\n }\n}\n",
30
+ "import { createHash } from \"node:crypto\"\nimport type { StorageMigrator } from \"@sixb/core\"\nimport type {\n MigrationHistoryStore,\n MigrationRecord,\n MigrationSet,\n MigrationStep,\n MigrationStepOptions,\n} from \"@sixb/core/storage\"\nimport {\n defineMigrations,\n describeMigrationHistory,\n runMigrationSet,\n step,\n} from \"@sixb/core/storage\"\nimport initialSchemaSql from \"./migrations/001-initial-schema.sql\" with { type: \"text\" }\nimport workflowRunOutputSql from \"./migrations/002-workflow-run-output.sql\" with { type: \"text\" }\nimport mergeSyncRunsSql from \"./migrations/003-merge-sync-runs.sql\" with { type: \"text\" }\nimport executionsSql from \"./migrations/004-executions.sql\" with { type: \"text\" }\nimport workflowExecutionsSql from \"./migrations/005-workflow-executions.sql\" with { type: \"text\" }\nimport narrowOntologySourceRootIndexSql from \"./migrations/006-narrow-ontology-source-root-index.sql\" with {\n type: \"text\",\n}\nimport splitOverridesSql from \"./migrations/007-split-overrides.sql\" with { type: \"text\" }\nimport actionExecutionsSql from \"./migrations/008-action-executions.sql\" with { type: \"text\" }\nimport agentExecutionsSql from \"./migrations/009-agent-executions.sql\" with { type: \"text\" }\nimport aiUsageAccountingFoundationSql from \"./migrations/010-ai-usage-accounting-foundation.sql\" with {\n type: \"text\",\n}\nimport syncFailureRecordSql from \"./migrations/011-sync-failure-record.sql\" with { type: \"text\" }\nimport pipelineFailureRecordSql from \"./migrations/012-pipeline-failure-record.sql\" with {\n type: \"text\",\n}\nimport workflowFailureRecordSql from \"./migrations/013-workflow-failure-record.sql\" with {\n type: \"text\",\n}\nimport agentFailureRecordSql from \"./migrations/014-agent-failure-record.sql\" with { type: \"text\" }\nimport projectionFailureRecordSql from \"./migrations/015-projection-failure-record.sql\" with {\n type: \"text\",\n}\nimport webhookRunFailureRecordSql from \"./migrations/016-webhook-run-failure-record.sql\" with {\n type: \"text\",\n}\nimport actionFailureRecordSql from \"./migrations/017-action-failure-record.sql\" with {\n type: \"text\",\n}\nimport ontologyOutboxFailureRecordSql from \"./migrations/018-ontology-outbox-failure-record.sql\" with {\n type: \"text\",\n}\nimport webhookDeliveryFailureRecordSql from \"./migrations/019-webhook-delivery-failure-record.sql\" with {\n type: \"text\",\n}\nimport dropRunUsageProjectionsSql from \"./migrations/020-drop-run-usage-projections.sql\" with {\n type: \"text\",\n}\nimport syncPipelineExecutionsSql from \"./migrations/021-sync-pipeline-executions.sql\" with {\n type: \"text\",\n}\nimport projectionExecutionsSql from \"./migrations/022-projection-executions.sql\" with {\n type: \"text\",\n}\nimport webhookExecutionsSql from \"./migrations/023-webhook-executions.sql\" with { type: \"text\" }\nimport ontologyCommitExecutionsSql from \"./migrations/024-ontology-commit-executions.sql\" with {\n type: \"text\",\n}\nimport connectorConnectionsSql from \"./migrations/025-connector-connections.sql\" with {\n type: \"text\",\n}\nimport aiCostAccountingSql from \"./migrations/026-ai-cost-accounting.sql\" with { type: \"text\" }\nimport agentContextCheckpointsSql from \"./migrations/027-agent-context-checkpoints.sql\" with {\n type: \"text\",\n}\nimport objectOverrideEditTimesSql from \"./migrations/028-object-override-edit-times.sql\" with {\n type: \"text\",\n}\nimport modelAccountingSql from \"./migrations/029-model-accounting.sql\" with { type: \"text\" }\nimport aiUsageLimitsSql from \"./migrations/030-ai-usage-limits.sql\" with { type: \"text\" }\nimport subagentRunsSql from \"./migrations/031-subagent-runs.sql\" with { type: \"text\" }\nimport conversationRunSpecSql from \"./migrations/032-conversation-run-spec.sql\" with {\n type: \"text\",\n}\nimport retireAgentDefinitionsSql from \"./migrations/033-retire-agent-definitions.sql\" with {\n type: \"text\",\n}\nimport deviceAuthorizationsSql from \"./migrations/034-device-authorizations.sql\" with {\n type: \"text\",\n}\nimport shareGrantsSql from \"./migrations/035-share-grants.sql\" with { type: \"text\" }\nimport shareSessionsSql from \"./migrations/036-share-sessions.sql\" with { type: \"text\" }\nimport projectionSourceRootsSql from \"./migrations/039-projection-source-roots.sql\" with {\n type: \"text\",\n}\nimport agentThreadWorkspacesSql from \"./migrations/041-agent-thread-workspaces.sql\" with {\n type: \"text\",\n}\nimport vectorProfilesSql from \"./migrations/042-vector-profiles.sql\" with { type: \"text\" }\nimport vectorIndexingSql from \"./migrations/043-vector-indexing.sql\" with { type: \"text\" }\nimport vectorBatchingSql from \"./migrations/044-vector-batching.sql\" with { type: \"text\" }\nimport agentThreadSandboxStateSql from \"./migrations/045-agent-thread-sandbox-state.sql\" with {\n type: \"text\",\n}\nimport workflowInterventionPrincipalsSql from \"./migrations/046-workflow-intervention-principals.sql\" with {\n type: \"text\",\n}\nimport ontologyCommitAttributionSql from \"./migrations/047-ontology-commit-attribution.sql\" with {\n type: \"text\",\n}\nimport nativeSessionsSql from \"./migrations/049-native-sessions.sql\" with { type: \"text\" }\nimport directoryGroupMembershipsSql from \"./migrations/050-directory-group-memberships.sql\" with {\n type: \"text\",\n}\nimport projectionRunSupersessionSql from \"./migrations/051-projection-run-supersession.sql\" with {\n type: \"text\",\n}\nimport compactSourceStorageSql from \"./migrations/052-compact-source-storage.sql\" with {\n type: \"text\",\n}\nimport replacementPlansSql from \"./migrations/053-replacement-plans.sql\" with { type: \"text\" }\nimport slimOntologyOutboxSql from \"./migrations/054-slim-ontology-outbox.sql\" with { type: \"text\" }\nimport objectQueryPreparationSql from \"./migrations/055-object-query-preparation.sql\" with {\n type: \"text\",\n}\nimport commitTouchesSql from \"./migrations/056-commit-touches.sql\" with { type: \"text\" }\nimport audioTranscriptionSql from \"./migrations/057-audio-transcription.sql\" with { type: \"text\" }\nimport rerankingModelKindSql from \"./migrations/058-reranking-model-kind.sql\" with { type: \"text\" }\nimport type { ReservedSQL, SQL, SQLClient } from \"./pg-client\"\nimport { runPgTransactionOn, undoOnFailure, withReservedPgConnection } from \"./transactions\"\n\nexport interface PostgresMigrationContext {\n exec(sqlText: string): Promise<void>\n}\n\nexport const POSTGRES_STORAGE_ADAPTER_ID = \"SixbPostgresStorage\"\n\nexport function pgSql(id: string, sqlText: string): MigrationStep<PostgresMigrationContext> {\n return pgStep(id, (context) => context.exec(sqlText), { checksum: checksum(sqlText) })\n}\n\nexport function pgStep(\n id: string,\n up: (context: PostgresMigrationContext) => void | Promise<void>,\n options: MigrationStepOptions = {}\n): MigrationStep<PostgresMigrationContext> {\n return step<PostgresMigrationContext>(id, up, options)\n}\n\nexport function createPostgresStorageMigrators(\n sql: SQL,\n schemaName: string\n): readonly StorageMigrator[] {\n return [\n createPostgresMigrator({\n sql,\n schemaName,\n migrations: postgresStorageMigrations,\n }),\n ]\n}\n\nexport function createPostgresMigrator(params: {\n readonly sql: SQL\n readonly schemaName: string\n readonly migrations: MigrationSet<PostgresMigrationContext>\n}): StorageMigrator {\n return {\n adapterId: params.migrations.adapterId,\n latestVersion: params.migrations.latestVersion,\n async status() {\n return describeMigrationHistory({\n migrations: params.migrations,\n rows: await readPostgresHistory(params.sql, params.schemaName, params.migrations.adapterId),\n })\n },\n migrate() {\n return withPostgresMigrationLock(params, async (sql) => {\n const session = postgresMigrationSession(sql, params.schemaName)\n return runMigrationSet({\n context: session.context,\n migrations: params.migrations,\n state: session.state,\n })\n })\n },\n }\n}\n\nexport async function migratePostgresStorage(sql: SQL, schemaName: string): Promise<void> {\n await createPostgresMigrator({\n sql,\n schemaName,\n migrations: postgresStorageMigrations,\n }).migrate()\n}\n\nexport async function dropSchema(sql: SQL, schemaName: string): Promise<void> {\n await sql.unsafe(`DROP SCHEMA IF EXISTS ${quoteIdent(schemaName)} CASCADE`)\n}\n\nexport function quoteIdent(identifier: string): string {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier)) {\n throw new Error(`[SixbPg] Invalid identifier: ${identifier}`)\n }\n return `\"${identifier}\"`\n}\n\nfunction postgresMigrationSession(\n sql: ReservedSQL,\n schemaName: string\n): { context: PostgresMigrationContext; state: MigrationHistoryStore } {\n const schema = quoteIdent(schemaName)\n const migrationsTable = `${schema}.sixb_migrations`\n // Migration steps receive a stable context; route exec() through the active transaction.\n let active: SQLClient | null = null\n const connection = (): SQLClient => active ?? sql\n\n return {\n context: {\n async exec(sqlText) {\n await connection().unsafe(sqlText)\n },\n },\n state: {\n async ensure() {\n await sql.unsafe(`\n CREATE SCHEMA IF NOT EXISTS ${schema};\n\n CREATE TABLE IF NOT EXISTS ${migrationsTable} (\n adapter_id TEXT NOT NULL,\n version INTEGER NOT NULL,\n id TEXT NOT NULL,\n checksum TEXT,\n status TEXT NOT NULL CHECK (status IN ('started', 'applied')),\n started_at TIMESTAMPTZ NOT NULL,\n finished_at TIMESTAMPTZ,\n PRIMARY KEY (adapter_id, version)\n );\n `)\n },\n async readHistory(adapterId) {\n const rows = await sql.unsafe<PostgresMigrationRow[]>(\n `SELECT * FROM ${migrationsTable} WHERE adapter_id = $1 ORDER BY version`,\n [adapterId]\n )\n return rows.map(rowToMigrationRecord)\n },\n async markStarted(adapterId, migration, at) {\n await connection().unsafe(\n `\n INSERT INTO ${migrationsTable} (\n adapter_id, version, id, checksum, status, started_at, finished_at\n ) VALUES ($1, $2, $3, $4, 'started', $5, NULL)\n ON CONFLICT(adapter_id, version) DO UPDATE SET\n id = excluded.id,\n checksum = excluded.checksum,\n status = excluded.status,\n started_at = excluded.started_at,\n finished_at = NULL\n `,\n [adapterId, migration.version, migration.id, migration.checksum ?? null, at]\n )\n },\n async markApplied(adapterId, migration, at) {\n await connection().unsafe(\n `\n UPDATE ${migrationsTable}\n SET status = 'applied', finished_at = $1\n WHERE adapter_id = $2 AND version = $3\n `,\n [at, adapterId, migration.version]\n )\n },\n async transaction(run) {\n // `sql` is the reserved connection holding the migration advisory lock. porsager's\n // `.begin` would open the transaction on another pool connection, so drive it on this one\n // and route exec()/markStarted()/markApplied() through it via `active`.\n const previous = active\n active = sql\n try {\n return await runPgTransactionOn(sql, async () => {\n await sql.unsafe(`SET LOCAL search_path TO ${schema}`)\n return run()\n })\n } finally {\n active = previous\n }\n },\n },\n }\n}\n\n/**\n * Reads migration history without DDL and without the advisory lock. `null` means the\n * history table does not exist, which is a state and not a failure.\n *\n * `migrate()` cannot be used for this: it calls `ensure()` first, so it runs\n * `CREATE SCHEMA`/`CREATE TABLE` and reserves a connection to hold\n * `pg_advisory_lock`. A probe must need no DDL grant — `/ready` is public and\n * unauthenticated — and must not serialize N replicas behind one lock.\n *\n * `to_regclass` returns NULL for a missing relation (including a missing schema)\n * instead of raising, and needs no catalog privileges.\n */\nasync function readPostgresHistory(\n sql: SQL,\n schemaName: string,\n adapterId: string\n): Promise<readonly MigrationRecord[] | null> {\n const schema = quoteIdent(schemaName)\n const probe = await sql.unsafe<{ oid: string | null }[]>(`SELECT to_regclass($1) AS oid`, [\n `${schema}.sixb_migrations`,\n ])\n if (!probe[0]?.oid) {\n return null\n }\n\n const rows = await sql.unsafe<PostgresMigrationRow[]>(\n `SELECT * FROM ${schema}.sixb_migrations WHERE adapter_id = $1 ORDER BY version`,\n [adapterId]\n )\n return rows.map(rowToMigrationRecord)\n}\n\nasync function withPostgresMigrationLock<T>(\n params: {\n readonly sql: SQL\n readonly schemaName: string\n readonly migrations: MigrationSet<PostgresMigrationContext>\n },\n run: (sql: ReservedSQL) => Promise<T>\n): Promise<T> {\n const [first, second] = advisoryLockParts(\n `storage:migration:${params.schemaName}:${params.migrations.adapterId}`\n )\n\n // A session-level lock outlives any transaction, so it is released before the connection goes\n // back to the pool — except when the connection was lost, which already released it.\n return withReservedPgConnection(params.sql, async (sql) => {\n const unlock = () => sql`SELECT pg_advisory_unlock(${first}, ${second})`\n await sql`SELECT pg_advisory_lock(${first}, ${second})`\n const result = await undoOnFailure(() => run(sql), unlock)\n await unlock()\n return result\n })\n}\n\nfunction advisoryLockParts(key: string): readonly [number, number] {\n const hash = createHash(\"sha256\").update(key).digest()\n return [hash.readInt32BE(0), hash.readInt32BE(4)]\n}\n\nfunction rowToMigrationRecord(row: PostgresMigrationRow): MigrationRecord {\n return {\n adapterId: row.adapter_id,\n version: row.version,\n id: row.id,\n checksum: row.checksum ?? undefined,\n status: row.status,\n startedAt: toIsoString(row.started_at),\n finishedAt: row.finished_at ? toIsoString(row.finished_at) : undefined,\n }\n}\n\nfunction toIsoString(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n\nfunction checksum(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\")\n}\n\nexport const postgresStorageMigrations = defineMigrations<PostgresMigrationContext>({\n adapterId: POSTGRES_STORAGE_ADAPTER_ID,\n steps: [\n pgSql(\"001-initial-schema\", initialSchemaSql),\n pgSql(\"002-workflow-run-output\", workflowRunOutputSql),\n pgSql(\"003-merge-sync-runs\", mergeSyncRunsSql),\n pgSql(\"004-executions\", executionsSql),\n pgSql(\"005-workflow-executions\", workflowExecutionsSql),\n pgSql(\"006-narrow-ontology-source-root-index\", narrowOntologySourceRootIndexSql),\n pgSql(\"007-split-overrides\", splitOverridesSql),\n pgSql(\"008-action-executions\", actionExecutionsSql),\n pgSql(\"009-agent-executions\", agentExecutionsSql),\n pgSql(\"010-ai-usage-accounting-foundation\", aiUsageAccountingFoundationSql),\n pgSql(\"011-sync-failure-record\", syncFailureRecordSql),\n pgSql(\"012-pipeline-failure-record\", pipelineFailureRecordSql),\n pgSql(\"013-workflow-failure-record\", workflowFailureRecordSql),\n pgSql(\"014-agent-failure-record\", agentFailureRecordSql),\n pgSql(\"015-projection-failure-record\", projectionFailureRecordSql),\n pgSql(\"016-webhook-run-failure-record\", webhookRunFailureRecordSql),\n pgSql(\"017-action-failure-record\", actionFailureRecordSql),\n pgSql(\"018-ontology-outbox-failure-record\", ontologyOutboxFailureRecordSql),\n pgSql(\"019-webhook-delivery-failure-record\", webhookDeliveryFailureRecordSql),\n pgSql(\"020-drop-run-usage-projections\", dropRunUsageProjectionsSql),\n pgSql(\"021-sync-pipeline-executions\", syncPipelineExecutionsSql),\n pgSql(\"022-projection-executions\", projectionExecutionsSql),\n pgSql(\"023-webhook-executions\", webhookExecutionsSql),\n pgSql(\"024-ontology-commit-executions\", ontologyCommitExecutionsSql),\n pgSql(\"025-connector-connections\", connectorConnectionsSql),\n pgSql(\"026-ai-cost-accounting\", aiCostAccountingSql),\n pgSql(\"027-agent-context-checkpoints\", agentContextCheckpointsSql),\n pgSql(\"028-object-override-edit-times\", objectOverrideEditTimesSql),\n pgSql(\"029-model-accounting\", modelAccountingSql),\n pgSql(\"030-ai-usage-limits\", aiUsageLimitsSql),\n pgSql(\"031-subagent-runs\", subagentRunsSql),\n pgSql(\"032-conversation-run-spec\", conversationRunSpecSql),\n pgSql(\"033-retire-agent-definitions\", retireAgentDefinitionsSql),\n pgSql(\"034-device-authorizations\", deviceAuthorizationsSql),\n pgSql(\"035-share-grants\", shareGrantsSql),\n pgSql(\"036-share-sessions\", shareSessionsSql),\n pgSql(\"037-execution-requester-groups\", executionRequesterGroupsSql),\n pgSql(\"038-outbox-publication-order\", outboxPublicationOrderSql),\n pgSql(\"039-projection-source-roots\", projectionSourceRootsSql),\n pgSql(\"040-connector-optional-pkce\", connectorOptionalPkceSql),\n pgSql(\"041-agent-thread-workspaces\", agentThreadWorkspacesSql),\n pgSql(\"042-vector-profiles\", vectorProfilesSql),\n pgSql(\"043-vector-indexing\", vectorIndexingSql),\n pgSql(\"044-vector-batching\", vectorBatchingSql),\n pgSql(\"045-agent-thread-sandbox-state\", agentThreadSandboxStateSql),\n pgSql(\"046-workflow-intervention-principals\", workflowInterventionPrincipalsSql),\n pgSql(\"047-ontology-commit-attribution\", ontologyCommitAttributionSql),\n pgSql(\"048-file-upload-sessions\", fileUploadSessionsSql),\n pgSql(\"049-native-sessions\", nativeSessionsSql),\n pgSql(\"050-directory-group-memberships\", directoryGroupMembershipsSql),\n pgSql(\"051-projection-run-supersession\", projectionRunSupersessionSql),\n pgSql(\"052-compact-source-storage\", compactSourceStorageSql),\n pgSql(\"053-replacement-plans\", replacementPlansSql),\n pgSql(\"054-slim-ontology-outbox\", slimOntologyOutboxSql),\n pgSql(\"055-object-query-preparation\", objectQueryPreparationSql),\n pgSql(\"056-commit-touches\", commitTouchesSql),\n pgSql(\"057-audio-transcription\", audioTranscriptionSql),\n pgSql(\"058-reranking-model-kind\", rerankingModelKindSql),\n pgSql(\"059-file-download-grants\", fileDownloadGrantsSql),\n pgSql(\"060-drained-source-versions\", drainedSourceVersionsSql),\n ],\n})\n\ninterface PostgresMigrationRow {\n readonly adapter_id: string\n readonly version: number\n readonly id: string\n readonly checksum: string | null\n readonly status: MigrationRecord[\"status\"]\n readonly started_at: Date | string\n readonly finished_at: Date | string | null\n}\n\nimport executionRequesterGroupsSql from \"./migrations/037-execution-requester-groups.sql\" with {\n type: \"text\",\n}\nimport outboxPublicationOrderSql from \"./migrations/038-outbox-publication-order.sql\" with {\n type: \"text\",\n}\n\nimport connectorOptionalPkceSql from \"./migrations/040-connector-optional-pkce.sql\" with {\n type: \"text\",\n}\nimport fileUploadSessionsSql from \"./migrations/048-file-upload-sessions.sql\" with { type: \"text\" }\nimport fileDownloadGrantsSql from \"./migrations/059-file-download-grants.sql\" with { type: \"text\" }\nimport drainedSourceVersionsSql from \"./migrations/060-drained-source-versions.sql\" with {\n type: \"text\",\n}\n",
31
+ "import { hasVectorProfile } from \"@sixb/core/internal/query\"\nimport type {\n CompiledSelectedObjectReadScope,\n CountObjectsInput,\n CountObjectsResult,\n ExistsObjectsInput,\n ExistsObjectsResult,\n FacetObjectsInput,\n FacetObjectsResult,\n LinkBatchKey,\n LinkDirection,\n ObjectBatchKey,\n ObjectLinkRow,\n ObjectQueryCapabilities,\n ObjectReadExecutionLimits,\n ObjectReadStorage,\n ObjectRow,\n ObjectStorage,\n QueryObjectLinksInput,\n QueryObjectLinksResult,\n QueryObjectsInput,\n QueryObjectsResult,\n} from \"@sixb/core/storage\"\nimport type { SQLClient, SqlParameter } from \"../pg-client\"\nimport {\n canStartPgTransaction,\n type PgStoreClient,\n runPgRepeatableReadTransaction,\n} from \"../transactions\"\nimport { PgAggregateAdmission } from \"./aggregate-admission\"\nimport { DEFAULT_OBJECT_QUERY_SOURCE } from \"./query-compiler\"\nimport { assertLinkQueryLimit, PgObjectReader } from \"./reader\"\nimport {\n type LinkDatabaseRow,\n linkIdentity,\n type ObjectDatabaseRow,\n rowToLink,\n rowToObject,\n} from \"./rows\"\nimport { createPgSelectedReader } from \"./selected-reader\"\n\nconst PG_OBJECT_QUERY_CAPABILITIES: ObjectQueryCapabilities = {\n queryObjects: true,\n countObjects: true,\n existsObjects: true,\n facetObjects: true,\n nodes: {\n start: true,\n refs: true,\n filter: true,\n text: true,\n vector: true,\n sort: true,\n limit: true,\n page: true,\n traverse: true,\n set: true,\n project: true,\n expand: true,\n },\n predicateOps: {\n and: true,\n or: true,\n not: true,\n eq: true,\n neq: true,\n lt: true,\n lte: true,\n gt: true,\n gte: true,\n in: true,\n exists: true,\n contains: true,\n },\n sortKinds: {\n property: true,\n },\n traversalDirections: {\n outgoing: true,\n incoming: true,\n },\n setOps: {\n union: true,\n intersect: true,\n subtract: true,\n },\n scalarOperations: {\n string: { equality: true, ordering: true },\n uuid: { equality: true, ordering: true },\n boolean: { equality: true },\n integer: { equality: true, ordering: true },\n double: { equality: true, ordering: true },\n decimal: { equality: true, ordering: true },\n date: { equality: true, ordering: true },\n timestamp: { equality: true, ordering: true },\n // jsonb equality and containment compare both fields of `{ type, id }`, whatever key order.\n userRef: { equality: true },\n },\n limits: {\n totalCount: true,\n stablePageTokens: true,\n },\n notes: [\n \"PostgreSQL object query pushdown supports start/refs/filter/text/sort/limit/page/traverse/set/project/expand over JSONB properties and object links.\",\n \"expand hydrates linked objects in-database (top-N per parent via LATERAL + jsonb_agg); core resolves each expansion's cardinality before pushdown, and a mixed/unresolved one stays on the fallback.\",\n \"Exact decimal predicates, ordering, and keyset pagination use PostgreSQL numeric casts.\",\n \"Relevance sorting and unresolved start.includeSubtypes remain planner fallback or rejection cases.\",\n ],\n}\n\n/** PostgreSQL object provider; interactive reads share one source-aware reader. */\nexport class PgObjectStorage implements ObjectStorage {\n private readonly reader: PgObjectReader\n\n constructor(\n private readonly sql: PgStoreClient,\n maxConcurrentAggregates = 1\n ) {\n this.reader = new PgObjectReader(\n sql,\n DEFAULT_OBJECT_QUERY_SOURCE,\n canStartPgTransaction(sql) ? new PgAggregateAdmission(maxConcurrentAggregates) : undefined\n )\n }\n\n queryCapabilities(): ObjectQueryCapabilities {\n return PG_OBJECT_QUERY_CAPABILITIES\n }\n\n createSelectedReadScope(params: {\n projectId: string\n scope: CompiledSelectedObjectReadScope\n limits: ObjectReadExecutionLimits\n }): ObjectReadStorage {\n return createPgSelectedReader(this.sql, params, () => this.queryCapabilities())\n }\n\n async queryObjects(params: QueryObjectsInput): Promise<QueryObjectsResult> {\n if (hasVectorProfile(params.query))\n return runPgRepeatableReadTransaction(this.sql, (tx) =>\n new PgObjectReader(tx, DEFAULT_OBJECT_QUERY_SOURCE).queryObjects(params)\n )\n return this.reader.queryObjects(params)\n }\n\n async countObjects(params: CountObjectsInput): Promise<CountObjectsResult> {\n if (hasVectorProfile(params.query))\n return runPgRepeatableReadTransaction(this.sql, (tx) =>\n new PgObjectReader(tx, DEFAULT_OBJECT_QUERY_SOURCE).countObjects(params)\n )\n return this.reader.countObjects(params)\n }\n\n async existsObjects(params: ExistsObjectsInput): Promise<ExistsObjectsResult> {\n if (hasVectorProfile(params.query))\n return runPgRepeatableReadTransaction(this.sql, (tx) =>\n new PgObjectReader(tx, DEFAULT_OBJECT_QUERY_SOURCE).existsObjects(params)\n )\n return this.reader.existsObjects(params)\n }\n\n async facetObjects(params: FacetObjectsInput): Promise<FacetObjectsResult> {\n if (hasVectorProfile(params.query))\n return runPgRepeatableReadTransaction(this.sql, (tx) =>\n new PgObjectReader(tx, DEFAULT_OBJECT_QUERY_SOURCE).facetObjects(params)\n )\n return this.reader.facetObjects(params)\n }\n\n async getByPrimaryId(params: {\n projectId: string\n objectTypeId: string\n primaryId: string\n }): Promise<ObjectRow | null> {\n return this.reader.getByPrimaryId(params)\n }\n\n async selectsObjectProperties(\n params: Parameters<ObjectReadStorage[\"selectsObjectProperties\"]>[0]\n ): Promise<readonly boolean[]> {\n return this.reader.selectsObjectProperties(params)\n }\n\n async listLinks(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n linkId?: string\n direction?: LinkDirection\n }): Promise<readonly ObjectLinkRow[]> {\n return this.reader.listLinks(params)\n }\n\n async getByPrimaryIdBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; primaryId: string }[]\n }): Promise<Map<ObjectBatchKey, ObjectRow>> {\n return this.reader.getByPrimaryIdBatch(params)\n }\n\n async listLinksBatch(params: {\n projectId: string\n direction?: LinkDirection\n items: readonly { objectTypeId: string; objectId: string; linkId: string }[]\n }): Promise<Map<LinkBatchKey, ObjectLinkRow[]>> {\n return this.reader.listLinksBatch(params)\n }\n\n async queryLinks(params: QueryObjectLinksInput): Promise<QueryObjectLinksResult> {\n assertLinkQueryLimit(params.limit)\n return this.reader.queryLinks(params)\n }\n\n async listIncidentLinksBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; objectId: string }[]\n }): Promise<readonly ObjectLinkRow[]> {\n if (params.items.length === 0) return []\n const tuples = params.items.map((item) => [item.objectTypeId, item.objectId])\n\n // Cover both link directions with two index-friendly equality joins (source-side, then\n // target-side) rather than a single OR-join, which would defeat index usage. This is a constant\n // number of round trips regardless of the requested object count. They are issued sequentially\n // because callers may run on a serializable transaction's single connection. A link incident to\n // two listed objects matches both halves and is de-duplicated below.\n const sourceRows = await valuesJoin<LinkDatabaseRow>(\n this.sql,\n \"SELECT l.* FROM links l\",\n [\"source_type_id\", \"source_id\"],\n tuples,\n \"WHERE l.project_id = $1\",\n [params.projectId]\n )\n const targetRows = await valuesJoin<LinkDatabaseRow>(\n this.sql,\n \"SELECT l.* FROM links l\",\n [\"target_type_id\", \"target_id\"],\n tuples,\n \"WHERE l.project_id = $1\",\n [params.projectId]\n )\n\n const deduped = new Map<string, ObjectLinkRow>()\n for (const row of [...sourceRows, ...targetRows]) {\n const link = rowToLink(row)\n deduped.set(linkIdentity(link), link)\n }\n return [...deduped.values()]\n }\n\n async listByPrimaryIdPage(params: {\n projectId: string\n objectTypeId: string\n afterPrimaryId?: string\n limit: number\n }): Promise<{ objects: readonly ObjectRow[]; nextPrimaryId?: string }> {\n assertReconciliationPageLimit(params.limit)\n const rows = await this.sql<ObjectDatabaseRow[]>`\n SELECT * FROM objects\n WHERE project_id = ${params.projectId}\n AND object_type_id = ${params.objectTypeId}\n ${params.afterPrimaryId ? this.sql`AND primary_id > ${params.afterPrimaryId}` : this.sql``}\n ORDER BY primary_id ASC\n LIMIT ${params.limit + 1}\n `\n const hasMore = rows.length > params.limit\n const objects = rows.slice(0, params.limit).map((row) => rowToObject(row))\n const last = objects.at(-1)\n return {\n objects,\n ...(hasMore && last ? { nextPrimaryId: last.primaryId } : {}),\n }\n }\n\n async list(params: {\n projectId: string\n objectTypeId?: string | readonly string[]\n primaryIdPrefix?: string\n primaryIdSuffix?: string\n updatedAfter?: Date\n updatedBefore?: Date\n createdAfter?: Date\n createdBefore?: Date\n limit?: number\n offset?: number\n orderBy?: \"createdAt\" | \"updatedAt\" | \"primaryId\"\n order?: \"asc\" | \"desc\"\n }): Promise<{ objects: readonly ObjectRow[]; hasMore: boolean; total: number }> {\n return this.reader.list(params)\n }\n}\n\n/**\n * Build a `SELECT ... JOIN (VALUES ...) AS t(...) ON ... WHERE ...` query\n * with positional parameters. Bun SQL's tagged-template helpers don't\n * support VALUES inside SELECT/JOIN, so we construct the query string\n * manually while keeping all user data in the parameter array.\n */\nfunction valuesJoin<Row = unknown>(\n sql: SQLClient,\n select: string,\n columns: string[],\n tuples: unknown[][],\n where: string,\n whereParams: unknown[]\n): Promise<Row[]> {\n const alias = \"t\"\n const colWidth = columns.length\n\n // $1 … $N are reserved for the WHERE params that come first.\n const base = whereParams.length\n const valuePlaceholders = tuples\n .map((_, i) => {\n const cols = columns.map((_, j) => `$${base + i * colWidth + j + 1}`)\n return `(${cols.join(\",\")})`\n })\n .join(\",\")\n\n const onClause = columns\n .map((c) => {\n // Infer the table alias from the SELECT clause (first word after SELECT ... FROM)\n const srcAlias = select.match(/FROM\\s+\\w+\\s+(\\w+)/i)?.[1] ?? select.split(\" \").pop()\n return `${srcAlias}.${c} = ${alias}.${c}`\n })\n .join(\" AND \")\n\n const query = `${select} JOIN (VALUES ${valuePlaceholders}) AS ${alias}(${columns.join(\",\")}) ON ${onClause} ${where}`\n const params = [...whereParams, ...tuples.flat()]\n\n return sql.unsafe(query, params as SqlParameter[]) as unknown as Promise<Row[]>\n}\n\nfunction assertReconciliationPageLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Object reconciliation page limit must be a positive safe integer.\")\n }\n}\n",
32
+ "/** Limit expensive root aggregates before they reserve a database connection. Pages can\n * use the remaining pool capacity. No results or object revisions are retained here. */\nexport class PgAggregateAdmission {\n private active = 0\n private readonly waiting: (() => void)[] = []\n\n constructor(private readonly concurrency = 1) {}\n\n async run<T>(compute: () => Promise<T>): Promise<T> {\n if (this.active >= this.concurrency)\n await new Promise<void>((resolve) => this.waiting.push(resolve))\n else this.active++\n try {\n return await compute()\n } finally {\n const next = this.waiting.shift()\n if (next) next()\n else this.active--\n }\n }\n}\n",
33
+ "import {\n type ObjectExpansion,\n type ObjectQuery,\n ObjectQueryExecutionError,\n type ObjectQueryPredicate,\n type ObjectQuerySetOperation,\n type ObjectQuerySortField,\n type QueryScalarKind,\n} from \"@sixb/core\"\nimport {\n hasVectorProfile,\n isVectorProfileQuery,\n normalizeVector,\n vectorSearchCandidateLimit,\n} from \"@sixb/core/internal/query\"\n\nexport interface PgObjectQueryPageRow {\n object_type_id: string\n primary_id: string\n properties: unknown\n _cursor_properties?: unknown\n}\n\nexport interface CompiledPgObjectQuery {\n traversalProbe?: { sql: string; args: unknown[]; limit: number }\n vectorProbe?: { sql: string; args: unknown[]; limit: number }\n sql: string\n args: unknown[]\n totalSql: string\n totalArgs: unknown[]\n order: CompiledOrder\n hasMoreProbe?: CompiledHasMoreProbe\n hasMore(rowCount: number, total?: number): boolean\n trimRows<T>(rows: readonly T[]): readonly T[]\n nextPageToken(rows: readonly PgObjectQueryPageRow[], rowCount: number): string | undefined\n}\n\nexport interface CompiledPgScalarQuery {\n sql: string\n args: unknown[]\n}\n\nexport interface CompiledPgFacetQuery {\n sql: string\n args: unknown[]\n}\n\ninterface CompiledHasMoreProbe {\n sql: string\n args: unknown[]\n hasMore(rowCount: number): boolean\n}\n\ninterface CompileContext {\n probeLimit: boolean\n startPredicate?: string\n isolateSortOverflow?: boolean\n /** A consuming operator supplies ordering; bounded inputs still keep their own order. */\n unordered?: boolean\n correlatedTraversal?: boolean\n source: PgObjectQuerySource\n}\n\ninterface CompiledPredicate {\n sql: string\n args: unknown[]\n}\n\ninterface CompiledAggregateSource {\n sql: string\n args: unknown[]\n}\n\ninterface CompiledOrder {\n sql: string\n args: unknown[]\n fields: readonly CompiledOrderField[]\n propertyColumn: string\n}\n\ntype CompiledOrderField =\n | {\n kind: \"property\"\n propertyId: string\n direction: \"asc\" | \"desc\"\n scalarKind?: QueryScalarKind\n }\n | {\n kind: \"column\"\n column: \"object_type_id\" | \"primary_id\" | \"_vector_score\"\n binary?: boolean\n direction: \"asc\" | \"desc\"\n }\n\ninterface EncodedPageToken {\n version: 1\n order: readonly string[]\n values: readonly EncodedCursorValue[]\n}\n\ninterface EncodedCursorValue {\n nullish: boolean\n value?: unknown\n}\n\nconst PAGE_TOKEN_PREFIX = \"keyset:\"\n// Per-parent fanout the core executor bakes into every pushed-down expansion;\n// this default only guards a malformed (un-baked) IR and mirrors the core cap.\nconst DEFAULT_EXPANSION_FANOUT = 1_000\n\nexport function compilePgObjectQuery(\n projectId: string,\n query: ObjectQuery,\n options: {\n includeTotal?: boolean\n source?: PgObjectQuerySource\n correlatedTraversal?: boolean\n sortIndexBound?: string\n } = {}\n): CompiledPgObjectQuery {\n if (hasVectorProfile(query) && !isVectorProfileQuery(query)) {\n throw new ObjectQueryExecutionError(\n \"unsupported_vector_composition\",\n \"Vector search supports one profile with filters, traversals or sets before ranking and limit/project after.\"\n )\n }\n const source = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n let compiled = source.wrapQuery(\n compileObjectQueryInternal(projectId, query, {\n probeLimit: options.includeTotal === false,\n correlatedTraversal: options.correlatedTraversal,\n source,\n })\n )\n if (options.sortIndexBound && source === DEFAULT_OBJECT_QUERY_SOURCE) {\n let bounded = query\n while (bounded.kind === \"expand\") bounded = bounded.input\n if (bounded.kind === \"page\" || bounded.kind === \"limit\") {\n const branches = [options.sortIndexBound, `NOT (${options.sortIndexBound})`].map(\n (startPredicate, branch) =>\n compileObjectQueryInternal(projectId, query, {\n probeLimit: options.includeTotal === false,\n source,\n startPredicate,\n isolateSortOverflow: branch === 1,\n correlatedTraversal: options.correlatedTraversal,\n })\n )\n const limit =\n bounded.kind === \"page\"\n ? bounded.pageSize + 1\n : bounded.limit + (options.includeTotal === false ? 1 : 0)\n compiled = {\n ...compiled,\n sql: `SELECT * FROM ((${branches[0]!.sql}) UNION ALL (${branches[1]!.sql})) AS input ORDER BY ${compiled.order.sql} LIMIT ?`,\n args: [...branches[0]!.args, ...branches[1]!.args, ...compiled.order.args, limit],\n }\n }\n }\n const traversal = !options.correlatedTraversal && boundedTraversal(query)\n const traversalProbe = traversal ? compileTraversalProbe(projectId, traversal, source) : undefined\n return {\n ...compiled,\n ...(traversalProbe ? { traversalProbe } : {}),\n sql: numberPlaceholders(compiled.sql),\n totalSql: numberPlaceholders(compiled.totalSql),\n vectorProbe: compiled.vectorProbe\n ? { ...compiled.vectorProbe, sql: numberPlaceholders(compiled.vectorProbe.sql) }\n : undefined,\n hasMoreProbe: compiled.hasMoreProbe\n ? {\n ...compiled.hasMoreProbe,\n sql: numberPlaceholders(compiled.hasMoreProbe.sql),\n }\n : undefined,\n }\n}\n\n/** Physical relations used by the PostgreSQL object-query compiler. */\nexport interface PgObjectQuerySource {\n readonly objectsTable: string\n readonly linksTable: string\n readonly objectPropertyPermissionsTable?: string\n /** Wrap a terminal SELECT without its own WITH clause; the selected source owns the only WITH. */\n wrapStatement(\n sql: string,\n args?: readonly unknown[]\n ): {\n readonly sql: string\n readonly args: unknown[]\n }\n wrapQuery(query: CompiledPgObjectQuery): CompiledPgObjectQuery\n}\n\n/** Prefix an optional query source, then assign PostgreSQL positional placeholders. */\nexport function compilePgObjectStatement(\n sql: string,\n args: readonly unknown[] = [],\n source?: PgObjectQuerySource\n): CompiledPgScalarQuery {\n return numberCompiledQuery((source ?? DEFAULT_OBJECT_QUERY_SOURCE).wrapStatement(sql, args))\n}\n\nexport const DEFAULT_OBJECT_QUERY_SOURCE: PgObjectQuerySource = {\n objectsTable: \"objects\",\n linksTable: \"links\",\n wrapStatement: (sql, args = []) => ({ sql, args: [...args] }),\n wrapQuery: (query) => query,\n}\n\nfunction exactContext(ctx: CompileContext): CompileContext {\n return ctx.probeLimit ? { ...ctx, probeLimit: false } : ctx\n}\n\nexport function compilePgObjectCountQuery(\n projectId: string,\n query: ObjectQuery,\n options: { source?: PgObjectQuerySource } = {}\n): CompiledPgScalarQuery {\n const querySource = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n const source = compileAggregateSource(projectId, query, querySource)\n return numberCompiledQuery(\n querySource.wrapStatement(\n `\n SELECT COUNT(*)::bigint AS count\n FROM (${source.sql}) AS input\n `,\n source.args\n )\n )\n}\n\nexport function compilePgObjectExistsQuery(\n projectId: string,\n query: ObjectQuery,\n options: { source?: PgObjectQuerySource } = {}\n): CompiledPgScalarQuery {\n const querySource = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n const source = compileAggregateSource(projectId, query, querySource)\n return numberCompiledQuery(\n querySource.wrapStatement(\n `\n SELECT 1\n FROM (${source.sql}) AS input\n LIMIT 1\n `,\n source.args\n )\n )\n}\n\nexport function compilePgObjectFacetQuery(\n projectId: string,\n query: ObjectQuery,\n propertyId: string,\n limit: number,\n options: { source?: PgObjectQuerySource } = {}\n): CompiledPgFacetQuery {\n const querySource = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n const source = compileAggregateSource(projectId, query, querySource)\n return numberCompiledQuery(\n querySource.wrapStatement(\n `\n SELECT facet.value_type, facet.value_text, COUNT(*)::bigint AS count\n FROM (\n SELECT\n jsonb_typeof(input.properties -> (?::text)) AS value_type,\n input.properties ->> (?::text) AS value_text\n FROM (${source.sql}) AS input\n WHERE jsonb_exists(input.properties, ?::text)\n ) AS facet\n GROUP BY facet.value_type, facet.value_text\n ORDER BY count DESC, facet.value_text ASC\n LIMIT ?\n `,\n [propertyId, propertyId, ...source.args, propertyId, limit]\n )\n )\n}\n\n/** A single aggregate computes every facet and its exact total under one SQL snapshot. */\nexport function compilePgObjectFacetsQuery(\n projectId: string,\n query: ObjectQuery,\n facets: readonly { propertyId: string; limit: number }[],\n options: { source?: PgObjectQuerySource } = {}\n): CompiledPgFacetQuery {\n const querySource = options.source ?? DEFAULT_OBJECT_QUERY_SOURCE\n const source = compileAggregateSource(projectId, query, querySource)\n return compilePgFacetSummary(\n numberCompiledQuery(querySource.wrapStatement(source.sql, source.args)),\n facets\n )\n}\n\n/** Input is a numbered statement returning properties; compact read paths can supply it too. */\nexport function compilePgFacetSummary(\n source: CompiledPgFacetQuery,\n facets: readonly { propertyId: string; limit: number }[],\n nativeValues = false\n): CompiledPgFacetQuery {\n const args = [...source.args]\n const bind = (value: unknown) => {\n args.push(value)\n return `$${args.length}`\n }\n const fields = facets.map((facet, i) => {\n if (nativeValues) return `f${i}_type, f${i}_value`\n const property = bind(facet.propertyId)\n // Group JSONB before rendering: text would split equal numeric values such as 1.0 / 1.00.\n return `jsonb_typeof(input.properties -> ${property}::text) AS f${i}_type, input.properties -> ${property}::text AS f${i}_value`\n })\n if (!fields.length)\n return {\n sql: `SELECT -1 AS facet_index, NULL::text AS value_type, NULL::text AS value_text, count(*) AS count FROM (${source.sql}) AS input`,\n args,\n }\n const columns = facets.map((_, i) => `f${i}_type, f${i}_value`)\n const groups = facets.map((_, i) => `WHEN GROUPING(f${i}_type) = 0 THEN ${i}`).join(\" \")\n const buckets = facets.map(\n (facet, i) =>\n `(SELECT ${i} AS facet_index, f${i}_type AS value_type, ${nativeValues ? `f${i}_value` : `(f${i}_value #>> '{}')`} AS value_text, count FROM _sixb_facet_groups WHERE facet_index = ${i} AND f${i}_type IS NOT NULL ORDER BY count DESC, value_text ASC LIMIT ${bind(facet.limit)})`\n )\n return {\n sql: `WITH _sixb_facet_groups AS MATERIALIZED (\n SELECT CASE ${groups} ELSE -1 END AS facet_index, ${columns.join(\", \")}, count(*) AS count\n FROM (SELECT ${fields.join(\", \")} FROM (${source.sql}) AS input) AS _sixb_values\n GROUP BY GROUPING SETS ((), ${columns.map((column) => `(${column})`).join(\", \")})\n )\n SELECT -1 AS facet_index, NULL::text AS value_type, NULL::text AS value_text, count FROM _sixb_facet_groups WHERE facet_index = -1\n UNION ALL ${buckets.join(\" UNION ALL \")}`,\n args,\n }\n}\n\nfunction compileObjectQueryInternal(\n projectId: string,\n query: ObjectQuery,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n switch (query.kind) {\n case \"rerank\":\n throw new ObjectQueryExecutionError(\n \"reranking_requires_runtime\",\n \"Reranking must execute in the model runtime, not storage.\"\n )\n case \"start\":\n return compileStart(projectId, query, ctx)\n case \"refs\":\n return compileRefs(projectId, query, ctx)\n case \"filter\":\n return compileFilter(projectId, query.input, query.predicate, ctx)\n case \"sort\":\n return compileSort(projectId, query.input, query.fields, ctx)\n case \"limit\":\n return compileLimit(projectId, query.input, query.limit, ctx)\n case \"page\":\n return compilePage(projectId, query.input, query.pageSize, query.pageToken, ctx)\n case \"traverse\":\n return compileTraversal(\n projectId,\n query.input,\n query.linkId,\n query.direction,\n query.sourceObjectTypeId,\n ctx\n )\n case \"set\":\n return compileSet(projectId, query.op, query.inputs, ctx)\n case \"project\":\n return compileProject(projectId, query.input, query.properties, ctx)\n case \"text\":\n return compileText(\n projectId,\n query.input,\n query.query,\n query.fields,\n query.fieldsByObjectType,\n ctx\n )\n case \"expand\":\n return compileExpand(projectId, query.input, query.expansions, ctx)\n case \"vector\":\n return compileVector(projectId, query, ctx)\n }\n}\n\nfunction compileVector(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"vector\" }>,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n if (\n typeof query.vector === \"string\" ||\n !isVectorProfileQuery(query) ||\n !query.configuration ||\n !Number.isSafeInteger(query.k) ||\n query.k < 1 ||\n query.k > 1000 ||\n query.vector.length < 1 ||\n query.vector.length > 16000\n ) {\n throw new ObjectQueryExecutionError(\n \"invalid_vector_query\",\n \"A validated named vector profile is required.\"\n )\n }\n const input = compileObjectQueryInternal(projectId, query.input, exactContext(ctx))\n const permissions = ctx.source.objectPropertyPermissionsTable\n const permissionJoin = permissions\n ? `JOIN (\n SELECT project_id, object_type_id, primary_id, array_agg(property_id) AS property_ids\n FROM ${permissions}\n GROUP BY project_id, object_type_id, primary_id\n ) AS vector_permissions ON vector_permissions.project_id = vectors.project_id\n AND vector_permissions.object_type_id = vectors.object_type_id\n AND vector_permissions.primary_id = vectors.primary_id`\n : \"\"\n const authorized = permissions ? `AND vectors.source <@ vector_permissions.property_ids` : \"\"\n const candidates = `FROM (${input.sql}) AS input\n JOIN object_vectors AS vectors ON vectors.project_id = input.project_id\n AND vectors.object_type_id = input.object_type_id AND vectors.primary_id = input.primary_id\n ${permissionJoin}\n WHERE vectors.profile = ? AND vectors.configuration = ?\n AND cardinality(vectors.embedding) = ? ${authorized}`\n const candidateArgs = [...input.args, query.profile!, query.configuration, query.vector.length]\n // Bound distance work, not just returned rows. Exceeding the envelope fails before ranking.\n const limit = vectorSearchCandidateLimit(query.vector.length)\n const values = normalizeVector(query.vector, query.vector.length)\n const order = compileOrder([\n { kind: \"column\", column: \"_vector_score\", direction: \"desc\" },\n ...identityOrderFields().map((field) => ({ ...field, binary: true })),\n ])\n const sql = `SELECT * FROM (SELECT input.*, 1 - (vectors.embedding::public.vector OPERATOR(public.<=>) ?::public.vector) AS _vector_score\n ${candidates}) AS ranked ORDER BY ${order.sql} LIMIT ?`\n const args = [JSON.stringify(values), ...candidateArgs, query.k]\n return {\n sql,\n args,\n // Top-k cardinality depends on eligibility, not distances or ranking.\n totalSql: `SELECT COUNT(*)::bigint AS total FROM (SELECT 1 ${candidates} LIMIT ?) AS eligible`,\n totalArgs: [...candidateArgs, query.k],\n order,\n vectorProbe: {\n sql: `SELECT COUNT(*)::bigint AS total FROM (SELECT 1 ${candidates} LIMIT ?) AS candidates`,\n args: [...candidateArgs, limit + 1],\n limit,\n },\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileStart(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"start\" }>,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n if (query.includeSubtypes === true) {\n throw new Error(\"[SixbPg] PostgreSQL object storage does not support start.includeSubtypes\")\n }\n\n const order = compileOrder(identityOrderFields())\n const sql = `\n SELECT *, properties AS _cursor_properties\n FROM ${ctx.source.objectsTable}\n WHERE project_id = ? AND object_type_id = ?\n ${ctx.startPredicate ? `AND (${ctx.startPredicate})` : \"\"}\n ${ctx.unordered ? \"\" : `ORDER BY ${order.sql}`}\n ${ctx.isolateSortOverflow ? \"OFFSET 0\" : \"\"}\n `\n\n return {\n sql,\n args: [projectId, query.objectTypeId, ...(ctx.unordered ? [] : order.args)],\n totalSql: `SELECT COUNT(*)::bigint AS total FROM ${ctx.source.objectsTable} WHERE project_id = ? AND object_type_id = ?`,\n totalArgs: [projectId, query.objectTypeId],\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileRefs(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"refs\" }>,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n if (query.refs.length === 0) {\n throw new Error(\"[SixbPg] PostgreSQL object storage requires at least one ref\")\n }\n\n // Keep a concrete type visible to PostgreSQL even when identities arrive as JSON.\n // Relationship joins can then use partial incoming-link indexes for that type.\n const objectTypeId = query.refs[0]!.objectTypeId\n const uniformType = query.refs.every((ref) => ref.objectTypeId === objectTypeId)\n const typePredicate = uniformType ? \"AND selected.object_type_id = ?\" : \"\"\n const typeArgs = uniformType ? [objectTypeId] : []\n\n const order = compileOrder(identityOrderFields())\n const selectedOrder = compileOrder(identityOrderFields(), \"selected\")\n const refsJson = JSON.stringify(query.refs)\n const requested = `\n SELECT DISTINCT\n ref.value ->> 'objectTypeId' AS object_type_id,\n ref.value ->> 'primaryId' AS primary_id\n FROM jsonb_array_elements(?::text::jsonb) AS ref(value)\n `\n const sql = `\n SELECT selected.*, selected.properties AS _cursor_properties\n FROM (${requested}) AS requested\n JOIN ${ctx.source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = requested.object_type_id\n AND selected.primary_id = requested.primary_id\n ${typePredicate}\n ${ctx.unordered ? \"\" : `ORDER BY ${selectedOrder.sql}`}\n `\n\n return {\n sql,\n args: [refsJson, projectId, ...typeArgs, ...(ctx.unordered ? [] : selectedOrder.args)],\n totalSql: `\n SELECT COUNT(*)::bigint AS total\n FROM (${requested}) AS requested\n JOIN ${ctx.source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = requested.object_type_id\n AND selected.primary_id = requested.primary_id\n ${typePredicate}\n `,\n totalArgs: [refsJson, projectId, ...typeArgs],\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileFilter(\n projectId: string,\n inputQuery: ObjectQuery,\n predicateNode: ObjectQueryPredicate,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n return compileWhere(projectId, inputQuery, compilePredicate(predicateNode), ctx)\n}\n\nfunction compileWhere(\n projectId: string,\n inputQuery: ObjectQuery,\n predicate: CompiledPredicate,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, {\n ...exactContext(ctx),\n unordered: true,\n })\n const sql = `\n SELECT *\n FROM (${input.sql}) AS input\n WHERE ${predicate.sql}\n ${ctx.unordered ? \"\" : `ORDER BY ${input.order.sql}`}\n `\n\n return {\n sql,\n args: [...input.args, ...predicate.args, ...(ctx.unordered ? [] : input.order.args)],\n totalSql: `\n SELECT COUNT(*)::bigint AS total\n FROM (${input.sql}) AS input\n WHERE ${predicate.sql}\n `,\n totalArgs: [...input.args, ...predicate.args],\n vectorProbe: input.vectorProbe,\n order: input.order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileText(\n projectId: string,\n inputQuery: ObjectQuery,\n query: string,\n fields: readonly string[] | undefined,\n fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n return compileWhere(\n projectId,\n inputQuery,\n compileTextSearchPredicate(query, fields, fieldsByObjectType),\n ctx\n )\n}\n\nfunction compileSort(\n projectId: string,\n inputQuery: ObjectQuery,\n fields: readonly ObjectQuerySortField[],\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, {\n ...exactContext(ctx),\n unordered: true,\n })\n const probeInput =\n ctx.probeLimit && needsLimitProbe(inputQuery)\n ? compileObjectQueryInternal(projectId, inputQuery, ctx)\n : undefined\n const order = compileOrder(sortOrderFields(fields))\n\n return {\n sql: `\n SELECT\n input.project_id,\n input.object_type_id,\n input.primary_id,\n input.properties,\n input.properties AS _cursor_properties,\n input.created_at,\n input.updated_at,\n input.version,\n input.last_commit_id${input.vectorProbe ? \", input._vector_score\" : \"\"}\n FROM (${input.sql}) AS input\n ${ctx.unordered ? \"\" : `ORDER BY ${order.sql}`}\n `,\n args: [...input.args, ...(ctx.unordered ? [] : order.args)],\n totalSql: input.totalSql,\n totalArgs: input.totalArgs,\n order,\n hasMoreProbe: probeInput ? hasMoreProbeFor(probeInput) : input.hasMoreProbe,\n hasMore: input.hasMore,\n trimRows: input.trimRows,\n nextPageToken: input.nextPageToken,\n }\n}\n\nfunction compileLimit(\n projectId: string,\n inputQuery: ObjectQuery,\n rawLimit: number,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, {\n ...exactContext(ctx),\n unordered: true,\n })\n const limit = Math.max(0, rawLimit)\n const rowLimit = ctx.probeLimit ? limit + 1 : limit\n\n // A plan bounded for the page must not force correlated probes over the full total.\n const totalInput = ctx.correlatedTraversal\n ? compileAggregateSource(projectId, inputQuery, ctx.source)\n : input\n\n return {\n sql: `\n SELECT *\n FROM (${input.sql}) AS input\n ORDER BY ${input.order.sql}\n LIMIT ?\n `,\n args: [...input.args, ...input.order.args, rowLimit],\n totalSql: `\n SELECT COUNT(*)::bigint AS total\n FROM (${totalInput.sql}) AS input\n `,\n totalArgs: totalInput.args,\n vectorProbe: input.vectorProbe,\n order: input.order,\n hasMore: (rowCount, total) =>\n total === undefined ? ctx.probeLimit && rowCount > limit : limit < total,\n trimRows: ctx.probeLimit ? (rows) => rows.slice(0, limit) : identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compilePage(\n projectId: string,\n inputQuery: ObjectQuery,\n rawPageSize: number,\n pageToken: string | undefined,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, {\n ...exactContext(ctx),\n unordered: true,\n })\n const pageSize = Math.max(0, rawPageSize)\n const cursor = pageToken ? decodePageToken(pageToken, input.order.fields) : undefined\n const cursorPredicate = cursor\n ? compileKeysetPredicate(input.order.fields, cursor, input.order.propertyColumn)\n : undefined\n const whereSql = cursorPredicate ? `WHERE ${cursorPredicate.sql}` : \"\"\n\n const ranges =\n cursor && isIndexPageInput(inputQuery)\n ? compileKeysetRanges(input.order.fields, cursor, input.order.propertyColumn)\n : undefined\n const rangeSql = ranges\n ?.map(\n (range) =>\n `(SELECT * FROM (${input.sql}) AS input WHERE ${range.sql} ORDER BY ${input.order.sql} LIMIT ?)`\n )\n .join(\" UNION ALL \")\n\n // A plan bounded for the page must not force correlated probes over the full total.\n const totalInput = ctx.correlatedTraversal\n ? compileAggregateSource(projectId, inputQuery, ctx.source)\n : input\n\n return {\n sql: rangeSql\n ? `SELECT * FROM (${rangeSql}) AS input ORDER BY ${input.order.sql} LIMIT ?`\n : `\n SELECT *\n FROM (${input.sql}) AS input\n ${whereSql}\n ORDER BY ${input.order.sql}\n LIMIT ?\n `,\n args:\n rangeSql && ranges\n ? [\n ...ranges.flatMap((range) => [\n ...input.args,\n ...range.args,\n ...input.order.args,\n pageSize + 1,\n ]),\n ...input.order.args,\n pageSize + 1,\n ]\n : [...input.args, ...(cursorPredicate?.args ?? []), ...input.order.args, pageSize + 1],\n totalSql: `\n SELECT COUNT(*)::bigint AS total\n FROM (${totalInput.sql}) AS input\n `,\n totalArgs: totalInput.args,\n vectorProbe: input.vectorProbe,\n order: input.order,\n hasMore: (rowCount) => rowCount > pageSize,\n trimRows: (rows) => rows.slice(0, pageSize),\n nextPageToken: (rows, rowCount) => {\n if (rowCount <= pageSize || rows.length === 0) return undefined\n return encodePageToken(rows[rows.length - 1], input.order.fields)\n },\n }\n}\n\nfunction compileTraversal(\n projectId: string,\n inputQuery: ObjectQuery,\n linkId: string,\n direction: \"outgoing\" | \"incoming\",\n sourceObjectTypeId: string | undefined,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, {\n ...exactContext(ctx),\n unordered: true,\n startPredicate: undefined,\n isolateSortOverflow: false,\n })\n const relation = compileTraversalRelation(\n projectId,\n input,\n linkId,\n direction,\n sourceObjectTypeId,\n ctx.source,\n ctx.correlatedTraversal,\n ctx.startPredicate\n )\n const order = compileOrder(identityOrderFields())\n return {\n sql: `SELECT selected.*, selected.properties AS _cursor_properties ${relation.sql} ${ctx.unordered ? \"\" : `ORDER BY ${order.sql}`} ${ctx.isolateSortOverflow ? \"OFFSET 0\" : \"\"}`,\n args: [...relation.args, ...(ctx.unordered ? [] : order.args)],\n totalSql: `SELECT COUNT(*)::bigint AS total ${relation.sql}`,\n totalArgs: relation.args,\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\n/** A traversal is a set of endpoints. EXISTS avoids sorting/deduplicating full JSON objects. */\nfunction compileTraversalRelation(\n projectId: string,\n input: CompiledAggregateSource,\n linkId: string,\n direction: \"outgoing\" | \"incoming\",\n sourceObjectTypeId: string | undefined,\n source: PgObjectQuerySource,\n correlated = false,\n endpointPredicate?: string\n): CompiledAggregateSource {\n const incoming = direction === \"incoming\"\n const parent = incoming ? \"target\" : \"source\"\n const endpoint = incoming ? \"source\" : \"target\"\n const constrainedType = incoming ? sourceObjectTypeId : undefined\n return {\n sql: `FROM ${source.objectsTable} AS selected\n WHERE selected.project_id = ?\n ${constrainedType === undefined ? \"\" : \"AND selected.object_type_id = ?\"}\n ${endpointPredicate ? `AND (${endpointPredicate})` : \"\"}\n AND EXISTS (\n SELECT 1 FROM (${input.sql}) AS input\n JOIN ${source.linksTable} AS edge\n ON edge.project_id = input.project_id\n AND edge.${parent}_type_id = input.object_type_id\n AND edge.${parent}_id = input.primary_id\n WHERE edge.project_id = selected.project_id\n AND edge.${endpoint}_type_id = selected.object_type_id\n AND edge.${endpoint}_id = selected.primary_id\n AND edge.link_id = ?\n ${correlated ? \"OFFSET 0\" : \"\"}\n )`,\n args: [\n projectId,\n ...(constrainedType === undefined ? [] : [constrainedType]),\n ...input.args,\n linkId,\n ],\n }\n}\n\n/** Only a bounded page benefits from choosing an ordered, correlated endpoint scan. */\nfunction boundedTraversal(\n query: ObjectQuery,\n bounded = false\n): Extract<ObjectQuery, { kind: \"traverse\" }> | undefined {\n switch (query.kind) {\n case \"page\":\n case \"limit\":\n return boundedTraversal(query.input, true)\n case \"sort\":\n case \"filter\":\n case \"text\":\n case \"project\":\n case \"expand\":\n return boundedTraversal(query.input, bounded)\n case \"traverse\":\n return bounded ? query : undefined\n default:\n return undefined\n }\n}\n\nfunction compileTraversalProbe(\n projectId: string,\n traversal: Extract<ObjectQuery, { kind: \"traverse\" }>,\n source: PgObjectQuerySource\n): { sql: string; args: unknown[]; limit: number } {\n const input = compileAggregateSource(projectId, traversal.input, source)\n const parent = traversal.direction === \"incoming\" ? \"target\" : \"source\"\n const limit = 1000\n const statement = compilePgObjectStatement(\n `SELECT 1 FROM (${input.sql}) AS input\n JOIN ${source.linksTable} AS edge ON edge.project_id = input.project_id\n AND edge.${parent}_type_id = input.object_type_id AND edge.${parent}_id = input.primary_id\n WHERE edge.link_id = ? ${traversal.direction === \"incoming\" && traversal.sourceObjectTypeId ? \"AND edge.source_type_id = ?\" : \"\"}\n LIMIT ?`,\n [\n ...input.args,\n traversal.linkId,\n ...(traversal.direction === \"incoming\" && traversal.sourceObjectTypeId\n ? [traversal.sourceObjectTypeId]\n : []),\n limit + 1,\n ],\n source\n )\n return { ...statement, limit }\n}\n\n/** Correlation handle for an expansion: the parent row's identity columns. */\ninterface ExpansionParent {\n project: string\n type: string\n id: string\n}\n\n// `expand` attaches linked objects to each result row without changing which\n// objects match (unlike `traverse`, which pivots to the targets). Each expansion\n// becomes a correlated subquery that hydrates its links into a JSONB value, and\n// all expansions are folded into one `_expand` object column the row mapper reads\n// back. The input set is otherwise untouched, so pagination/order pass through.\nfunction compileExpand(\n projectId: string,\n inputQuery: ObjectQuery,\n expansions: readonly ObjectExpansion[],\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, exactContext(ctx))\n const expand = compileExpansionsObject(\n expansions,\n { project: \"input.project_id\", type: \"input.object_type_id\", id: \"input.primary_id\" },\n \"\",\n ctx\n )\n const inputOrder = compileOrder(input.order.fields, \"input\", \"input._cursor_properties\")\n const sql = `\n SELECT input.*, ${expand.sql} AS _expand\n FROM (${input.sql}) AS input\n ORDER BY ${inputOrder.sql}\n `\n\n return {\n sql,\n args: [...expand.args, ...input.args, ...inputOrder.args],\n totalSql: input.totalSql,\n totalArgs: input.totalArgs,\n vectorProbe: input.vectorProbe,\n order: input.order,\n hasMoreProbe: input.hasMoreProbe,\n hasMore: input.hasMore,\n trimRows: input.trimRows,\n nextPageToken: input.nextPageToken,\n }\n}\n\n// `jsonb_build_object(linkId, value, ...)` over a set of expansions sharing one\n// parent. Link ids are user data, so they ride as parameters. Used both for the\n// outer `_expand` column and for each child's nested `links`.\nfunction compileExpansionsObject(\n expansions: readonly ObjectExpansion[],\n parent: ExpansionParent,\n pathPrefix: string,\n ctx: CompileContext\n): CompiledPredicate {\n const parts: string[] = []\n const args: unknown[] = []\n expansions.forEach((expansion, index) => {\n const path = pathPrefix === \"\" ? `${index}` : `${pathPrefix}_${index}`\n const value = compileExpansionValue(expansion, parent, path, ctx)\n parts.push(\"?::text\", value.sql)\n args.push(expansion.linkId, ...value.args)\n })\n return { sql: `jsonb_build_object(${parts.join(\", \")})`, args }\n}\n\n// One expansion's hydrated value. `row_number()` numbers a parent's links by the\n// order from `compileExpansionOrder` (the expansion's `orderBy` against the target\n// object's properties, then an identity tiebreak); `WHERE _ord <= N` keeps the\n// top-N per parent in-DB; each retained neighbour becomes a JSONB object; and the\n// value is an ordered array (\"many\") or the first element or null (\"one\"). The\n// cardinality is core-resolved before pushdown.\nfunction compileExpansionValue(\n expansion: ObjectExpansion,\n parent: ExpansionParent,\n path: string,\n ctx: CompileContext\n): CompiledPredicate {\n const edge = `edge_${path}`\n const target = `tgt_${path}`\n const ranked = `ranked_${path}`\n const incoming = expansion.direction === \"incoming\"\n // The hydrated neighbour is the link target (outgoing) or source (incoming);\n // the parent sits on the opposite end, mirroring `compileTraversal`.\n const neighborType = incoming ? `${edge}.source_type_id` : `${edge}.target_type_id`\n const neighborId = incoming ? `${edge}.source_id` : `${edge}.target_id`\n const parentType = incoming ? `${edge}.target_type_id` : `${edge}.source_type_id`\n const parentId = incoming ? `${edge}.target_id` : `${edge}.source_id`\n\n const child = compileExpansionChildJson(expansion, edge, target, path, ctx)\n const order = compileExpansionOrder(expansion, target, neighborType, neighborId)\n\n const whereParts = [\n `${edge}.project_id = ${parent.project}`,\n `${parentType} = ${parent.type}`,\n `${parentId} = ${parent.id}`,\n `${edge}.link_id = ?::text`,\n ]\n const whereArgs: unknown[] = [expansion.linkId]\n if (incoming && expansion.sourceObjectTypeId !== undefined) {\n whereParts.push(`${edge}.source_type_id = ?::text`)\n whereArgs.push(expansion.sourceObjectTypeId)\n }\n\n const inner = `\n SELECT ${child.sql} AS elem, row_number() OVER (ORDER BY ${order.sql}) AS _ord\n FROM ${ctx.source.linksTable} AS ${edge}\n JOIN ${ctx.source.objectsTable} AS ${target}\n ON ${target}.project_id = ${edge}.project_id\n AND ${target}.object_type_id = ${neighborType}\n AND ${target}.primary_id = ${neighborId}\n WHERE ${whereParts.join(\" AND \")}\n `\n const innerArgs = [...child.args, ...order.args, ...whereArgs]\n\n if (expansion.cardinality === \"one\") {\n return {\n sql: `(SELECT ${ranked}.elem FROM (${inner}) AS ${ranked} WHERE ${ranked}._ord = 1)`,\n args: innerArgs,\n }\n }\n\n // The fanout cap is baked into `limit` by the core executor before pushdown.\n const limit = expansion.limit ?? DEFAULT_EXPANSION_FANOUT\n return {\n sql: `COALESCE((SELECT jsonb_agg(${ranked}.elem ORDER BY ${ranked}._ord) FROM (${inner}) AS ${ranked} WHERE ${ranked}._ord <= ?), '[]'::jsonb)`,\n args: [...innerArgs, limit],\n }\n}\n\n// Build one hydrated neighbour as an `ExpandedObjectRow`-shaped JSONB object.\n// `linkProperties` always rides along (the mapper drops it when empty), and\n// nested expansions recurse under `links`, correlated on this neighbour.\nfunction compileExpansionChildJson(\n expansion: ObjectExpansion,\n edge: string,\n target: string,\n path: string,\n ctx: CompileContext\n): CompiledPredicate {\n const fields = [\n `'projectId', ${target}.project_id`,\n `'objectTypeId', ${target}.object_type_id`,\n `'primaryId', ${target}.primary_id`,\n `'properties', ${target}.properties`,\n `'createdAt', ${target}.created_at`,\n `'updatedAt', ${target}.updated_at`,\n `'version', ${target}.version`,\n `'lastCommitId', ${target}.last_commit_id`,\n `'linkProperties', ${edge}.properties`,\n ]\n const args: unknown[] = []\n\n if (expansion.expand && expansion.expand.length > 0) {\n const nested = compileExpansionsObject(\n expansion.expand,\n {\n project: `${target}.project_id`,\n type: `${target}.object_type_id`,\n id: `${target}.primary_id`,\n },\n path,\n ctx\n )\n fields.push(`'links', ${nested.sql}`)\n args.push(...nested.args)\n }\n\n return { sql: `jsonb_build_object(${fields.join(\", \")})`, args }\n}\n\n// Order a parent's links the way the fallback's per-parent trim does: each\n// property sorts nulls last with the requested direction (against the neighbour's\n// JSONB properties), then a deterministic identity tiebreak on the neighbour.\nfunction compileExpansionOrder(\n expansion: ObjectExpansion,\n target: string,\n neighborType: string,\n neighborId: string\n): CompiledPredicate {\n const propertyColumn = `${target}.properties`\n const clauses: string[] = []\n const args: unknown[] = []\n\n for (const field of expansion.orderBy ?? []) {\n // Relevance is a no-op in the fallback comparator; mirror that by skipping it.\n if (field.kind !== \"property\") continue\n const direction = field.direction === \"desc\" ? \"DESC\" : \"ASC\"\n clauses.push(\n `CASE WHEN ${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null' THEN 1 ELSE 0 END ASC`,\n `${\n field.scalarKind === \"decimal\"\n ? `(${jsonTextExpression(propertyColumn)})::numeric`\n : `NULLIF(${jsonValueExpression(propertyColumn)}, 'null'::jsonb)`\n } ${direction}`\n )\n args.push(field.propertyId, field.propertyId, field.propertyId)\n }\n\n clauses.push(`${neighborType} ASC`, `${neighborId} ASC`)\n return { sql: clauses.join(\", \"), args }\n}\n\nfunction compileSet(\n projectId: string,\n op: ObjectQuerySetOperation,\n inputs: readonly ObjectQuery[],\n ctx: CompileContext\n): CompiledPgObjectQuery {\n if (inputs.length === 0) {\n const order = compileOrder(identityOrderFields())\n return {\n sql: `\n SELECT *, properties AS _cursor_properties\n FROM ${ctx.source.objectsTable}\n WHERE 1 = 0\n ORDER BY ${order.sql}\n `,\n args: order.args,\n totalSql: \"SELECT 0::bigint AS total\",\n totalArgs: [],\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n }\n\n const compiledInputs = inputs.map((input) =>\n compileObjectQueryInternal(projectId, input, exactContext(ctx))\n )\n const identities = compileSetIdentities(op, compiledInputs)\n const order = compileOrder(identityOrderFields())\n const selectedOrder = compileOrder(identityOrderFields(), \"selected\")\n const sql = `\n SELECT selected.*, selected.properties AS _cursor_properties\n FROM (${identities.sql}) AS ids\n JOIN ${ctx.source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = ids.object_type_id\n AND selected.primary_id = ids.primary_id\n ORDER BY ${selectedOrder.sql}\n `\n\n return {\n sql,\n args: [...identities.args, projectId, ...selectedOrder.args],\n totalSql: `SELECT COUNT(*)::bigint AS total FROM (${identities.sql}) AS ids`,\n totalArgs: identities.args,\n order,\n hasMore: () => false,\n trimRows: identityRows,\n nextPageToken: () => undefined,\n }\n}\n\nfunction compileProject(\n projectId: string,\n inputQuery: ObjectQuery,\n properties: readonly string[] | undefined,\n ctx: CompileContext\n): CompiledPgObjectQuery {\n const input = compileObjectQueryInternal(projectId, inputQuery, ctx)\n if (!properties) return input\n\n const projection = compileProjectionExpression(properties)\n const inputOrder = compileOrder(input.order.fields, \"input\", \"input._cursor_properties\")\n const outputOrder = compileOrder(input.order.fields, undefined, \"_cursor_properties\")\n\n return {\n sql: `\n SELECT\n input.project_id,\n input.object_type_id,\n input.primary_id,\n ${projection.sql} AS properties,\n input._cursor_properties AS _cursor_properties,\n input.created_at,\n input.updated_at,\n input.version,\n input.last_commit_id${input.vectorProbe ? \", input._vector_score\" : \"\"}\n FROM (${input.sql}) AS input\n ORDER BY ${inputOrder.sql}\n `,\n args: [...projection.args, ...input.args, ...inputOrder.args],\n totalSql: input.totalSql,\n totalArgs: input.totalArgs,\n vectorProbe: input.vectorProbe,\n order: outputOrder,\n hasMoreProbe: input.hasMoreProbe,\n hasMore: input.hasMore,\n trimRows: input.trimRows,\n nextPageToken: input.nextPageToken,\n }\n}\n\nfunction compileAggregateSource(\n projectId: string,\n query: ObjectQuery,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n switch (query.kind) {\n case \"rerank\":\n throw new ObjectQueryExecutionError(\n \"reranking_requires_runtime\",\n \"Reranking must execute in the model runtime, not storage.\"\n )\n case \"start\":\n return compileAggregateStart(projectId, query, source)\n case \"refs\":\n return compileAggregateRefs(projectId, query, source)\n case \"filter\":\n return compileAggregateWhere(\n projectId,\n query.input,\n compilePredicate(query.predicate),\n source\n )\n case \"text\": {\n return compileAggregateWhere(\n projectId,\n query.input,\n compileTextSearchPredicate(query.query, query.fields, query.fieldsByObjectType),\n source\n )\n }\n case \"traverse\":\n return compileAggregateTraversal(\n projectId,\n query.input,\n query.linkId,\n query.direction,\n query.sourceObjectTypeId,\n source\n )\n case \"set\":\n return compileAggregateSet(projectId, query.op, query.inputs, source)\n case \"sort\":\n case \"project\":\n // `expand` is output-shaping, like sort/project: aggregates ignore it.\n case \"expand\":\n return compileAggregateSource(projectId, query.input, source)\n case \"limit\":\n case \"page\":\n return compileRowQueryAggregateSource(projectId, query, source)\n case \"vector\":\n return compileRowQueryAggregateSource(projectId, query, source)\n }\n}\n\nfunction compileAggregateStart(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"start\" }>,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n if (query.includeSubtypes === true) {\n throw new Error(\"[SixbPg] PostgreSQL object storage does not support start.includeSubtypes\")\n }\n\n return {\n sql: `\n SELECT project_id, object_type_id, primary_id, properties\n FROM ${source.objectsTable}\n WHERE project_id = ? AND object_type_id = ?\n `,\n args: [projectId, query.objectTypeId],\n }\n}\n\nfunction compileAggregateRefs(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"refs\" }>,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n if (query.refs.length === 0) {\n throw new Error(\"[SixbPg] PostgreSQL object storage requires at least one ref\")\n }\n\n // Keep a concrete type visible to PostgreSQL even when identities arrive as JSON.\n // Relationship joins can then use partial incoming-link indexes for that type.\n const objectTypeId = query.refs[0]!.objectTypeId\n const uniformType = query.refs.every((ref) => ref.objectTypeId === objectTypeId)\n const typePredicate = uniformType ? \"AND selected.object_type_id = ?\" : \"\"\n const typeArgs = uniformType ? [objectTypeId] : []\n\n return {\n sql: `\n SELECT selected.project_id, selected.object_type_id, selected.primary_id, selected.properties\n FROM (\n SELECT DISTINCT\n ref.value ->> 'objectTypeId' AS object_type_id,\n ref.value ->> 'primaryId' AS primary_id\n FROM jsonb_array_elements(?::text::jsonb) AS ref(value)\n ) AS requested\n JOIN ${source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = requested.object_type_id\n AND selected.primary_id = requested.primary_id\n ${typePredicate}\n `,\n args: [JSON.stringify(query.refs), projectId, ...typeArgs],\n }\n}\n\nfunction compileAggregateWhere(\n projectId: string,\n inputQuery: ObjectQuery,\n predicate: CompiledPredicate,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n const input = compileAggregateSource(projectId, inputQuery, source)\n return {\n sql: `\n SELECT input.project_id, input.object_type_id, input.primary_id, input.properties\n FROM (${input.sql}) AS input\n WHERE ${predicate.sql}\n `,\n args: [...input.args, ...predicate.args],\n }\n}\n\nfunction compileAggregateTraversal(\n projectId: string,\n inputQuery: ObjectQuery,\n linkId: string,\n direction: \"outgoing\" | \"incoming\",\n sourceObjectTypeId: string | undefined,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n const input = compileAggregateSource(projectId, inputQuery, source)\n if (direction === \"incoming\" && sourceObjectTypeId !== undefined) {\n // Deduplicate endpoint identities before fetching objects. Bounded arrays let PostgreSQL\n // visit primary keys in groups instead of doing one random B-tree descent per edge.\n // Each array contains at most 1024 IDs; larger traversals can spill their sort/group work.\n return {\n sql: `SELECT selected.project_id, selected.object_type_id, selected.primary_id, selected.properties\n FROM (\n SELECT array_agg(primary_id) AS ids FROM (\n SELECT primary_id, (row_number() OVER (ORDER BY primary_id) - 1) / 1024 AS batch\n FROM (\n SELECT DISTINCT edge.source_id AS primary_id\n FROM (${input.sql}) AS input\n JOIN ${source.linksTable} AS edge ON edge.project_id = input.project_id\n AND edge.target_type_id = input.object_type_id AND edge.target_id = input.primary_id\n WHERE edge.link_id = ? AND edge.source_type_id = ?\n ) AS endpoints\n ) AS numbered GROUP BY batch\n ) AS batches\n JOIN ${source.objectsTable} AS selected ON selected.project_id = ?\n AND selected.object_type_id = ? AND selected.primary_id = ANY(batches.ids)`,\n args: [...input.args, linkId, sourceObjectTypeId, projectId, sourceObjectTypeId],\n }\n }\n const relation = compileTraversalRelation(\n projectId,\n input,\n linkId,\n direction,\n sourceObjectTypeId,\n source\n )\n return {\n sql: `SELECT selected.project_id, selected.object_type_id, selected.primary_id, selected.properties ${relation.sql}`,\n args: relation.args,\n }\n}\n\nfunction compileAggregateSet(\n projectId: string,\n op: ObjectQuerySetOperation,\n inputs: readonly ObjectQuery[],\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n if (inputs.length === 0) {\n return {\n sql: `\n SELECT project_id, object_type_id, primary_id, properties\n FROM ${source.objectsTable}\n WHERE 1 = 0\n `,\n args: [],\n }\n }\n\n const compiledInputs = inputs.map((input) => compileAggregateSource(projectId, input, source))\n const identities = compileSetIdentities(op, compiledInputs)\n return {\n sql: `\n SELECT selected.project_id, selected.object_type_id, selected.primary_id, selected.properties\n FROM (${identities.sql}) AS ids\n JOIN ${source.objectsTable} AS selected\n ON selected.project_id = ?\n AND selected.object_type_id = ids.object_type_id\n AND selected.primary_id = ids.primary_id\n `,\n args: [...identities.args, projectId],\n }\n}\n\nfunction compileRowQueryAggregateSource(\n projectId: string,\n query: ObjectQuery,\n source: PgObjectQuerySource\n): CompiledAggregateSource {\n const rowQuery = compileObjectQueryInternal(projectId, query, {\n probeLimit: false,\n source,\n })\n return {\n sql: `\n SELECT input.project_id, input.object_type_id, input.primary_id, input.properties\n FROM (${rowQuery.sql}) AS input\n `,\n args: rowQuery.args,\n }\n}\n\nfunction needsLimitProbe(query: ObjectQuery): boolean {\n switch (query.kind) {\n case \"limit\":\n return true\n case \"project\":\n case \"sort\":\n return needsLimitProbe(query.input)\n default:\n return false\n }\n}\n\nfunction hasMoreProbeFor(compiled: CompiledPgObjectQuery): CompiledHasMoreProbe {\n return (\n compiled.hasMoreProbe ?? {\n sql: compiled.sql,\n args: compiled.args,\n hasMore: (rowCount) => compiled.hasMore(rowCount, undefined),\n }\n )\n}\n\nfunction compileSetIdentities(\n op: ObjectQuerySetOperation,\n inputs: readonly { sql: string; args: readonly unknown[] }[]\n): CompiledPredicate {\n const operator = op === \"union\" ? \"UNION\" : op === \"intersect\" ? \"INTERSECT\" : \"EXCEPT\"\n const identitySqls = inputs.map(\n (input) => `SELECT object_type_id, primary_id FROM (${input.sql}) AS input`\n )\n\n return {\n sql: identitySqls.join(` ${operator} `),\n args: inputs.flatMap((input) => input.args),\n }\n}\n\nfunction compileProjectionExpression(properties: readonly string[]): CompiledPredicate {\n if (properties.length === 0) return { sql: \"'{}'::jsonb\", args: [] }\n\n return {\n sql: `\n COALESCE(\n (\n SELECT jsonb_object_agg(projected.key, projected.value)\n FROM jsonb_each(input.properties) AS projected(key, value)\n WHERE projected.key IN (${properties.map(() => \"?::text\").join(\", \")})\n ),\n '{}'::jsonb\n )\n `,\n args: [...properties],\n }\n}\n\nfunction compilePredicate(predicate: ObjectQueryPredicate): CompiledPredicate {\n switch (predicate.op) {\n case \"and\":\n case \"or\": {\n const items = predicate.items.map(compilePredicate)\n const joiner = predicate.op === \"and\" ? \" AND \" : \" OR \"\n return {\n sql: `(${items.map((item) => item.sql).join(joiner)})`,\n args: items.flatMap((item) => item.args),\n }\n }\n case \"not\": {\n const item = compilePredicate(predicate.item)\n return negatePredicate(item)\n }\n case \"eq\":\n return predicate.scalarKind === \"decimal\"\n ? compileDecimalEqualityPredicate(predicate.propertyId, \"eq\", predicate.value)\n : compileEqualityPredicate(predicate.propertyId, \"eq\", predicate.value)\n case \"neq\":\n return predicate.scalarKind === \"decimal\"\n ? compileDecimalEqualityPredicate(predicate.propertyId, \"neq\", predicate.value)\n : compileEqualityPredicate(predicate.propertyId, \"neq\", predicate.value)\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n const op = sqlComparisonOperator(predicate.op)\n if (predicate.scalarKind === \"decimal\") {\n return {\n sql: `(${jsonTypeExpression()} = 'string' AND (${jsonTextExpression()})::numeric ${op} ?::numeric)`,\n args: [predicate.propertyId, predicate.propertyId, predicate.value],\n }\n }\n return {\n sql: `${jsonValueExpression()} ${op} ?::text::jsonb`,\n args: [predicate.propertyId, jsonbValue(predicate.value)],\n }\n }\n case \"in\":\n return predicate.scalarKind === \"decimal\"\n ? compileDecimalInPredicate(predicate.propertyId, predicate.values)\n : compileInPredicate(predicate.propertyId, predicate.values)\n case \"exists\": {\n const sql = `jsonb_exists(properties, ?::text)`\n const item: CompiledPredicate = { sql, args: [predicate.propertyId] }\n return predicate.value ? item : negatePredicate(item)\n }\n case \"contains\":\n return compileContainsPredicate(predicate.propertyId, predicate.value)\n }\n}\n\nfunction compileDecimalEqualityPredicate(\n propertyId: string,\n op: \"eq\" | \"neq\",\n value: unknown\n): CompiledPredicate {\n if (value === null) {\n const sql = `${jsonTypeExpression()} = 'null'`\n const item: CompiledPredicate = { sql, args: [propertyId] }\n return op === \"eq\" ? item : negatePredicate(item)\n }\n\n if (op === \"eq\") {\n return {\n sql: `(${jsonTypeExpression()} = 'string' AND (${jsonTextExpression()})::numeric = ?::numeric)`,\n args: [propertyId, propertyId, value],\n }\n }\n\n return {\n sql: `(${jsonTypeExpression()} IS NULL OR ${jsonTypeExpression()} = 'null' OR ${jsonTypeExpression()} <> 'string' OR (${jsonTextExpression()})::numeric <> ?::numeric)`,\n args: [propertyId, propertyId, propertyId, propertyId, value],\n }\n}\n\nfunction compileDecimalInPredicate(\n propertyId: string,\n values: readonly unknown[]\n): CompiledPredicate {\n if (values.length === 0) return { sql: \"0 = 1\", args: [] }\n const nonNullValues = values.filter((value) => value !== null)\n const clauses: string[] = []\n const args: unknown[] = []\n\n if (nonNullValues.length !== values.length) {\n clauses.push(`${jsonTypeExpression()} = 'null'`)\n args.push(propertyId)\n }\n\n if (nonNullValues.length > 0) {\n clauses.push(\n `(${jsonTypeExpression()} = 'string' AND (${jsonTextExpression()})::numeric IN (${nonNullValues\n .map(() => \"?::numeric\")\n .join(\", \")}))`\n )\n args.push(propertyId, propertyId, ...nonNullValues)\n }\n\n return {\n sql: `(${clauses.join(\" OR \")})`,\n args,\n }\n}\n\nfunction negatePredicate(predicate: CompiledPredicate): CompiledPredicate {\n return {\n sql: `(NOT COALESCE((${predicate.sql}), false))`,\n args: predicate.args,\n }\n}\n\nfunction compileEqualityPredicate(\n propertyId: string,\n op: \"eq\" | \"neq\",\n value: unknown\n): CompiledPredicate {\n if (value === null) {\n const sql = `${jsonTypeExpression()} = 'null'`\n const item: CompiledPredicate = { sql, args: [propertyId] }\n return op === \"eq\" ? item : negatePredicate(item)\n }\n\n if (typeof value === \"string\") {\n if (op === \"eq\") {\n return {\n sql: `(${jsonTypeExpression()} = 'string' AND ${jsonTextExpression()} = ?::text AND md5(${jsonTextExpression()}) = md5(?::text))`,\n args: [propertyId, propertyId, value, propertyId, value],\n }\n }\n\n return {\n sql: `(${jsonTypeExpression()} IS NULL OR ${jsonTypeExpression()} = 'null' OR ${jsonTypeExpression()} <> 'string' OR ${jsonTextExpression()} <> ?::text)`,\n args: [propertyId, propertyId, propertyId, propertyId, value],\n }\n }\n\n if (op === \"eq\") {\n return {\n sql: `${jsonValueExpression()} = ?::text::jsonb`,\n args: [propertyId, jsonbValue(value)],\n }\n }\n\n return {\n sql: `(${jsonTypeExpression()} IS NULL OR ${jsonTypeExpression()} = 'null' OR ${jsonValueExpression()} <> ?::text::jsonb)`,\n args: [propertyId, propertyId, propertyId, jsonbValue(value)],\n }\n}\n\nfunction compileInPredicate(propertyId: string, values: readonly unknown[]): CompiledPredicate {\n if (values.length === 0) return { sql: \"0 = 1\", args: [] }\n\n const nonNullValues = values.filter((value) => value !== null)\n const stringValues = nonNullValues.filter((value): value is string => typeof value === \"string\")\n const jsonbValues = nonNullValues.filter((value) => typeof value !== \"string\")\n const clauses: string[] = []\n const args: unknown[] = []\n\n if (values.length !== nonNullValues.length) {\n clauses.push(`${jsonTypeExpression()} = 'null'`)\n args.push(propertyId)\n }\n\n if (stringValues.length > 0) {\n clauses.push(\n `(${jsonTypeExpression()} = 'string' AND ${jsonTextExpression()} IN (${stringValues\n .map(() => \"?::text\")\n .join(\n \", \"\n )}) AND md5(${jsonTextExpression()}) IN (${stringValues.map(() => \"md5(?::text)\").join(\", \")}))`\n )\n args.push(propertyId, propertyId, ...stringValues, propertyId, ...stringValues)\n }\n\n if (jsonbValues.length > 0) {\n clauses.push(\n `${jsonValueExpression()} IN (${jsonbValues.map(() => \"?::text::jsonb\").join(\", \")})`\n )\n args.push(propertyId, ...jsonbValues.map(jsonbValue))\n }\n\n return {\n sql: `(${clauses.join(\" OR \")})`,\n args,\n }\n}\n\nfunction compileContainsPredicate(propertyId: string, value: unknown): CompiledPredicate {\n const clauses: string[] = []\n const args: unknown[] = []\n\n if (typeof value === \"string\") {\n clauses.push(\n `(${jsonTypeExpression()} = 'string' AND position(?::text in ${jsonTextExpression()}) > 0)`\n )\n args.push(propertyId, value, propertyId)\n }\n\n clauses.push(\n `(${jsonTypeExpression()} = 'array' AND ${jsonValueExpression()} @> jsonb_build_array(?::text::jsonb))`\n )\n args.push(propertyId, propertyId, jsonbValue(value))\n\n if (typeof value === \"string\") {\n clauses.push(\n `(${jsonTypeExpression()} = 'object' AND jsonb_exists(${jsonValueExpression()}, ?::text))`\n )\n args.push(propertyId, propertyId, value)\n }\n\n return { sql: `(${clauses.join(\" OR \")})`, args }\n}\n\nfunction compileTextPredicate(query: string, fields: readonly string[]): CompiledPredicate {\n const terms = tokenize(query)\n if (terms.length === 0) return { sql: \"0 = 1\", args: [] }\n\n const clauses = terms.map(() => {\n const fieldClauses = fields.map(\n () => `lower(coalesce(${jsonTextExpression()}, '')) LIKE ?::text`\n )\n return `(${fieldClauses.join(\" OR \")})`\n })\n const args = terms.flatMap((term) =>\n fields.flatMap((field) => [field, `%${term.replace(/[\\\\%_]/g, \"\\\\$&\")}%`])\n )\n\n return { sql: `(${clauses.join(\" AND \")})`, args }\n}\n\nfunction compileTextSearchPredicate(\n query: string,\n fields: readonly string[] | undefined,\n fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined\n): CompiledPredicate {\n const predicate =\n fields && fields.length > 0\n ? compileTextPredicate(query, fields)\n : compileScopedTextPredicate(query, fieldsByObjectType)\n\n if (!predicate) {\n throw new Error(\n \"[SixbPg] PostgreSQL object text search requires fields or resolved text defaults\"\n )\n }\n\n return predicate\n}\n\nfunction compileScopedTextPredicate(\n query: string,\n fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined\n): CompiledPredicate | null {\n const scopedPredicates: CompiledPredicate[] = []\n\n for (const [objectTypeId, fields] of Object.entries(fieldsByObjectType ?? {})) {\n if (fields.length === 0) continue\n const predicate = compileTextPredicate(query, fields)\n scopedPredicates.push({\n sql: `(object_type_id = ? AND ${predicate.sql})`,\n args: [objectTypeId, ...predicate.args],\n })\n }\n\n if (scopedPredicates.length === 0) return null\n\n return {\n sql: `(${scopedPredicates.map((predicate) => predicate.sql).join(\" OR \")})`,\n args: scopedPredicates.flatMap((predicate) => predicate.args),\n }\n}\n\nfunction compileOrder(\n fields: readonly CompiledOrderField[],\n qualifier?: string,\n propertyColumn = \"properties\"\n): CompiledOrder {\n const clauses: string[] = []\n const args: unknown[] = []\n\n for (const field of fields) {\n if (field.kind === \"column\") {\n clauses.push(\n `${columnExpression(field.column, qualifier)}${field.binary ? ' COLLATE \"C\"' : \"\"} ${field.direction.toUpperCase()}`\n )\n continue\n }\n\n const direction = field.direction === \"desc\" ? \"DESC\" : \"ASC\"\n clauses.push(\n `CASE WHEN ${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null' THEN 1 ELSE 0 END ASC`,\n `${compiledPropertyValueExpression(field, propertyColumn)} ${direction}`\n )\n args.push(field.propertyId, field.propertyId, field.propertyId)\n }\n\n return { sql: clauses.join(\", \"), args, fields, propertyColumn }\n}\n\nfunction sortOrderFields(fields: readonly ObjectQuerySortField[]): readonly CompiledOrderField[] {\n const orderFields: CompiledOrderField[] = []\n for (const field of fields) {\n if (field.kind !== \"property\") {\n throw new Error(\"[SixbPg] PostgreSQL object storage does not support relevance sorting\")\n }\n\n orderFields.push({\n kind: \"property\",\n propertyId: field.propertyId,\n direction: field.direction === \"desc\" ? \"desc\" : \"asc\",\n scalarKind: field.scalarKind,\n })\n }\n orderFields.push(...identityOrderFields())\n return orderFields\n}\n\nfunction identityOrderFields(): readonly CompiledOrderField[] {\n return [\n { kind: \"column\", column: \"object_type_id\", direction: \"asc\" },\n { kind: \"column\", column: \"primary_id\", direction: \"asc\" },\n ]\n}\n\n/** Bound each disjoint cursor range before merging: OR would scan all preceding index entries. */\nfunction compileKeysetRanges(\n fields: readonly CompiledOrderField[],\n cursor: readonly EncodedCursorValue[],\n propertyColumn: string\n): CompiledPredicate[] {\n const ranges: CompiledPredicate[] = []\n const prefix: CompiledPredicate[] = []\n const addRange = (advance: CompiledPredicate) => {\n const parts = [...prefix, advance]\n ranges.push({\n sql: parts.map((part) => `(${part.sql})`).join(\" AND \"),\n args: parts.flatMap((part) => part.args),\n })\n }\n fields.forEach((field, index) => {\n const value = cursor[index]\n if (field.kind === \"column\") {\n const after = compileFieldAfter(field, value, propertyColumn)\n if (after) addRange(after)\n prefix.push(compileFieldEquality(field, value, propertyColumn))\n return\n }\n const rank = `CASE WHEN ${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null' THEN 1 ELSE 0 END`\n if (!value.nullish) addRange({ sql: `${rank} = 1`, args: [field.propertyId, field.propertyId] })\n prefix.push({\n sql: `${rank} = ${value.nullish ? 1 : 0}`,\n args: [field.propertyId, field.propertyId],\n })\n if (value.nullish) return\n const expression = compiledPropertyValueExpression(field, propertyColumn)\n const parameter = field.scalarKind === \"decimal\" ? \"?::numeric\" : \"?::text::jsonb\"\n const args = [\n field.propertyId,\n field.scalarKind === \"decimal\" ? value.value : jsonbValue(value.value),\n ]\n addRange({ sql: `${expression} ${field.direction === \"desc\" ? \"<\" : \">\"} ${parameter}`, args })\n prefix.push({ sql: `${expression} = ${parameter}`, args })\n })\n return ranges\n}\n\nfunction isIndexPageInput(query: ObjectQuery): boolean {\n switch (query.kind) {\n case \"start\":\n return true\n case \"filter\":\n case \"text\":\n case \"sort\":\n case \"traverse\":\n return isIndexPageInput(query.input)\n default:\n return false\n }\n}\n\nfunction compileKeysetPredicate(\n fields: readonly CompiledOrderField[],\n cursor: readonly EncodedCursorValue[],\n propertyColumn = \"properties\"\n): CompiledPredicate {\n const disjuncts: CompiledPredicate[] = []\n\n for (let index = 0; index < fields.length; index += 1) {\n const equalityPredicates = fields\n .slice(0, index)\n .map((field, equalityIndex) =>\n compileFieldEquality(field, cursor[equalityIndex], propertyColumn)\n )\n const advancePredicate = compileFieldAfter(fields[index], cursor[index], propertyColumn)\n if (!advancePredicate) continue\n\n const parts = [...equalityPredicates, advancePredicate]\n disjuncts.push({\n sql: `(${parts.map((part) => part.sql).join(\" AND \")})`,\n args: parts.flatMap((part) => part.args),\n })\n }\n\n if (disjuncts.length === 0) return { sql: \"0 = 1\", args: [] }\n\n return {\n sql: `(${disjuncts.map((part) => part.sql).join(\" OR \")})`,\n args: disjuncts.flatMap((part) => part.args),\n }\n}\n\nfunction compileFieldEquality(\n field: CompiledOrderField,\n cursor: EncodedCursorValue,\n propertyColumn = \"properties\"\n): CompiledPredicate {\n if (field.kind === \"column\") {\n return {\n sql: `${columnExpression(field.column)} = ?`,\n args: [cursor.value],\n }\n }\n\n if (cursor.nullish) {\n return {\n sql: `(${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null')`,\n args: [field.propertyId, field.propertyId],\n }\n }\n\n return {\n sql: `(${jsonTypeExpression(propertyColumn)} IS NOT NULL AND ${jsonTypeExpression(propertyColumn)} != 'null' AND ${compiledPropertyValueExpression(field, propertyColumn)} = ${field.scalarKind === \"decimal\" ? \"?::numeric\" : \"?::text::jsonb\"})`,\n args: [\n field.propertyId,\n field.propertyId,\n field.propertyId,\n field.scalarKind === \"decimal\" ? cursor.value : jsonbValue(cursor.value),\n ],\n }\n}\n\nfunction compileFieldAfter(\n field: CompiledOrderField,\n cursor: EncodedCursorValue,\n propertyColumn = \"properties\"\n): CompiledPredicate | null {\n if (field.kind === \"column\") {\n return {\n sql: `${columnExpression(field.column)} ${field.direction === \"desc\" ? \"<\" : \">\"} ?`,\n args: [cursor.value],\n }\n }\n\n if (cursor.nullish) return null\n\n const rankSql = `CASE WHEN ${jsonTypeExpression(propertyColumn)} IS NULL OR ${jsonTypeExpression(propertyColumn)} = 'null' THEN 1 ELSE 0 END`\n const valueOperator = field.direction === \"desc\" ? \"<\" : \">\"\n\n return {\n sql: `(${rankSql} > 0 OR (${rankSql} = 0 AND ${compiledPropertyValueExpression(field, propertyColumn)} ${valueOperator} ${field.scalarKind === \"decimal\" ? \"?::numeric\" : \"?::text::jsonb\"}))`,\n args: [\n field.propertyId,\n field.propertyId,\n field.propertyId,\n field.propertyId,\n field.propertyId,\n field.scalarKind === \"decimal\" ? cursor.value : jsonbValue(cursor.value),\n ],\n }\n}\n\nfunction encodePageToken(row: PgObjectQueryPageRow, fields: readonly CompiledOrderField[]): string {\n const properties = objectProperties(row._cursor_properties ?? row.properties)\n const token: EncodedPageToken = {\n version: 1,\n order: fields.map(orderFieldKey),\n values: fields.map((field) => cursorValueForField(row, properties, field)),\n }\n return `${PAGE_TOKEN_PREFIX}${Buffer.from(JSON.stringify(token)).toString(\"base64url\")}`\n}\n\nfunction decodePageToken(\n token: string,\n fields: readonly CompiledOrderField[]\n): readonly EncodedCursorValue[] {\n if (!token.startsWith(PAGE_TOKEN_PREFIX)) {\n throwInvalidPageToken(\"Invalid PostgreSQL object query page token\")\n }\n\n const raw = token.slice(PAGE_TOKEN_PREFIX.length)\n let decoded: unknown\n try {\n decoded = JSON.parse(Buffer.from(raw, \"base64url\").toString(\"utf8\"))\n } catch {\n throwInvalidPageToken(\"Invalid PostgreSQL object query page token\")\n }\n\n if (!isEncodedPageToken(decoded)) {\n throwInvalidPageToken(\"Invalid PostgreSQL object query page token\")\n }\n\n const expectedOrder = fields.map(orderFieldKey)\n if (\n decoded.order.length !== expectedOrder.length ||\n decoded.order.some((field, index) => field !== expectedOrder[index])\n ) {\n throwInvalidPageToken(\"PostgreSQL object query page token does not match query order\")\n }\n\n return decoded.values\n}\n\nfunction throwInvalidPageToken(message: string): never {\n throw new ObjectQueryExecutionError(\"invalid_page_token\", message, \"$.pageToken\")\n}\n\nfunction isEncodedPageToken(value: unknown): value is EncodedPageToken {\n if (!isPlainObject(value)) return false\n if (value.version !== 1) return false\n if (!Array.isArray(value.order) || value.order.some((item) => typeof item !== \"string\")) {\n return false\n }\n if (!Array.isArray(value.values)) return false\n return value.values.every(\n (item) =>\n isPlainObject(item) &&\n typeof item.nullish === \"boolean\" &&\n (item.nullish || Object.hasOwn(item, \"value\"))\n )\n}\n\nfunction cursorValueForField(\n row: PgObjectQueryPageRow,\n properties: Record<string, unknown>,\n field: CompiledOrderField\n): EncodedCursorValue {\n const value =\n field.kind === \"column\"\n ? field.column === \"object_type_id\"\n ? row.object_type_id\n : row.primary_id\n : properties[field.propertyId]\n\n return value === null || value === undefined ? { nullish: true } : { nullish: false, value }\n}\n\nfunction orderFieldKey(field: CompiledOrderField): string {\n return field.kind === \"column\"\n ? `column:${field.column}:${field.direction}`\n : `property:${field.propertyId}:${field.scalarKind ?? \"json\"}:${field.direction}`\n}\n\nfunction compiledPropertyValueExpression(\n field: Extract<CompiledOrderField, { kind: \"property\" }>,\n propertyColumn = \"properties\"\n): string {\n return field.scalarKind === \"decimal\"\n ? `(${jsonTextExpression(propertyColumn)})::numeric`\n : `NULLIF(${jsonValueExpression(propertyColumn)}, 'null'::jsonb)`\n}\n\nfunction columnExpression(\n column: \"object_type_id\" | \"primary_id\" | \"_vector_score\",\n qualifier?: string\n): string {\n return qualifier ? `${qualifier}.${column}` : column\n}\n\nfunction jsonValueExpression(column = \"properties\"): string {\n return `${column} -> (?::text)`\n}\n\nfunction jsonTextExpression(column = \"properties\"): string {\n return `${column} ->> (?::text)`\n}\n\nfunction jsonTypeExpression(column = \"properties\"): string {\n return `jsonb_typeof(${jsonValueExpression(column)})`\n}\n\nfunction jsonbValue(value: unknown): string {\n if (value instanceof Date) return JSON.stringify(value.toISOString())\n const json = JSON.stringify(value)\n return json === undefined ? \"null\" : json\n}\n\nfunction tokenize(query: string): string[] {\n return query\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter((term) => term.length > 0)\n}\n\nfunction sqlComparisonOperator(op: \"lt\" | \"lte\" | \"gt\" | \"gte\"): \"<\" | \"<=\" | \">\" | \">=\" {\n switch (op) {\n case \"lt\":\n return \"<\"\n case \"lte\":\n return \"<=\"\n case \"gt\":\n return \">\"\n case \"gte\":\n return \">=\"\n }\n}\n\nfunction numberPlaceholders(sql: string): string {\n let index = 0\n return sql.replace(/\\?/g, () => `$${++index}`)\n}\n\nfunction numberCompiledQuery<T extends { sql: string; args: unknown[] }>(compiled: T): T {\n return {\n ...compiled,\n sql: numberPlaceholders(compiled.sql),\n }\n}\n\nfunction objectProperties(value: unknown): Record<string, unknown> {\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown\n return isPlainObject(parsed) ? parsed : {}\n }\n\n return isPlainObject(value) ? value : {}\n}\n\nfunction identityRows<T>(rows: readonly T[]): readonly T[] {\n return rows\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
34
+ "import { type ObjectQuery, ObjectQueryExecutionError } from \"@sixb/core\"\nimport { hasVectorProfile } from \"@sixb/core/internal/query\"\nimport type {\n CountObjectsInput,\n CountObjectsResult,\n ExistsObjectsInput,\n ExistsObjectsResult,\n FacetObjectsInput,\n FacetObjectsResult,\n LinkBatchKey,\n LinkDirection,\n ObjectBatchKey,\n ObjectLinkRow,\n ObjectReadStorage,\n ObjectRow,\n QueryObjectLinksInput,\n QueryObjectLinksResult,\n QueryObjectsInput,\n QueryObjectsResult,\n} from \"@sixb/core/storage\"\nimport { linkBatchKey, objectBatchKey } from \"@sixb/core/storage\"\nimport type { SQLClient, SqlParameter } from \"../pg-client\"\nimport type { PgAggregateAdmission } from \"./aggregate-admission\"\nimport {\n type CompiledPgObjectQuery,\n compilePgObjectCountQuery,\n compilePgObjectExistsQuery,\n compilePgObjectFacetsQuery,\n compilePgObjectQuery,\n compilePgObjectStatement,\n DEFAULT_OBJECT_QUERY_SOURCE,\n type PgObjectQuerySource,\n} from \"./query-compiler\"\nimport { findPgSortIndexBound } from \"./query-indexes\"\nimport type { PgSelectedObjectReadSource } from \"./read-scope\"\nimport {\n type FacetDatabaseRow,\n type LinkBatchDatabaseRow,\n type LinkDatabaseRow,\n linkIdentity,\n type ObjectBatchDatabaseRow,\n type ObjectDatabaseRow,\n type ObjectQueryDatabaseRow,\n type PropertyPermissionBatchDatabaseRow,\n queryRowToObject,\n rowToLink,\n rowToObject,\n} from \"./rows\"\nimport { compilePgIndexedTextCount, compilePgIndexedTextFacets } from \"./text-count-index\"\n\n/** Execute object and link reads, using prepared access paths when the query shape allows it. */\nexport class PgObjectReader {\n constructor(\n private readonly sql: SQLClient,\n private readonly source: PgObjectQuerySource | PgSelectedObjectReadSource,\n private readonly aggregateAdmission?: PgAggregateAdmission\n ) {}\n\n private async assertVectorSearch(\n params: QueryObjectsInput | CountObjectsInput | ExistsObjectsInput | FacetObjectsInput\n ): Promise<void> {\n if (!hasVectorProfile(params.query)) return\n const compiled = compilePgObjectQuery(params.projectId, params.query, { source: this.source })\n if (!compiled.vectorProbe) return\n const extensions = await this.sql.unsafe<{ ready: boolean }[]>(\n \"SELECT EXISTS (SELECT 1 FROM pg_extension e JOIN pg_namespace n ON n.oid = e.extnamespace WHERE e.extname = 'vector' AND n.nspname = 'public') AS ready\"\n )\n if (!extensions[0]?.ready)\n throw new ObjectQueryExecutionError(\n \"vector_extension_missing\",\n \"PostgreSQL vector search requires pgvector installed in schema public (CREATE EXTENSION vector WITH SCHEMA public).\"\n )\n const probe = compiled.vectorProbe\n const [row] = await this.sql.unsafe<{ total: string | number }[]>(\n probe.sql,\n probe.args as SqlParameter[]\n )\n if (Number(row?.total ?? 0) > probe.limit) {\n throw new ObjectQueryExecutionError(\n \"vector_work_limit_exceeded\",\n `Exact vector search supports at most ${probe.limit} eligible vectors at this dimension. Narrow the query filters.`\n )\n }\n }\n\n async queryObjects(params: QueryObjectsInput): Promise<QueryObjectsResult> {\n await this.assertVectorSearch(params)\n const sql = this.sql\n const compiled = await this.compilePageQuery(params)\n const total = await this.readQueryTotal(params, compiled)\n\n const rawRows = await sql.unsafe<ObjectQueryDatabaseRow[]>(\n compiled.sql,\n compiled.args as SqlParameter[]\n )\n const rows = compiled.trimRows(rawRows) as readonly ObjectQueryDatabaseRow[]\n let hasMore = compiled.hasMore(rawRows.length, total)\n if (total === undefined && compiled.hasMoreProbe) {\n const probe = compiled.hasMoreProbe\n const candidates = await sql.unsafe(probe.sql, probe.args as SqlParameter[])\n hasMore = probe.hasMore(candidates.length)\n }\n\n return {\n objects: rows.map((row) => queryRowToObject(row)),\n hasMore,\n nextPageToken: compiled.nextPageToken(rows, rawRows.length),\n ...(total === undefined ? {} : { total }),\n }\n }\n\n /** Use the ordered traversal path only when its bounded probe finds a broad fanout. */\n private async compilePageQuery(params: QueryObjectsInput): Promise<CompiledPgObjectQuery> {\n const sql = this.sql\n const source = this.source\n const sortIndexBound =\n source === DEFAULT_OBJECT_QUERY_SOURCE\n ? await findPgSortIndexBound(sql, params.projectId, params.query)\n : undefined\n let compiled = compilePgObjectQuery(params.projectId, params.query, {\n sortIndexBound,\n includeTotal: params.includeTotal,\n source,\n })\n if (compiled.traversalProbe) {\n const probe = compiled.traversalProbe\n const candidates = await sql.unsafe(probe.sql, probe.args as SqlParameter[])\n if (candidates.length > probe.limit) {\n compiled = compilePgObjectQuery(params.projectId, params.query, {\n includeTotal: params.includeTotal,\n source,\n correlatedTraversal: true,\n sortIndexBound,\n })\n }\n }\n return compiled\n }\n\n private async readQueryTotal(\n params: QueryObjectsInput,\n compiled: CompiledPgObjectQuery\n ): Promise<number | undefined> {\n if (params.includeTotal === false) return undefined\n\n const computeTotal = async () => {\n if (this.source === DEFAULT_OBJECT_QUERY_SOURCE) {\n const indexed = await compilePgIndexedTextCount(\n this.sql,\n params.projectId,\n totalCountInput(params.query)\n )\n if (indexed) {\n const [row] = await this.sql.unsafe(indexed.sql, indexed.args as SqlParameter[])\n return Number(row?.count ?? 0)\n }\n }\n return readTotal(this.sql, compiled)\n }\n\n if (this.aggregateAdmission) return this.aggregateAdmission.run(computeTotal)\n return computeTotal()\n }\n\n async countObjects(params: CountObjectsInput): Promise<CountObjectsResult> {\n if (this.aggregateAdmission) {\n return this.aggregateAdmission.run(() =>\n new PgObjectReader(this.sql, this.source).countObjects(params)\n )\n }\n\n await this.assertVectorSearch(params)\n const sql = this.sql\n const source = this.source\n const indexed =\n source === DEFAULT_OBJECT_QUERY_SOURCE\n ? await compilePgIndexedTextCount(sql, params.projectId, stripOuterRowShape(params.query))\n : undefined\n const compiled =\n indexed ??\n compilePgObjectCountQuery(params.projectId, stripOuterRowShape(params.query), {\n source,\n })\n const [row] = await sql.unsafe<{ count: string | number | bigint }[]>(\n compiled.sql,\n compiled.args as SqlParameter[]\n )\n return { count: Number(row?.count ?? 0) }\n }\n\n async existsObjects(params: ExistsObjectsInput): Promise<ExistsObjectsResult> {\n await this.assertVectorSearch(params)\n const sql = this.sql\n const source = this.source\n const compiled = compilePgObjectExistsQuery(\n params.projectId,\n stripOuterRowShape(params.query),\n { source }\n )\n const [row] = await sql.unsafe<unknown[]>(compiled.sql, compiled.args as SqlParameter[])\n return { exists: row !== undefined }\n }\n\n async facetObjects(params: FacetObjectsInput): Promise<FacetObjectsResult> {\n if (this.aggregateAdmission) {\n return this.aggregateAdmission.run(() =>\n new PgObjectReader(this.sql, this.source).facetObjects(params)\n )\n }\n\n await this.assertVectorSearch(params)\n const sql = this.sql\n const source = this.source\n const indexed =\n source === DEFAULT_OBJECT_QUERY_SOURCE\n ? await compilePgIndexedTextFacets(\n sql,\n params.projectId,\n stripOuterRowShape(params.query),\n params.facets\n )\n : undefined\n const compiled =\n indexed ??\n compilePgObjectFacetsQuery(\n params.projectId,\n stripOuterRowShape(params.query),\n params.facets,\n { source }\n )\n const rows = await sql.unsafe<(FacetDatabaseRow & { facet_index: number })[]>(\n compiled.sql,\n compiled.args as SqlParameter[]\n )\n const facets = params.facets.map((facet) => ({\n propertyId: facet.propertyId,\n buckets: [] as { value: unknown; count: number }[],\n }))\n let total = 0\n for (const row of rows) {\n if (row.facet_index === -1) {\n total = Number(row.count)\n } else {\n facets[row.facet_index]?.buckets.push({\n value: pgFacetValue(row.value_type, row.value_text),\n count: Number(row.count),\n })\n }\n }\n\n return { total, facets }\n }\n\n async getByPrimaryId(params: {\n projectId: string\n objectTypeId: string\n primaryId: string\n }): Promise<ObjectRow | null> {\n const sql = this.sql\n const source = this.source\n const statement = compilePgObjectStatement(\n `\n SELECT *\n FROM ${source.objectsTable}\n WHERE project_id = ? AND object_type_id = ? AND primary_id = ?\n `,\n [params.projectId, params.objectTypeId, params.primaryId],\n source\n )\n const [row] = await sql.unsafe<ObjectDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n\n return row ? rowToObject(row) : null\n }\n\n async selectsObjectProperties(\n params: Parameters<ObjectReadStorage[\"selectsObjectProperties\"]>[0]\n ): Promise<readonly boolean[]> {\n const sql = this.sql\n const source = this.source\n const result = params.items.map(() => false)\n if (params.items.length === 0) return result\n\n const items = params.items.map((item, batchIndex) => ({ ...item, batchIndex }))\n const selected = \"objectPropertyPermissionsTable\" in source\n const storedTable = selected ? source.objectPropertyPermissionsTable : source.objectsTable\n const propertyJoin = selected ? 'AND stored.property_id = requested.\"propertyId\"' : \"\"\n const statement = compilePgObjectStatement(\n `\n SELECT DISTINCT requested.\"batchIndex\" AS _batch_index\n FROM ${storedTable} AS stored\n JOIN jsonb_to_recordset(?::text::jsonb)\n AS requested(\n \"objectTypeId\" text,\n \"primaryId\" text,\n \"propertyId\" text,\n \"batchIndex\" integer\n )\n ON stored.object_type_id = requested.\"objectTypeId\"\n AND stored.primary_id = requested.\"primaryId\"\n ${propertyJoin}\n WHERE stored.project_id = ?\n `,\n [JSON.stringify(items), params.projectId],\n source\n )\n const rows = await sql.unsafe<PropertyPermissionBatchDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n for (const row of rows) result[row._batch_index] = true\n return result\n }\n\n async listLinks(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n linkId?: string\n direction?: LinkDirection\n }): Promise<readonly ObjectLinkRow[]> {\n const sql = this.sql\n const source = this.source\n const direction = params.direction ?? \"outgoing\"\n const directionWhere =\n direction === \"incoming\"\n ? \"target_type_id = ? AND target_id = ?\"\n : direction === \"both\"\n ? \"((source_type_id = ? AND source_id = ?) OR (target_type_id = ? AND target_id = ?))\"\n : \"source_type_id = ? AND source_id = ?\"\n const args: unknown[] =\n direction === \"both\"\n ? [\n params.projectId,\n params.objectTypeId,\n params.objectId,\n params.objectTypeId,\n params.objectId,\n ]\n : [params.projectId, params.objectTypeId, params.objectId]\n const query = `SELECT * FROM ${source.linksTable} WHERE project_id = ? AND ${directionWhere}${\n params.linkId ? \" AND link_id = ?\" : \"\"\n }`\n if (params.linkId) args.push(params.linkId)\n const statement = compilePgObjectStatement(query, args, source)\n const rows = await sql.unsafe<LinkDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n\n return rows.map((row) => rowToLink(row))\n }\n\n async getByPrimaryIdBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; primaryId: string }[]\n }): Promise<Map<ObjectBatchKey, ObjectRow>> {\n const sql = this.sql\n const source = this.source\n const result = new Map<ObjectBatchKey, ObjectRow>()\n if (params.items.length === 0) return result\n const items = params.items.map((item, batchIndex) => ({ ...item, batchIndex }))\n const statement = compilePgObjectStatement(\n `\n SELECT object.*, requested.\"batchIndex\" AS _batch_index\n FROM jsonb_to_recordset(?::text::jsonb)\n AS requested(\"objectTypeId\" text, \"primaryId\" text, \"batchIndex\" integer)\n JOIN ${source.objectsTable} AS object\n ON object.project_id = ?\n AND object.object_type_id = requested.\"objectTypeId\"\n AND object.primary_id = requested.\"primaryId\"\n `,\n [JSON.stringify(items), params.projectId],\n source\n )\n const rows = await sql.unsafe<ObjectBatchDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n const rowsByIndex = new Map(rows.map((row) => [row._batch_index, row]))\n for (const [index, item] of params.items.entries()) {\n const row = rowsByIndex.get(index)\n if (row) result.set(objectBatchKey(item.objectTypeId, item.primaryId), rowToObject(row))\n }\n return result\n }\n\n async listLinksBatch(params: {\n projectId: string\n direction?: LinkDirection\n items: readonly { objectTypeId: string; objectId: string; linkId: string }[]\n }): Promise<Map<LinkBatchKey, ObjectLinkRow[]>> {\n const sql = this.sql\n const source = this.source\n const result = new Map<LinkBatchKey, ObjectLinkRow[]>()\n if (params.items.length === 0) return result\n\n const direction = params.direction ?? \"outgoing\"\n const outgoing =\n 'stored.source_type_id = requested.\"objectTypeId\" AND stored.source_id = requested.\"objectId\"'\n const incoming =\n 'stored.target_type_id = requested.\"objectTypeId\" AND stored.target_id = requested.\"objectId\"'\n const items = params.items.map((item, batchIndex) => ({ ...item, batchIndex }))\n const requestedSql = `\n jsonb_to_recordset(?::text::jsonb)\n AS requested(\n \"objectTypeId\" text,\n \"objectId\" text,\n \"linkId\" text,\n \"batchIndex\" integer\n )\n `\n const table = source.linksTable\n const selectedSql =\n direction === \"both\"\n ? `\n SELECT stored.*, requested.\"batchIndex\" AS _batch_index\n FROM ${requestedSql}\n CROSS JOIN LATERAL (\n SELECT outgoing_link.*\n FROM ${table} AS outgoing_link\n WHERE outgoing_link.project_id = ?\n AND outgoing_link.source_type_id = requested.\"objectTypeId\"\n AND outgoing_link.source_id = requested.\"objectId\"\n AND outgoing_link.link_id = requested.\"linkId\"\n\n UNION\n\n SELECT incoming_link.*\n FROM ${table} AS incoming_link\n WHERE incoming_link.project_id = ?\n AND incoming_link.target_type_id = requested.\"objectTypeId\"\n AND incoming_link.target_id = requested.\"objectId\"\n AND incoming_link.link_id = requested.\"linkId\"\n ) AS stored\n `\n : `\n SELECT stored.*, requested.\"batchIndex\" AS _batch_index\n FROM ${requestedSql}\n JOIN ${table} AS stored\n ON ${direction === \"incoming\" ? incoming : outgoing}\n AND stored.link_id = requested.\"linkId\"\n WHERE stored.project_id = ?\n `\n const statement = compilePgObjectStatement(\n `\n ${selectedSql}\n ORDER BY\n _batch_index,\n source_type_id COLLATE \"C\",\n source_id COLLATE \"C\",\n link_id COLLATE \"C\",\n target_type_id COLLATE \"C\",\n target_id COLLATE \"C\"\n `,\n direction === \"both\"\n ? [JSON.stringify(items), params.projectId, params.projectId]\n : [JSON.stringify(items), params.projectId],\n source\n )\n const rows = await sql.unsafe<LinkBatchDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n const rowsByIndex = params.items.map(() => new Map<string, ObjectLinkRow>())\n for (const row of rows) {\n const link = rowToLink(row)\n rowsByIndex[row._batch_index]?.set(linkIdentity(link), link)\n }\n for (const [index, item] of params.items.entries()) {\n const links = [...(rowsByIndex[index]?.values() ?? [])]\n if (links.length > 0) {\n result.set(linkBatchKey(item.objectTypeId, item.objectId, item.linkId), links)\n }\n }\n return result\n }\n\n async queryLinks(params: QueryObjectLinksInput): Promise<QueryObjectLinksResult> {\n const sql = this.sql\n const source = this.source\n if (params.objectRefs.length === 0 || params.endpointObjectTypeIds?.length === 0) {\n return { links: [], hasMore: false }\n }\n\n const requestedJson = JSON.stringify(params.objectRefs)\n const args: unknown[] =\n params.direction === \"both\"\n ? [requestedJson, params.projectId, params.projectId]\n : [requestedJson, params.projectId]\n const addArg = (value: unknown): string => {\n args.push(value)\n return \"?\"\n }\n const requestedSql = `\n jsonb_to_recordset(?::text::jsonb)\n AS requested(\"objectTypeId\" text, \"primaryId\" text)\n `\n const table = source.linksTable\n const incidentSql =\n params.direction === \"both\"\n ? `\n SELECT DISTINCT link.*\n FROM ${requestedSql}\n CROSS JOIN LATERAL (\n SELECT outgoing_link.*\n FROM ${table} AS outgoing_link\n WHERE outgoing_link.project_id = ?\n AND outgoing_link.source_type_id = requested.\"objectTypeId\"\n AND outgoing_link.source_id = requested.\"primaryId\"\n\n UNION\n\n SELECT incoming_link.*\n FROM ${table} AS incoming_link\n WHERE incoming_link.project_id = ?\n AND incoming_link.target_type_id = requested.\"objectTypeId\"\n AND incoming_link.target_id = requested.\"primaryId\"\n ) AS link\n `\n : `\n SELECT DISTINCT link.*\n FROM ${requestedSql}\n JOIN ${table} AS link\n ON requested.\"objectTypeId\" = link.${params.direction === \"incoming\" ? \"target_type_id\" : \"source_type_id\"}\n AND requested.\"primaryId\" = link.${params.direction === \"incoming\" ? \"target_id\" : \"source_id\"}\n WHERE link.project_id = ?\n `\n\n const predicates: string[] = []\n if (params.linkId !== undefined) {\n predicates.push(`link_id = ${addArg(params.linkId)}::text`)\n }\n if (params.endpointObjectTypeIds !== undefined) {\n const allowedTypes = JSON.stringify([...new Set(params.endpointObjectTypeIds)])\n predicates.push(\n `source_type_id IN (SELECT jsonb_array_elements_text(${addArg(allowedTypes)}::text::jsonb))`,\n `target_type_id IN (SELECT jsonb_array_elements_text(${addArg(allowedTypes)}::text::jsonb))`\n )\n }\n if (params.after) {\n const cursor = params.after.map((value) => `${addArg(value)}::text COLLATE \"C\"`)\n predicates.push(\n `(\n source_type_id COLLATE \"C\",\n source_id COLLATE \"C\",\n link_id COLLATE \"C\",\n target_type_id COLLATE \"C\",\n target_id COLLATE \"C\"\n ) > (${cursor.join(\", \")})`\n )\n }\n const limit = addArg(params.limit + 1)\n const whereSql = predicates.length > 0 ? `WHERE ${predicates.join(\" AND \")}` : \"\"\n const statement = compilePgObjectStatement(\n `\n SELECT *\n FROM (${incidentSql}) AS incident\n ${whereSql}\n ORDER BY\n source_type_id COLLATE \"C\",\n source_id COLLATE \"C\",\n link_id COLLATE \"C\",\n target_type_id COLLATE \"C\",\n target_id COLLATE \"C\"\n LIMIT ${limit}\n `,\n args,\n source\n )\n const rows = await sql.unsafe<LinkDatabaseRow[]>(\n statement.sql,\n statement.args as SqlParameter[]\n )\n\n return {\n links: rows.slice(0, params.limit).map((row) => rowToLink(row)),\n hasMore: rows.length > params.limit,\n }\n }\n\n async list(\n params: Parameters<ObjectReadStorage[\"list\"]>[0]\n ): Promise<{ objects: readonly ObjectRow[]; hasMore: boolean; total: number }> {\n const sql = this.sql\n const source = this.source\n const queryOffset = params.offset ?? 0\n const limit = params.limit ?? 50\n const orderBy = params.orderBy ?? \"updatedAt\"\n const order = params.order ?? \"desc\"\n const orderColumn =\n orderBy === \"primaryId\" ? \"primary_id\" : orderBy === \"createdAt\" ? \"created_at\" : \"updated_at\"\n const filters = [\"project_id = ?\"]\n const args: unknown[] = [params.projectId]\n if (typeof params.objectTypeId === \"string\") {\n filters.push(\"object_type_id = ?\")\n args.push(params.objectTypeId)\n } else if (params.objectTypeId !== undefined) {\n filters.push(\"object_type_id IN (SELECT jsonb_array_elements_text(?::text::jsonb))\")\n args.push(JSON.stringify(params.objectTypeId))\n }\n if (params.primaryIdPrefix) {\n filters.push(\"primary_id LIKE ?\")\n args.push(`${params.primaryIdPrefix}%`)\n }\n if (params.primaryIdSuffix) {\n filters.push(\"primary_id LIKE ?\")\n args.push(`%${params.primaryIdSuffix}`)\n }\n if (params.updatedAfter) {\n filters.push(\"updated_at >= ?\")\n args.push(params.updatedAfter)\n }\n if (params.updatedBefore) {\n filters.push(\"updated_at <= ?\")\n args.push(params.updatedBefore)\n }\n if (params.createdAfter) {\n filters.push(\"created_at >= ?\")\n args.push(params.createdAfter)\n }\n if (params.createdBefore) {\n filters.push(\"created_at <= ?\")\n args.push(params.createdBefore)\n }\n\n const objectsTable = source.objectsTable\n const whereSql = filters.join(\" AND \")\n const countStatement = compilePgObjectStatement(\n `SELECT COUNT(*)::int AS total FROM ${objectsTable} WHERE ${whereSql}`,\n args,\n source\n )\n const [countResult] = await sql.unsafe<{ total: number }[]>(\n countStatement.sql,\n countStatement.args as SqlParameter[]\n )\n const total = countResult?.total ?? 0\n\n if (limit === 0) return { objects: [], hasMore: queryOffset < total, total }\n\n const fetchLimit = limit + 1\n const rowsStatement = compilePgObjectStatement(\n `\n SELECT * FROM ${objectsTable}\n WHERE ${whereSql}\n ORDER BY ${orderColumn} ${order === \"asc\" ? \"ASC\" : \"DESC\"}\n LIMIT ? OFFSET ?\n `,\n [...args, fetchLimit, queryOffset],\n source\n )\n const rows = await sql.unsafe<ObjectDatabaseRow[]>(\n rowsStatement.sql,\n rowsStatement.args as SqlParameter[]\n )\n\n const hasMore = rows.length > limit\n const objects = rows.slice(0, limit).map((row) => rowToObject(row))\n\n return { objects, hasMore, total }\n }\n}\n\nasync function readTotal(sql: SQLClient, compiled: CompiledPgObjectQuery): Promise<number> {\n const [row] = await sql.unsafe<\n {\n total: string | number | bigint\n }[]\n >(compiled.totalSql, compiled.totalArgs as SqlParameter[])\n return Number(row?.total ?? 0)\n}\n\nfunction pgFacetValue(valueType: string | null, valueText: string | null): unknown {\n switch (valueType) {\n case \"string\":\n return valueText ?? \"\"\n case \"number\":\n return valueText === null ? null : Number(valueText)\n case \"boolean\":\n return valueText === \"true\"\n case \"null\":\n return null\n case \"array\":\n case \"object\":\n return valueText === null ? null : JSON.parse(valueText)\n default:\n return valueText\n }\n}\n\n// A page's total counts its input, including any inner limit/page. Do not strip those bounds.\nfunction totalCountInput(query: ObjectQuery): ObjectQuery {\n switch (query.kind) {\n case \"sort\":\n case \"project\":\n case \"expand\":\n return totalCountInput(query.input)\n case \"limit\":\n case \"page\":\n return query.input\n default:\n return query\n }\n}\n\nfunction stripOuterRowShape(query: ObjectQuery): ObjectQuery {\n switch (query.kind) {\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"sort\":\n return stripOuterRowShape(query.input)\n default:\n return query\n }\n}\n\nexport function assertLinkQueryLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Object link query limit must be a positive safe integer.\")\n }\n}\n",
35
+ "import { createHash } from \"node:crypto\"\nimport type { ObjectQuery, QueryScalarKind } from \"@sixb/core\"\nimport type { ReservedSQL, SQL, SQLClient } from \"../pg-client\"\nimport { isConnectionLost } from \"../storage-errors\"\nimport { withReservedPgConnection } from \"../transactions\"\nimport { lockPgPreparation } from \"./preparation-lock\"\n\nexport interface PgObjectQueryIndexScope {\n readonly projectId: string\n readonly objectTypeId: string\n /** Optional equality conditions. Partial indexes also accelerate exact counts of these views. */\n readonly where?: Readonly<Record<string, string | number | boolean | null>>\n}\n\nexport type PgObjectQueryIndex = PgObjectQueryIndexScope &\n (\n | {\n readonly kind: \"sort\"\n /** Leading string equality filters, in query order. */\n readonly equality?: readonly string[]\n readonly fields: readonly {\n readonly propertyId: string\n readonly direction?: \"asc\" | \"desc\"\n readonly scalarKind?: QueryScalarKind\n }[]\n }\n | { readonly kind: \"incomingLinks\"; readonly where?: never }\n | { readonly kind: \"text\"; readonly propertyId: string }\n | { readonly kind: \"value\"; readonly propertyId: string }\n | { readonly kind: \"count\" }\n | { readonly kind: \"filter\"; readonly properties: readonly string[] }\n )\n\n/** Explicit maintenance operation: never creates indexes in the request path or a transaction. */\nexport async function ensurePgObjectQueryIndexes(\n sql: SQL | ReservedSQL,\n schema: string,\n indexes: readonly PgObjectQueryIndex[]\n): Promise<readonly string[]> {\n const definitions = indexes.map((index) => ({\n table: index.kind === \"incomingLinks\" ? \"links\" : \"objects\",\n expression: compileIndex(index),\n index,\n }))\n if (indexes.some((index) => index.kind === \"text\")) {\n const [extension] = await sql<{ ready: boolean }[]>`\n SELECT EXISTS (\n SELECT 1 FROM pg_extension e JOIN pg_namespace n ON n.oid = e.extnamespace\n WHERE e.extname = 'pg_trgm' AND n.nspname = 'public'\n ) AS ready`\n if (!extension?.ready) {\n throw new Error(\n \"[SixbPg] Text query indexes require pg_trgm in schema public. Run CREATE EXTENSION pg_trgm WITH SCHEMA public before ensuring indexes.\"\n )\n }\n }\n\n const names: string[] = []\n await withReservedPgConnection(sql, async (connection) => {\n let connected = true\n try {\n // One concurrent build per table, across definitions and across processes.\n await lockPgPreparation(connection, `${schema}.objects.query-indexes`)\n for (const definition of definitions) {\n names.push(await createQueryIndex(connection, schema, definition))\n }\n\n await ensureExpressionStatistics(connection, schema, indexes)\n } catch (error) {\n connected = !isConnectionLost(error)\n throw error\n } finally {\n if (connected)\n await connection`SELECT pg_advisory_unlock(hashtextextended(${`${schema}.objects.query-indexes`}, 0))`\n }\n })\n return names\n}\n\nasync function createQueryIndex(\n connection: ReservedSQL,\n schema: string,\n definition: { table: string; expression: string; index: PgObjectQueryIndex }\n): Promise<string> {\n const name = `sixb_query_${createHash(\"sha256\")\n .update(\n definition.table === \"objects\"\n ? definition.expression\n : `${definition.table}:${definition.expression}`\n )\n .digest(\"hex\")\n .slice(0, 32)}`\n await connection.unsafe(\n `CREATE INDEX CONCURRENTLY IF NOT EXISTS ${identifier(name)} ON ${identifier(schema)}.${identifier(definition.table)} ${definition.expression}`\n )\n const [index] = await connection<{ valid: boolean }[]>`\n SELECT i.indisvalid AS valid FROM pg_index i\n JOIN pg_class c ON c.oid = i.indexrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = ${schema} AND c.relname = ${name}`\n if (!index?.valid)\n throw new Error(\n `[SixbPg] Query index ${schema}.${name} is invalid after an interrupted build. Drop that index concurrently and retry ensureObjectQueryIndexes().`\n )\n if (definition.index.kind === \"sort\") {\n await connection.unsafe(\n `COMMENT ON INDEX ${identifier(schema)}.${identifier(name)} IS ${literal(JSON.stringify(definition.index))}`\n )\n const scope = `project_id = ${literal(definition.index.projectId)} AND object_type_id = ${literal(definition.index.objectTypeId)}`\n await connection.unsafe(\n `CREATE INDEX CONCURRENTLY IF NOT EXISTS ${identifier(`${name}_overflow`)} ON ${identifier(schema)}.objects (primary_id) WHERE ${scope} AND NOT (${sortIndexBound(definition.index)})`\n )\n }\n return name\n}\n\nasync function ensureExpressionStatistics(\n connection: ReservedSQL,\n schema: string,\n indexes: readonly PgObjectQueryIndex[]\n): Promise<void> {\n let statisticsChanged = false\n // Partial-index statistics do not describe expressions for the whole table. Without\n // expression statistics JSON's default selectivity can turn a 4M-row view into an\n // estimated 125-row sort, even when the right ordered index exists.\n const expressions = new Set(indexes.flatMap(statisticsExpressions))\n for (const expression of expressions) {\n const name = `sixb_query_stats_${createHash(\"sha256\").update(expression).digest(\"hex\").slice(0, 24)}`\n const [existing] = await connection`\n SELECT 1 FROM pg_statistic_ext s JOIN pg_namespace n ON n.oid = s.stxnamespace\n WHERE n.nspname = ${schema} AND s.stxname = ${name}`\n if (existing) continue\n await connection.unsafe(\n `CREATE STATISTICS ${identifier(schema)}.${identifier(name)} ON project_id, object_type_id, ${expression} FROM ${identifier(schema)}.objects`\n )\n statisticsChanged = true\n }\n if (statisticsChanged) await connection.unsafe(`ANALYZE ${identifier(schema)}.objects`)\n}\n\nfunction statisticsExpressions(index: PgObjectQueryIndex): string[] {\n if (index.kind === \"incomingLinks\") return []\n const equality = new Set(Object.keys(index.where ?? {}))\n if (index.kind === \"filter\") for (const property of index.properties) equality.add(property)\n if (index.kind === \"sort\") for (const property of index.equality ?? []) equality.add(property)\n const expressions = [...equality].map(\n (property) =>\n `jsonb_typeof(properties -> ${literal(property)}), (properties ->> ${literal(property)}), (md5(properties ->> ${literal(property)}))`\n )\n if (index.kind === \"value\") expressions.push(`(properties -> ${literal(index.propertyId)})`)\n if (index.kind === \"text\")\n expressions.push(`lower(coalesce(properties ->> ${literal(index.propertyId)}, ''))`)\n if (index.kind === \"sort\")\n for (const field of index.fields) {\n expressions.push(\n field.scalarKind === \"decimal\"\n ? `((properties ->> ${literal(field.propertyId)})::numeric)`\n : `(NULLIF(properties -> ${literal(field.propertyId)}, 'null'::jsonb))`\n )\n }\n return expressions\n}\n\nfunction compileIndex(index: PgObjectQueryIndex): string {\n if (index.kind === \"incomingLinks\") {\n if (index.where)\n throw new Error(\"[SixbPg] Incoming link indexes do not accept object property conditions\")\n return `(target_id, link_id, source_type_id, source_id) INCLUDE (project_id, target_type_id) WHERE project_id = ${literal(index.projectId)} AND target_type_id = ${literal(index.objectTypeId)}`\n }\n const predicate = [\n `project_id = ${literal(index.projectId)}`,\n `object_type_id = ${literal(index.objectTypeId)}`,\n ]\n for (const [propertyId, value] of Object.entries(index.where ?? {}).sort(([a], [b]) =>\n a.localeCompare(b)\n )) {\n const property = `properties -> ${literal(propertyId)}`\n if (value === null) predicate.push(`jsonb_typeof(${property}) = 'null'`)\n else if (typeof value === \"string\") {\n predicate.push(\n `jsonb_typeof(${property}) = 'string'`,\n `properties ->> ${literal(propertyId)} = ${literal(value)}`,\n `md5(properties ->> ${literal(propertyId)}) = md5(${literal(value)})`\n )\n } else {\n if (typeof value === \"number\" && !Number.isFinite(value)) {\n throw new Error(\"[SixbPg] Query index conditions require finite numbers\")\n }\n predicate.push(`${property} = ${literal(JSON.stringify(value))}::jsonb`)\n }\n }\n if (index.kind === \"text\") {\n return `USING gin (lower(coalesce(properties ->> ${literal(index.propertyId)}, '')) public.gin_trgm_ops) WHERE ${predicate.join(\" AND \")}`\n }\n\n // The partial predicate fixes the scope. Repeating those columns as leading keys\n // makes PostgreSQL scan past them when it removes their redundant conditions.\n const fields: string[] = []\n if (index.kind === \"count\") {\n fields.push(\"project_id\", \"object_type_id\")\n } else if (index.kind === \"value\") {\n fields.push(`(properties -> ${literal(index.propertyId)})`)\n }\n\n if (index.kind === \"filter\") {\n if (!index.properties.length || index.properties.length > 8)\n throw new Error(\"[SixbPg] A filter index requires one to eight string properties\")\n for (const propertyId of index.properties)\n fields.push(`(md5(properties ->> ${literal(propertyId)}))`)\n }\n if (index.kind === \"sort\") {\n predicate.push(sortIndexBound(index))\n if (index.fields.length === 0 || index.fields.length + (index.equality?.length ?? 0) > 8) {\n throw new Error(\"[SixbPg] A sort query index requires between one and eight fields\")\n }\n for (const propertyId of index.equality ?? []) {\n fields.push(`(properties ->> ${literal(propertyId)})`)\n }\n for (const field of index.fields) {\n const property = `properties -> ${literal(field.propertyId)}`\n fields.push(\n `(CASE WHEN jsonb_typeof(${property}) IS NULL OR jsonb_typeof(${property}) = 'null' THEN 1 ELSE 0 END)`,\n `${field.scalarKind === \"decimal\" ? `((properties ->> ${literal(field.propertyId)})::numeric)` : `(NULLIF(${property}, 'null'::jsonb))`} ${field.direction === \"desc\" ? \"DESC\" : \"ASC\"}`\n )\n }\n fields.push(\"primary_id\")\n }\n return `(${fields.join(\", \")}) WHERE ${predicate.join(\" AND \")}`\n}\n\nfunction literal(value: string): string {\n if (value.includes(\"\\0\"))\n throw new Error(\"[SixbPg] Query index names and values cannot contain NUL\")\n return `E'${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"''\")}'`\n}\n\nfunction identifier(value: string): string {\n return `\"${value.replace(/\"/g, '\"\"')}\"`\n}\n\n/** Keep complete B-tree entries below PostgreSQL's page limit, without constraining valid data.\n * Ordered reads merge a small indexed page with the exact overflow page. */\nexport function sortIndexBound(index: Extract<PgObjectQueryIndex, { kind: \"sort\" }>): string {\n const sizes = [\n \"octet_length(primary_id)\",\n ...index.fields.map(\n (field) => `coalesce(octet_length((properties -> ${literal(field.propertyId)})::text), 0)`\n ),\n ...(index.equality ?? []).map(\n (property) => `coalesce(octet_length(properties ->> ${literal(property)}), 0)`\n ),\n ]\n return `(${sizes.join(\" + \")}) <= 1800`\n}\n\n/** Only split a flat, bounded ordered read; joins, nested limits and projections keep the\n * general compiler. Its unrestricted fallback always preserves semantics. */\nexport async function findPgSortIndexBound(\n sql: SQLClient,\n projectId: string,\n query: ObjectQuery\n): Promise<string | undefined> {\n while (query.kind === \"expand\") query = query.input\n if (query.kind !== \"page\" && query.kind !== \"limit\") return undefined\n let input = query.input\n let fields: Extract<ObjectQuery, { kind: \"sort\" }>[\"fields\"] | undefined\n const equality = new Set<string>()\n while (input.kind === \"sort\" || input.kind === \"filter\" || input.kind === \"text\") {\n if (input.kind === \"sort\") {\n if (fields) return undefined\n fields = input.fields\n }\n if (input.kind === \"filter\") {\n const inspect = (predicate: Extract<ObjectQuery, { kind: \"filter\" }>[\"predicate\"]): void => {\n if (predicate.op === \"and\") predicate.items.forEach(inspect)\n else if (predicate.op === \"eq\" && typeof predicate.value === \"string\")\n equality.add(predicate.propertyId)\n else if (\n predicate.op === \"in\" &&\n predicate.values.length === 1 &&\n typeof predicate.values[0] === \"string\"\n )\n equality.add(predicate.propertyId)\n }\n inspect(input.predicate)\n }\n input = input.input\n }\n let objectTypeId: string | undefined\n if (input.kind === \"start\" && !input.includeSubtypes) {\n objectTypeId = input.objectTypeId\n } else if (input.kind === \"traverse\" && input.direction === \"incoming\") {\n objectTypeId = input.sourceObjectTypeId\n }\n\n if (!objectTypeId || !fields?.length || fields.some((field) => field.kind !== \"property\"))\n return undefined\n\n const rows = await sql<{ definition: string }[]>`\n SELECT obj_description(c.oid, 'pg_class') AS definition\n FROM pg_index i JOIN pg_class c ON c.oid = i.indexrelid\n WHERE i.indrelid = 'objects'::regclass AND i.indisvalid\n AND c.relname LIKE 'sixb_query_%'\n AND obj_description(c.oid, 'pg_class') IS NOT NULL\n `\n const matches: Extract<PgObjectQueryIndex, { kind: \"sort\" }>[] = []\n for (const row of rows) {\n let candidate: unknown\n try {\n candidate = JSON.parse(row.definition)\n } catch {\n continue\n }\n if (!candidate || typeof candidate !== \"object\") continue\n // Metadata is generated by this module. Verify all SQL-interpolated members before using it.\n const index = candidate as Partial<Extract<PgObjectQueryIndex, { kind: \"sort\" }>>\n if (\n index.kind !== \"sort\" ||\n index.projectId !== projectId ||\n index.objectTypeId !== objectTypeId ||\n index.where ||\n !Array.isArray(index.fields) ||\n index.fields.length !== fields.length\n )\n continue\n if (\n index.equality !== undefined &&\n (!Array.isArray(index.equality) ||\n !index.equality.every((property) => typeof property === \"string\" && equality.has(property)))\n )\n continue\n if (\n !index.fields.every(\n (field, i) =>\n field &&\n typeof field.propertyId === \"string\" &&\n fields[i]?.kind === \"property\" &&\n fields[i].propertyId === field.propertyId &&\n (field.direction ?? \"asc\") === (fields[i].direction ?? \"asc\") &&\n (field.scalarKind === \"decimal\") === (fields[i].scalarKind === \"decimal\")\n )\n )\n continue\n matches.push(index as Extract<PgObjectQueryIndex, { kind: \"sort\" }>)\n }\n matches.sort((a, b) => (b.equality?.length ?? 0) - (a.equality?.length ?? 0))\n return matches[0] ? sortIndexBound(matches[0]) : undefined\n}\n",
36
+ "import type { ReservedSQL } from \"../pg-client\"\n\n/** CREATE INDEX CONCURRENTLY on expressions/partial indexes waits for older snapshots.\n * A blocking pg_advisory_lock SELECT can hold one while waiting for the index builder,\n * producing a cycle. Try-lock in short statements and wait outside PostgreSQL instead. */\nexport async function lockPgPreparation(sql: ReservedSQL, key: string): Promise<void> {\n let delay = 25\n while (true) {\n const [row] = await sql<{ acquired: boolean }[]>`\n SELECT pg_try_advisory_lock(hashtextextended(${key}, 0)) AS acquired`\n if (row?.acquired) return\n await Bun.sleep(delay)\n delay = Math.min(delay * 2, 500)\n }\n}\n",
34
37
  "import type {\n ExpandedLinkValue,\n ExpandedObjectRow,\n ObjectLinkRow,\n ObjectRow,\n ObjectRowLinks,\n} from \"@sixb/core/storage\"\n\nexport function rowToObject(row: ObjectDatabaseRow): ObjectRow {\n return {\n projectId: row.project_id,\n objectTypeId: row.object_type_id,\n primaryId: row.primary_id,\n properties: row.properties as Record<string, unknown>,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n version: row.version,\n lastCommitId: row.last_commit_id,\n }\n}\n\n// Map a query row, attaching `links` when an `expand` pushdown produced them. The\n// base columns map as usual; `_expand` (a `jsonb_build_object`) is revived into\n// the runtime link shape the core executor's fallback also produces.\nexport function queryRowToObject(row: ObjectQueryDatabaseRow): ObjectRow {\n const base = {\n ...rowToObject(row),\n ...(row._vector_score === undefined ? {} : { score: row._vector_score }),\n }\n const links = reviveExpandedLinks(row._expand)\n return links ? { ...base, links } : base\n}\n\nfunction reviveExpandedLinks(value: unknown): ObjectRowLinks | undefined {\n if (!isPlainRecord(value)) return undefined\n const links: ObjectRowLinks = {}\n for (const [linkId, raw] of Object.entries(value)) {\n links[linkId] = reviveExpandedLinkValue(raw)\n }\n return links\n}\n\n// A \"one\" expansion arrives as a single object or null; a \"many\" expansion as an\n// array (already ordered and trimmed in the database).\nfunction reviveExpandedLinkValue(value: unknown): ExpandedLinkValue {\n if (value === null || value === undefined) return null\n if (Array.isArray(value)) return value.map(reviveExpandedRow)\n return reviveExpandedRow(value)\n}\n\n// Revive one hydrated neighbour from `compileExpansionChildJson`: JSONB timestamp\n// strings back to `Date`, empty link properties dropped (matching the fallback),\n// and nested links recursed.\nfunction reviveExpandedRow(value: unknown): ExpandedObjectRow {\n const row = isPlainRecord(value) ? value : {}\n const expanded: ExpandedObjectRow = {\n projectId: String(row.projectId),\n objectTypeId: String(row.objectTypeId),\n primaryId: String(row.primaryId),\n properties: isPlainRecord(row.properties) ? row.properties : {},\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n version: Number(row.version),\n lastCommitId: String(row.lastCommitId),\n }\n if (isPlainRecord(row.linkProperties) && Object.keys(row.linkProperties).length > 0) {\n expanded.linkProperties = row.linkProperties\n }\n const links = reviveExpandedLinks(row.links)\n if (links) expanded.links = links\n return expanded\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function rowToLink(row: LinkDatabaseRow): ObjectLinkRow {\n return {\n projectId: row.project_id,\n sourceTypeId: row.source_type_id,\n sourceId: row.source_id,\n linkId: row.link_id,\n targetTypeId: row.target_type_id,\n targetId: row.target_id,\n ...(row.properties === null ? {} : { properties: row.properties as Record<string, unknown> }),\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n lastCommitId: row.last_commit_id,\n }\n}\n\nexport function linkIdentity(link: ObjectLinkRow): string {\n return JSON.stringify([\n link.sourceTypeId,\n link.sourceId,\n link.linkId,\n link.targetTypeId,\n link.targetId,\n ])\n}\n\nexport interface ObjectDatabaseRow {\n project_id: string\n object_type_id: string\n primary_id: string\n properties: unknown\n created_at: Date | string\n updated_at: Date | string\n version: number\n last_commit_id: string\n}\n\nexport interface ObjectQueryDatabaseRow extends ObjectDatabaseRow {\n _vector_score?: number\n _cursor_properties?: unknown\n /** `jsonb_build_object(linkId, value, ...)` from an `expand` pushdown; absent otherwise. */\n _expand?: unknown\n}\n\nexport interface ObjectBatchDatabaseRow extends ObjectDatabaseRow {\n _batch_index: number\n}\n\nexport interface PropertyPermissionBatchDatabaseRow {\n _batch_index: number\n}\n\nexport interface FacetDatabaseRow {\n value_type: string | null\n value_text: string | null\n count: string | number | bigint\n}\n\nexport interface LinkDatabaseRow {\n project_id: string\n source_type_id: string\n source_id: string\n link_id: string\n target_type_id: string\n target_id: string\n properties: unknown | null\n created_at: Date | string\n updated_at: Date | string\n last_commit_id: string\n}\n\nexport interface LinkBatchDatabaseRow extends LinkDatabaseRow {\n _batch_index: number\n}\n",
38
+ "import { createHash } from \"node:crypto\"\nimport type { ObjectQuery, ObjectQueryPredicate } from \"@sixb/core\"\nimport type { ReservedSQL, SQL, SQLClient } from \"../pg-client\"\nimport { isConnectionLost } from \"../storage-errors\"\nimport { withReservedPgConnection } from \"../transactions\"\nimport { lockPgPreparation } from \"./preparation-lock\"\nimport {\n compilePgFacetSummary,\n compilePgObjectCountQuery,\n compilePgObjectQuery,\n DEFAULT_OBJECT_QUERY_SOURCE,\n} from \"./query-compiler\"\n\nexport interface PgObjectTextCountIndex {\n readonly projectId: string\n readonly objectTypeId: string\n readonly propertyId: string\n /** Up to four string equality filters used with this text search. */\n readonly filters?: readonly string[]\n}\n\nfunction describe(input: PgObjectTextCountIndex) {\n const definition = { ...input, filters: [...new Set(input.filters ?? [])].sort() }\n if (definition.filters.length > 4)\n throw new Error(\"[SixbPg] Text counts support at most four string filters\")\n for (const value of [\n input.projectId,\n input.objectTypeId,\n input.propertyId,\n ...definition.filters,\n ])\n literal(value)\n const key = hash(\n JSON.stringify([\n definition.projectId,\n definition.objectTypeId,\n definition.propertyId,\n definition.filters,\n ])\n )\n const textColumn = `sixb_qtext_${key}`\n const filters = new Map(\n definition.filters.map((property) => [\n property,\n `sixb_qfilter_${hash(JSON.stringify([input.projectId, input.objectTypeId, property]))}`,\n ])\n )\n const scope = `project_id = ${literal(input.projectId)} AND object_type_id = ${literal(input.objectTypeId)}`\n // Bound B-tree entry size without restricting application data. Long rows use an exact\n // overflow path; adding this index must never make a later valid object write fail.\n const compact = [\n `octet_length(${identifier(textColumn)}) <= 1024`,\n ...[...filters.values()].map(\n (column) => `(${identifier(column)} IS NULL OR octet_length(${identifier(column)}) <= 128)`\n ),\n ].join(\" AND \")\n return { definition, name: `sixb_text_count_${key}`, textColumn, filters, scope, compact }\n}\n\n/** Explicit offline preparation: adding STORED generated columns rewrites existing objects. */\nexport async function preparePgObjectTextCounts(\n sql: SQL | ReservedSQL,\n schema: string,\n inputs: readonly PgObjectTextCountIndex[]\n): Promise<readonly string[]> {\n const definitions = inputs.map(describe)\n if (!definitions.length) return []\n\n const [extension] = await sql<{ ready: boolean }[]>`\n SELECT EXISTS (\n SELECT 1 FROM pg_extension e JOIN pg_namespace n ON n.oid = e.extnamespace\n WHERE e.extname = 'pg_trgm' AND n.nspname = 'public'\n ) AS ready\n `\n if (!extension?.ready)\n throw new Error(\"[SixbPg] Text counts require CREATE EXTENSION pg_trgm WITH SCHEMA public\")\n const table = `${identifier(schema)}.objects`\n const names: string[] = []\n await withReservedPgConnection(sql, async (connection) => {\n let connected = true\n try {\n await lockPgPreparation(connection, `${schema}.objects.query-indexes`)\n\n const existing = await connection<{ attname: string }[]>`\n SELECT attname FROM pg_attribute\n WHERE attrelid = ${table}::regclass AND attnum > 0 AND NOT attisdropped\n `\n const columns = new Set(existing.map((row) => row.attname))\n const additions = new Map<string, string>()\n for (const item of definitions) {\n additions.set(\n item.textColumn,\n `CASE WHEN ${item.scope} THEN lower(coalesce(properties ->> ${literal(item.definition.propertyId)}, '')) END`\n )\n for (const [property, column] of item.filters)\n additions.set(\n column,\n `CASE WHEN ${item.scope} AND jsonb_typeof(properties -> ${literal(property)}) = 'string' THEN properties ->> ${literal(property)} END`\n )\n }\n\n const missing = [...additions].filter(([column]) => !columns.has(column))\n if (missing.length > 0) {\n await connection.unsafe(\n `ALTER TABLE ${table} ${missing.map(([column, expression]) => `ADD COLUMN ${identifier(column)} text GENERATED ALWAYS AS (${expression}) STORED`).join(\", \")}`\n )\n }\n\n for (const item of definitions) {\n const statements = textCountIndexStatements(item)\n for (const [name, expression] of statements) {\n await connection.unsafe(\n `CREATE INDEX CONCURRENTLY IF NOT EXISTS ${identifier(name)} ON ${table} ${expression}`\n )\n const [valid] = await connection<{ indisvalid: boolean }[]>`\n SELECT indisvalid FROM pg_index\n WHERE indexrelid = ${`${identifier(schema)}.${identifier(name)}`}::regclass\n `\n if (!valid?.indisvalid)\n throw new Error(\n `[SixbPg] Text count index ${schema}.${name} is invalid. Drop it concurrently and retry preparation.`\n )\n }\n await connection.unsafe(\n `COMMENT ON INDEX ${identifier(schema)}.${identifier(item.name)} IS ${literal(JSON.stringify(item.definition))}`\n )\n names.push(item.name)\n }\n await connection.unsafe(`ANALYZE ${table}`)\n } catch (error) {\n connected = !isConnectionLost(error)\n throw error\n } finally {\n if (connected)\n await connection`SELECT pg_advisory_unlock(hashtextextended(${`${schema}.objects.query-indexes`}, 0))`\n }\n })\n return names\n}\n\ntype TextCountDefinition = ReturnType<typeof describe>\n\n/** Cover compact text/filter values; separate overflow indexes preserve unbounded values. */\nfunction textCountIndexStatements(item: TextCountDefinition): [string, string][] {\n const predicate = `${item.scope} AND (${item.compact})`\n const statements: [string, string][] = [\n [\n item.name,\n `(${[...item.filters.values(), item.textColumn].map(identifier).join(\", \")}) WHERE ${predicate}`,\n ],\n [\n `${item.name}_gin`,\n `USING gin (${identifier(item.textColumn)} public.gin_trgm_ops) WHERE ${predicate}`,\n ],\n [`${item.name}_overflow`, `(primary_id) WHERE ${item.scope} AND NOT (${item.compact})`],\n ]\n\n if (item.filters.size > 0) {\n const columns = [...item.filters.values()].map(identifier)\n const compact = columns\n .map((column) => `(${column} IS NOT NULL AND octet_length(${column}) <= 128)`)\n .join(\" AND \")\n statements.push(\n [`${item.name}_facets`, `(${columns.join(\", \")}) WHERE ${item.scope} AND (${compact})`],\n [`${item.name}_facet_overflow`, `(primary_id) WHERE ${item.scope} AND NOT (${compact})`],\n [\n `${item.name}_text_facets_overflow`,\n `(primary_id) WHERE ${item.scope} AND NOT ((${item.compact}) AND (${columns.map((column) => `${column} IS NOT NULL`).join(\" AND \")}))`,\n ]\n )\n }\n\n return statements\n}\n\n/** Narrow optimization for flat counts; unsupported predicates and selected scopes use the normal compiler. */\nexport async function compilePgIndexedTextCount(\n sql: SQLClient,\n projectId: string,\n query: ObjectQuery\n): Promise<{ sql: string; args: unknown[] } | undefined> {\n return compilePgIndexedTextAggregate(sql, projectId, query)\n}\n\nexport async function compilePgIndexedTextFacets(\n sql: SQLClient,\n projectId: string,\n query: ObjectQuery,\n facets: readonly { propertyId: string; limit: number }[]\n): Promise<{ sql: string; args: unknown[] } | undefined> {\n return compilePgIndexedTextAggregate(sql, projectId, query, facets)\n}\n\n/** Try compact indexes first, then merge exact results for values outside their size bounds. */\nasync function compilePgIndexedTextAggregate(\n sql: SQLClient,\n projectId: string,\n query: ObjectQuery,\n facets?: readonly { propertyId: string; limit: number }[]\n): Promise<{ sql: string; args: unknown[] } | undefined> {\n const shape = flatCount(query)\n if (!shape || (!shape.text.length && !facets)) return undefined\n\n const rows = await sql<{ name: string; definition: string }[]>`\n SELECT c.relname AS name, obj_description(c.oid,'pg_class') AS definition\n FROM pg_index i JOIN pg_class c ON c.oid=i.indexrelid\n WHERE i.indrelid='objects'::regclass AND i.indisvalid\n AND c.relname LIKE 'sixb_text_count_%' AND obj_description(c.oid,'pg_class') IS NOT NULL`\n for (const row of rows) {\n const definition = parseDefinition(row.definition)\n if (\n !definition ||\n definition.projectId !== projectId ||\n definition.objectTypeId !== shape.objectTypeId\n )\n continue\n const item = describe(definition)\n if (item.name !== row.name) continue\n if (facets?.some((facet) => !item.filters.has(facet.propertyId))) continue\n if (\n shape.text.some((text) => {\n const fields = text.fields?.length\n ? text.fields\n : text.fieldsByObjectType?.[shape.objectTypeId]\n return fields?.length !== 1 || fields[0] !== definition.propertyId\n })\n )\n continue\n\n const args: unknown[] = []\n const bind = (value: unknown) => {\n args.push(value)\n return `$${args.length}`\n }\n const where = [\n `project_id=${bind(projectId)}`,\n `object_type_id=${bind(shape.objectTypeId)}`,\n `(${item.compact})`,\n ]\n let supported = true\n for (const predicate of shape.predicates) {\n const condition = stringPredicate(predicate, item.filters, bind)\n if (!condition) {\n supported = false\n break\n }\n where.push(condition)\n }\n if (!supported) continue\n\n const broadWhere = [...where]\n for (const text of shape.text) {\n const terms = text.query.trim().toLowerCase().split(/\\s+/).filter(Boolean)\n if (!terms.length) {\n where.push(\"false\")\n broadWhere.push(\"false\")\n }\n for (const term of terms) {\n where.push(\n `${identifier(item.textColumn)} LIKE ${bind(`%${term.replace(/[\\\\%_]/g, \"\\\\$&\")}%`)}::text`\n )\n // POSITION deliberately chooses a covering B-tree scan for broad searches; GIN\n // must fetch/recheck the heap and becomes lossy beyond work_mem.\n broadWhere.push(`position(${bind(term)}::text in ${identifier(item.textColumn)}) > 0`)\n }\n }\n\n const input = { projectId, query, item, where, broadWhere, args }\n if (facets) return compileIndexedFacets(input, facets, shape.text.length > 0, bind)\n return compileIndexedCount(input)\n }\n return undefined\n}\n\ninterface IndexedAggregateInput {\n projectId: string\n query: ObjectQuery\n item: TextCountDefinition\n where: string[]\n broadWhere: string[]\n args: unknown[]\n}\n\nfunction compileIndexedFacets(\n { projectId, query, item, where, broadWhere, args }: IndexedAggregateInput,\n facets: readonly { propertyId: string; limit: number }[],\n hasText: boolean,\n bind: (value: unknown) => string\n): { sql: string; args: unknown[] } {\n const allString =\n [...item.filters.values()].map((column) => `${identifier(column)} IS NOT NULL`).join(\" AND \") ||\n \"true\"\n const filterCompact =\n [...item.filters.values()]\n .map(\n (column) =>\n `(${identifier(column)} IS NOT NULL AND octet_length(${identifier(column)}) <= 128)`\n )\n .join(\" AND \") || \"true\"\n const compact = hasText ? `(${item.compact}) AND (${allString})` : filterCompact\n // Plain facets do not need to read the text column. Their covering index is tiny.\n const nativeWhere = hasText\n ? [...where, allString]\n : [where[0]!, where[1]!, compact, ...where.slice(3)]\n const nativeBroad = [...broadWhere, allString]\n const fields = facets\n .map(\n (facet, i) =>\n `'string'::text AS f${i}_type, ${identifier(item.filters.get(facet.propertyId)!)} AS f${i}_value`\n )\n .join(\", \")\n\n // Read oversized or non-string values through the general compiler.\n const overflow = compilePgObjectQuery(projectId, query, {\n includeTotal: false,\n source: {\n ...DEFAULT_OBJECT_QUERY_SOURCE,\n objectsTable: `(SELECT * FROM objects WHERE ${item.scope} AND NOT (${compact}) OFFSET 0) AS _sixb_facet_overflow`,\n },\n })\n const offset = args.length\n const overflowSql = overflow.sql.replace(/\\$(\\d+)/g, (_, number) => `$${Number(number) + offset}`)\n args.push(...overflow.args)\n const overflowFields = facets\n .map((facet, i) => {\n const property = bind(facet.propertyId)\n return `jsonb_typeof(properties -> ${property}::text) AS f${i}_type, properties ->> ${property}::text AS f${i}_value`\n })\n .join(\", \")\n\n // Probe at most 4097 matches before choosing the broad covering-index scan.\n const native = hasText\n ? `WITH _sixb_bounded AS MATERIALIZED (SELECT ${fields} FROM objects WHERE ${nativeWhere.join(\" AND \")} LIMIT 4097)\n SELECT * FROM _sixb_bounded WHERE (SELECT count(*) FROM _sixb_bounded) <= 4096\n UNION ALL SELECT ${fields} FROM objects WHERE ${nativeBroad.join(\" AND \")} AND (SELECT count(*) FROM _sixb_bounded) > 4096`\n : `SELECT ${fields} FROM objects WHERE ${nativeWhere.join(\" AND \")}`\n return compilePgFacetSummary(\n {\n sql: `SELECT * FROM (${native}) AS _sixb_native_facets UNION ALL SELECT ${overflowFields} FROM (${overflowSql}) AS _sixb_overflow_facets`,\n args,\n },\n facets,\n true\n )\n}\n\nfunction compileIndexedCount({\n projectId,\n query,\n item,\n where,\n broadWhere,\n args,\n}: IndexedAggregateInput): { sql: string; args: unknown[] } {\n const overflow = compilePgObjectCountQuery(projectId, query, {\n source: {\n ...DEFAULT_OBJECT_QUERY_SOURCE,\n objectsTable: `(SELECT * FROM objects WHERE ${item.scope} AND NOT (${item.compact}) OFFSET 0) AS _sixb_long_text`,\n },\n })\n const offset = args.length\n return {\n sql: `WITH _sixb_bounded_text_count AS MATERIALIZED (SELECT 1 FROM objects WHERE ${where.join(\" AND \")} LIMIT 4097)\n SELECT CASE WHEN (SELECT count(*) FROM _sixb_bounded_text_count) > 4096\n THEN (SELECT count(*) FROM objects WHERE ${broadWhere.join(\" AND \")})\n ELSE (SELECT count(*) FROM _sixb_bounded_text_count) END\n + (${overflow.sql.replace(/\\$(\\d+)/g, (_, number) => `$${Number(number) + offset}`)}) AS count`,\n args: [...args, ...overflow.args],\n }\n}\n\nfunction flatCount(query: ObjectQuery):\n | {\n objectTypeId: string\n text: Extract<ObjectQuery, { kind: \"text\" }>[]\n predicates: ObjectQueryPredicate[]\n }\n | undefined {\n if (query.kind === \"start\")\n return query.includeSubtypes\n ? undefined\n : { objectTypeId: query.objectTypeId, text: [], predicates: [] }\n if (![\"filter\", \"text\", \"sort\", \"expand\"].includes(query.kind) || !(\"input\" in query))\n return undefined\n const shape = flatCount(query.input)\n if (!shape) return undefined\n if (query.kind === \"text\") shape.text.push(query)\n if (query.kind === \"filter\") shape.predicates.push(query.predicate)\n return shape\n}\n\nfunction stringPredicate(\n predicate: ObjectQueryPredicate,\n columns: ReadonlyMap<string, string>,\n bind: (value: unknown) => string\n): string | undefined {\n if (predicate.op === \"and\" || predicate.op === \"or\") {\n if (!predicate.items.length) return predicate.op === \"and\" ? \"true\" : \"false\"\n const items = predicate.items.map((item) => stringPredicate(item, columns, bind))\n return items.every((item) => item !== undefined)\n ? `(${items.join(predicate.op === \"and\" ? \" AND \" : \" OR \")})`\n : undefined\n }\n if ((predicate.op !== \"eq\" && predicate.op !== \"in\") || predicate.scalarKind === \"decimal\")\n return undefined\n const column = columns.get(predicate.propertyId)\n if (!column) return undefined\n const values = predicate.op === \"in\" ? predicate.values : [predicate.value]\n if (!values.every((value) => typeof value === \"string\")) return undefined\n return values.length\n ? `${identifier(column)} IN (${values.map((value) => `${bind(value)}::text`).join(\", \")})`\n : \"false\"\n}\n\nfunction parseDefinition(text: string): PgObjectTextCountIndex | undefined {\n try {\n const value: unknown = JSON.parse(text)\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"projectId\" in value) ||\n typeof value.projectId !== \"string\" ||\n !(\"objectTypeId\" in value) ||\n typeof value.objectTypeId !== \"string\" ||\n !(\"propertyId\" in value) ||\n typeof value.propertyId !== \"string\" ||\n !(\"filters\" in value) ||\n !Array.isArray(value.filters) ||\n value.filters.length > 4 ||\n !value.filters.every((field) => typeof field === \"string\")\n )\n return undefined\n return {\n projectId: value.projectId,\n objectTypeId: value.objectTypeId,\n propertyId: value.propertyId,\n filters: value.filters,\n }\n } catch {\n return undefined\n }\n}\n\nfunction hash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 24)\n}\n\nfunction identifier(value: string): string {\n return `\"${value.replace(/\"/g, '\"\"')}\"`\n}\n\nfunction literal(value: string): string {\n if (value.includes(\"\\0\")) throw new Error(\"[SixbPg] Text count identifiers cannot contain NUL\")\n return `E'${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"''\")}'`\n}\n",
35
39
  "import type {\n CompiledSelectedObjectReadScope,\n ObjectQueryCapabilities,\n ObjectReadExecutionLimits,\n ObjectReadStorage,\n} from \"@sixb/core/storage\"\nimport {\n assertObjectReaderProject,\n assertObjectReadFacetCount,\n assertObjectReadOutputWithinLimit,\n ObjectReadLimitExceededError,\n snapshotObjectReadExecutionLimits,\n} from \"@sixb/core/storage\"\nimport type { SQLClient, SqlParameter } from \"../pg-client\"\nimport { type PgStoreClient, runPgRepeatableReadTransaction } from \"../transactions\"\nimport { compilePgSelectedObjectReadSource, type PgSelectedObjectReadSource } from \"./read-scope\"\n\nimport { assertLinkQueryLimit, PgObjectReader } from \"./reader\"\n\nexport function createPgSelectedReader(\n sql: PgStoreClient,\n params: {\n projectId: string\n scope: CompiledSelectedObjectReadScope\n limits: ObjectReadExecutionLimits\n },\n queryCapabilities: () => ObjectQueryCapabilities\n): ObjectReadStorage {\n const projectId = params.projectId\n const limits = snapshotObjectReadExecutionLimits(params.limits)\n const source = compilePgSelectedObjectReadSource(\n projectId,\n params.scope,\n limits.maxTraversalFacts\n )\n const assertProject = (actualProjectId: string): void =>\n assertObjectReaderProject(projectId, actualProjectId)\n const read = <T>(run: (reader: PgObjectReader) => Promise<T>): Promise<T> =>\n runPgRepeatableReadTransaction(sql, async (tx) => {\n await assertTraversalBudget(tx, source, limits.maxTraversalFacts)\n const value = await run(new PgObjectReader(tx, source))\n assertObjectReadOutputWithinLimit(value, limits)\n return value\n })\n const readMap = <TKey, TValue>(\n run: (reader: PgObjectReader) => Promise<Map<TKey, TValue>>\n ): Promise<Map<TKey, TValue>> =>\n runPgRepeatableReadTransaction(sql, async (tx) => {\n await assertTraversalBudget(tx, source, limits.maxTraversalFacts)\n const value = await run(new PgObjectReader(tx, source))\n assertObjectReadOutputWithinLimit([...value.entries()], limits)\n return value\n })\n\n return Object.freeze({\n queryCapabilities,\n queryObjects: async (input) => {\n assertProject(input.projectId)\n return read((reader) => reader.queryObjects(input))\n },\n countObjects: async (input) => {\n assertProject(input.projectId)\n return read((reader) => reader.countObjects(input))\n },\n existsObjects: async (input) => {\n assertProject(input.projectId)\n return read((reader) => reader.existsObjects(input))\n },\n facetObjects: async (input) => {\n assertProject(input.projectId)\n assertObjectReadFacetCount(input.facets.length)\n return read((reader) => reader.facetObjects(input))\n },\n getByPrimaryId: async (input) => {\n assertProject(input.projectId)\n return read((reader) => reader.getByPrimaryId(input))\n },\n selectsObjectProperties: async (input) => {\n assertProject(input.projectId)\n return read((reader) => reader.selectsObjectProperties(input))\n },\n listLinks: async (input) => {\n assertProject(input.projectId)\n return read((reader) => reader.listLinks(input))\n },\n getByPrimaryIdBatch: async (input) => {\n assertProject(input.projectId)\n return readMap((reader) => reader.getByPrimaryIdBatch(input))\n },\n listLinksBatch: async (input) => {\n assertProject(input.projectId)\n return readMap((reader) => reader.listLinksBatch(input))\n },\n queryLinks: async (input) => {\n assertProject(input.projectId)\n assertLinkQueryLimit(input.limit)\n return read((reader) => reader.queryLinks(input))\n },\n list: async (input) => {\n assertProject(input.projectId)\n return read((reader) => reader.list(input))\n },\n } satisfies ObjectReadStorage)\n}\n\nasync function assertTraversalBudget(\n sql: SQLClient,\n source: PgSelectedObjectReadSource,\n maxTraversalFacts: number\n): Promise<void> {\n const [row] = await sql.unsafe<{ total: string | number | bigint }[]>(\n source.traversalProbe.sql,\n source.traversalProbe.args as SqlParameter[]\n )\n if (BigInt(row?.total ?? 0) > BigInt(maxTraversalFacts)) {\n throw new ObjectReadLimitExceededError(\"traversalFacts\", maxTraversalFacts)\n }\n}\n",
36
40
  "import type { CompiledSelectedObjectReadScope } from \"@sixb/core/storage\"\nimport {\n type CompiledPgObjectQuery,\n compilePgObjectStatement,\n type PgObjectQuerySource,\n} from \"./query-compiler\"\n\nexport interface PgSelectedObjectReadSource extends PgObjectQuerySource {\n readonly objectPropertyPermissionsTable: string\n readonly traversalProbe: {\n readonly sql: string\n readonly args: readonly unknown[]\n }\n}\n\n/**\n * Prepare one immutable selected scope as live, path-sensitive PostgreSQL relations.\n *\n * The complete compiled scope is serialized once. Every statement receives that one JSONB\n * document and the bound project id, keeping the parameter count constant as selections grow.\n * Group property grants after resolving paths so redaction reads only each object's own grants.\n */\nexport function compilePgSelectedObjectReadSource(\n projectId: string,\n scope: CompiledSelectedObjectReadScope,\n maxTraversalFacts: number\n): PgSelectedObjectReadSource {\n const scopeJson = JSON.stringify({\n roots: scope.roots,\n objects: scope.objects,\n steps: scope.steps,\n })\n const compiled = compileSelectedReadScopeCte(scopeJson, projectId)\n const wrapStatement = (sql: string, args: readonly unknown[] = []) => ({\n sql: `${compiled.sql}\\n${sql}`,\n args: [...compiled.args, ...args],\n })\n\n const source: PgSelectedObjectReadSource = {\n objectsTable: \"_sixb_scope_objects\",\n linksTable: \"_sixb_scope_links\",\n objectPropertyPermissionsTable: \"_sixb_scope_object_permissions\",\n wrapStatement,\n wrapQuery: (query: CompiledPgObjectQuery): CompiledPgObjectQuery => ({\n ...query,\n ...wrapStatement(query.sql, query.args),\n vectorProbe: query.vectorProbe\n ? { ...query.vectorProbe, ...wrapStatement(query.vectorProbe.sql, query.vectorProbe.args) }\n : undefined,\n totalSql: `${compiled.sql}\\n${query.totalSql}`,\n totalArgs: [...compiled.args, ...query.totalArgs],\n ...(query.hasMoreProbe\n ? {\n hasMoreProbe: {\n ...query.hasMoreProbe,\n ...wrapStatement(query.hasMoreProbe.sql, query.hasMoreProbe.args),\n },\n }\n : {}),\n }),\n traversalProbe: { sql: \"\", args: [] },\n }\n\n const traversalProbe = compilePgObjectStatement(\n `\n SELECT COUNT(*)::bigint AS total\n FROM (\n SELECT 1 AS traversal_fact\n FROM _sixb_scope_root_facts\n\n UNION ALL\n\n SELECT 1 AS traversal_fact\n FROM _sixb_scope_reached_links\n\n LIMIT ?\n ) AS bounded_traversal_facts\n `,\n [BigInt(maxTraversalFacts) + 1n],\n source\n )\n\n return Object.freeze({ ...source, traversalProbe })\n}\n\ninterface CompiledReadScopeCte {\n readonly sql: string\n readonly args: readonly unknown[]\n}\n\nfunction compileSelectedReadScopeCte(scopeJson: string, projectId: string): CompiledReadScopeCte {\n return {\n sql: `\n WITH RECURSIVE\n _sixb_scope_document(scope) AS (\n SELECT ?::text::jsonb\n ),\n _sixb_scope_roots(root_id, node_id, object_type_id, primary_id) AS (\n SELECT\n (root.ordinality - 1)::integer,\n (root.value ->> 'nodeId')::integer,\n root.value ->> 'objectTypeId',\n root.value ->> 'primaryId'\n FROM _sixb_scope_document AS document\n CROSS JOIN LATERAL jsonb_array_elements(document.scope -> 'roots')\n WITH ORDINALITY AS root(value, ordinality)\n ),\n _sixb_scope_root_facts(project_id, root_id, node_id, object_type_id, primary_id) AS (\n SELECT anchor.project_id, root.root_id, root.node_id, root.object_type_id, root.primary_id\n FROM _sixb_scope_roots AS root\n JOIN objects AS anchor\n ON anchor.project_id = ?\n AND anchor.object_type_id = root.object_type_id\n AND anchor.primary_id = root.primary_id\n ),\n _sixb_scope_object_selections(node_id, object_type_id, property_ids) AS (\n SELECT\n (selection.value ->> 'nodeId')::integer,\n selection.value ->> 'objectTypeId',\n selection.value -> 'propertyIds'\n FROM _sixb_scope_document AS document\n CROSS JOIN LATERAL jsonb_array_elements(document.scope -> 'objects') AS selection(value)\n ),\n _sixb_scope_link_selections(\n step_id,\n node_id,\n parent_node_id,\n source_object_type_id,\n link_id,\n target_object_type_id,\n property_ids\n ) AS (\n SELECT\n (step.ordinality - 1)::integer,\n (step.value ->> 'nodeId')::integer,\n (step.value ->> 'parentNodeId')::integer,\n step.value ->> 'sourceObjectTypeId',\n step.value ->> 'linkId',\n step.value ->> 'targetObjectTypeId',\n step.value -> 'propertyIds'\n FROM _sixb_scope_document AS document\n CROSS JOIN LATERAL jsonb_array_elements(document.scope -> 'steps')\n WITH ORDINALITY AS step(value, ordinality)\n ),\n _sixb_scope_reachable(project_id, node_id, object_type_id, primary_id) AS (\n SELECT root.project_id, root.node_id, root.object_type_id, root.primary_id\n FROM _sixb_scope_root_facts AS root\n\n UNION\n\n SELECT edge.project_id, selection.node_id, edge.target_type_id, edge.target_id\n FROM _sixb_scope_reachable AS parent\n JOIN _sixb_scope_link_selections AS selection\n ON selection.parent_node_id = parent.node_id\n AND selection.source_object_type_id = parent.object_type_id\n JOIN links AS edge\n ON edge.project_id = parent.project_id\n AND edge.source_type_id = parent.object_type_id\n AND edge.source_id = parent.primary_id\n AND edge.link_id = selection.link_id\n AND edge.target_type_id = selection.target_object_type_id\n JOIN objects AS target\n ON target.project_id = edge.project_id\n AND target.object_type_id = edge.target_type_id\n AND target.primary_id = edge.target_id\n ),\n _sixb_scope_object_permissions(project_id, object_type_id, primary_id, property_id) AS (\n SELECT DISTINCT\n reachable.project_id,\n reachable.object_type_id,\n reachable.primary_id,\n selected_property.value\n FROM _sixb_scope_reachable AS reachable\n JOIN _sixb_scope_object_selections AS selection\n ON selection.node_id = reachable.node_id\n AND selection.object_type_id = reachable.object_type_id\n CROSS JOIN LATERAL jsonb_array_elements_text(selection.property_ids)\n AS selected_property(value)\n ),\n _sixb_scope_object_ids(project_id, object_type_id, primary_id) AS (\n SELECT DISTINCT project_id, object_type_id, primary_id\n FROM _sixb_scope_reachable\n ),\n _sixb_scope_object_grants AS (\n SELECT reachable.project_id, reachable.object_type_id, reachable.primary_id,\n array_agg(DISTINCT selected_property.value) FILTER (WHERE selected_property.value IS NOT NULL) AS property_ids\n FROM _sixb_scope_reachable AS reachable\n LEFT JOIN _sixb_scope_object_selections AS selection\n ON selection.node_id = reachable.node_id\n AND selection.object_type_id = reachable.object_type_id\n LEFT JOIN LATERAL jsonb_array_elements_text(selection.property_ids) AS selected_property(value) ON true\n GROUP BY reachable.project_id, reachable.object_type_id, reachable.primary_id\n ),\n _sixb_scope_objects AS (\n SELECT stored.project_id, stored.object_type_id, stored.primary_id,\n COALESCE((\n SELECT jsonb_object_agg(property.key, property.value)\n FROM jsonb_each(stored.properties) AS property(key, value)\n WHERE property.key = ANY(grants.property_ids)\n ), '{}'::jsonb) AS properties,\n stored.created_at, stored.updated_at, stored.version, stored.last_commit_id\n FROM _sixb_scope_object_grants AS grants\n JOIN objects AS stored\n ON stored.project_id = grants.project_id\n AND stored.object_type_id = grants.object_type_id\n AND stored.primary_id = grants.primary_id\n ),\n _sixb_scope_reached_links(\n project_id,\n step_id,\n node_id,\n parent_node_id,\n source_type_id,\n source_id,\n link_id,\n target_type_id,\n target_id,\n property_ids\n ) AS (\n SELECT\n edge.project_id,\n selection.step_id,\n selection.node_id,\n selection.parent_node_id,\n edge.source_type_id,\n edge.source_id,\n edge.link_id,\n edge.target_type_id,\n edge.target_id,\n selection.property_ids\n FROM _sixb_scope_reachable AS parent\n JOIN _sixb_scope_link_selections AS selection\n ON selection.parent_node_id = parent.node_id\n AND selection.source_object_type_id = parent.object_type_id\n JOIN links AS edge\n ON edge.project_id = parent.project_id\n AND edge.source_type_id = parent.object_type_id\n AND edge.source_id = parent.primary_id\n AND edge.link_id = selection.link_id\n AND edge.target_type_id = selection.target_object_type_id\n JOIN objects AS target\n ON target.project_id = edge.project_id\n AND target.object_type_id = edge.target_type_id\n AND target.primary_id = edge.target_id\n ),\n _sixb_scope_link_permissions(\n project_id,\n source_type_id,\n source_id,\n link_id,\n target_type_id,\n target_id,\n property_id\n ) AS (\n SELECT DISTINCT\n reached.project_id,\n reached.source_type_id,\n reached.source_id,\n reached.link_id,\n reached.target_type_id,\n reached.target_id,\n selected_property.value\n FROM _sixb_scope_reached_links AS reached\n CROSS JOIN LATERAL jsonb_array_elements_text(reached.property_ids)\n AS selected_property(value)\n ),\n _sixb_scope_link_ids(\n project_id,\n source_type_id,\n source_id,\n link_id,\n target_type_id,\n target_id\n ) AS (\n SELECT DISTINCT\n project_id,\n source_type_id,\n source_id,\n link_id,\n target_type_id,\n target_id\n FROM _sixb_scope_reached_links\n ),\n _sixb_scope_links AS (\n SELECT\n stored.project_id,\n stored.source_type_id,\n stored.source_id,\n stored.link_id,\n stored.target_type_id,\n stored.target_id,\n CASE\n WHEN stored.properties IS NULL THEN NULL\n ELSE NULLIF(\n (\n SELECT jsonb_object_agg(property.key, property.value)\n FROM jsonb_each(stored.properties) AS property(key, value)\n JOIN _sixb_scope_link_permissions AS permission\n ON permission.project_id = stored.project_id\n AND permission.source_type_id = stored.source_type_id\n AND permission.source_id = stored.source_id\n AND permission.link_id = stored.link_id\n AND permission.target_type_id = stored.target_type_id\n AND permission.target_id = stored.target_id\n AND permission.property_id = property.key\n ),\n '{}'::jsonb\n )\n END AS properties,\n stored.created_at,\n stored.updated_at,\n stored.last_commit_id\n FROM links AS stored\n JOIN _sixb_scope_link_ids AS visible\n ON visible.project_id = stored.project_id\n AND visible.source_type_id = stored.source_type_id\n AND visible.source_id = stored.source_id\n AND visible.link_id = stored.link_id\n AND visible.target_type_id = stored.target_type_id\n AND visible.target_id = stored.target_id\n )\n `,\n args: [scopeJson, projectId],\n }\n}\n",
37
- "import { parseSixbFailure } from \"@sixb/core/internal/errors\"\nimport { MaterializationConflictError } from \"@sixb/core/internal/materialization\"\nimport {\n sourceAssertionFromColumns,\n sourceEntityFromKey,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n AssertSourceMaterializationExecutionInput,\n OntologyCommitRecord,\n OntologyCommitWrite,\n OntologyOutboxRecord,\n OntologySourceRecord,\n StageSourceAssertion,\n} from \"@sixb/core/storage\"\nimport { ONTOLOGY_OUTBOX_FAILURE_CODES } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\n\nexport {\n assertNonblank,\n assertNonnegativeInteger,\n assertPositiveInteger,\n assertTimestamp,\n canonicalJson,\n linkRefFromColumns,\n objectRefFromColumns,\n originColumns,\n originWhere,\n sourceEntityKey,\n} from \"@sixb/core/internal/ontology-storage-provider\"\n\nexport type PgRootOperation = <T>(run: (sql: SQLClient) => Promise<T>) => Promise<T>\n\ntype PgJsonValue = Parameters<SQLClient[\"json\"]>[0]\n\nexport interface PgOntologyCommitRow {\n readonly project_id: string\n readonly id: string\n readonly idempotency_key: string\n readonly request_hash: string\n readonly execution_id: string\n readonly origin_kind: string\n readonly origin_run_id: string | null\n readonly origin_batch_ordinal: number | string | null\n readonly origin: unknown\n readonly requested_by: unknown | null\n readonly executor: unknown\n readonly ontology_revision: string\n readonly projection_revision: string | null\n readonly ownership_hash: string | null\n readonly intent: unknown\n readonly result: unknown\n readonly committed_at: Date | string\n}\n\nexport interface PgOntologySourceRow {\n readonly version_id: string\n readonly project_id: string\n readonly source_id: string\n readonly materialization_id: string\n readonly projection_run_id: string\n readonly projection_kind: \"object\" | \"link\"\n readonly protocol: \"replacement\"\n readonly status: OntologySourceRecord[\"status\"]\n readonly execution_token: string | null\n readonly dataset_id: string\n readonly dataset_version_id: string\n readonly dataset_version_created_at: Date | string\n readonly projection_revision: string\n readonly ownership_hash: string\n readonly ontology_revision: string\n readonly root_count: number | string | null\n readonly base_materialization_id: string | null\n readonly base_commit_id: string | null\n readonly assertion_count: number | string | null\n readonly created_at: Date | string\n readonly ready_at: Date | string | null\n readonly activated_at: Date | string | null\n readonly terminal_at: Date | string | null\n readonly last_commit_id: string | null\n readonly updated_at: Date | string\n}\n\n/** An assertion with its root and version, as `sourceAssertionColumns` selects it. */\nexport interface PgOntologySourceAssertionRow {\n readonly source_id: string\n readonly materialization_id: string\n readonly root_key: string\n readonly staging_ordinal: number | string\n readonly entity_kind: \"object\" | \"link\"\n readonly object_type_id: string | null\n readonly primary_id: string | null\n readonly source_type_id: string | null\n readonly source_primary_id: string | null\n readonly link_id: string | null\n readonly target_type_id: string | null\n readonly target_primary_id: string | null\n readonly payload: unknown\n}\n\nexport interface PgStoredOverrideRow {\n readonly value: unknown\n readonly last_commit_id: string\n readonly updated_at: Date | string\n}\n\nexport interface PgOntologyOutboxRow {\n readonly envelope: unknown\n readonly available_at: Date | string\n readonly attempts: number | string\n readonly lease_id: string | null\n readonly lease_expires_at: Date | string | null\n readonly published_at: Date | string | null\n readonly last_failure: unknown | null\n readonly created_at: Date | string\n}\n\nexport function jsonParameter(sql: SQLClient, value: unknown): ReturnType<SQLClient[\"json\"]> {\n return sql.json(value as PgJsonValue)\n}\n\nexport function toIsoString(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n\nexport function optionalIsoString(value: Date | string | null): string | null {\n return value === null ? null : toIsoString(value)\n}\n\nexport function databaseSafeInteger(value: number | string, label: string): number {\n const result = Number(value)\n if (!Number.isSafeInteger(result) || result < 0) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `${label} is outside the nonnegative safe-integer range.`\n )\n }\n return result\n}\n\nexport function sourceRecord(row: PgOntologySourceRow): OntologySourceRecord {\n return {\n projectId: row.project_id,\n source: { projectionId: row.source_id },\n materializationId: row.materialization_id,\n projectionRunId: row.projection_run_id,\n projectionKind: row.projection_kind,\n protocol: row.protocol,\n status: row.status,\n executionToken: row.execution_token,\n datasetVersion: {\n datasetId: row.dataset_id,\n versionId: row.dataset_version_id,\n createdAt: toIsoString(row.dataset_version_created_at),\n },\n projectionRevision: row.projection_revision,\n ownershipHash: row.ownership_hash,\n ontologyRevision: row.ontology_revision,\n ...(row.base_materialization_id === null\n ? {}\n : {\n base: {\n materializationId: row.base_materialization_id,\n lastCommitId: row.base_commit_id!,\n },\n }),\n rootCount:\n row.root_count === null ? null : databaseSafeInteger(row.root_count, \"Source root count\"),\n assertionCount:\n row.assertion_count === null\n ? null\n : databaseSafeInteger(row.assertion_count, \"Source assertion count\"),\n createdAt: toIsoString(row.created_at),\n readyAt: optionalIsoString(row.ready_at),\n activatedAt: optionalIsoString(row.activated_at),\n terminalAt: optionalIsoString(row.terminal_at),\n lastCommitId: row.last_commit_id,\n updatedAt: toIsoString(row.updated_at),\n }\n}\n\nexport function sourceAssertion(row: PgOntologySourceAssertionRow): StageSourceAssertion {\n return {\n root: sourceEntityFromKey(row.root_key),\n assertion: sourceAssertionFromColumns(row, row.payload),\n stagingOrdinal: databaseSafeInteger(row.staging_ordinal, \"Source staging ordinal\"),\n }\n}\n\nexport function commitRecord(row: PgOntologyCommitRow): OntologyCommitRecord {\n const base = {\n projectId: row.project_id,\n id: row.id,\n idempotencyKey: row.idempotency_key,\n requestHash: row.request_hash,\n executionId: row.execution_id,\n origin: structuredClone(row.origin) as OntologyCommitWrite[\"origin\"],\n ...(row.requested_by === null\n ? {}\n : {\n requestedBy: structuredClone(row.requested_by) as NonNullable<\n OntologyCommitWrite[\"requestedBy\"]\n >,\n }),\n executor: structuredClone(row.executor) as OntologyCommitWrite[\"executor\"],\n ontologyRevision: row.ontology_revision,\n ...(row.projection_revision === null ? {} : { projectionRevision: row.projection_revision }),\n ...(row.ownership_hash === null ? {} : { ownershipHash: row.ownership_hash }),\n committedAt: toIsoString(row.committed_at),\n }\n const intent = structuredClone(row.intent) as OntologyCommitWrite[\"intent\"]\n const result = structuredClone(row.result) as OntologyCommitRecord[\"result\"]\n return { ...base, intent, result } as OntologyCommitRecord\n}\n\nexport function outboxRecord(row: PgOntologyOutboxRow): OntologyOutboxRecord {\n return {\n envelope: structuredClone(row.envelope) as OntologyOutboxRecord[\"envelope\"],\n availableAt: toIsoString(row.available_at),\n attempts: databaseSafeInteger(row.attempts, \"Ontology outbox attempts\"),\n leaseId: row.lease_id,\n leaseExpiresAt: optionalIsoString(row.lease_expires_at),\n publishedAt: optionalIsoString(row.published_at),\n lastFailure:\n row.last_failure === null\n ? null\n : parseSixbFailure(row.last_failure, ONTOLOGY_OUTBOX_FAILURE_CODES),\n createdAt: toIsoString(row.created_at),\n }\n}\n\nexport async function assertProjectionExecution(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly sourceId: string\n readonly projectionRunId: string\n readonly executionToken: string\n readonly identity?: AssertSourceMaterializationExecutionInput[\"identity\"]\n }\n): Promise<void> {\n const [run] = await sql<\n {\n readonly projection_id: string\n readonly projection_kind: string\n readonly status: string\n readonly materialization_protocol: string | null\n readonly execution_token: string | null\n readonly dataset_id: string\n readonly dataset_version_id: string\n readonly dataset_version_created_at: Date | string | null\n readonly ontology_revision: string | null\n readonly projection_revision: string | null\n readonly ownership_hash: string | null\n }[]\n >`\n SELECT projection_id, projection_kind, status, materialization_protocol, execution_token,\n dataset_id, dataset_version_id, dataset_version_created_at,\n ontology_revision, projection_revision, ownership_hash\n FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.projectionRunId}\n FOR UPDATE\n `\n if (!run || run.status !== \"running\") {\n throw new MaterializationConflictError(\n \"run-correlation\",\n `Projection run '${input.projectionRunId}' is missing or is not running.`\n )\n }\n if (run.projection_id !== input.sourceId || run.materialization_protocol !== \"replacement\") {\n throw new MaterializationConflictError(\n \"run-correlation\",\n `Projection run '${input.projectionRunId}' does not own replacement source '${input.sourceId}'.`\n )\n }\n if (run.execution_token !== input.executionToken) {\n throw new MaterializationConflictError(\n \"execution-lost\",\n `Projection run '${input.projectionRunId}' execution token is stale.`\n )\n }\n const identity = input.identity\n if (\n identity &&\n (run.projection_kind !== identity.projectionKind ||\n run.materialization_protocol !== identity.protocol ||\n run.dataset_id !== identity.datasetVersion.datasetId ||\n run.dataset_version_id !== identity.datasetVersion.versionId ||\n run.dataset_version_created_at === null ||\n toIsoString(run.dataset_version_created_at) !== identity.datasetVersion.createdAt ||\n run.ontology_revision !== identity.ontologyRevision ||\n run.projection_revision !== identity.projectionRevision ||\n run.ownership_hash !== identity.ownershipHash)\n ) {\n throw new MaterializationConflictError(\n \"run-correlation\",\n `Projection run '${input.projectionRunId}' immutable source identity does not match.`\n )\n }\n}\n\nexport function ontologyLockKey(kind: string, ...parts: readonly string[]): string {\n return `ontology:${kind}:${JSON.stringify(parts)}`\n}\n",
41
+ "import { createHash } from \"node:crypto\"\nimport type { ObjectQueryIndexDefinition } from \"@sixb/core\"\nimport type { ObjectQueryPreparationPlan, ObjectQueryPreparationResult } from \"@sixb/core/storage\"\nimport type { ReservedSQL, SQL, SQLClient } from \"../pg-client\"\nimport { undoOnFailure, withReservedPgConnection } from \"../transactions\"\nimport { lockPgPreparation } from \"./preparation-lock\"\nimport { ensurePgObjectQueryIndexes, type PgObjectQueryIndex } from \"./query-indexes\"\nimport { type PgObjectTextCountIndex, preparePgObjectTextCounts } from \"./text-count-index\"\n\n/** Reconcile ontology indexes and text columns once per plan, coordinating concurrent startups. */\nexport async function preparePgObjectQueries(\n sql: SQL,\n schema: string,\n plan: ObjectQueryPreparationPlan\n): Promise<ObjectQueryPreparationResult> {\n const fingerprint = preparationFingerprint(plan)\n const current = await readCompletedPreparation(sql, fingerprint)\n if (current) return current\n\n // Hold one session through the entire preparation, including CONCURRENTLY builds (which\n // cannot run in a transaction). Helpers reuse it instead of taking another pool connection.\n return withReservedPgConnection(sql, async (connection) => {\n const key = `${schema}.objects.query-indexes`\n await lockPgPreparation(connection, key)\n const unlock = () => connection`SELECT pg_advisory_unlock(hashtextextended(${key}, 0))`\n const result = await undoOnFailure(async () => {\n const existing = await readCompletedPreparation(connection, fingerprint)\n if (existing) return existing\n\n console.info(\n `[SixbPg] Preparing query indexes for ${plan.projectId}; initial backfills may block writes.`\n )\n const result = await prepareStructures(connection, schema, plan)\n\n // Record completion only after every index and generated-column backfill succeeds.\n await connection`\n INSERT INTO object_query_preparation (singleton, fingerprint, result)\n VALUES (true, ${fingerprint}, ${connection.json({ ...result, warnings: [...result.warnings] })})\n ON CONFLICT (singleton) DO UPDATE\n SET fingerprint = excluded.fingerprint, result = excluded.result, prepared_at = now()\n `\n return result\n }, unlock)\n await unlock()\n\n return result\n })\n}\n\nfunction preparationFingerprint(plan: ObjectQueryPreparationPlan): string {\n const objectTypes = plan.objectTypes\n .map((type) => ({\n objectTypeId: type.objectTypeId,\n properties: [...type.properties].sort((a, b) => a.propertyId.localeCompare(b.propertyId)),\n indexes: type.indexes\n .map(normalizeIndex)\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n }))\n .sort((a, b) => a.objectTypeId.localeCompare(b.objectTypeId))\n\n // Bump the version when physical generation changes, even if the ontology stays the same.\n const definition = { version: 1, projectId: plan.projectId, objectTypes }\n return createHash(\"sha256\").update(JSON.stringify(definition)).digest(\"hex\")\n}\n\nfunction normalizeIndex(index: ObjectQueryIndexDefinition) {\n if (index.kind === \"sort\") {\n return {\n kind: index.kind,\n fields: index.fields.map((field) => ({\n propertyId: field.propertyId,\n direction: field.direction ?? \"asc\",\n })),\n filters: index.filters ?? [],\n }\n }\n\n return {\n kind: index.kind,\n propertyId: index.propertyId,\n filters: [...(index.filters ?? [])].sort(),\n }\n}\n\nasync function readCompletedPreparation(\n sql: SQLClient,\n fingerprint: string\n): Promise<ObjectQueryPreparationResult | undefined> {\n const [row] = await sql<{ result: ObjectQueryPreparationResult }[]>`\n SELECT result FROM object_query_preparation\n WHERE singleton AND fingerprint = ${fingerprint}\n `\n if (!row) return undefined\n\n return { ...row.result, status: \"current\" }\n}\n\nasync function prepareStructures(\n sql: ReservedSQL,\n schema: string,\n plan: ObjectQueryPreparationPlan\n): Promise<ObjectQueryPreparationResult> {\n const { indexes, textCounts, warnings } = compilePreparationPlan(plan)\n\n if (indexes.some((index) => index.kind === \"text\") || textCounts.length > 0) {\n await ensureTrigrams(sql)\n }\n\n const names = await ensurePgObjectQueryIndexes(sql, schema, indexes)\n const texts = await preparePgObjectTextCounts(sql, schema, textCounts)\n return {\n status: \"prepared\",\n objectTypes: plan.objectTypes.length,\n indexes: new Set([...names, ...texts]).size,\n warnings,\n }\n}\n\nfunction compilePreparationPlan(plan: ObjectQueryPreparationPlan) {\n const indexes: PgObjectQueryIndex[] = []\n const textCounts: PgObjectTextCountIndex[] = []\n const warnings: string[] = []\n\n for (const type of plan.objectTypes) {\n const scope = { projectId: plan.projectId, objectTypeId: type.objectTypeId }\n indexes.push({ ...scope, kind: \"incomingLinks\" })\n\n for (const property of type.properties) {\n if (property.text) indexes.push({ ...scope, kind: \"text\", propertyId: property.propertyId })\n if (property.sortable) {\n indexes.push({\n ...scope,\n kind: \"sort\",\n fields: [{ propertyId: property.propertyId, scalarKind: property.scalarKind }],\n })\n }\n\n if (property.filterable && property.scalarKind === \"string\") {\n indexes.push({ ...scope, kind: \"filter\", properties: [property.propertyId] })\n } else if (\n property.filterable &&\n property.scalarKind &&\n [\"integer\", \"double\", \"boolean\", \"date\", \"timestamp\", \"uuid\"].includes(property.scalarKind)\n ) {\n indexes.push({ ...scope, kind: \"value\", propertyId: property.propertyId })\n } else if (property.filterable) {\n warnings.push(\n `${type.objectTypeId}.${property.propertyId}: no dedicated equality index for ${property.scalarKind ?? \"this schema\"}; queries remain exact through the general path.`\n )\n }\n }\n\n for (const index of type.indexes) {\n if (index.kind === \"sort\") {\n indexes.push({\n ...scope,\n kind: \"sort\",\n equality: index.filters,\n fields: index.fields.map((field) => ({\n ...field,\n scalarKind: type.properties.find((property) => property.propertyId === field.propertyId)\n ?.scalarKind,\n })),\n })\n } else {\n textCounts.push({ ...scope, propertyId: index.propertyId, filters: index.filters })\n }\n }\n }\n return { indexes, textCounts, warnings }\n}\n\n// Extension creation is database-wide, whereas index preparation is schema-scoped.\nasync function ensureTrigrams(sql: ReservedSQL): Promise<void> {\n await lockPgPreparation(sql, \"sixb.extension.pg_trgm\")\n const unlock = () => sql`SELECT pg_advisory_unlock(hashtextextended('sixb.extension.pg_trgm', 0))`\n await undoOnFailure(async () => {\n await sql.unsafe(\"CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public\")\n }, unlock)\n await unlock()\n}\n",
42
+ "import { parseSixbFailure } from \"@sixb/core/internal/errors\"\nimport { MaterializationConflictError } from \"@sixb/core/internal/materialization\"\nimport {\n type ClaimedOutboxDraft,\n sourceAssertionFromColumns,\n sourceEntityFromKey,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n AssertSourceMaterializationExecutionInput,\n OntologyCommitRecord,\n OntologyCommitWrite,\n OntologySourceRecord,\n StageSourceAssertion,\n} from \"@sixb/core/storage\"\nimport { ONTOLOGY_OUTBOX_FAILURE_CODES } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\n\nexport {\n assertNonblank,\n assertNonnegativeInteger,\n assertPositiveInteger,\n assertTimestamp,\n canonicalJson,\n linkRefFromColumns,\n objectRefFromColumns,\n originColumns,\n originWhere,\n sourceEntityKey,\n} from \"@sixb/core/internal/ontology-storage-provider\"\n\nexport type PgRootOperation = <T>(run: (sql: SQLClient) => Promise<T>) => Promise<T>\n\ntype PgJsonValue = Parameters<SQLClient[\"json\"]>[0]\n\nexport interface PgOntologyCommitRow {\n readonly project_id: string\n readonly id: string\n readonly idempotency_key: string\n readonly request_hash: string\n readonly execution_id: string\n readonly origin_kind: string\n readonly origin_run_id: string | null\n readonly origin_batch_ordinal: number | string | null\n readonly origin: unknown\n readonly ontology_revision: string\n readonly projection_revision: string | null\n readonly ownership_hash: string | null\n readonly intent: unknown\n readonly result: unknown\n readonly committed_at: Date | string\n}\n\nexport interface PgOntologySourceRow {\n readonly version_id: string\n readonly project_id: string\n readonly source_id: string\n readonly materialization_id: string\n readonly projection_run_id: string\n readonly projection_kind: \"object\" | \"link\"\n readonly protocol: \"replacement\"\n readonly status: OntologySourceRecord[\"status\"]\n readonly execution_token: string | null\n readonly dataset_id: string\n readonly dataset_version_id: string\n readonly dataset_version_created_at: Date | string\n readonly projection_revision: string\n readonly ownership_hash: string\n readonly ontology_revision: string\n readonly root_count: number | string | null\n readonly base_materialization_id: string | null\n readonly base_commit_id: string | null\n readonly assertion_count: number | string | null\n readonly created_at: Date | string\n readonly ready_at: Date | string | null\n readonly activated_at: Date | string | null\n readonly terminal_at: Date | string | null\n readonly last_commit_id: string | null\n readonly updated_at: Date | string\n}\n\n/** An assertion with its root and version, as `sourceAssertionColumns` selects it. */\nexport interface PgOntologySourceAssertionRow {\n readonly source_id: string\n readonly materialization_id: string\n readonly root_key: string\n readonly staging_ordinal: number | string\n readonly entity_kind: \"object\" | \"link\"\n readonly object_type_id: string | null\n readonly primary_id: string | null\n readonly source_type_id: string | null\n readonly source_primary_id: string | null\n readonly link_id: string | null\n readonly target_type_id: string | null\n readonly target_primary_id: string | null\n readonly payload: unknown\n}\n\nexport interface PgStoredOverrideRow {\n readonly value: unknown\n readonly last_commit_id: string\n readonly updated_at: Date | string\n}\n\nexport interface PgOntologyOutboxRow {\n readonly id: string\n readonly commit_id: string\n readonly commit_ordinal: number | string\n readonly event: unknown\n readonly available_at: Date | string\n readonly attempts: number | string\n readonly lease_id: string | null\n readonly lease_expires_at: Date | string | null\n readonly published_at: Date | string | null\n readonly last_failure: unknown | null\n readonly created_at: Date | string\n}\n\nexport function jsonParameter(sql: SQLClient, value: unknown): ReturnType<SQLClient[\"json\"]> {\n return sql.json(value as PgJsonValue)\n}\n\nexport function toIsoString(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n\nexport function optionalIsoString(value: Date | string | null): string | null {\n return value === null ? null : toIsoString(value)\n}\n\nexport function databaseSafeInteger(value: number | string, label: string): number {\n const result = Number(value)\n if (!Number.isSafeInteger(result) || result < 0) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `${label} is outside the nonnegative safe-integer range.`\n )\n }\n return result\n}\n\nexport function sourceRecord(row: PgOntologySourceRow): OntologySourceRecord {\n return {\n projectId: row.project_id,\n source: { projectionId: row.source_id },\n materializationId: row.materialization_id,\n projectionRunId: row.projection_run_id,\n projectionKind: row.projection_kind,\n protocol: row.protocol,\n status: row.status,\n executionToken: row.execution_token,\n datasetVersion: {\n datasetId: row.dataset_id,\n versionId: row.dataset_version_id,\n createdAt: toIsoString(row.dataset_version_created_at),\n },\n projectionRevision: row.projection_revision,\n ownershipHash: row.ownership_hash,\n ontologyRevision: row.ontology_revision,\n ...(row.base_materialization_id === null\n ? {}\n : {\n base: {\n materializationId: row.base_materialization_id,\n lastCommitId: row.base_commit_id!,\n },\n }),\n rootCount:\n row.root_count === null ? null : databaseSafeInteger(row.root_count, \"Source root count\"),\n assertionCount:\n row.assertion_count === null\n ? null\n : databaseSafeInteger(row.assertion_count, \"Source assertion count\"),\n createdAt: toIsoString(row.created_at),\n readyAt: optionalIsoString(row.ready_at),\n activatedAt: optionalIsoString(row.activated_at),\n terminalAt: optionalIsoString(row.terminal_at),\n lastCommitId: row.last_commit_id,\n updatedAt: toIsoString(row.updated_at),\n }\n}\n\nexport function sourceAssertion(row: PgOntologySourceAssertionRow): StageSourceAssertion {\n return {\n root: sourceEntityFromKey(row.root_key),\n assertion: sourceAssertionFromColumns(row, row.payload),\n stagingOrdinal: databaseSafeInteger(row.staging_ordinal, \"Source staging ordinal\"),\n }\n}\n\nexport function commitRecord(row: PgOntologyCommitRow): OntologyCommitRecord {\n const base = {\n projectId: row.project_id,\n id: row.id,\n idempotencyKey: row.idempotency_key,\n requestHash: row.request_hash,\n executionId: row.execution_id,\n origin: structuredClone(row.origin) as OntologyCommitWrite[\"origin\"],\n ontologyRevision: row.ontology_revision,\n ...(row.projection_revision === null ? {} : { projectionRevision: row.projection_revision }),\n ...(row.ownership_hash === null ? {} : { ownershipHash: row.ownership_hash }),\n committedAt: toIsoString(row.committed_at),\n }\n const intent = structuredClone(row.intent) as OntologyCommitWrite[\"intent\"]\n const result = structuredClone(row.result) as OntologyCommitRecord[\"result\"]\n return { ...base, intent, result } as OntologyCommitRecord\n}\n\n/** A claimed row as stored: its draft, to rebuild from its commit. */\nexport function claimedOutboxDraft(row: PgOntologyOutboxRow): ClaimedOutboxDraft {\n if (row.lease_id === null || row.lease_expires_at === null) {\n throw new MaterializationConflictError(\n \"outbox-lease\",\n \"Ontology outbox claim returned an unpaired lease.\"\n )\n }\n return {\n id: row.id,\n commitId: row.commit_id,\n commitOrdinal: databaseSafeInteger(row.commit_ordinal, \"Ontology outbox commit ordinal\"),\n event: structuredClone(row.event) as ClaimedOutboxDraft[\"event\"],\n availableAt: toIsoString(row.available_at),\n attempts: databaseSafeInteger(row.attempts, \"Ontology outbox attempts\"),\n leaseId: row.lease_id,\n leaseExpiresAt: toIsoString(row.lease_expires_at),\n publishedAt: optionalIsoString(row.published_at),\n lastFailure:\n row.last_failure === null\n ? null\n : parseSixbFailure(row.last_failure, ONTOLOGY_OUTBOX_FAILURE_CODES),\n createdAt: toIsoString(row.created_at),\n }\n}\n\nexport async function assertProjectionExecution(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly sourceId: string\n readonly projectionRunId: string\n readonly executionToken: string\n readonly identity?: AssertSourceMaterializationExecutionInput[\"identity\"]\n }\n): Promise<void> {\n const [run] = await sql<\n {\n readonly projection_id: string\n readonly projection_kind: string\n readonly status: string\n readonly materialization_protocol: string | null\n readonly execution_token: string | null\n readonly dataset_id: string\n readonly dataset_version_id: string\n readonly dataset_version_created_at: Date | string | null\n readonly ontology_revision: string | null\n readonly projection_revision: string | null\n readonly ownership_hash: string | null\n }[]\n >`\n SELECT projection_id, projection_kind, status, materialization_protocol, execution_token,\n dataset_id, dataset_version_id, dataset_version_created_at,\n ontology_revision, projection_revision, ownership_hash\n FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.projectionRunId}\n FOR UPDATE\n `\n if (!run || run.status !== \"running\") {\n throw new MaterializationConflictError(\n \"run-correlation\",\n `Projection run '${input.projectionRunId}' is missing or is not running.`\n )\n }\n if (run.projection_id !== input.sourceId || run.materialization_protocol !== \"replacement\") {\n throw new MaterializationConflictError(\n \"run-correlation\",\n `Projection run '${input.projectionRunId}' does not own replacement source '${input.sourceId}'.`\n )\n }\n if (run.execution_token !== input.executionToken) {\n throw new MaterializationConflictError(\n \"execution-lost\",\n `Projection run '${input.projectionRunId}' execution token is stale.`\n )\n }\n const identity = input.identity\n if (\n identity &&\n (run.projection_kind !== identity.projectionKind ||\n run.materialization_protocol !== identity.protocol ||\n run.dataset_id !== identity.datasetVersion.datasetId ||\n run.dataset_version_id !== identity.datasetVersion.versionId ||\n run.dataset_version_created_at === null ||\n toIsoString(run.dataset_version_created_at) !== identity.datasetVersion.createdAt ||\n run.ontology_revision !== identity.ontologyRevision ||\n run.projection_revision !== identity.projectionRevision ||\n run.ownership_hash !== identity.ownershipHash)\n ) {\n throw new MaterializationConflictError(\n \"run-correlation\",\n `Projection run '${input.projectionRunId}' immutable source identity does not match.`\n )\n }\n}\n\nexport function ontologyLockKey(kind: string, ...parts: readonly string[]): string {\n return `ontology:${kind}:${JSON.stringify(parts)}`\n}\n\nexport function jsonTupleExpression(parts: readonly string[]): string {\n return `concat('[', ${parts.join(\", ',', \")}, ']')`\n}\n\n/** The canonical JSON key of a row's identity columns, as `objectRefKey`/`linkRefKey` render it. */\nexport function columnKeyExpression(columns: readonly string[]): string {\n return jsonTupleExpression(columns.map((column) => `to_jsonb(${column})::text`))\n}\n",
38
43
  "import type {\n GetOntologyCommitByIdempotencyKeyInput,\n GetOntologyCommitByIdInput,\n GetOntologyCommitByOriginInput,\n ListOntologyCommitsInput,\n ListOntologyCommitsResult,\n OntologyCommitRecord,\n OntologyCommitStorage,\n} from \"@sixb/core/storage\"\nimport {\n assertNonblank,\n assertNonnegativeInteger,\n commitRecord,\n originWhere,\n type PgOntologyCommitRow,\n type PgRootOperation,\n} from \"./shared\"\n\nexport class PgOntologyCommitStorage implements OntologyCommitStorage {\n constructor(private readonly runRootOperation: PgRootOperation) {}\n\n async getByIdempotencyKey(\n input: GetOntologyCommitByIdempotencyKeyInput\n ): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology commit project id\")\n assertNonblank(input.idempotencyKey, \"Ontology commit idempotency key\")\n const [row] = await sql<PgOntologyCommitRow[]>`\n SELECT * FROM ontology_commits\n WHERE project_id = ${input.projectId} AND idempotency_key = ${input.idempotencyKey}\n `\n return row ? commitRecord(row) : null\n })\n }\n\n async getById(input: GetOntologyCommitByIdInput): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology commit project id\")\n assertNonblank(input.id, \"Ontology commit id\")\n const [row] = await sql<PgOntologyCommitRow[]>`\n SELECT * FROM ontology_commits\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n return row ? commitRecord(row) : null\n })\n }\n\n async getByOrigin(input: GetOntologyCommitByOriginInput): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology commit project id\")\n const origin = originWhere(input.origin)\n assertNonblank(origin.runId, \"Ontology commit origin run id\")\n if (origin.batchOrdinal !== null) {\n assertNonnegativeInteger(origin.batchOrdinal, \"Ontology telemetry commit batch ordinal\")\n }\n const [row] =\n origin.batchOrdinal === null\n ? await sql<PgOntologyCommitRow[]>`\n SELECT * FROM ontology_commits\n WHERE project_id = ${input.projectId}\n AND origin_kind = ${origin.kind}\n AND origin_run_id = ${origin.runId}\n AND origin_batch_ordinal IS NULL\n `\n : await sql<PgOntologyCommitRow[]>`\n SELECT * FROM ontology_commits\n WHERE project_id = ${input.projectId}\n AND origin_kind = ${origin.kind}\n AND origin_run_id = ${origin.runId}\n AND origin_batch_ordinal = ${origin.batchOrdinal}\n `\n return row ? commitRecord(row) : null\n })\n }\n\n async list(input: ListOntologyCommitsInput): Promise<ListOntologyCommitsResult> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology commit project id\")\n if (input.run) assertNonblank(input.run.id, \"Ontology commit run id\")\n const offset = input.offset ?? 0\n const limit = input.limit\n assertNonnegativeInteger(offset, \"Ontology commit list offset\")\n if (limit !== undefined) assertNonnegativeInteger(limit, \"Ontology commit list limit\")\n\n const runFilter =\n input.run?.kind === \"action\"\n ? sql`AND origin_kind = 'action' AND origin_run_id = ${input.run.id}`\n : input.run?.kind === \"projection\"\n ? sql`AND origin_run_id = ${input.run.id}\n AND origin_kind IN ('projection', 'telemetry')`\n : sql``\n const [{ total }] = await sql<{ readonly total: number | string }[]>`\n SELECT COUNT(*) AS total\n FROM ontology_commits\n WHERE project_id = ${input.projectId} ${runFilter}\n `\n const direction = input.order === \"desc\" ? sql`DESC` : sql`ASC`\n const order =\n input.run?.kind === \"projection\"\n ? sql`CASE WHEN origin_kind = 'telemetry' THEN origin_batch_ordinal ELSE -1 END\n ${direction}, committed_at ${direction}, id ${direction}`\n : sql`committed_at ${direction}, id ${direction}`\n const limitFragment = limit === undefined ? sql`` : sql`LIMIT ${limit}`\n const rows = await sql<PgOntologyCommitRow[]>`\n SELECT * FROM ontology_commits\n WHERE project_id = ${input.projectId} ${runFilter}\n ORDER BY ${order}\n ${limitFragment} OFFSET ${offset}\n `\n const count = Number(total)\n const commits = rows.map(commitRecord)\n return { commits, total: count, hasMore: offset + commits.length < count }\n })\n }\n}\n",
39
- "import type { EffectiveChangeCounts } from \"@sixb/core/internal/materialization\"\nimport {\n assertPinnedDatasetWatermark,\n linkRefKey,\n linkRefSortKey,\n linkScopeSortKey,\n MaterializationConflictError,\n MaterializationValidationError,\n objectRefKey,\n objectRefSortKey,\n telemetryPointKey,\n telemetryPointSortKey,\n} from \"@sixb/core/internal/materialization\"\nimport {\n assertExpectedLinkRevision,\n assertExpectedLinkScopeRevision,\n assertExpectedObjectRevision,\n assertMaterializationFinalizationCorrelation,\n assertMaterializationHeader,\n assertMaterializationLaneCompletion,\n assertPageRows,\n assertPlanChunkCorrelations,\n assertSourceActivationCorrelation,\n invalidCorrelation,\n sameNonnegativeCounts as sameCounts,\n uniqueSorted,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n ApplyMaterializationChunkInput,\n ApplyMaterializationResult,\n FinalizeMaterializationInput,\n MaterializationObjectExistence,\n MaterializationPlanHeader,\n MaterializationSession,\n MaterializationStatePage,\n MaterializationWorkPage,\n OntologyCommitRecord,\n OntologyMaterializationStorage,\n ReadMaterializationObjectExistenceInput,\n SourceActivationWrite,\n SourceReplacementStatePage,\n StageMaterializationWorkInput,\n StreamMaterializationStateInput,\n StreamMaterializationWorkInput,\n StreamSourceReplacementStateInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { isUniqueViolation } from \"../storage-errors\"\nimport { lockAdvisoryKeys } from \"../transactions\"\nimport {\n type PgMaterializationSessionState,\n PgMaterializationSessions,\n type PgOntologyTransactionContext,\n} from \"./materialization-session\"\nimport {\n linkSortExpression,\n PG_MATERIALIZATION_WORK_TABLE,\n PgMaterializationStateReader,\n} from \"./materialization-state\"\nimport { PgMaterializationWriter } from \"./materialization-writer\"\nimport {\n assertProjectionExecution,\n commitRecord,\n jsonParameter,\n ontologyLockKey,\n originColumns,\n type PgOntologyCommitRow,\n type PgOntologySourceRow,\n toIsoString,\n} from \"./shared\"\nimport { activateSourceRoots } from \"./source-roots\"\n\ninterface ProjectionCountsRow {\n readonly object_classifications: number | string\n readonly link_classifications: number | string\n readonly objects_created: number | string\n readonly objects_updated: number | string\n readonly objects_deleted: number | string\n readonly links_created: number | string\n readonly links_updated: number | string\n readonly links_deleted: number | string\n}\n\ninterface TelemetrySummaryRow {\n readonly classified_points: number | string\n readonly points_created: number | string\n readonly points_updated: number | string\n readonly latest_objects_changed: number | string\n}\n\nexport class PgOntologyMaterializationStorage implements OntologyMaterializationStorage {\n private readonly sessions: PgMaterializationSessions\n private readonly writer: PgMaterializationWriter\n\n constructor(\n private readonly sql: SQLClient,\n context: PgOntologyTransactionContext | null\n ) {\n this.sessions = new PgMaterializationSessions(sql, context)\n this.writer = new PgMaterializationWriter(sql)\n }\n\n assertVectorSession(session: MaterializationSession, projectId: string, commitId?: string): void {\n const active = this.sessions.require(session)\n if (\n active.header.commit.projectId !== projectId ||\n (commitId !== undefined && active.header.commit.id !== commitId)\n ) {\n throw new MaterializationValidationError(\n \"Vector mutation does not belong to this materialization session.\"\n )\n }\n }\n\n async begin(input: MaterializationPlanHeader): Promise<MaterializationSession> {\n assertMaterializationHeader(input)\n const session = await this.sessions.create(input)\n try {\n await lockAdvisoryKeys(this.sql, materializationLockKeys(input))\n await this.assertCommitAbsent(input)\n const reader = new PgMaterializationStateReader(this.sql, input.commit.projectId)\n await this.assertSources(input.expected.sources, input.commit.projectId)\n const objectRevisions = await reader.effectiveObjectRevisions(\n input.expected.objects.map((expected) => expected.ref),\n true\n )\n for (const expected of input.expected.objects) {\n assertExpectedObjectRevision(\n objectRevisions.get(objectRefKey(expected.ref)) ?? null,\n expected\n )\n }\n const linkRevisions = await reader.effectiveLinkLastCommits(\n input.expected.links.map((expected) => expected.ref),\n true\n )\n for (const expected of input.expected.links) {\n assertExpectedLinkRevision(linkRevisions.get(linkRefKey(expected.ref)), expected)\n }\n const linkScopeRevisions = await reader.linkScopeRevisions(input.expected.linkScopes)\n for (const [index, expected] of input.expected.linkScopes.entries()) {\n assertExpectedLinkScopeRevision(linkScopeRevisions[index]?.fingerprint, expected)\n }\n const points = await reader.exactPoints(input.expected.points, true)\n const pointRevisions = new Map(\n points.map(\n (point) => [telemetryPointKey(point.series, point.at), point.lastCommitId] as const\n )\n )\n for (const expected of input.expected.points) {\n if (\n (pointRevisions.get(telemetryPointKey(expected.series, expected.at)) ?? null) !==\n expected.lastCommitId\n ) {\n throw new MaterializationConflictError(\n \"timeseries-point\",\n `Telemetry point ${telemetryPointKey(expected.series, expected.at)} changed.`\n )\n }\n }\n return session.publicSession()\n } catch (error) {\n await this.sessions.release(session)\n throw error\n }\n }\n\n async *streamState(\n input: StreamMaterializationStateInput\n ): AsyncIterable<MaterializationStatePage> {\n const session = this.sessions.require(input.session)\n assertPageRows(input.pageRows)\n const reader = new PgMaterializationStateReader(this.sql, session.header.commit.projectId)\n for await (const request of input.requests) {\n this.sessions.require(input.session)\n const objects = uniqueSorted(request.objects, objectRefKey, objectRefSortKey)\n for (let offset = 0; offset < objects.length; offset += input.pageRows) {\n const states = await reader.objectStates(objects.slice(offset, offset + input.pageRows))\n yield { objects: states, links: [], linkScopes: [], points: [] }\n }\n const links = uniqueSorted(request.links, linkRefKey, linkRefSortKey)\n for (let offset = 0; offset < links.length; offset += input.pageRows) {\n const states = await reader.linkStates(links.slice(offset, offset + input.pageRows))\n yield { objects: [], links: states, linkScopes: [], points: [] }\n }\n for await (const refs of reader.incidentLinks(request.incidentObjects, input.pageRows)) {\n this.sessions.require(input.session)\n yield {\n objects: [],\n links: await reader.linkStates(refs),\n linkScopes: [],\n points: [],\n }\n }\n const scopes = uniqueSorted(\n request.linkScopes,\n (scope) =>\n JSON.stringify([scope.source.objectTypeId, scope.source.primaryId, scope.linkId]),\n (scope) => linkScopeSortKey(scope.source, scope.linkId)\n )\n for (let offset = 0; offset < scopes.length; offset += input.pageRows) {\n yield {\n objects: [],\n links: [],\n linkScopes: await reader.linkSlotStates(scopes.slice(offset, offset + input.pageRows)),\n points: [],\n }\n }\n const points = uniqueSorted(\n request.points,\n (point) => telemetryPointKey(point.series, point.at),\n (point) => telemetryPointSortKey(point.series, point.at)\n )\n for (let offset = 0; offset < points.length; offset += input.pageRows) {\n const stored = await reader.exactPoints(points.slice(offset, offset + input.pageRows))\n if (stored.length > 0) {\n yield { objects: [], links: [], linkScopes: [], points: stored }\n }\n }\n }\n }\n\n async *streamSourceReplacementState(\n input: StreamSourceReplacementStateInput\n ): AsyncIterable<SourceReplacementStatePage> {\n const session = this.sessions.require(input.session)\n assertPageRows(input.pageRows)\n const replacement = await this.requireReplacement(session, input)\n const reader = new PgMaterializationStateReader(this.sql, session.header.commit.projectId)\n if (input.entityKind === \"object\") {\n if (replacement.projectionKind !== \"object\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Link projection replacement cannot stream object state.\"\n )\n }\n if (replacement.objectStreamStarted) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Replacement object state may only be streamed once per session.\"\n )\n }\n replacement.objectStreamStarted = true\n for await (const identities of reader.replacementIdentities({\n sessionId: session.id,\n sourceId: replacement.sourceId,\n candidateMaterializationId: replacement.candidateMaterializationId,\n previousMaterializationId: replacement.previousMaterializationId,\n incremental: replacement.incremental,\n kind: \"object\",\n pageRows: input.pageRows,\n })) {\n this.sessions.require(input.session)\n const refs = identities.map((identity) => {\n if (identity.kind !== \"object\") {\n invalidCorrelation(\"Object replacement returned a link identity.\")\n }\n return identity.ref\n })\n const objects = await reader.replacementObjectStates(\n replacement.sourceId,\n replacement.candidateMaterializationId,\n refs\n )\n yield { objects, links: [] }\n }\n this.sessions.require(input.session)\n replacement.objectStreamCompleted = true\n return\n }\n\n if (replacement.projectionKind === \"object\" && !replacement.objectStreamCompleted) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Object projection replacement must fully stream object state before link state.\"\n )\n }\n if (replacement.linkStreamStarted) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Replacement link state may only be streamed once per session.\"\n )\n }\n replacement.linkStreamStarted = true\n const materializationIds = [\n replacement.candidateMaterializationId,\n ...(replacement.previousMaterializationId ? [replacement.previousMaterializationId] : []),\n ]\n for await (const identities of reader.replacementIdentities({\n sessionId: session.id,\n sourceId: replacement.sourceId,\n candidateMaterializationId: replacement.candidateMaterializationId,\n previousMaterializationId: replacement.previousMaterializationId,\n incremental: replacement.incremental,\n kind: \"link\",\n pageRows: input.pageRows,\n })) {\n this.sessions.require(input.session)\n const linkIdentities = identities.map((identity) => {\n if (identity.kind !== \"link\") {\n invalidCorrelation(\"Link replacement returned an object identity.\")\n }\n return identity\n })\n const links = await reader.replacementLinkStates(\n replacement.sourceId,\n replacement.candidateMaterializationId,\n materializationIds,\n linkIdentities,\n replacement.incremental\n )\n yield { objects: [], links }\n }\n this.sessions.require(input.session)\n replacement.linkStreamCompleted = true\n }\n\n async stageWork(input: StageMaterializationWorkInput): Promise<void> {\n await this.sessions.stage(input)\n }\n\n streamWork(input: StreamMaterializationWorkInput): AsyncIterable<MaterializationWorkPage> {\n assertPageRows(input.pageRows)\n return this.sessions.stream(input)\n }\n\n async readObjectExistence(\n input: ReadMaterializationObjectExistenceInput\n ): Promise<readonly MaterializationObjectExistence[]> {\n const session = this.sessions.require(input.session)\n return this.sessions.readObjectExistence(session, input.refs)\n }\n\n async applyChunk(input: ApplyMaterializationChunkInput): Promise<void> {\n const session = this.sessions.require(input.session)\n const { commit } = session.header\n assertPlanChunkCorrelations(input.chunk, commit)\n const progress = await this.sessions.prepareChunkSequence(session, input.chunk)\n await this.writer.apply(commit.projectId, commit.id, input.chunk)\n session.changedObjects +=\n input.chunk.effective.objectUpserts.length + input.chunk.effective.objectDeletes.length\n session.changedLinks +=\n input.chunk.effective.linkUpserts.length + input.chunk.effective.linkDeletes.length\n this.sessions.commitChunkSequence(session, progress)\n }\n\n async finalize(input: FinalizeMaterializationInput): Promise<ApplyMaterializationResult> {\n const session = this.sessions.require(input.session)\n await this.assertCommitAbsent(session.header)\n await this.assertFinalization(session, input)\n for (const activation of input.finalization.sourceActivations) {\n await this.activateSource(session, activation)\n }\n // The next sparse projection must see the distribution of a newly published bulk load.\n // With empty/stale statistics, a link lookup can scan every edge sharing its target.\n if (session.changedObjects >= 1_000) await this.sql`ANALYZE objects`\n if (session.changedLinks >= 1_000) await this.sql`ANALYZE links`\n const record = await this.insertCommit(session.header, input)\n await this.sessions.release(session)\n return { commit: record }\n }\n\n deactivateSessions(): void {\n this.sessions.deactivateAll()\n }\n\n private async requireReplacement(\n session: PgMaterializationSessionState,\n input: StreamSourceReplacementStateInput\n ): Promise<NonNullable<PgMaterializationSessionState[\"replacement\"]>> {\n if (session.replacement) {\n if (\n session.replacement.sourceId !== input.source.projectionId ||\n session.replacement.candidateMaterializationId !== input.candidateMaterializationId\n ) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Materialization session already owns another replacement union.\"\n )\n }\n return session.replacement\n }\n const projectId = session.header.commit.projectId\n const candidate = await this.getSource(\n projectId,\n input.source.projectionId,\n input.candidateMaterializationId,\n true\n )\n if (!candidate || candidate.status !== \"ready\" || candidate.execution_token === null) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Candidate source materialization '${input.candidateMaterializationId}' is missing or is not ready.`\n )\n }\n await assertProjectionExecution(this.sql, {\n projectId,\n sourceId: input.source.projectionId,\n projectionRunId: candidate.projection_run_id,\n executionToken: candidate.execution_token,\n })\n const previous = await this.getActiveSource(projectId, input.source.projectionId, true)\n if (\n candidate.protocol !== \"replacement\" ||\n (previous &&\n (previous.protocol !== candidate.protocol ||\n previous.projection_kind !== candidate.projection_kind))\n ) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source replacement kind or protocol does not match its active materialization.\"\n )\n }\n session.replacement = {\n sourceId: input.source.projectionId,\n candidateMaterializationId: input.candidateMaterializationId,\n previousMaterializationId: previous?.materialization_id ?? null,\n incremental: candidate.base_materialization_id !== null,\n projectionKind: candidate.projection_kind,\n objectStreamStarted: false,\n objectStreamCompleted: false,\n linkStreamStarted: false,\n linkStreamCompleted: false,\n }\n return session.replacement\n }\n\n private async assertCommitAbsent(header: MaterializationPlanHeader): Promise<void> {\n const [duplicateIdentity] = await this.sql<\n { readonly id: string; readonly idempotency_key: string }[]\n >`\n SELECT id, idempotency_key\n FROM ontology_commits\n WHERE project_id = ${header.commit.projectId}\n AND (id = ${header.commit.id} OR idempotency_key = ${header.commit.idempotencyKey})\n ORDER BY CASE WHEN id = ${header.commit.id} THEN 0 ELSE 1 END\n LIMIT 1\n FOR UPDATE\n `\n if (duplicateIdentity) {\n throw new MaterializationConflictError(\n \"idempotency\",\n duplicateIdentity.id === header.commit.id\n ? `Ontology commit '${header.commit.id}' already exists.`\n : \"Ontology idempotency key already exists.\"\n )\n }\n\n const origin = originColumns(header.commit.origin)\n if (origin.runId === null) return\n const [duplicateOrigin] =\n origin.batchOrdinal === null\n ? await this.sql<{ readonly id: string }[]>`\n SELECT id FROM ontology_commits\n WHERE project_id = ${header.commit.projectId}\n AND origin_kind = ${origin.kind}\n AND origin_run_id = ${origin.runId}\n AND origin_batch_ordinal IS NULL\n LIMIT 1\n FOR UPDATE\n `\n : await this.sql<{ readonly id: string }[]>`\n SELECT id FROM ontology_commits\n WHERE project_id = ${header.commit.projectId}\n AND origin_kind = ${origin.kind}\n AND origin_run_id = ${origin.runId}\n AND origin_batch_ordinal = ${origin.batchOrdinal}\n LIMIT 1\n FOR UPDATE\n `\n if (duplicateOrigin) {\n throw new MaterializationConflictError(\n \"run-correlation\",\n \"Ontology commit origin already has an authoritative commit.\"\n )\n }\n }\n\n private async assertSources(\n expectedSources: MaterializationPlanHeader[\"expected\"][\"sources\"],\n projectId: string\n ): Promise<void> {\n if (expectedSources.length === 0) return\n const rows = await this.sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId}\n AND source_id = ANY(\n ${this.sql.array(expectedSources.map((expected) => expected.source.projectionId))}::text[]\n )\n AND status = 'active'\n FOR UPDATE\n `\n const active = new Map(rows.map((row) => [row.source_id, row] as const))\n for (const expected of expectedSources) {\n this.assertSourceRow(expected, active.get(expected.source.projectionId) ?? null)\n }\n }\n\n private assertSourceRow(\n expected: MaterializationPlanHeader[\"expected\"][\"sources\"][number],\n active: PgOntologySourceRow | null\n ): void {\n if (\n (active?.materialization_id ?? null) !== expected.activeMaterializationId ||\n (active?.last_commit_id ?? null) !== expected.lastCommitId\n ) {\n throw new MaterializationConflictError(\n \"projection-fence\",\n `Source '${expected.source.projectionId}' changed.`\n )\n }\n }\n\n private async assertFinalization(\n session: PgMaterializationSessionState,\n input: FinalizeMaterializationInput\n ): Promise<void> {\n const { commit } = session.header\n const { result } = input.finalization\n assertMaterializationFinalizationCorrelation(session, input)\n const laneCounts = await this.sessions.laneCounts(session)\n assertMaterializationLaneCompletion(session, laneCounts)\n if (laneCounts.cardinality > 0) await this.assertFinalCardinality(session)\n const eventCount = laneCounts.event\n const [outbox] = await this.sql<\n {\n readonly count: number | string\n readonly minimum: number | string | null\n readonly maximum: number | string | null\n }[]\n >`\n SELECT COUNT(*) AS count, MIN(commit_ordinal) AS minimum,\n MAX(commit_ordinal) AS maximum\n FROM ontology_outbox\n WHERE project_id = ${commit.projectId} AND commit_id = ${commit.id}\n `\n const outboxCount = Number(outbox?.count ?? 0)\n const minimum = outbox?.minimum === null ? null : Number(outbox?.minimum)\n const maximum = outbox?.maximum === null ? null : Number(outbox?.maximum)\n if (\n outboxCount !== eventCount ||\n (eventCount > 0 && (minimum !== 0 || maximum !== eventCount - 1))\n ) {\n invalidCorrelation(\"Outbox event ordinals must be contiguous from zero.\")\n }\n\n if (commit.intent.kind === \"telemetry\") {\n const summary = await this.telemetrySummary(session, commit.intent.pointCount)\n if (summary.classifiedPoints !== commit.intent.pointCount) {\n invalidCorrelation(\n \"Telemetry point classification coverage does not match the commit intent.\"\n )\n }\n if (result.kind !== \"telemetry\" || !sameCounts(result, summary.counts)) {\n invalidCorrelation(\"Telemetry result counts do not correlate with finalized work.\")\n }\n }\n if (commit.intent.kind === \"projection\") {\n if (result.kind !== \"projection\") return\n await this.sessions.assertClassificationCoverage(session)\n if (!sameCounts(result.counts, await this.projectionCounts(session))) {\n invalidCorrelation(\"Projection result counts do not correlate with finalized work.\")\n }\n }\n }\n\n private async assertFinalCardinality(session: PgMaterializationSessionState): Promise<void> {\n // A mixed work table can hide a few occupied scopes among millions of other records.\n // Even ANALYZE can miss that population. Isolate it before planning the final join so\n // the planner sees a relation of scopes, without JSON/session selectivity guesses.\n // Session IDs are provider-generated UUIDs. Use unprepared statements for this private\n // identifier so each session does not leave a new statement in the connection cache.\n const table = `ontology_cardinality_${session.id.replaceAll(\"-\", \"\")}`\n await this.sql.unsafe(\n `CREATE TEMP TABLE ${table} ON COMMIT DROP AS\n SELECT sort_one AS scope_sort_key, sort_two AS link_sort_key,\n (payload->>'occupied')::boolean AS occupied,\n payload->'ref'->'source'->>'objectTypeId' AS source_type_id,\n payload->'ref'->'source'->>'primaryId' AS source_id,\n payload->'ref'->>'linkId' AS link_id\n FROM ${PG_MATERIALIZATION_WORK_TABLE}\n WHERE session_id = $1 AND lane = 'cardinality' AND major_order = 0`,\n [session.id]\n )\n await this.sql.unsafe(`ANALYZE ${table}`)\n const [violation] = await this.sql.unsafe<{ readonly reason: \"duplicate\" | \"mismatch\" }[]>(\n `WITH work AS (\n SELECT * FROM ${table}\n ), duplicate AS (\n SELECT scope_sort_key FROM work WHERE occupied\n GROUP BY scope_sort_key HAVING COUNT(*) > 1\n ), scopes AS (\n SELECT DISTINCT scope_sort_key, source_type_id, source_id, link_id FROM work\n ), expected AS (\n SELECT scope_sort_key, link_sort_key FROM work WHERE occupied\n ), actual AS (\n SELECT scopes.scope_sort_key,\n ${linkSortExpression(\"links\")} AS link_sort_key\n FROM scopes\n JOIN links USING (source_type_id, source_id, link_id)\n WHERE links.project_id = $1\n ), differences AS (\n (SELECT * FROM expected EXCEPT SELECT * FROM actual)\n UNION ALL\n (SELECT * FROM actual EXCEPT SELECT * FROM expected)\n )\n SELECT 'duplicate'::text AS reason FROM duplicate\n UNION ALL\n SELECT 'mismatch'::text AS reason FROM differences\n LIMIT 1`,\n [session.header.commit.projectId]\n )\n await this.sql.unsafe(`DROP TABLE ${table}`)\n if (violation?.reason === \"duplicate\") {\n invalidCorrelation(\"Materialization cardinality work violates cardinality-one.\")\n }\n if (violation) {\n invalidCorrelation(\n \"Materialization cardinality work does not match the final effective link scope.\"\n )\n }\n }\n\n private async projectionCounts(\n session: PgMaterializationSessionState\n ): Promise<EffectiveChangeCounts> {\n const [row] = await this.sql<ProjectionCountsRow[]>`\n SELECT\n COUNT(*) FILTER (\n WHERE kind = 'classification' AND payload->>'entityKind' = 'object'\n ) AS object_classifications,\n COUNT(*) FILTER (\n WHERE kind = 'classification' AND payload->>'entityKind' = 'link'\n ) AS link_classifications,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'object-upsert'\n AND NOT (payload->'item'->'value'->'expected'->>'exists')::boolean\n ) AS objects_created,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'object-upsert'\n AND (payload->'item'->'value'->'expected'->>'exists')::boolean\n ) AS objects_updated,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'object-delete'\n ) AS objects_deleted,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'link-upsert'\n AND NOT (payload->'item'->'value'->'expected'->>'exists')::boolean\n ) AS links_created,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'link-upsert'\n AND (payload->'item'->'value'->'expected'->>'exists')::boolean\n ) AS links_updated,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'link-delete'\n ) AS links_deleted\n FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${session.id}\n `\n const objectsCreated = databaseCount(row?.objects_created)\n const objectsUpdated = databaseCount(row?.objects_updated)\n const objectsDeleted = databaseCount(row?.objects_deleted)\n const linksCreated = databaseCount(row?.links_created)\n const linksUpdated = databaseCount(row?.links_updated)\n const linksDeleted = databaseCount(row?.links_deleted)\n return {\n objectsCreated,\n objectsUpdated,\n objectsDeleted,\n objectsUnchanged:\n databaseCount(row?.object_classifications) -\n objectsCreated -\n objectsUpdated -\n objectsDeleted,\n linksCreated,\n linksUpdated,\n linksDeleted,\n linksUnchanged:\n databaseCount(row?.link_classifications) - linksCreated - linksUpdated - linksDeleted,\n }\n }\n\n private async telemetrySummary(session: PgMaterializationSessionState, pointCount: number) {\n const [row] = await this.sql<TelemetrySummaryRow[]>`\n SELECT\n COUNT(*) FILTER (\n WHERE kind = 'classification' AND payload->>'entityKind' = 'point'\n ) AS classified_points,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'point-upsert'\n AND payload->'item'->'value'->'expected'->>'lastCommitId' IS NULL\n ) AS points_created,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'point-upsert'\n AND payload->'item'->'value'->'expected'->>'lastCommitId' IS NOT NULL\n ) AS points_updated,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'object-upsert'\n ) AS latest_objects_changed\n FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${session.id}\n `\n const pointsCreated = databaseCount(row?.points_created)\n const pointsUpdated = databaseCount(row?.points_updated)\n return {\n classifiedPoints: databaseCount(row?.classified_points),\n counts: {\n pointsCreated,\n pointsUpdated,\n pointsUnchanged: pointCount - pointsCreated - pointsUpdated,\n latestObjectsChanged: databaseCount(row?.latest_objects_changed),\n },\n }\n }\n\n private async activateSource(\n session: PgMaterializationSessionState,\n activation: SourceActivationWrite\n ): Promise<void> {\n const { commit } = session.header\n assertSourceActivationCorrelation(session, activation)\n const candidate = await this.getSource(\n commit.projectId,\n activation.source.projectionId,\n activation.materializationId,\n true\n )\n if (!candidate || candidate.status !== \"ready\" || candidate.execution_token === null) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source activation candidate is missing or is not ready.\"\n )\n }\n await assertProjectionExecution(this.sql, {\n projectId: commit.projectId,\n sourceId: activation.source.projectionId,\n projectionRunId: activation.execution.projectionRunId,\n executionToken: activation.execution.executionToken,\n })\n if (\n candidate.projection_run_id !== activation.execution.projectionRunId ||\n candidate.execution_token !== activation.execution.executionToken ||\n candidate.projection_kind !== activation.projectionKind ||\n candidate.protocol !== activation.protocol ||\n candidate.dataset_id !== activation.datasetVersion.datasetId ||\n candidate.dataset_version_id !== activation.datasetVersion.versionId ||\n toIsoString(candidate.dataset_version_created_at) !== activation.datasetVersion.createdAt ||\n candidate.projection_revision !== activation.projectionRevision ||\n candidate.ownership_hash !== activation.ownershipHash ||\n candidate.ontology_revision !== activation.ontologyRevision ||\n candidate.ready_at === null ||\n activation.updatedAt < toIsoString(candidate.ready_at)\n ) {\n invalidCorrelation(\"Source activation does not match its ready candidate identity.\")\n }\n const previous = await this.getActiveSource(\n commit.projectId,\n activation.source.projectionId,\n true\n )\n this.assertSourceRow(activation.expected, previous)\n await activateSourceRoots(this.sql, commit.projectId, candidate, activation)\n if (previous) {\n assertPinnedDatasetWatermark(\n {\n datasetId: previous.dataset_id,\n versionId: previous.dataset_version_id,\n createdAt: toIsoString(previous.dataset_version_created_at),\n },\n activation.datasetVersion,\n \"Source activation\"\n )\n if (activation.updatedAt < toIsoString(previous.updated_at)) {\n invalidCorrelation(\"Source activation cannot precede the active materialization update.\")\n }\n const superseded = await this.sql<{ readonly materialization_id: string }[]>`\n UPDATE ontology_sources\n SET status = 'superseded', execution_token = NULL,\n terminal_at = ${activation.updatedAt}, updated_at = ${activation.updatedAt}\n WHERE project_id = ${commit.projectId}\n AND source_id = ${activation.source.projectionId}\n AND materialization_id = ${previous.materialization_id}\n AND status = 'active'\n AND last_commit_id IS NOT DISTINCT FROM ${activation.expected.lastCommitId}\n RETURNING materialization_id\n `\n if (superseded.length !== 1) {\n throw new MaterializationConflictError(\n \"projection-fence\",\n `Source '${activation.source.projectionId}' changed.`\n )\n }\n }\n let activated: readonly { readonly materialization_id: string }[]\n try {\n activated = await this.sql<{ readonly materialization_id: string }[]>`\n UPDATE ontology_sources\n SET status = 'active', execution_token = NULL,\n activated_at = ${activation.updatedAt}, last_commit_id = ${activation.lastCommitId},\n updated_at = ${activation.updatedAt}\n WHERE project_id = ${commit.projectId}\n AND source_id = ${activation.source.projectionId}\n AND materialization_id = ${activation.materializationId}\n AND status = 'ready'\n AND execution_token = ${activation.execution.executionToken}\n RETURNING materialization_id\n `\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new MaterializationConflictError(\n \"projection-fence\",\n `Source '${activation.source.projectionId}' changed.`\n )\n }\n throw error\n }\n if (activated.length !== 1) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source activation candidate changed.\"\n )\n }\n }\n\n private async insertCommit(\n header: MaterializationPlanHeader,\n input: FinalizeMaterializationInput\n ): Promise<OntologyCommitRecord> {\n const { commit } = header\n const origin = originColumns(commit.origin)\n const requestedBy =\n commit.requestedBy === undefined ? null : jsonParameter(this.sql, commit.requestedBy)\n const rows = await this.sql<PgOntologyCommitRow[]>`\n INSERT INTO ontology_commits (\n project_id, id, idempotency_key, request_hash, execution_id,\n origin_kind, origin_run_id, origin_batch_ordinal, origin, requested_by, executor,\n ontology_revision, projection_revision, ownership_hash,\n intent, result, committed_at\n ) VALUES (\n ${commit.projectId}, ${commit.id}, ${commit.idempotencyKey}, ${commit.requestHash},\n ${commit.executionId},\n ${origin.kind}, ${origin.runId}, ${origin.batchOrdinal},\n ${jsonParameter(this.sql, commit.origin)}, ${requestedBy},\n ${jsonParameter(this.sql, commit.executor)}, ${commit.ontologyRevision},\n ${commit.projectionRevision ?? null}, ${commit.ownershipHash ?? null},\n ${jsonParameter(this.sql, commit.intent)},\n ${jsonParameter(this.sql, input.finalization.result)}, ${commit.committedAt}\n )\n ON CONFLICT DO NOTHING\n RETURNING *\n `\n if (!rows[0]) {\n await this.assertCommitAbsent(header)\n throw new MaterializationConflictError(\n \"idempotency\",\n \"Ontology commit identity already exists.\"\n )\n }\n return commitRecord(rows[0])\n }\n\n private async getActiveSource(\n projectId: string,\n sourceId: string,\n lock = false\n ): Promise<PgOntologySourceRow | null> {\n const lockFragment = lock ? this.sql`FOR UPDATE` : this.sql``\n const [row] = await this.sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId} AND source_id = ${sourceId} AND status = 'active'\n ${lockFragment}\n `\n return row ?? null\n }\n\n private async getSource(\n projectId: string,\n sourceId: string,\n materializationId: string,\n lock = false\n ): Promise<PgOntologySourceRow | null> {\n const lockFragment = lock ? this.sql`FOR UPDATE` : this.sql``\n const [row] = await this.sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId}\n AND source_id = ${sourceId}\n AND materialization_id = ${materializationId}\n ${lockFragment}\n `\n return row ?? null\n }\n}\n\nfunction materializationLockKeys(header: MaterializationPlanHeader): string[] {\n const { commit, expected } = header\n const origin = originColumns(commit.origin)\n return [\n ontologyLockKey(\"commit-id\", commit.projectId, commit.id),\n ontologyLockKey(\"commit-idempotency\", commit.projectId, commit.idempotencyKey),\n ...(origin.runId === null\n ? []\n : [\n ontologyLockKey(\n \"commit-origin\",\n commit.projectId,\n origin.kind,\n origin.runId,\n origin.batchOrdinal === null ? \"\" : String(origin.batchOrdinal)\n ),\n ]),\n ...expected.sources.map((value) =>\n ontologyLockKey(\"source\", commit.projectId, value.source.projectionId)\n ),\n ...expected.objects.map((value) =>\n ontologyLockKey(\"object\", commit.projectId, objectRefKey(value.ref))\n ),\n ...expected.links.map((value) =>\n ontologyLockKey(\"link\", commit.projectId, linkRefKey(value.ref))\n ),\n ...expected.linkScopes.map((value) =>\n ontologyLockKey(\n \"link-scope\",\n commit.projectId,\n value.source.objectTypeId,\n value.source.primaryId,\n value.linkId\n )\n ),\n ...expected.points.map((value) =>\n ontologyLockKey(\"point\", commit.projectId, telemetryPointKey(value.series, value.at))\n ),\n ]\n}\n\nfunction databaseCount(value: number | string | undefined): number {\n return Number(value ?? 0)\n}\n",
40
- "import { MaterializationConflictError } from \"@sixb/core/internal/materialization\"\nimport {\n correlateMaterializationChunk,\n duplicateMaterializationWork as duplicateWork,\n invalidCorrelation,\n materializationPlanItems,\n ProviderMaterializationSessionState,\n type ProviderMaterializationTransactionLifecycle,\n prepareMaterializationWork,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n MaterializationEventWorkRecord,\n MaterializationPlanChunk,\n MaterializationPlanHeader,\n MaterializationSession,\n MaterializationWorkPage,\n MaterializationWorkRecord,\n StageMaterializationWorkInput,\n StreamMaterializationWorkInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { isUniqueViolation } from \"../storage-errors\"\nimport { PG_MATERIALIZATION_WORK_TABLE, PG_REPLACEMENT_WORK_TABLE } from \"./materialization-state\"\nimport { jsonParameter } from \"./shared\"\n\nexport interface PgOntologyTransactionContext {\n readonly id: object\n readonly materializations: ProviderMaterializationTransactionLifecycle\n active: boolean\n}\n\ninterface WorkCursor {\n readonly majorOrder: number\n readonly minorOrder: number\n readonly sortOne: string\n readonly sortTwo: string\n readonly recordKey: string\n}\n\nexport interface PgChunkSequenceProgress {\n readonly appliedPlanCount: number\n readonly appliedOutboxCount: number\n readonly appliedPlanCursor: WorkCursor | null\n readonly appliedEventCursor: WorkCursor | null\n}\n\nexport class PgMaterializationSessionState extends ProviderMaterializationSessionState {\n stagedWorkCount = 0\n changedObjects = 0\n changedLinks = 0\n appliedPlanCursor: WorkCursor | null = null\n appliedEventCursor: WorkCursor | null = null\n}\n\ninterface WorkDatabaseRow {\n readonly record_key: string\n readonly major_order: number\n readonly minor_order: number\n readonly sort_one: string\n readonly sort_two: string\n readonly payload: unknown\n}\n\nexport class PgMaterializationSessions {\n private readonly sessions = new WeakMap<object, PgMaterializationSessionState>()\n private readonly live = new Set<PgMaterializationSessionState>()\n private tablesReady = false\n\n constructor(\n private readonly sql: SQLClient,\n private readonly context: PgOntologyTransactionContext | null\n ) {}\n\n async create(header: MaterializationPlanHeader): Promise<PgMaterializationSessionState> {\n if (!this.context?.active) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Materialization sessions require an active storage transaction.\"\n )\n }\n await this.ensureTables()\n const session = new PgMaterializationSessionState(structuredClone(header), this.context.id)\n this.sessions.set(session.providerToken, session)\n this.live.add(session)\n this.context.materializations.register(session.providerToken)\n return session\n }\n\n require(session: MaterializationSession): PgMaterializationSessionState {\n const value = this.sessions.get(session.providerToken)\n if (\n !value ||\n !value.active ||\n !this.context?.active ||\n value.transactionId !== this.context.id\n ) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Materialization session is inactive.\"\n )\n }\n return value\n }\n\n async release(session: PgMaterializationSessionState): Promise<void> {\n if (!session.active) return\n await this.deleteWork(session.id)\n session.active = false\n session.replacement = null\n this.live.delete(session)\n this.context?.materializations.complete(session.providerToken)\n }\n\n deactivateAll(): void {\n for (const session of this.live) {\n session.active = false\n session.replacement = null\n }\n this.live.clear()\n }\n\n async stage(input: StageMaterializationWorkInput): Promise<void> {\n const session = this.require(input.session)\n const records = prepareMaterializationWork(session, input)\n if (records.length === 0) return\n const payload = records.map(({ record, uniqueKey, columns }) => {\n return {\n recordKey: record.recordKey,\n uniqueKey,\n kind: record.kind,\n lane: columns.lane,\n majorOrder: columns.majorOrder,\n minorOrder: columns.minorOrder,\n sortOne: columns.sortOne,\n sortTwo: columns.sortTwo,\n record,\n }\n })\n // This session is the only writer to its transaction-local temp rows. Let the two unique\n // constraints arbitrate cross-chunk duplicates instead of issuing a duplicate probe before\n // every insert; a violation aborts the enclosing materialization transaction and is mapped\n // back to the provider contract below.\n try {\n await this.sql`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, payload)}::jsonb)\n )\n INSERT INTO ${this.sql(PG_MATERIALIZATION_WORK_TABLE)} (\n session_id, record_key, unique_key, kind, lane,\n major_order, minor_order, sort_one, sort_two, payload\n )\n SELECT ${session.id}, value->>'recordKey', value->>'uniqueKey', value->>'kind',\n value->>'lane', (value->>'majorOrder')::integer, (value->>'minorOrder')::integer,\n value->>'sortOne', value->>'sortTwo', value->'record'\n FROM staged\n `\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw duplicateWork()\n }\n throw error\n }\n session.stagedWorkCount += records.length\n }\n\n async *stream(input: StreamMaterializationWorkInput): AsyncIterable<MaterializationWorkPage> {\n const session = this.require(input.session)\n const stream = session.workStreams[input.order]\n if (stream.started) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Materialization ${input.order} work may only be streamed once per session.`\n )\n }\n stream.started = true\n if (!session.workSealed && session.stagedWorkCount >= 10_000) {\n // Planning has finished writing work. Refresh once before draining a large population;\n // small edits avoid the extra database round trip.\n await this.sql`ANALYZE ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}`\n }\n session.workSealed = true\n let cursor: WorkCursor | null = null\n while (true) {\n this.require(input.session)\n const rows = await this.readLane(input.order, session.id, cursor, input.pageRows)\n if (rows.length === 0) break\n const records = rows.map((row) =>\n structuredClone(row.payload)\n ) as MaterializationWorkPage[\"records\"]\n cursor = workCursor(rows[rows.length - 1]!)\n stream.emittedCount += records.length\n yield { records }\n }\n this.require(input.session)\n stream.completed = true\n }\n\n async readObjectExistence(\n session: PgMaterializationSessionState,\n refs: readonly { readonly objectTypeId: string; readonly primaryId: string }[]\n ): Promise<\n readonly {\n readonly ref: { readonly objectTypeId: string; readonly primaryId: string }\n readonly exists: boolean\n }[]\n > {\n if (refs.length === 0) return []\n const keys = refs.map(\n (ref) => `object-existence:${JSON.stringify([ref.objectTypeId, ref.primaryId])}`\n )\n // OFFSET 0 keeps each unique-key lookup parameterized instead of letting the planner\n // flatten the lateral join into a scan of the entire temporary work table.\n const rows = await this.sql<{ readonly unique_key: string; readonly payload: unknown }[]>`\n SELECT work.unique_key, work.payload\n FROM unnest(${this.sql.array(keys)}::text[]) AS requested(unique_key)\n CROSS JOIN LATERAL (\n SELECT unique_key, payload FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${session.id} AND unique_key = requested.unique_key\n OFFSET 0\n ) AS work\n `\n const found = new Map(rows.map((row) => [row.unique_key, row.payload] as const))\n return keys.flatMap((key) => {\n const payload = found.get(key)\n if (!payload) return []\n // prepareMaterializationWork owns this unique-key namespace. Filtering kind in SQL\n // makes stale temporary-table statistics favor a scan over exact indexed lookups.\n const record = structuredClone(payload) as MaterializationWorkRecord\n if (record.kind !== \"object-existence\") {\n invalidCorrelation(\"Object existence work has an invalid kind.\")\n }\n return [{ ref: record.ref, exists: record.exists }]\n })\n }\n\n async prepareChunkSequence(\n session: PgMaterializationSessionState,\n chunk: MaterializationPlanChunk\n ): Promise<PgChunkSequenceProgress> {\n const items = materializationPlanItems(chunk)\n const planRows = await this.readLane(\n \"apply\",\n session.id,\n session.appliedPlanCursor,\n items.length\n )\n const expectedItems = planRows.map(\n (row) =>\n (\n structuredClone(row.payload) as Extract<\n MaterializationWorkRecord,\n { readonly kind: \"plan\" }\n >\n ).item\n )\n const eventRows = await this.readLane(\n \"event\",\n session.id,\n session.appliedEventCursor,\n chunk.outbox.length\n )\n const expectedEvents = eventRows.map(\n (row) => structuredClone(row.payload) as MaterializationEventWorkRecord\n )\n const progress = correlateMaterializationChunk(\n session,\n chunk,\n items,\n expectedItems,\n expectedEvents\n )\n\n return {\n ...progress,\n appliedPlanCursor:\n planRows.length === 0\n ? session.appliedPlanCursor\n : workCursor(planRows[planRows.length - 1]!),\n appliedEventCursor:\n eventRows.length === 0\n ? session.appliedEventCursor\n : workCursor(eventRows[eventRows.length - 1]!),\n }\n }\n\n commitChunkSequence(\n session: PgMaterializationSessionState,\n progress: PgChunkSequenceProgress\n ): void {\n session.appliedPlanCount = progress.appliedPlanCount\n session.appliedOutboxCount = progress.appliedOutboxCount\n session.appliedPlanCursor = progress.appliedPlanCursor\n session.appliedEventCursor = progress.appliedEventCursor\n }\n\n async count(session: PgMaterializationSessionState, kind: string): Promise<number> {\n const [row] = await this.sql<{ readonly count: number | string }[]>`\n SELECT COUNT(*) AS count FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${session.id} AND kind = ${kind}\n `\n return Number(row?.count ?? 0)\n }\n\n async laneCounts(session: PgMaterializationSessionState): Promise<{\n readonly apply: number\n readonly cardinality: number\n readonly event: number\n }> {\n const rows = await this.sql<\n { readonly lane: \"apply\" | \"cardinality\" | \"event\"; readonly count: number | string }[]\n >`\n SELECT lane, COUNT(*) AS count FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${session.id} AND lane <> 'none'\n GROUP BY lane\n `\n const counts = { apply: 0, cardinality: 0, event: 0 }\n for (const row of rows) counts[row.lane] = Number(row.count)\n return counts\n }\n\n async assertClassificationCoverage(session: PgMaterializationSessionState): Promise<void> {\n if (!session.replacement) return\n const includeObjects = session.replacement.projectionKind === \"object\"\n const [mismatch] = await this.sql<{ readonly marker: number }[]>`\n WITH expected AS (\n SELECT entity_kind, identity_key\n FROM ${this.sql(PG_REPLACEMENT_WORK_TABLE)}\n WHERE session_id = ${session.id} AND diff_required\n AND (entity_kind = 'link' OR ${includeObjects})\n ), actual AS (\n SELECT payload->>'entityKind' AS entity_kind,\n payload->>'identityKey' AS identity_key\n FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${session.id} AND kind = 'classification'\n AND payload->>'entityKind' IN ('object', 'link')\n ), differences AS (\n (SELECT * FROM expected EXCEPT SELECT * FROM actual)\n UNION ALL\n (SELECT * FROM actual EXCEPT SELECT * FROM expected)\n ), invalid AS (\n SELECT 1 AS marker FROM differences\n UNION ALL\n SELECT 1 AS marker FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${session.id} AND kind = 'classification'\n AND payload->>'entityKind' = 'point'\n )\n SELECT marker FROM invalid LIMIT 1\n `\n if (mismatch) {\n invalidCorrelation(\n \"Projection replacement classification coverage does not match its streamed state.\"\n )\n }\n }\n\n private async readLane(\n lane: StreamMaterializationWorkInput[\"order\"],\n sessionId: string,\n cursor: WorkCursor | null,\n limit: number\n ): Promise<WorkDatabaseRow[]> {\n if (limit === 0) return []\n const after = cursor\n ? this.sql`AND (major_order, minor_order, sort_one, sort_two, record_key) >\n (${cursor.majorOrder}, ${cursor.minorOrder}, ${cursor.sortOne}, ${cursor.sortTwo},\n ${cursor.recordKey})`\n : this.sql``\n return this.sql<WorkDatabaseRow[]>`\n SELECT record_key, major_order, minor_order, sort_one, sort_two, payload\n FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${sessionId} AND lane = ${lane} ${after}\n ORDER BY major_order, minor_order, sort_one, sort_two, record_key\n LIMIT ${limit}\n `\n }\n\n private async ensureTables(): Promise<void> {\n if (this.tablesReady) return\n await this.sql`\n CREATE TEMP TABLE ${this.sql(PG_MATERIALIZATION_WORK_TABLE)} (\n session_id TEXT NOT NULL,\n record_key TEXT COLLATE \"C\" NOT NULL,\n unique_key TEXT NOT NULL,\n kind TEXT NOT NULL,\n lane TEXT NOT NULL,\n major_order INTEGER NOT NULL,\n minor_order INTEGER NOT NULL,\n sort_one TEXT COLLATE \"C\" NOT NULL,\n sort_two TEXT COLLATE \"C\" NOT NULL,\n payload JSONB NOT NULL,\n PRIMARY KEY (session_id, record_key),\n UNIQUE (session_id, unique_key)\n ) ON COMMIT DROP\n `\n await this.sql`\n CREATE INDEX ontology_materialization_work_lane\n ON ${this.sql(PG_MATERIALIZATION_WORK_TABLE)} (\n session_id, lane, major_order, minor_order, sort_one, sort_two, record_key\n )\n `\n await this.sql`\n CREATE TEMP TABLE ${this.sql(PG_REPLACEMENT_WORK_TABLE)} (\n session_id TEXT NOT NULL,\n entity_kind TEXT NOT NULL,\n identity_key TEXT COLLATE \"C\" NOT NULL,\n sort_key TEXT COLLATE \"C\" NOT NULL,\n diff_required BOOLEAN NOT NULL,\n PRIMARY KEY (session_id, entity_kind, identity_key)\n ) ON COMMIT DROP\n `\n await this.sql`\n CREATE INDEX ontology_replacement_work_order\n ON ${this.sql(PG_REPLACEMENT_WORK_TABLE)} (\n session_id, entity_kind, sort_key, identity_key\n )\n `\n this.tablesReady = true\n }\n\n private async deleteWork(sessionId: string): Promise<void> {\n if (!this.tablesReady) return\n await this.sql`\n DELETE FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)} WHERE session_id = ${sessionId}\n `\n await this.sql`\n DELETE FROM ${this.sql(PG_REPLACEMENT_WORK_TABLE)} WHERE session_id = ${sessionId}\n `\n }\n}\n\nfunction workCursor(row: WorkDatabaseRow): WorkCursor {\n return {\n majorOrder: row.major_order,\n minorOrder: row.minor_order,\n sortOne: row.sort_one,\n sortTwo: row.sort_two,\n recordKey: row.record_key,\n }\n}\n",
41
- "import type {\n EffectiveLinkSnapshot,\n EffectiveObjectSnapshot,\n OntologyLinkRef,\n OntologyObjectRef,\n ProjectionEntityRef,\n TelemetrySeriesRef,\n} from \"@sixb/core/internal/materialization\"\nimport {\n linkRefKey,\n linkScopeSortKey,\n MaterializationConflictError,\n objectRefKey,\n projectionEntityKey,\n telemetryPointKey,\n telemetryPointSortKey,\n} from \"@sixb/core/internal/materialization\"\nimport {\n appendScopeSnapshot,\n finishScopeAccumulator,\n linkSlotOverrideValue,\n startScopeAccumulator,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n MaterializationLinkScopeRevision,\n MaterializationLinkScopeState,\n MaterializationLinkState,\n MaterializationObjectState,\n SourceReplacementLinkState,\n SourceReplacementObjectState,\n StoredLinkOverride,\n StoredLinkSlotOverride,\n StoredObjectOverride,\n StoredSourceAssertion,\n StoredSourceLinkAssertion,\n StoredSourceObjectAssertion,\n StoredTelemetryPoint,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport {\n jsonParameter,\n linkRefFromColumns,\n objectRefFromColumns,\n type PgOntologySourceAssertionRow,\n type PgStoredOverrideRow,\n sourceAssertion,\n toIsoString,\n} from \"./shared\"\nimport {\n activeSourceRows,\n liveSourceRowsJoin,\n replacementAssertionRows,\n replacementSourceRows,\n sourceAssertionColumns,\n} from \"./source-roots\"\n\nexport const PG_MATERIALIZATION_WORK_TABLE = \"ontology_materialization_work\"\nexport const PG_REPLACEMENT_WORK_TABLE = \"ontology_replacement_work\"\n\ninterface EffectiveObjectRow {\n readonly object_type_id: string\n readonly primary_id: string\n readonly properties: unknown\n readonly created_at: Date | string\n readonly updated_at: Date | string\n readonly version: number\n readonly last_commit_id: string | null\n}\n\ninterface EffectiveLinkRow {\n readonly source_type_id: string\n readonly source_id: string\n readonly link_id: string\n readonly target_type_id: string\n readonly target_id: string\n readonly properties: unknown | null\n readonly created_at: Date | string\n readonly updated_at: Date | string\n readonly last_commit_id: string | null\n}\n\ninterface TelemetryRow {\n readonly object_type_id: string\n readonly object_id: string\n readonly property_id: string\n readonly value: unknown\n readonly unit: string | null\n readonly at: Date | string\n readonly last_commit_id: string | null\n}\n\ninterface LinkIdentityRow {\n readonly source_type_id: string\n readonly source_id: string\n readonly link_id: string\n readonly target_type_id: string\n readonly target_id: string\n readonly sort_key: string\n}\n\ninterface LinkScopeRow extends EffectiveLinkRow {\n readonly scope_sort_key: string\n readonly link_sort_key: string\n}\n\ninterface ObjectOverrideRow extends PgStoredOverrideRow {\n readonly object_type_id: string\n readonly primary_id: string\n readonly edited_at: unknown\n}\n\ninterface LinkOverrideRow extends PgStoredOverrideRow {\n readonly source_type_id: string\n readonly source_primary_id: string\n readonly link_id: string\n readonly target_type_id: string\n readonly target_primary_id: string\n}\n\ninterface LinkSlotOverrideRow {\n readonly source_type_id: string\n readonly source_primary_id: string\n readonly link_id: string\n readonly target_type_id: string\n readonly target_primary_id: string\n readonly value: unknown\n readonly last_commit_id: string\n readonly updated_at: Date | string\n}\n\nexport type ReplacementIdentity =\n | {\n readonly kind: \"object\"\n readonly ref: OntologyObjectRef\n readonly sortKey: string\n readonly diffRequired: true\n }\n | {\n readonly kind: \"link\"\n readonly ref: OntologyLinkRef\n readonly sortKey: string\n readonly diffRequired: boolean\n }\n\ninterface ReplacementSources {\n readonly owned: ReadonlySet<string>\n readonly byMaterialization: ReadonlyMap<string, ReadonlyMap<string, StoredSourceAssertion>>\n}\n\ninterface ReplacementIdentityInput {\n readonly incremental?: boolean\n readonly sessionId: string\n readonly sourceId: string\n readonly candidateMaterializationId: string\n readonly previousMaterializationId: string | null\n readonly kind: \"object\" | \"link\"\n readonly pageRows: number\n}\n\ninterface ReplacementWorkRow {\n readonly entity_kind: \"object\" | \"link\"\n readonly identity_key: string\n readonly sort_key: string\n readonly diff_required: boolean\n}\n\nexport class PgMaterializationStateReader {\n constructor(\n private readonly sql: SQLClient,\n readonly projectId: string\n ) {}\n\n async objectState(ref: OntologyObjectRef): Promise<MaterializationObjectState> {\n const [state] = await this.objectStates([ref])\n return state!\n }\n\n async objectStates(\n refs: readonly OntologyObjectRef[]\n ): Promise<readonly MaterializationObjectState[]> {\n if (refs.length === 0) return []\n const requested = refs.map((ref) => ({\n object_type_id: ref.objectTypeId,\n primary_id: ref.primaryId,\n }))\n const requestedParameter = jsonParameter(this.sql, requested)\n const [effectiveRows, sourceRows, overrideRows, telemetryRows] = await Promise.all([\n this.sql<EffectiveObjectRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n )\n SELECT objects.* FROM objects\n JOIN requested USING (object_type_id, primary_id)\n WHERE objects.project_id = ${this.projectId}\n `,\n activeSourceRows(\n this.sql,\n this.projectId,\n refs.map((ref) => ({ kind: \"object\", ref }))\n ),\n this.sql<ObjectOverrideRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n )\n SELECT overrides.* FROM ontology_object_overrides AS overrides\n JOIN requested USING (object_type_id, primary_id)\n WHERE overrides.project_id = ${this.projectId}\n `,\n this.sql<TelemetryRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n )\n SELECT latest.*\n FROM timeseries_latest AS latest\n JOIN requested\n ON requested.object_type_id = latest.object_type_id\n AND requested.primary_id = latest.object_id\n WHERE latest.project_id = ${this.projectId}\n `,\n ])\n\n const effective = new Map(\n effectiveRows.map((row) => [objectRefKey(objectRefFromColumns(row)), row] as const)\n )\n const sources = activeSourceMap(sourceRows)\n const overrides = new Map(\n overrideRows.map(\n (row) => [objectRefKey(objectRefFromColumns(row)), storedObjectOverride(row)] as const\n )\n )\n const telemetry = new Map<string, StoredTelemetryPoint[]>()\n for (const row of telemetryRows) {\n const key = objectRefKey({ objectTypeId: row.object_type_id, primaryId: row.object_id })\n const points = telemetry.get(key) ?? []\n points.push(storedPoint(row))\n telemetry.set(key, points)\n }\n for (const points of telemetry.values()) {\n points.sort((left, right) =>\n telemetryPointSortKey(left.series, left.at).localeCompare(\n telemetryPointSortKey(right.series, right.at)\n )\n )\n }\n\n return refs.map((ref) => {\n const key = objectRefKey(ref)\n const effectiveRow = effective.get(key)\n return {\n ref: structuredClone(ref),\n source: sourceObject(sources.get(projectionEntityKey({ kind: \"object\", ref }))),\n override: overrides.get(key) ?? null,\n effective: effectiveRow ? effectiveObjectSnapshot(effectiveRow) : null,\n latestTelemetry: telemetry.get(key) ?? [],\n }\n })\n }\n\n async linkState(ref: OntologyLinkRef): Promise<MaterializationLinkState> {\n const [state] = await this.linkStates([ref])\n return state!\n }\n\n async linkStates(refs: readonly OntologyLinkRef[]): Promise<readonly MaterializationLinkState[]> {\n if (refs.length === 0) return []\n const requested = refs.map((ref) => ({\n source_type_id: ref.source.objectTypeId,\n source_id: ref.source.primaryId,\n source_primary_id: ref.source.primaryId,\n link_id: ref.linkId,\n target_type_id: ref.target.objectTypeId,\n target_id: ref.target.primaryId,\n target_primary_id: ref.target.primaryId,\n }))\n const requestedParameter = jsonParameter(this.sql, requested)\n const [effectiveRows, sourceRows, overrideRows, slotOverrideRows] = await Promise.all([\n this.sql<EffectiveLinkRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter}) AS requested_values(\n source_type_id TEXT, source_id TEXT, link_id TEXT,\n target_type_id TEXT, target_id TEXT\n )\n )\n SELECT links.* FROM links\n JOIN requested USING (source_type_id, source_id, link_id, target_type_id, target_id)\n WHERE links.project_id = ${this.projectId}\n `,\n activeSourceRows(\n this.sql,\n this.projectId,\n refs.map((ref) => ({ kind: \"link\", ref }))\n ),\n this.sql<LinkOverrideRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter}) AS requested_values(\n source_type_id TEXT, source_primary_id TEXT, link_id TEXT,\n target_type_id TEXT, target_primary_id TEXT\n )\n )\n SELECT overrides.* FROM ontology_link_overrides AS overrides\n JOIN requested USING (\n source_type_id, source_primary_id, link_id, target_type_id, target_primary_id\n )\n WHERE overrides.project_id = ${this.projectId}\n AND overrides.identity_kind = 'edge'\n `,\n this.sql<LinkSlotOverrideRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter}) AS requested_values(\n source_type_id TEXT, source_primary_id TEXT, link_id TEXT\n )\n )\n SELECT overrides.* FROM ontology_link_overrides AS overrides\n JOIN requested USING (source_type_id, source_primary_id, link_id)\n WHERE overrides.project_id = ${this.projectId}\n AND overrides.identity_kind = 'slot'\n `,\n ])\n const effective = new Map(\n effectiveRows.map((row) => [linkRefKey(linkRefFromColumns(row)), row] as const)\n )\n const sources = activeSourceMap(sourceRows)\n const overrides = new Map(\n overrideRows.map(\n (row) => [linkRefKey(linkRefFromOverrideColumns(row)), storedLinkOverride(row)] as const\n )\n )\n const slotOverrides = new Map(\n slotOverrideRows.map((row) => {\n const stored = storedLinkSlotOverride(row)\n return [linkScopeSortKey(stored.ref.source, stored.ref.linkId), stored] as const\n })\n )\n return refs.map((ref) => {\n const key = linkRefKey(ref)\n const effectiveRow = effective.get(key)\n return {\n ref: structuredClone(ref),\n source: sourceLink(sources.get(projectionEntityKey({ kind: \"link\", ref }))),\n override: overrides.get(key) ?? null,\n slotOverride: slotOverrides.get(linkScopeSortKey(ref.source, ref.linkId)) ?? null,\n effective: effectiveRow ? effectiveLinkSnapshot(effectiveRow) : null,\n }\n })\n }\n\n async exactPoint(\n series: TelemetrySeriesRef,\n at: string,\n lock = false\n ): Promise<StoredTelemetryPoint | null> {\n return (await this.exactPoints([{ series, at }], lock))[0] ?? null\n }\n\n async exactPoints(\n points: readonly { readonly series: TelemetrySeriesRef; readonly at: string }[],\n lock = false\n ): Promise<readonly StoredTelemetryPoint[]> {\n if (points.length === 0) return []\n const requested = points.map(({ series, at }) => ({\n object_type_id: series.object.objectTypeId,\n object_id: series.object.primaryId,\n property_id: series.propertyId,\n at,\n }))\n const lockFragment = lock ? this.sql`FOR UPDATE OF timeseries` : this.sql``\n const rows = await this.sql<TelemetryRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${jsonParameter(this.sql, requested)}) AS requested_values(\n object_type_id TEXT, object_id TEXT, property_id TEXT, at TIMESTAMPTZ\n )\n )\n SELECT timeseries.* FROM timeseries\n JOIN requested USING (object_type_id, object_id, property_id, at)\n WHERE timeseries.project_id = ${this.projectId}\n ${lockFragment}\n `\n const found = new Map(\n rows.map((row) => {\n const point = storedPoint(row)\n return [telemetryPointKey(point.series, point.at), point] as const\n })\n )\n return points.flatMap((point) => {\n const stored = found.get(telemetryPointKey(point.series, point.at))\n return stored ? [stored] : []\n })\n }\n\n async linkScopeRevisions(\n scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]\n ): Promise<readonly MaterializationLinkScopeRevision[]> {\n if (scopes.length === 0) return []\n return (await this.readEffectiveLinkScopes(scopes)).revisions\n }\n\n async linkSlotStates(\n scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]\n ): Promise<readonly MaterializationLinkScopeState[]> {\n if (scopes.length === 0) return []\n const requested = scopes.map(({ source, linkId }) => ({\n scope_sort_key: linkScopeSortKey(source, linkId),\n source_type_id: source.objectTypeId,\n source_id: source.primaryId,\n link_id: linkId,\n }))\n const requestedParameter = jsonParameter(this.sql, requested)\n const [sourceRows, slotOverrideRows] = await Promise.all([\n this.sql<PgOntologySourceAssertionRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(\n scope_sort_key TEXT, source_type_id TEXT, source_id TEXT, link_id TEXT\n )\n )\n SELECT ${sourceAssertionColumns(this.sql)}\n FROM ontology_source_rows AS rows\n JOIN requested\n ON requested.source_type_id = rows.source_type_id\n AND requested.source_id = rows.source_primary_id\n AND requested.link_id = rows.link_id\n ${liveSourceRowsJoin(this.sql, this.projectId)}\n WHERE rows.entity_kind = 'link'\n `,\n this.sql<LinkSlotOverrideRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(\n scope_sort_key TEXT, source_type_id TEXT, source_id TEXT, link_id TEXT\n )\n )\n SELECT overrides.*\n FROM ontology_link_overrides AS overrides\n JOIN requested\n ON requested.source_type_id = overrides.source_type_id\n AND requested.source_id = overrides.source_primary_id\n AND requested.link_id = overrides.link_id\n WHERE overrides.project_id = ${this.projectId}\n AND overrides.identity_kind = 'slot'\n `,\n ])\n const sources = activeScopeSourceMap(sourceRows)\n const overrides = new Map(\n slotOverrideRows.map((row) => {\n const stored = storedLinkSlotOverride(row)\n return [linkScopeSortKey(stored.ref.source, stored.ref.linkId), stored] as const\n })\n )\n const { revisions, effective } = await this.readEffectiveLinkScopes(scopes)\n return scopes.map(({ source, linkId }, index) => {\n const key = linkScopeSortKey(source, linkId)\n return {\n ...revisions[index]!,\n sourceAssertion: sources.get(key) ?? null,\n override: overrides.get(key) ?? null,\n effective: effective.get(key) ?? null,\n }\n })\n }\n\n private async readEffectiveLinkScopes(\n scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]\n ): Promise<{\n readonly revisions: readonly MaterializationLinkScopeRevision[]\n readonly effective: ReadonlyMap<string, EffectiveLinkSnapshot | null>\n }> {\n const requested = scopes.map(({ source, linkId }) => ({\n scope_sort_key: linkScopeSortKey(source, linkId),\n source_type_id: source.objectTypeId,\n source_id: source.primaryId,\n link_id: linkId,\n }))\n const requestedParameter = jsonParameter(this.sql, requested)\n const accumulators = new Map(\n scopes.map(({ source, linkId }) => {\n const key = linkScopeSortKey(source, linkId)\n return [key, startScopeAccumulator(source, linkId)] as const\n })\n )\n const effective = new Map<string, EffectiveLinkSnapshot | null>()\n let scopeCursor: string | null = null\n let linkCursor: string | null = null\n while (true) {\n const rows: LinkScopeRow[] = await this.sql`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(\n scope_sort_key TEXT, source_type_id TEXT, source_id TEXT, link_id TEXT\n )\n ), selected AS (\n SELECT requested.scope_sort_key, links.*,\n ${this.sql.unsafe(linkSortExpression(\"links\"))} AS link_sort_key\n FROM links\n JOIN requested USING (source_type_id, source_id, link_id)\n WHERE links.project_id = ${this.projectId}\n )\n SELECT * FROM selected\n WHERE (${scopeCursor}::text IS NULL OR (scope_sort_key, link_sort_key) >\n (${scopeCursor}, ${linkCursor}))\n ORDER BY scope_sort_key, link_sort_key\n LIMIT 500\n `\n for (const row of rows) {\n const accumulator = accumulators.get(row.scope_sort_key)\n if (!accumulator) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Unexpected link scope '${row.scope_sort_key}' returned by storage.`\n )\n }\n const snapshot = effectiveLinkSnapshot(row)\n appendScopeSnapshot(accumulator, snapshot)\n effective.set(row.scope_sort_key, accumulator.effectiveCount === 1 ? snapshot : null)\n }\n if (rows.length < 500) break\n const last: LinkScopeRow = rows[rows.length - 1]!\n scopeCursor = last.scope_sort_key\n linkCursor = last.link_sort_key\n }\n return {\n revisions: scopes.map(({ source, linkId }) =>\n finishScopeAccumulator(accumulators.get(linkScopeSortKey(source, linkId))!)\n ),\n effective,\n }\n }\n\n async *incidentLinks(\n objects: readonly OntologyObjectRef[],\n pageRows: number\n ): AsyncIterable<OntologyLinkRef[]> {\n if (objects.length === 0) return\n const requested = objects.map((ref) => ({\n object_type_id: ref.objectTypeId,\n primary_id: ref.primaryId,\n }))\n let cursor: string | null = null\n while (true) {\n const rows: LinkIdentityRow[] = await this.sql`\n WITH requested AS (\n SELECT DISTINCT *\n FROM jsonb_to_recordset(${jsonParameter(this.sql, requested)})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n ), authority_links AS (\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links\n JOIN requested\n ON requested.object_type_id = links.source_type_id\n AND requested.primary_id = links.source_id\n WHERE links.project_id = ${this.projectId}\n UNION\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links\n JOIN requested\n ON requested.object_type_id = links.target_type_id\n AND requested.primary_id = links.target_id\n WHERE links.project_id = ${this.projectId}\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id AS source_id,\n overrides.link_id, overrides.target_type_id,\n overrides.target_primary_id AS target_id\n FROM ontology_link_overrides AS overrides\n JOIN requested\n ON requested.object_type_id = overrides.source_type_id\n AND requested.primary_id = overrides.source_primary_id\n WHERE overrides.project_id = ${this.projectId}\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id AS source_id,\n overrides.link_id, overrides.target_type_id,\n overrides.target_primary_id AS target_id\n FROM ontology_link_overrides AS overrides\n JOIN requested\n ON requested.object_type_id = overrides.target_type_id\n AND requested.primary_id = overrides.target_primary_id\n WHERE overrides.project_id = ${this.projectId}\n UNION\n SELECT rows.source_type_id, rows.source_primary_id AS source_id,\n rows.link_id, rows.target_type_id, rows.target_primary_id AS target_id\n FROM ontology_source_rows AS rows\n ${liveSourceRowsJoin(this.sql, this.projectId)}\n JOIN requested\n ON requested.object_type_id = rows.source_type_id\n AND requested.primary_id = rows.source_primary_id\n WHERE rows.entity_kind = 'link'\n UNION\n SELECT rows.source_type_id, rows.source_primary_id AS source_id,\n rows.link_id, rows.target_type_id, rows.target_primary_id AS target_id\n FROM ontology_source_rows AS rows\n ${liveSourceRowsJoin(this.sql, this.projectId)}\n JOIN requested\n ON requested.object_type_id = rows.target_type_id\n AND requested.primary_id = rows.target_primary_id\n WHERE rows.entity_kind = 'link'\n ), selected AS (\n SELECT DISTINCT links.*,\n ${this.sql.unsafe(linkSortExpression(\"links\"))} AS sort_key\n FROM authority_links AS links\n )\n SELECT * FROM selected\n WHERE (${cursor}::text IS NULL OR sort_key > ${cursor})\n ORDER BY sort_key\n LIMIT ${pageRows}\n `\n if (rows.length === 0) break\n yield rows.map(linkRefFromColumns)\n cursor = rows[rows.length - 1]?.sort_key ?? null\n }\n }\n\n async *replacementIdentities(\n input: ReplacementIdentityInput\n ): AsyncIterable<ReplacementIdentity[]> {\n await this.prepareReplacementIdentities(input)\n // Temporary tables are not auto-analyzed. Refresh after each identity population is\n // prepared so the planner can choose the ordered index for its bounded pages.\n await this.sql`ANALYZE ${this.sql(PG_REPLACEMENT_WORK_TABLE)}`\n let cursor: string | null = null\n while (true) {\n // Keep the next-page bound indexable in generic prepared plans. A nullable OR\n // makes PostgreSQL revisit the preceding pages before applying the cursor filter.\n const after = cursor === null ? this.sql`` : this.sql`AND sort_key > ${cursor}`\n const rows: ReplacementWorkRow[] = await this.sql<ReplacementWorkRow[]>`\n SELECT entity_kind, identity_key, sort_key, diff_required\n FROM ${this.sql(PG_REPLACEMENT_WORK_TABLE)}\n WHERE session_id = ${input.sessionId} AND entity_kind = ${input.kind}\n ${after}\n ORDER BY sort_key\n LIMIT ${input.pageRows}\n `\n if (rows.length === 0) break\n yield rows.map(replacementIdentity)\n cursor = rows[rows.length - 1]?.sort_key ?? null\n }\n }\n\n async replacementObjectStates(\n sourceId: string,\n candidateMaterializationId: string,\n refs: readonly OntologyObjectRef[]\n ): Promise<readonly SourceReplacementObjectState[]> {\n const base = await this.objectStates(refs)\n const candidates = await this.replacementSources(\n sourceId,\n [candidateMaterializationId],\n refs.map((ref) => ({ kind: \"object\" as const, ref }))\n )\n return base.map((state) => ({\n ref: state.ref,\n candidateSource: sourceObject(\n candidates.byMaterialization\n .get(candidateMaterializationId)\n ?.get(projectionEntityKey({ kind: \"object\", ref: state.ref }))\n ),\n override: state.override,\n effective: state.effective,\n latestTelemetry: state.latestTelemetry,\n }))\n }\n\n async replacementLinkStates(\n sourceId: string,\n candidateMaterializationId: string,\n materializationIds: readonly string[],\n identities: readonly Extract<ReplacementIdentity, { readonly kind: \"link\" }>[],\n incremental = false\n ): Promise<readonly SourceReplacementLinkState[]> {\n const refs = identities.map((identity) => identity.ref)\n const base = await this.linkStates(refs)\n const replacements = await this.replacementSources(\n sourceId,\n materializationIds,\n refs.map((ref) => ({ kind: \"link\" as const, ref })),\n incremental\n )\n const candidate = replacements.byMaterialization.get(candidateMaterializationId)\n return base.map((state, index) => {\n const key = projectionEntityKey({ kind: \"link\", ref: state.ref })\n return {\n ref: state.ref,\n candidateSource: replacements.owned.has(key)\n ? sourceLink(candidate?.get(key))\n : state.source,\n override: state.override,\n slotOverride: state.slotOverride,\n effective: state.effective,\n diffRequired: identities[index]!.diffRequired,\n }\n })\n }\n\n async effectiveObjectRevision(\n ref: OntologyObjectRef,\n lock = false\n ): Promise<{ readonly version: number; readonly lastCommitId: string | null } | null> {\n return (await this.effectiveObjectRevisions([ref], lock)).get(objectRefKey(ref)) ?? null\n }\n\n async effectiveObjectRevisions(\n refs: readonly OntologyObjectRef[],\n lock = false\n ): Promise<\n ReadonlyMap<string, { readonly version: number; readonly lastCommitId: string | null }>\n > {\n if (refs.length === 0) return new Map()\n const requested = refs.map((ref) => ({\n object_type_id: ref.objectTypeId,\n primary_id: ref.primaryId,\n }))\n const lockFragment = lock ? this.sql`FOR UPDATE OF objects` : this.sql``\n const rows = await this.sql<\n {\n readonly object_type_id: string\n readonly primary_id: string\n readonly version: number\n readonly last_commit_id: string | null\n }[]\n >`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${jsonParameter(this.sql, requested)})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n )\n SELECT objects.object_type_id, objects.primary_id, objects.version,\n objects.last_commit_id\n FROM objects JOIN requested USING (object_type_id, primary_id)\n WHERE objects.project_id = ${this.projectId}\n ${lockFragment}\n `\n return new Map(\n rows.map(\n (row) =>\n [\n objectRefKey(objectRefFromColumns(row)),\n { version: row.version, lastCommitId: row.last_commit_id },\n ] as const\n )\n )\n }\n\n async effectiveLinkLastCommit(\n ref: OntologyLinkRef,\n lock = false\n ): Promise<string | null | undefined> {\n return (await this.effectiveLinkLastCommits([ref], lock)).get(linkRefKey(ref))\n }\n\n async effectiveLinkLastCommits(\n refs: readonly OntologyLinkRef[],\n lock = false\n ): Promise<ReadonlyMap<string, string | null>> {\n if (refs.length === 0) return new Map()\n const requested = refs.map((ref) => ({\n source_type_id: ref.source.objectTypeId,\n source_id: ref.source.primaryId,\n link_id: ref.linkId,\n target_type_id: ref.target.objectTypeId,\n target_id: ref.target.primaryId,\n }))\n const lockFragment = lock ? this.sql`FOR UPDATE OF links` : this.sql``\n const rows = await this.sql<EffectiveLinkRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${jsonParameter(this.sql, requested)})\n AS requested_values(\n source_type_id TEXT, source_id TEXT, link_id TEXT,\n target_type_id TEXT, target_id TEXT\n )\n )\n SELECT links.* FROM links\n JOIN requested USING (source_type_id, source_id, link_id, target_type_id, target_id)\n WHERE links.project_id = ${this.projectId}\n ${lockFragment}\n `\n return new Map(\n rows.map((row) => [linkRefKey(linkRefFromColumns(row)), row.last_commit_id] as const)\n )\n }\n\n private async replacementSources(\n sourceId: string,\n materializationIds: readonly string[],\n refs: readonly ProjectionEntityRef[],\n incremental = false\n ): Promise<ReplacementSources> {\n if (materializationIds.length === 0 || refs.length === 0) {\n return { owned: new Set(), byMaterialization: new Map() }\n }\n const rows = await replacementAssertionRows(this.sql, {\n projectId: this.projectId,\n sourceId,\n materializationId: materializationIds[0]!,\n incremental,\n includePrevious: materializationIds.length > 1,\n refs,\n })\n const owned = new Set<string>()\n const byMaterialization = new Map<string, Map<string, StoredSourceAssertion>>()\n for (const row of rows) {\n const source = storedSource(row)\n const key = projectionEntityKey(source.assertion)\n owned.add(key)\n const materialization = byMaterialization.get(row.materialization_id) ?? new Map()\n materialization.set(key, source)\n byMaterialization.set(row.materialization_id, materialization)\n }\n return { owned, byMaterialization }\n }\n\n private async prepareReplacementIdentities(input: ReplacementIdentityInput): Promise<void> {\n if (input.kind === \"object\") {\n await this.prepareReplacementObjects(input)\n return\n }\n await this.prepareReplacementLinks(input)\n }\n\n private async prepareReplacementObjects(input: ReplacementIdentityInput): Promise<void> {\n const rows = replacementSourceRows(this.sql, {\n projectId: this.projectId,\n sourceId: input.sourceId,\n materializationId: input.candidateMaterializationId,\n incremental: input.incremental ?? false,\n })\n await this.sql`\n WITH selected AS (\n SELECT DISTINCT object_type_id, primary_id,\n ${this.sql.unsafe(objectKeyExpression(\"rows\"))} AS identity_key,\n ${this.sql.unsafe(objectSortExpression(\"rows\"))} AS sort_key\n FROM (${rows}) AS rows\n WHERE entity_kind = 'object'\n )\n INSERT INTO ${this.sql(PG_REPLACEMENT_WORK_TABLE)} (\n session_id, entity_kind, identity_key, sort_key, diff_required\n )\n SELECT ${input.sessionId}, 'object', identity_key, sort_key, TRUE\n FROM selected\n ON CONFLICT (session_id, entity_kind, identity_key) DO UPDATE SET\n diff_required = ${this.sql(PG_REPLACEMENT_WORK_TABLE)}.diff_required\n OR EXCLUDED.diff_required\n `\n }\n\n private async prepareReplacementLinks(input: ReplacementIdentityInput): Promise<void> {\n await this.sql`ANALYZE ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}`\n const rows = replacementSourceRows(this.sql, {\n projectId: this.projectId,\n sourceId: input.sourceId,\n materializationId: input.candidateMaterializationId,\n incremental: input.incremental ?? false,\n })\n await this.sql`\n WITH incident_objects AS (\n SELECT DISTINCT payload->'ref'->>'objectTypeId' AS object_type_id,\n payload->'ref'->>'primaryId' AS primary_id\n FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)}\n WHERE session_id = ${input.sessionId} AND kind = 'incident-object'\n ), replacement_links AS (\n SELECT source_type_id, source_primary_id AS source_id, link_id,\n target_type_id, target_primary_id AS target_id\n FROM (${rows}) AS rows\n WHERE entity_kind = 'link'\n ), incident_links AS (\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links\n JOIN incident_objects\n ON incident_objects.object_type_id = links.source_type_id\n AND incident_objects.primary_id = links.source_id\n WHERE links.project_id = ${this.projectId}\n UNION\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links\n JOIN incident_objects\n ON incident_objects.object_type_id = links.target_type_id\n AND incident_objects.primary_id = links.target_id\n WHERE links.project_id = ${this.projectId}\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id AS source_id,\n overrides.link_id, overrides.target_type_id,\n overrides.target_primary_id AS target_id\n FROM ontology_link_overrides AS overrides\n JOIN incident_objects\n ON incident_objects.object_type_id = overrides.source_type_id\n AND incident_objects.primary_id = overrides.source_primary_id\n WHERE overrides.project_id = ${this.projectId}\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id AS source_id,\n overrides.link_id, overrides.target_type_id,\n overrides.target_primary_id AS target_id\n FROM ontology_link_overrides AS overrides\n JOIN incident_objects\n ON incident_objects.object_type_id = overrides.target_type_id\n AND incident_objects.primary_id = overrides.target_primary_id\n WHERE overrides.project_id = ${this.projectId}\n UNION\n SELECT rows.source_type_id, rows.source_primary_id AS source_id,\n rows.link_id, rows.target_type_id, rows.target_primary_id AS target_id\n FROM ontology_source_rows AS rows\n ${liveSourceRowsJoin(this.sql, this.projectId)}\n JOIN incident_objects\n ON incident_objects.object_type_id = rows.source_type_id\n AND incident_objects.primary_id = rows.source_primary_id\n WHERE rows.entity_kind = 'link'\n UNION\n SELECT rows.source_type_id, rows.source_primary_id AS source_id,\n rows.link_id, rows.target_type_id, rows.target_primary_id AS target_id\n FROM ontology_source_rows AS rows\n ${liveSourceRowsJoin(this.sql, this.projectId)}\n JOIN incident_objects\n ON incident_objects.object_type_id = rows.target_type_id\n AND incident_objects.primary_id = rows.target_primary_id\n WHERE rows.entity_kind = 'link'\n ), diff_links AS (\n SELECT * FROM replacement_links\n UNION SELECT * FROM incident_links\n ), affected_scopes AS (\n SELECT DISTINCT source_type_id, source_id, link_id FROM diff_links\n ), all_links AS (\n SELECT diff_links.*, TRUE AS diff_required FROM diff_links\n UNION ALL\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id, FALSE AS diff_required\n FROM links\n JOIN affected_scopes USING (source_type_id, source_id, link_id)\n WHERE links.project_id = ${this.projectId}\n UNION ALL\n SELECT overrides.source_type_id, overrides.source_primary_id AS source_id,\n overrides.link_id, overrides.target_type_id,\n overrides.target_primary_id AS target_id, FALSE AS diff_required\n FROM ontology_link_overrides AS overrides\n JOIN affected_scopes\n ON affected_scopes.source_type_id = overrides.source_type_id\n AND affected_scopes.source_id = overrides.source_primary_id\n AND affected_scopes.link_id = overrides.link_id\n WHERE overrides.project_id = ${this.projectId} AND overrides.identity_kind = 'slot'\n ), selected AS (\n SELECT source_type_id, source_id, link_id, target_type_id, target_id,\n ${this.sql.unsafe(linkKeyExpression(\"all_links\"))} AS identity_key,\n ${this.sql.unsafe(linkSortExpression(\"all_links\"))} AS sort_key,\n BOOL_OR(diff_required) AS diff_required\n FROM all_links\n GROUP BY source_type_id, source_id, link_id, target_type_id, target_id\n )\n INSERT INTO ${this.sql(PG_REPLACEMENT_WORK_TABLE)} (\n session_id, entity_kind, identity_key, sort_key, diff_required\n )\n SELECT ${input.sessionId}, 'link', identity_key, sort_key, diff_required\n FROM selected\n ON CONFLICT (session_id, entity_kind, identity_key) DO UPDATE SET\n diff_required = ${this.sql(PG_REPLACEMENT_WORK_TABLE)}.diff_required\n OR EXCLUDED.diff_required\n `\n }\n}\n\nfunction replacementIdentity(row: ReplacementWorkRow): ReplacementIdentity {\n const parts = JSON.parse(row.identity_key) as string[]\n if (row.entity_kind === \"object\") {\n return {\n kind: \"object\",\n ref: { objectTypeId: parts[0]!, primaryId: parts[1]! },\n sortKey: row.sort_key,\n diffRequired: true,\n }\n }\n return {\n kind: \"link\",\n ref: {\n source: { objectTypeId: parts[0]!, primaryId: parts[1]! },\n linkId: parts[2]!,\n target: { objectTypeId: parts[3]!, primaryId: parts[4]! },\n },\n sortKey: row.sort_key,\n diffRequired: row.diff_required,\n }\n}\n\nfunction activeSourceMap(\n rows: readonly PgOntologySourceAssertionRow[]\n): ReadonlyMap<string, StoredSourceAssertion> {\n const result = new Map<string, StoredSourceAssertion>()\n for (const row of rows) {\n const source = storedSource(row)\n const key = projectionEntityKey(source.assertion)\n if (result.has(key)) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Multiple active sources assert ${key}.`\n )\n }\n result.set(key, source)\n }\n return result\n}\n\nfunction activeScopeSourceMap(\n rows: readonly PgOntologySourceAssertionRow[]\n): ReadonlyMap<string, StoredSourceLinkAssertion> {\n const result = new Map<string, StoredSourceLinkAssertion>()\n for (const row of rows) {\n const source = sourceLink(storedSource(row))\n if (!source) continue\n const ref = source.assertion.ref\n const key = linkScopeSortKey(ref.source, ref.linkId)\n if (result.has(key)) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Multiple active sources assert cardinality-one link slot ${key}.`\n )\n }\n result.set(key, source)\n }\n return result\n}\n\nfunction sourceObject(\n source: StoredSourceAssertion | undefined\n): StoredSourceObjectAssertion | null {\n return source?.assertion.kind === \"object\" ? (source as StoredSourceObjectAssertion) : null\n}\n\nfunction sourceLink(source: StoredSourceAssertion | undefined): StoredSourceLinkAssertion | null {\n return source?.assertion.kind === \"link\" ? (source as StoredSourceLinkAssertion) : null\n}\n\nfunction storedObjectOverride(row: ObjectOverrideRow): StoredObjectOverride {\n const ref = objectRefFromColumns(row)\n return {\n ref,\n value: structuredClone(row.value) as StoredObjectOverride[\"value\"],\n editedAt: structuredClone(row.edited_at) as Readonly<Record<string, string>>,\n lastCommitId: row.last_commit_id,\n updatedAt: toIsoString(row.updated_at),\n }\n}\n\nfunction storedLinkOverride(row: LinkOverrideRow): StoredLinkOverride {\n const ref = linkRefFromOverrideColumns(row)\n return {\n ref,\n value: structuredClone(row.value) as StoredLinkOverride[\"value\"],\n lastCommitId: row.last_commit_id,\n updatedAt: toIsoString(row.updated_at),\n }\n}\n\nfunction storedLinkSlotOverride(row: LinkSlotOverrideRow): StoredLinkSlotOverride {\n const ref = {\n source: { objectTypeId: row.source_type_id, primaryId: row.source_primary_id },\n linkId: row.link_id,\n }\n return {\n ref,\n value: linkSlotOverrideValue(row.value, linkScopeLabel(ref)),\n lastCommitId: row.last_commit_id,\n updatedAt: toIsoString(row.updated_at),\n }\n}\n\nfunction linkRefFromOverrideColumns(row: LinkOverrideRow): OntologyLinkRef {\n return {\n source: { objectTypeId: row.source_type_id, primaryId: row.source_primary_id },\n linkId: row.link_id,\n target: { objectTypeId: row.target_type_id, primaryId: row.target_primary_id },\n }\n}\n\nfunction linkScopeLabel(scope: {\n readonly source: OntologyObjectRef\n readonly linkId: string\n}): string {\n return JSON.stringify([scope.source.objectTypeId, scope.source.primaryId, scope.linkId])\n}\n\nfunction storedSource(row: PgOntologySourceAssertionRow): StoredSourceAssertion {\n return {\n source: { projectionId: row.source_id },\n materializationId: row.materialization_id,\n ...sourceAssertion(row),\n } as StoredSourceAssertion\n}\n\nfunction effectiveObjectSnapshot(row: EffectiveObjectRow): EffectiveObjectSnapshot {\n if (!row.last_commit_id) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Effective object ${row.object_type_id}:${row.primary_id} lacks materializer provenance.`\n )\n }\n return {\n ref: objectRefFromColumns(row),\n properties: structuredClone(row.properties) as EffectiveObjectSnapshot[\"properties\"],\n version: row.version,\n createdAt: toIsoString(row.created_at),\n updatedAt: toIsoString(row.updated_at),\n lastCommitId: row.last_commit_id,\n }\n}\n\nfunction effectiveLinkSnapshot(row: EffectiveLinkRow): EffectiveLinkSnapshot {\n if (!row.last_commit_id) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Effective link ${linkRefKey(linkRefFromColumns(row))} lacks materializer provenance.`\n )\n }\n return {\n ref: linkRefFromColumns(row),\n ...(row.properties === null\n ? {}\n : {\n properties: structuredClone(row.properties) as NonNullable<\n EffectiveLinkSnapshot[\"properties\"]\n >,\n }),\n createdAt: toIsoString(row.created_at),\n updatedAt: toIsoString(row.updated_at),\n lastCommitId: row.last_commit_id,\n }\n}\n\nfunction storedPoint(row: TelemetryRow): StoredTelemetryPoint {\n const at = toIsoString(row.at)\n if (!row.last_commit_id) {\n throw new MaterializationConflictError(\n \"timeseries-point\",\n `Telemetry point ${telemetryPointSortKey(\n {\n object: { objectTypeId: row.object_type_id, primaryId: row.object_id },\n propertyId: row.property_id,\n },\n at\n )} lacks materializer provenance.`\n )\n }\n return {\n series: {\n object: { objectTypeId: row.object_type_id, primaryId: row.object_id },\n propertyId: row.property_id,\n },\n value: structuredClone(row.value) as StoredTelemetryPoint[\"value\"],\n ...(row.unit === null ? {} : { unit: row.unit }),\n at,\n lastCommitId: row.last_commit_id,\n }\n}\n\nexport function objectSortExpression(alias?: string): string {\n const prefix = alias ? `${alias}.` : \"\"\n return utf8SortExpression([\n `to_jsonb(${prefix}object_type_id)::text`,\n `to_jsonb(${prefix}primary_id)::text`,\n ])\n}\n\nfunction objectKeyExpression(alias?: string): string {\n const prefix = alias ? `${alias}.` : \"\"\n return jsonTupleExpression([\n `to_jsonb(${prefix}object_type_id)::text`,\n `to_jsonb(${prefix}primary_id)::text`,\n ])\n}\n\nexport function linkSortExpression(alias?: string): string {\n const prefix = alias ? `${alias}.` : \"\"\n return utf8SortExpression([\n `to_jsonb(${prefix}source_type_id)::text`,\n `to_jsonb(${prefix}source_id)::text`,\n `to_jsonb(${prefix}link_id)::text`,\n `to_jsonb(${prefix}target_type_id)::text`,\n `to_jsonb(${prefix}target_id)::text`,\n ])\n}\n\nfunction linkKeyExpression(alias?: string): string {\n const prefix = alias ? `${alias}.` : \"\"\n return jsonTupleExpression([\n `to_jsonb(${prefix}source_type_id)::text`,\n `to_jsonb(${prefix}source_id)::text`,\n `to_jsonb(${prefix}link_id)::text`,\n `to_jsonb(${prefix}target_type_id)::text`,\n `to_jsonb(${prefix}target_id)::text`,\n ])\n}\n\nfunction utf8SortExpression(parts: readonly string[]): string {\n return `encode(convert_to(${jsonTupleExpression(parts)}, 'UTF8'), 'hex')`\n}\n\nfunction jsonTupleExpression(parts: readonly string[]): string {\n return `concat('[', ${parts.join(\", ',', \")}, ']')`\n}\n",
42
- "import type { ProjectionEntityRef } from \"@sixb/core/internal/materialization\"\nimport {\n MaterializationConflictError,\n MaterializationValidationError,\n projectionEntityKey,\n} from \"@sixb/core/internal/materialization\"\nimport {\n sourceEntityColumns,\n sourceStageRoots,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type { SourceActivationWrite, StageSourceRowsInput } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport type { PgOntologySourceAssertionRow } from \"./shared\"\nimport { jsonParameter, type PgOntologySourceRow } from \"./shared\"\n\n/**\n * Source storage in three levels: a version (`ontology_sources`, one per run), its roots (one per\n * logical dataset row, keyed by the canonical entity key) and their rows (what each root asserts).\n *\n * A root is live while its version is published (active or superseded), it is not retired and it\n * is not a deletion. Activation retires the live roots its candidate replaces and flips the\n * version; the candidate's own roots are never rewritten. One live root per source and key holds\n * because activation, under the source fence, retires every root the candidate replaces.\n */\nconst PUBLISHED = \"('active', 'superseded')\"\n\n/** The columns `sourceAssertion` reads, over `versions`, `roots` and `rows`. */\nexport function sourceAssertionColumns(sql: SQLClient) {\n return sql.unsafe(`versions.source_id, versions.materialization_id, roots.root_key,\n roots.staging_ordinal, rows.entity_kind, rows.object_type_id, rows.primary_id,\n rows.source_type_id, rows.source_primary_id, rows.link_id, rows.target_type_id,\n rows.target_primary_id, rows.payload`)\n}\n\n/** Keeps `rows` to those of live roots in `projectId`, joined as `roots` and `versions`. */\nexport function liveSourceRowsJoin(sql: SQLClient, projectId: string) {\n return sql`\n JOIN ontology_source_roots AS roots ON roots.id = rows.root_id\n AND roots.project_id = ${projectId} AND roots.retired_at IS NULL AND NOT roots.deleted\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n AND versions.status IN ${sql.unsafe(PUBLISHED)}\n `\n}\n\nfunction candidateVersion(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly sourceId: string\n readonly materializationId: string\n }\n) {\n return sql`(SELECT version_id FROM ontology_sources WHERE project_id = ${input.projectId}\n AND source_id = ${input.sourceId} AND materialization_id = ${input.materializationId})`\n}\n\n/** The typed identity of `rows` equals the one requested. */\nconst ENTITY_MATCH = `rows.entity_kind = requested.entity_kind\n AND rows.object_type_id IS NOT DISTINCT FROM requested.object_type_id\n AND rows.primary_id IS NOT DISTINCT FROM requested.primary_id\n AND rows.source_type_id IS NOT DISTINCT FROM requested.source_type_id\n AND rows.source_primary_id IS NOT DISTINCT FROM requested.source_primary_id\n AND rows.link_id IS NOT DISTINCT FROM requested.link_id\n AND rows.target_type_id IS NOT DISTINCT FROM requested.target_type_id\n AND rows.target_primary_id IS NOT DISTINCT FROM requested.target_primary_id`\n\nconst REQUESTED_ENTITY = `entity_kind TEXT, object_type_id TEXT, primary_id TEXT,\n source_type_id TEXT, source_primary_id TEXT, link_id TEXT, target_type_id TEXT,\n target_primary_id TEXT`\n\n/** An entity's own key, and for a link the key of the object root that may assert it. */\nfunction requestedEntity(ref: ProjectionEntityRef) {\n const columns = sourceEntityColumns(ref)\n const key = projectionEntityKey(ref)\n return {\n entity_kind: ref.kind,\n object_type_id: columns.objectTypeId,\n primary_id: columns.primaryId,\n source_type_id: columns.sourceTypeId,\n source_primary_id: columns.sourcePrimaryId,\n link_id: columns.linkId,\n target_type_id: columns.targetTypeId,\n target_primary_id: columns.targetPrimaryId,\n root_keys:\n ref.kind === \"object\"\n ? [key]\n : [key, projectionEntityKey({ kind: \"object\", ref: ref.ref.source })],\n }\n}\n\n/** The candidate's rows, plus the rows of the live roots it may replace. */\nexport function replacementSourceRows(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly sourceId: string\n readonly materializationId: string\n readonly incremental: boolean\n }\n) {\n const live = sql`roots.retired_at IS NULL AND NOT roots.deleted\n AND versions.source_id = ${input.sourceId} AND versions.status IN ${sql.unsafe(PUBLISHED)}`\n const roots = input.incremental\n ? sql`\n SELECT live.id FROM ontology_source_roots AS changed\n CROSS JOIN LATERAL (\n SELECT roots.id FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n WHERE roots.project_id = ${input.projectId} AND roots.root_key = changed.root_key AND ${live}\n OFFSET 0\n ) AS live\n WHERE changed.version_id = ${candidateVersion(sql, input)}\n `\n : sql`\n SELECT roots.id FROM ontology_sources AS versions\n JOIN ontology_source_roots AS roots ON roots.version_id = versions.version_id\n WHERE versions.project_id = ${input.projectId} AND ${live}\n `\n return sql`\n SELECT rows.* FROM ontology_source_roots AS roots\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${candidateVersion(sql, input)}\n UNION ALL\n SELECT rows.* FROM (${roots}) AS roots\n CROSS JOIN LATERAL (\n SELECT rows.* FROM ontology_source_rows AS rows WHERE rows.root_id = roots.id OFFSET 0\n ) AS rows\n `\n}\n\nexport async function stageSourceRoots(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n input: StageSourceRowsInput\n): Promise<void> {\n const roots = sourceStageRoots(manifest.projection_kind, input)\n if (roots.length === 0) return\n if (!manifest.base_materialization_id && roots.some((root) => root.deleted)) {\n throw new MaterializationValidationError(\"Root deletions require a source delta base.\")\n }\n const values = jsonParameter(\n sql,\n roots.map((root) => ({\n root_key: root.rootKey,\n staging_ordinal: root.stagingOrdinal,\n deleted: root.deleted,\n }))\n )\n const inserted = await sql<{ root_key: string }[]>`\n INSERT INTO ontology_source_roots (version_id, project_id, root_key, staging_ordinal, deleted)\n SELECT ${manifest.version_id}, ${input.projectId}, root_key, staging_ordinal, deleted\n FROM jsonb_to_recordset(${values}) AS input(root_key TEXT, staging_ordinal BIGINT, deleted BOOLEAN)\n ON CONFLICT DO NOTHING RETURNING root_key\n `\n if (inserted.length === roots.length) return\n const insertedKeys = new Set(inserted.map((row) => row.root_key))\n const skipped = roots.filter((root) => !insertedKeys.has(root.rootKey))\n const stored = await sql<\n { root_key: string; staging_ordinal: string | number; deleted: boolean }[]\n >`\n SELECT root_key, staging_ordinal, deleted FROM ontology_source_roots\n WHERE version_id = ${manifest.version_id}\n AND root_key = ANY(${sql.array(skipped.map((root) => root.rootKey))}::text[])\n `\n const existing = new Map(stored.map((root) => [root.root_key, root]))\n if (\n skipped.some((root) => {\n const previous = existing.get(root.rootKey)\n return (\n !previous ||\n Number(previous.staging_ordinal) !== root.stagingOrdinal ||\n previous.deleted !== root.deleted\n )\n })\n )\n throw new MaterializationValidationError(\n \"Source materialization repeats root or stream ordinal with different content.\"\n )\n}\n\n/** Retires what the candidate replaces; its own roots go live when its version turns active. */\nexport async function activateSourceRoots(\n sql: SQLClient,\n projectId: string,\n candidate: PgOntologySourceRow,\n activation: SourceActivationWrite\n): Promise<void> {\n if (\n candidate.base_materialization_id !== null &&\n (candidate.base_materialization_id !== activation.expected.activeMaterializationId ||\n candidate.base_commit_id !== activation.expected.lastCommitId)\n )\n throw new MaterializationConflictError(\n \"projection-fence\",\n \"Source delta base changed before activation.\"\n )\n if (candidate.base_materialization_id !== null && Number(candidate.root_count) === 0) return\n const live = sql`roots.retired_at IS NULL AND NOT roots.deleted\n AND versions.version_id = roots.version_id AND versions.project_id = ${projectId}\n AND versions.source_id = ${activation.source.projectionId}\n AND versions.status IN ${sql.unsafe(PUBLISHED)}`\n if (candidate.base_materialization_id === null) {\n await sql`\n UPDATE ontology_source_roots AS roots SET retired_at = ${activation.updatedAt}\n FROM ontology_sources AS versions WHERE ${live}\n `\n } else {\n await sql`\n UPDATE ontology_source_roots AS roots SET retired_at = ${activation.updatedAt}\n FROM ontology_source_roots AS changed, ontology_sources AS versions\n WHERE changed.version_id = ${candidate.version_id} AND roots.project_id = ${projectId}\n AND roots.root_key = changed.root_key AND ${live}\n `\n }\n // Deletions are never live; retiring them lets cleanup remove them with their version.\n await sql`\n UPDATE ontology_source_roots SET retired_at = ${activation.updatedAt}\n WHERE version_id = ${candidate.version_id} AND deleted\n `\n}\n\nexport async function assertSourceRootCoverage(\n sql: SQLClient,\n manifest: PgOntologySourceRow\n): Promise<void> {\n const [invalid] = await sql`\n SELECT 1 FROM ontology_source_roots AS roots\n WHERE roots.version_id = ${manifest.version_id}\n AND roots.deleted = EXISTS (\n SELECT 1 FROM ontology_source_rows AS rows WHERE rows.root_id = roots.id\n )\n LIMIT 1\n `\n if (invalid)\n throw new MaterializationValidationError(\n \"Source roots must have complete assertions or an explicit deletion, never both.\"\n )\n}\n\n/** The live assertions of `refs`, whichever source asserts them. */\nexport function activeSourceRows(\n sql: SQLClient,\n projectId: string,\n refs: readonly ProjectionEntityRef[]\n) {\n const requested = refs.flatMap((ref) => {\n const { root_keys, ...entity } = requestedEntity(ref)\n return root_keys.map((root_key) => ({ ...entity, root_key }))\n })\n return sql<PgOntologySourceAssertionRow[]>`\n SELECT ${sourceAssertionColumns(sql)}\n FROM jsonb_to_recordset(${jsonParameter(sql, requested)})\n AS requested(root_key TEXT, ${sql.unsafe(REQUESTED_ENTITY)})\n JOIN ontology_source_roots AS roots ON roots.project_id = ${projectId}\n AND roots.root_key = requested.root_key AND roots.retired_at IS NULL AND NOT roots.deleted\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n AND versions.status IN ${sql.unsafe(PUBLISHED)}\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id AND ${sql.unsafe(ENTITY_MATCH)}\n `\n}\n\n/** The candidate's assertions of `refs`, and optionally the live ones they would replace. */\nexport function replacementAssertionRows(\n sql: SQLClient,\n input: {\n projectId: string\n sourceId: string\n materializationId: string\n incremental: boolean\n includePrevious: boolean\n refs: readonly ProjectionEntityRef[]\n }\n) {\n const version = candidateVersion(sql, input)\n const previous = !input.includePrevious\n ? sql``\n : sql`UNION ALL\n SELECT ${sourceAssertionColumns(sql)} FROM (\n SELECT roots.* FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n WHERE roots.project_id = ${input.projectId} AND roots.root_key = ANY(requested.root_keys)\n AND roots.retired_at IS NULL AND NOT roots.deleted\n AND versions.source_id = ${input.sourceId} AND versions.status IN ${sql.unsafe(PUBLISHED)}\n ${\n !input.incremental\n ? sql``\n : sql`AND EXISTS (SELECT 1 FROM ontology_source_roots AS changed\n WHERE changed.version_id = ${version} AND changed.root_key = roots.root_key)`\n }\n OFFSET 0\n ) AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n CROSS JOIN LATERAL (\n SELECT rows.* FROM ontology_source_rows AS rows\n WHERE rows.root_id = roots.id AND ${sql.unsafe(ENTITY_MATCH)}\n OFFSET 0\n ) AS rows\n `\n // Keep each JSON request as an indexed identity lookup even with fresh/stale statistics.\n // Flattening this LATERAL caused a cold 10k-root run to spend seconds on each state page.\n return sql<PgOntologySourceAssertionRow[]>`\n SELECT selected.* FROM jsonb_to_recordset(${jsonParameter(sql, input.refs.map(requestedEntity))})\n AS requested(${sql.unsafe(REQUESTED_ENTITY)}, root_keys TEXT[])\n CROSS JOIN LATERAL (\n SELECT ${sourceAssertionColumns(sql)} FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id AND ${sql.unsafe(ENTITY_MATCH)}\n WHERE roots.version_id = ${version} AND roots.root_key = ANY(requested.root_keys)\n ${previous}\n OFFSET 0\n ) AS selected\n `\n}\n",
43
- "import {\n linkRefKey,\n MaterializationConflictError,\n objectRefKey,\n telemetryPointKey,\n} from \"@sixb/core/internal/materialization\"\nimport { effectiveConflict } from \"@sixb/core/internal/ontology-storage-provider\"\nimport type { MaterializationPlanChunk } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { assertTimestamp, jsonParameter } from \"./shared\"\n\n/** Applies one already-validated exact plan chunk in bounded PostgreSQL batches. */\nexport class PgMaterializationWriter {\n constructor(private readonly sql: SQLClient) {}\n\n async apply(projectId: string, commitId: string, chunk: MaterializationPlanChunk): Promise<void> {\n await this.applyOverrides(projectId, chunk)\n await this.applyEffective(projectId, chunk)\n await this.applyTimeseries(projectId, chunk)\n await this.applyOutbox(projectId, commitId, chunk)\n }\n\n private async applyOverrides(projectId: string, chunk: MaterializationPlanChunk): Promise<void> {\n const objectUpserts = chunk.overrides.objects.upserts.map((item) => ({\n objectTypeId: item.ref.objectTypeId,\n primaryId: item.ref.primaryId,\n value: item.value,\n editedAt: item.editedAt,\n lastCommitId: item.lastCommitId,\n updatedAt: item.updatedAt,\n expectedLastCommitId: item.expectedLastCommitId,\n }))\n const objectInserts = objectUpserts.filter((item) => item.expectedLastCommitId === null)\n if (objectInserts.length > 0) {\n const rows = await this.sql<{ readonly object_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, objectInserts)}::jsonb)\n )\n INSERT INTO ontology_object_overrides (\n project_id, object_type_id, primary_id, value, edited_at, last_commit_id, updated_at\n )\n SELECT ${projectId}, value->>'objectTypeId', value->>'primaryId', value->'value',\n value->'editedAt', value->>'lastCommitId',\n (value->>'updatedAt')::timestamptz\n FROM staged\n ON CONFLICT DO NOTHING\n RETURNING object_type_id\n `\n if (rows.length !== objectInserts.length) throw objectOverrideConflict()\n }\n\n const objectUpdates = objectUpserts.filter((item) => item.expectedLastCommitId !== null)\n if (objectUpdates.length > 0) {\n const rows = await this.sql<{ readonly object_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, objectUpdates)}::jsonb)\n )\n UPDATE ontology_object_overrides AS overrides\n SET value = staged.value->'value', edited_at = staged.value->'editedAt',\n last_commit_id = staged.value->>'lastCommitId',\n updated_at = (staged.value->>'updatedAt')::timestamptz\n FROM staged\n WHERE overrides.project_id = ${projectId}\n AND overrides.object_type_id = staged.value->>'objectTypeId'\n AND overrides.primary_id = staged.value->>'primaryId'\n AND overrides.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING overrides.object_type_id\n `\n if (rows.length !== objectUpdates.length) throw objectOverrideConflict()\n }\n\n const objectDeletes = chunk.overrides.objects.deletes.map((item) => ({\n objectTypeId: item.ref.objectTypeId,\n primaryId: item.ref.primaryId,\n expectedLastCommitId: item.expectedLastCommitId,\n }))\n if (objectDeletes.length > 0) {\n const rows = await this.sql<{ readonly object_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, objectDeletes)}::jsonb)\n )\n DELETE FROM ontology_object_overrides AS overrides USING staged\n WHERE overrides.project_id = ${projectId}\n AND overrides.object_type_id = staged.value->>'objectTypeId'\n AND overrides.primary_id = staged.value->>'primaryId'\n AND overrides.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING overrides.object_type_id\n `\n if (rows.length !== objectDeletes.length) throw objectOverrideConflict()\n }\n\n const linkUpserts = [\n ...chunk.overrides.links.edges.upserts.map((item) => ({\n identityKind: \"edge\" as const,\n identityKey: JSON.parse(linkRefKey(item.ref)) as unknown,\n sourceTypeId: item.ref.source.objectTypeId,\n sourcePrimaryId: item.ref.source.primaryId,\n linkId: item.ref.linkId,\n targetTypeId: item.ref.target.objectTypeId,\n targetPrimaryId: item.ref.target.primaryId,\n value: item.value,\n lastCommitId: item.lastCommitId,\n updatedAt: item.updatedAt,\n expectedLastCommitId: item.expectedLastCommitId,\n })),\n ...chunk.overrides.links.slots.upserts.map((item) => ({\n identityKind: \"slot\" as const,\n identityKey: [item.ref.source.objectTypeId, item.ref.source.primaryId, item.ref.linkId],\n sourceTypeId: item.ref.source.objectTypeId,\n sourcePrimaryId: item.ref.source.primaryId,\n linkId: item.ref.linkId,\n targetTypeId: item.value.target.objectTypeId,\n targetPrimaryId: item.value.target.primaryId,\n value: item.value,\n lastCommitId: item.lastCommitId,\n updatedAt: item.updatedAt,\n expectedLastCommitId: item.expectedLastCommitId,\n })),\n ]\n const linkInserts = linkUpserts.filter((item) => item.expectedLastCommitId === null)\n if (linkInserts.length > 0) {\n const rows = await this.sql<{ readonly identity_kind: \"edge\" | \"slot\" }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, linkInserts)}::jsonb)\n )\n INSERT INTO ontology_link_overrides (\n project_id, identity_kind, identity_key, source_type_id, source_primary_id, link_id,\n target_type_id, target_primary_id, value, last_commit_id, updated_at\n )\n SELECT ${projectId}, value->>'identityKind', value->'identityKey',\n value->>'sourceTypeId', value->>'sourcePrimaryId', value->>'linkId',\n value->>'targetTypeId', value->>'targetPrimaryId', value->'value',\n value->>'lastCommitId', (value->>'updatedAt')::timestamptz\n FROM staged\n ON CONFLICT DO NOTHING\n RETURNING identity_kind\n `\n if (rows.length !== linkInserts.length)\n throw linkOverrideConflict(linkInserts[0]!.identityKind)\n }\n\n const linkUpdates = linkUpserts.filter((item) => item.expectedLastCommitId !== null)\n if (linkUpdates.length > 0) {\n const rows = await this.sql<{ readonly identity_kind: \"edge\" | \"slot\" }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, linkUpdates)}::jsonb)\n )\n UPDATE ontology_link_overrides AS overrides\n SET target_type_id = staged.value->>'targetTypeId',\n target_primary_id = staged.value->>'targetPrimaryId',\n value = staged.value->'value',\n last_commit_id = staged.value->>'lastCommitId',\n updated_at = (staged.value->>'updatedAt')::timestamptz\n FROM staged\n WHERE overrides.project_id = ${projectId}\n AND overrides.identity_kind = staged.value->>'identityKind'\n AND overrides.identity_key = staged.value->'identityKey'\n AND overrides.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING overrides.identity_kind\n `\n if (rows.length !== linkUpdates.length)\n throw linkOverrideConflict(linkUpdates[0]!.identityKind)\n }\n\n const linkDeletes = [\n ...chunk.overrides.links.edges.deletes.map((item) => ({\n identityKind: \"edge\" as const,\n identityKey: JSON.parse(linkRefKey(item.ref)) as unknown,\n expectedLastCommitId: item.expectedLastCommitId,\n })),\n ...chunk.overrides.links.slots.deletes.map((item) => ({\n identityKind: \"slot\" as const,\n identityKey: [item.ref.source.objectTypeId, item.ref.source.primaryId, item.ref.linkId],\n expectedLastCommitId: item.expectedLastCommitId,\n })),\n ]\n if (linkDeletes.length > 0) {\n const rows = await this.sql<{ readonly identity_kind: \"edge\" | \"slot\" }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, linkDeletes)}::jsonb)\n )\n DELETE FROM ontology_link_overrides AS overrides USING staged\n WHERE overrides.project_id = ${projectId}\n AND overrides.identity_kind = staged.value->>'identityKind'\n AND overrides.identity_key = staged.value->'identityKey'\n AND overrides.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING overrides.identity_kind\n `\n if (rows.length !== linkDeletes.length)\n throw linkOverrideConflict(linkDeletes[0]!.identityKind)\n }\n }\n\n private async applyEffective(projectId: string, chunk: MaterializationPlanChunk): Promise<void> {\n const linkDeletes = chunk.effective.linkDeletes.map((item) => ({\n sourceTypeId: item.ref.source.objectTypeId,\n sourceId: item.ref.source.primaryId,\n linkId: item.ref.linkId,\n targetTypeId: item.ref.target.objectTypeId,\n targetId: item.ref.target.primaryId,\n expectedLastCommitId: item.expected.lastCommitId,\n }))\n if (linkDeletes.length > 0) {\n const rows = await this.sql<{ readonly source_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, linkDeletes)}::jsonb)\n )\n DELETE FROM links AS effective USING staged\n WHERE effective.project_id = ${projectId}\n AND effective.source_type_id = staged.value->>'sourceTypeId'\n AND effective.source_id = staged.value->>'sourceId'\n AND effective.link_id = staged.value->>'linkId'\n AND effective.target_type_id = staged.value->>'targetTypeId'\n AND effective.target_id = staged.value->>'targetId'\n AND effective.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING effective.source_type_id\n `\n if (rows.length !== linkDeletes.length) throw effectiveLinkConflict(linkDeletes[0]!)\n }\n\n const objectDeletes = chunk.effective.objectDeletes.map((item) => ({\n objectTypeId: item.ref.objectTypeId,\n primaryId: item.ref.primaryId,\n expectedVersion: item.expected.version,\n expectedLastCommitId: item.expected.lastCommitId,\n }))\n if (objectDeletes.length > 0) {\n const rows = await this.sql<{ readonly object_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, objectDeletes)}::jsonb)\n )\n DELETE FROM objects AS effective USING staged\n WHERE effective.project_id = ${projectId}\n AND effective.object_type_id = staged.value->>'objectTypeId'\n AND effective.primary_id = staged.value->>'primaryId'\n AND effective.version = (staged.value->>'expectedVersion')::integer\n AND effective.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING effective.object_type_id\n `\n if (rows.length !== objectDeletes.length) throw effectiveObjectConflict(objectDeletes[0]!)\n }\n\n await this.applyObjects(projectId, chunk.effective.objectUpserts)\n await this.applyLinks(projectId, chunk.effective.linkUpserts)\n }\n\n private async applyObjects(\n projectId: string,\n items: MaterializationPlanChunk[\"effective\"][\"objectUpserts\"]\n ): Promise<void> {\n const payload = items.map(({ row, expected }) => ({\n objectTypeId: row.ref.objectTypeId,\n primaryId: row.ref.primaryId,\n properties: row.properties,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n version: row.version,\n lastCommitId: row.lastCommitId,\n expectedExists: expected.exists,\n expectedVersion: expected.exists ? expected.version : null,\n expectedLastCommitId: expected.exists ? expected.lastCommitId : null,\n }))\n const inserts = payload.filter((item) => !item.expectedExists)\n if (inserts.length > 0) {\n const rows = await this.sql<{ readonly object_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, inserts)}::jsonb)\n )\n INSERT INTO objects (\n project_id, object_type_id, primary_id, properties, created_at,\n updated_at, version, last_commit_id\n )\n SELECT ${projectId}, value->>'objectTypeId', value->>'primaryId',\n value->'properties', (value->>'createdAt')::timestamptz,\n (value->>'updatedAt')::timestamptz, (value->>'version')::integer,\n value->>'lastCommitId'\n FROM staged\n ON CONFLICT DO NOTHING\n RETURNING object_type_id\n `\n if (rows.length !== inserts.length) {\n throw effectiveConflict(`Expected object ${objectIdentityKey(inserts[0]!)} to be absent.`)\n }\n }\n\n const updates = payload.filter((item) => item.expectedExists)\n if (updates.length > 0) {\n const rows = await this.sql<{ readonly object_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, updates)}::jsonb)\n )\n UPDATE objects AS effective\n SET properties = staged.value->'properties',\n created_at = (staged.value->>'createdAt')::timestamptz,\n updated_at = (staged.value->>'updatedAt')::timestamptz,\n version = (staged.value->>'version')::integer,\n last_commit_id = staged.value->>'lastCommitId'\n FROM staged\n WHERE effective.project_id = ${projectId}\n AND effective.object_type_id = staged.value->>'objectTypeId'\n AND effective.primary_id = staged.value->>'primaryId'\n AND effective.version = (staged.value->>'expectedVersion')::integer\n AND effective.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING effective.object_type_id\n `\n if (rows.length !== updates.length) throw effectiveObjectConflict(updates[0]!)\n }\n }\n\n private async applyLinks(\n projectId: string,\n items: MaterializationPlanChunk[\"effective\"][\"linkUpserts\"]\n ): Promise<void> {\n const payload = items.map(({ row, expected }) => ({\n sourceTypeId: row.ref.source.objectTypeId,\n sourceId: row.ref.source.primaryId,\n linkId: row.ref.linkId,\n targetTypeId: row.ref.target.objectTypeId,\n targetId: row.ref.target.primaryId,\n ...(row.properties === undefined ? {} : { properties: row.properties }),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n lastCommitId: row.lastCommitId,\n expectedExists: expected.exists,\n expectedLastCommitId: expected.exists ? expected.lastCommitId : null,\n }))\n const inserts = payload.filter((item) => !item.expectedExists)\n if (inserts.length > 0) {\n const rows = await this.sql<{ readonly source_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, inserts)}::jsonb)\n )\n INSERT INTO links (\n project_id, source_type_id, source_id, link_id, target_type_id, target_id,\n properties, created_at, updated_at, last_commit_id\n )\n SELECT ${projectId}, value->>'sourceTypeId', value->>'sourceId', value->>'linkId',\n value->>'targetTypeId', value->>'targetId',\n CASE WHEN value ? 'properties' THEN value->'properties' ELSE NULL END,\n (value->>'createdAt')::timestamptz, (value->>'updatedAt')::timestamptz,\n value->>'lastCommitId'\n FROM staged\n ON CONFLICT DO NOTHING\n RETURNING source_type_id\n `\n if (rows.length !== inserts.length) {\n throw effectiveConflict(`Expected link ${linkIdentityKey(inserts[0]!)} to be absent.`)\n }\n }\n\n const updates = payload.filter((item) => item.expectedExists)\n if (updates.length > 0) {\n const rows = await this.sql<{ readonly source_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, updates)}::jsonb)\n )\n UPDATE links AS effective\n SET properties = CASE\n WHEN staged.value ? 'properties' THEN staged.value->'properties'\n ELSE NULL\n END,\n created_at = (staged.value->>'createdAt')::timestamptz,\n updated_at = (staged.value->>'updatedAt')::timestamptz,\n last_commit_id = staged.value->>'lastCommitId'\n FROM staged\n WHERE effective.project_id = ${projectId}\n AND effective.source_type_id = staged.value->>'sourceTypeId'\n AND effective.source_id = staged.value->>'sourceId'\n AND effective.link_id = staged.value->>'linkId'\n AND effective.target_type_id = staged.value->>'targetTypeId'\n AND effective.target_id = staged.value->>'targetId'\n AND effective.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING effective.source_type_id\n `\n if (rows.length !== updates.length) throw effectiveLinkConflict(updates[0]!)\n }\n }\n\n private async applyTimeseries(projectId: string, chunk: MaterializationPlanChunk): Promise<void> {\n const payload = chunk.timeseries.pointUpserts.map(({ point, expected }) => ({\n objectTypeId: point.series.object.objectTypeId,\n objectId: point.series.object.primaryId,\n propertyId: point.series.propertyId,\n value: point.value,\n unit: point.unit ?? null,\n at: point.at,\n lastCommitId: point.lastCommitId,\n expectedLastCommitId: expected.lastCommitId,\n }))\n const inserts = payload.filter((item) => item.expectedLastCommitId === null)\n if (inserts.length > 0) {\n const rows = await this.sql<{ readonly object_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, inserts)}::jsonb)\n ), written AS (\n INSERT INTO timeseries (\n project_id, object_type_id, object_id, property_id,\n value, unit, at, last_commit_id\n )\n SELECT ${projectId}, value->>'objectTypeId', value->>'objectId',\n value->>'propertyId', value->'value', value->>'unit',\n (value->>'at')::timestamptz, value->>'lastCommitId'\n FROM staged\n ON CONFLICT DO NOTHING\n RETURNING *\n ), latest_candidates AS (\n SELECT DISTINCT ON (project_id, object_type_id, object_id, property_id)\n project_id, object_type_id, object_id, property_id,\n value, unit, at, last_commit_id\n FROM written\n ORDER BY project_id, object_type_id, object_id, property_id, at DESC\n ), latest AS (\n INSERT INTO timeseries_latest (\n project_id, object_type_id, object_id, property_id,\n value, unit, at, last_commit_id\n )\n SELECT project_id, object_type_id, object_id, property_id,\n value, unit, at, last_commit_id\n FROM latest_candidates\n ON CONFLICT (project_id, object_type_id, object_id, property_id)\n DO UPDATE SET value = EXCLUDED.value, unit = EXCLUDED.unit, at = EXCLUDED.at,\n last_commit_id = EXCLUDED.last_commit_id\n WHERE EXCLUDED.at >= timeseries_latest.at\n RETURNING object_type_id\n )\n SELECT object_type_id, (SELECT COUNT(*) FROM latest) AS latest_count FROM written\n `\n if (rows.length !== inserts.length) throw pointConflict(inserts[0]!)\n }\n\n const updates = payload.filter((item) => item.expectedLastCommitId !== null)\n if (updates.length > 0) {\n const rows = await this.sql<{ readonly object_type_id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, updates)}::jsonb)\n ), written AS (\n UPDATE timeseries AS points\n SET value = staged.value->'value', unit = staged.value->>'unit',\n last_commit_id = staged.value->>'lastCommitId'\n FROM staged\n WHERE points.project_id = ${projectId}\n AND points.object_type_id = staged.value->>'objectTypeId'\n AND points.object_id = staged.value->>'objectId'\n AND points.property_id = staged.value->>'propertyId'\n AND points.at = (staged.value->>'at')::timestamptz\n AND points.last_commit_id = staged.value->>'expectedLastCommitId'\n RETURNING points.*\n ), latest_candidates AS (\n SELECT DISTINCT ON (project_id, object_type_id, object_id, property_id)\n project_id, object_type_id, object_id, property_id,\n value, unit, at, last_commit_id\n FROM written\n ORDER BY project_id, object_type_id, object_id, property_id, at DESC\n ), latest AS (\n INSERT INTO timeseries_latest (\n project_id, object_type_id, object_id, property_id,\n value, unit, at, last_commit_id\n )\n SELECT project_id, object_type_id, object_id, property_id,\n value, unit, at, last_commit_id\n FROM latest_candidates\n ON CONFLICT (project_id, object_type_id, object_id, property_id)\n DO UPDATE SET value = EXCLUDED.value, unit = EXCLUDED.unit, at = EXCLUDED.at,\n last_commit_id = EXCLUDED.last_commit_id\n WHERE EXCLUDED.at >= timeseries_latest.at\n RETURNING object_type_id\n )\n SELECT object_type_id, (SELECT COUNT(*) FROM latest) AS latest_count FROM written\n `\n if (rows.length !== updates.length) throw pointConflict(updates[0]!)\n }\n }\n\n private async applyOutbox(\n projectId: string,\n commitId: string,\n chunk: MaterializationPlanChunk\n ): Promise<void> {\n if (chunk.outbox.length === 0) return\n const payload = chunk.outbox.map((item) => {\n assertTimestamp(item.availableAt, \"Outbox availableAt\")\n assertTimestamp(item.createdAt, \"Outbox createdAt\")\n return {\n id: item.envelope.id,\n commitOrdinal: item.envelope.commitOrdinal,\n envelope: item.envelope,\n availableAt: item.availableAt,\n createdAt: item.createdAt,\n }\n })\n const rows = await this.sql<{ readonly id: string }[]>`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, payload)}::jsonb)\n )\n INSERT INTO ontology_outbox (\n project_id, id, commit_id, commit_ordinal, envelope,\n available_at, attempts, lease_id, lease_expires_at,\n published_at, last_failure, created_at\n )\n SELECT ${projectId}, value->>'id', ${commitId},\n (value->>'commitOrdinal')::bigint, value->'envelope',\n (value->>'availableAt')::timestamptz, 0, NULL, NULL, NULL, NULL,\n (value->>'createdAt')::timestamptz\n FROM staged\n ON CONFLICT DO NOTHING\n RETURNING id\n `\n if (rows.length !== payload.length) {\n const inserted = new Set(rows.map((row) => row.id))\n const duplicate = payload.find((item) => !inserted.has(item.id)) ?? payload[0]!\n throw effectiveConflict(`Duplicate outbox event '${duplicate.id}'.`)\n }\n }\n}\n\nfunction objectOverrideConflict(): MaterializationConflictError {\n return effectiveConflict(\"Expected object override changed.\")\n}\n\nfunction linkOverrideConflict(identityKind: \"edge\" | \"slot\"): MaterializationConflictError {\n return effectiveConflict(\n identityKind === \"edge\"\n ? \"Expected link edge override changed.\"\n : \"Expected link slot override changed.\"\n )\n}\n\nfunction objectIdentityKey(item: {\n readonly objectTypeId: string\n readonly primaryId: string\n}): string {\n return objectRefKey({ objectTypeId: item.objectTypeId, primaryId: item.primaryId })\n}\n\nfunction linkIdentityKey(item: {\n readonly sourceTypeId: string\n readonly sourceId: string\n readonly linkId: string\n readonly targetTypeId: string\n readonly targetId: string\n}): string {\n return linkRefKey({\n source: { objectTypeId: item.sourceTypeId, primaryId: item.sourceId },\n linkId: item.linkId,\n target: { objectTypeId: item.targetTypeId, primaryId: item.targetId },\n })\n}\n\nfunction effectiveObjectConflict(item: {\n readonly objectTypeId: string\n readonly primaryId: string\n}): MaterializationConflictError {\n return effectiveConflict(`Expected object ${objectIdentityKey(item)} changed.`)\n}\n\nfunction effectiveLinkConflict(item: {\n readonly sourceTypeId: string\n readonly sourceId: string\n readonly linkId: string\n readonly targetTypeId: string\n readonly targetId: string\n}): MaterializationConflictError {\n return effectiveConflict(`Expected link ${linkIdentityKey(item)} changed.`)\n}\n\nfunction pointConflict(item: {\n readonly objectTypeId: string\n readonly objectId: string\n readonly propertyId: string\n readonly at: string\n}): MaterializationConflictError {\n return new MaterializationConflictError(\n \"timeseries-point\",\n `Telemetry point ${telemetryPointKey(\n {\n object: { objectTypeId: item.objectTypeId, primaryId: item.objectId },\n propertyId: item.propertyId,\n },\n item.at\n )} changed.`\n )\n}\n",
44
- "import { serializeSixbFailure } from \"@sixb/core/internal/errors\"\nimport {\n MaterializationConflictError,\n MaterializationValidationError,\n} from \"@sixb/core/internal/materialization\"\nimport type {\n ClaimedOntologyOutboxRow,\n ClaimOntologyOutboxInput,\n CompleteOntologyOutboxLeaseInput,\n OntologyOutboxStorage,\n OntologyOutboxSummary,\n PurgePublishedOntologyOutboxInput,\n RescheduleOntologyOutboxLeaseInput,\n SummarizeOntologyOutboxInput,\n} from \"@sixb/core/storage\"\nimport { ONTOLOGY_OUTBOX_FAILURE_CODES } from \"@sixb/core/storage\"\nimport {\n assertNonblank,\n assertPositiveInteger,\n assertTimestamp,\n outboxRecord,\n type PgOntologyOutboxRow,\n type PgRootOperation,\n} from \"./shared\"\n\nexport class PgOntologyOutboxStorage implements OntologyOutboxStorage {\n constructor(private readonly runRootOperation: PgRootOperation) {}\n\n async claim(input: ClaimOntologyOutboxInput): Promise<readonly ClaimedOntologyOutboxRow[]> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertPositiveInteger(input.limit, \"Ontology outbox limit\")\n const now = assertTimestamp(input.now, \"Ontology outbox claim time\")\n const leaseExpiry = assertTimestamp(input.leaseExpiresAt, \"Ontology outbox lease expiry\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n if (leaseExpiry <= now) {\n throw new MaterializationValidationError(\n \"Ontology outbox lease expiry must be later than the claim time.\"\n )\n }\n\n const rows = await sql<PgOntologyOutboxRow[]>`\n WITH candidates AS (\n SELECT project_id, id\n FROM ontology_outbox\n WHERE project_id = ${input.projectId}\n AND published_at IS NULL\n AND available_at <= ${input.now}\n AND (lease_expires_at IS NULL OR lease_expires_at <= ${input.now})\n ORDER BY created_at, commit_id, commit_ordinal\n LIMIT ${input.limit}\n FOR UPDATE SKIP LOCKED\n ), claimed AS (\n UPDATE ontology_outbox AS outbox\n SET attempts = outbox.attempts + 1,\n lease_id = ${input.leaseId},\n lease_expires_at = ${input.leaseExpiresAt}\n FROM candidates\n WHERE outbox.project_id = candidates.project_id AND outbox.id = candidates.id\n RETURNING outbox.id AS row_id, outbox.envelope, outbox.available_at,\n outbox.attempts, outbox.lease_id, outbox.lease_expires_at,\n outbox.published_at, outbox.last_failure, outbox.created_at,\n outbox.commit_id, outbox.commit_ordinal\n )\n SELECT * FROM claimed ORDER BY created_at, commit_id, commit_ordinal\n `\n return rows.map((row) => {\n const record = outboxRecord(row)\n if (record.leaseId === null || record.leaseExpiresAt === null) {\n throw new MaterializationConflictError(\n \"outbox-lease\",\n \"Ontology outbox claim returned an unpaired lease.\"\n )\n }\n return { ...record, leaseId: record.leaseId, leaseExpiresAt: record.leaseExpiresAt }\n })\n })\n }\n\n async markPublished(input: CompleteOntologyOutboxLeaseInput): Promise<void> {\n await this.runRootOperation(async (sql) => {\n assertLeaseInput(input)\n assertTimestamp(input.publishedAt, \"Ontology outbox publishedAt\")\n const ids = validateLeaseIds(input.ids)\n if (ids.length === 0) return\n const rows = await sql<{ readonly id: string }[]>`\n WITH leased AS MATERIALIZED (\n SELECT id FROM ontology_outbox\n WHERE project_id = ${input.projectId}\n AND id = ANY(${sql.array(ids)}::text[])\n AND lease_id = ${input.leaseId}\n AND lease_expires_at IS NOT NULL\n FOR UPDATE\n ), eligible AS (\n SELECT id FROM leased\n WHERE (SELECT COUNT(*) FROM leased) = ${ids.length}\n )\n UPDATE ontology_outbox AS outbox\n SET published_at = ${input.publishedAt}, lease_id = NULL, lease_expires_at = NULL\n FROM eligible\n WHERE outbox.project_id = ${input.projectId} AND outbox.id = eligible.id\n RETURNING outbox.id\n `\n if (rows.length !== ids.length) throw leaseConflict()\n })\n }\n\n async reschedule(input: RescheduleOntologyOutboxLeaseInput): Promise<void> {\n await this.runRootOperation(async (sql) => {\n assertLeaseInput(input)\n assertTimestamp(input.availableAt, \"Ontology outbox availableAt\")\n const ids = validateLeaseIds(input.ids)\n if (ids.length === 0) return\n const failure =\n input.failure === undefined\n ? null\n : serializeSixbFailure(input.failure, ONTOLOGY_OUTBOX_FAILURE_CODES)\n const rows = await sql<{ readonly id: string }[]>`\n WITH leased AS MATERIALIZED (\n SELECT id FROM ontology_outbox\n WHERE project_id = ${input.projectId}\n AND id = ANY(${sql.array(ids)}::text[])\n AND lease_id = ${input.leaseId}\n AND lease_expires_at IS NOT NULL\n FOR UPDATE\n ), eligible AS (\n SELECT id FROM leased\n WHERE (SELECT COUNT(*) FROM leased) = ${ids.length}\n )\n UPDATE ontology_outbox AS outbox\n SET available_at = ${input.availableAt},\n last_failure = COALESCE(${failure}::text::jsonb, outbox.last_failure),\n lease_id = NULL, lease_expires_at = NULL\n FROM eligible\n WHERE outbox.project_id = ${input.projectId} AND outbox.id = eligible.id\n RETURNING outbox.id\n `\n if (rows.length !== ids.length) throw leaseConflict()\n })\n }\n\n async purgePublished(input: PurgePublishedOntologyOutboxInput): Promise<number> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertPositiveInteger(input.limit, \"Ontology outbox limit\")\n assertTimestamp(input.publishedBefore, \"Ontology outbox purge cutoff\")\n const rows = await sql<{ readonly id: string }[]>`\n WITH selected AS (\n SELECT project_id, id\n FROM ontology_outbox\n WHERE project_id = ${input.projectId}\n AND published_at IS NOT NULL\n AND published_at < ${input.publishedBefore}\n ORDER BY published_at, id\n LIMIT ${input.limit}\n FOR UPDATE SKIP LOCKED\n )\n DELETE FROM ontology_outbox AS outbox\n USING selected\n WHERE outbox.project_id = selected.project_id AND outbox.id = selected.id\n RETURNING outbox.id\n `\n return rows.length\n })\n }\n\n async summarize(input: SummarizeOntologyOutboxInput): Promise<OntologyOutboxSummary> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n const [summary] = await sql<\n {\n readonly pending_count: number\n readonly oldest_pending_at: Date | string | null\n readonly retrying_count: number\n readonly max_attempts: number\n }[]\n >`\n SELECT COUNT(*)::int AS pending_count,\n MIN(created_at) AS oldest_pending_at,\n COUNT(*) FILTER (WHERE attempts > 0)::int AS retrying_count,\n COALESCE(MAX(attempts), 0)::int AS max_attempts\n FROM ontology_outbox\n WHERE project_id = ${input.projectId} AND published_at IS NULL\n `\n return {\n pendingCount: summary?.pending_count ?? 0,\n oldestPendingAt: toOptionalIsoString(summary?.oldest_pending_at),\n retryingCount: summary?.retrying_count ?? 0,\n maxAttempts: summary?.max_attempts ?? 0,\n }\n })\n }\n}\n\nfunction toOptionalIsoString(value: Date | string | null | undefined): string | null {\n if (value === null || value === undefined) return null\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n\nfunction validateLeaseIds(ids: readonly string[]): string[] {\n const seen = new Set<string>()\n for (const id of ids) {\n assertNonblank(id, \"Ontology outbox event id\")\n if (seen.has(id)) {\n throw new MaterializationValidationError(`Ontology outbox lease batch repeats event '${id}'.`)\n }\n seen.add(id)\n }\n return [...seen]\n}\n\nfunction assertLeaseInput(input: {\n readonly projectId: string\n readonly ids: readonly string[]\n readonly leaseId: string\n}): void {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n}\n\nfunction leaseConflict(): MaterializationConflictError {\n return new MaterializationConflictError(\"outbox-lease\", \"Ontology outbox lease does not match.\")\n}\n",
45
- "import { MaterializationValidationError } from \"@sixb/core/internal/materialization\"\nimport {\n assertSourceBeginInput as assertBeginInput,\n assertSourceExecutionIdentity as assertExecutionIdentity,\n assertSourceProject as assertProjectAndSource,\n assertSourceCandidateOwner,\n assertSourceWriteIdentity as assertWriteIdentity,\n sourceEntityColumns as entityColumns,\n isExactStagingManifest,\n reconcileSourceStageRows,\n type SourceStageRow,\n sourceAssertionPayload,\n sourceConflict,\n sourceMaterializationIdentity,\n sourceStageRow,\n sourceStageRows,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n AbandonRunSourceMaterializationInput,\n AbandonSourceMaterializationCandidateInput,\n AbandonSourceMaterializationInput,\n AdoptedSourceMaterialization,\n AdoptSourceMaterializationInput,\n AssertSourceMaterializationExecutionInput,\n BeginSourceMaterializationInput,\n CleanupTerminalSourceMaterializationsInput,\n CleanupTerminalSourceMaterializationsResult,\n GetActiveOntologySourceInput,\n MarkSourceMaterializationReadyInput,\n OntologySourceRecord,\n OntologySourceStorage,\n PurgeAbandonedSourceMaterializationsInput,\n StageSourceRowsInput,\n StageSourceRowsResult,\n SummarizeTerminalSourceMaterializationsInput,\n TerminalSourceMaterializationSummary,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { lockAdvisoryKeys } from \"../transactions\"\nimport {\n assertNonblank,\n assertNonnegativeInteger,\n assertPositiveInteger,\n assertProjectionExecution,\n assertTimestamp,\n jsonParameter,\n ontologyLockKey,\n type PgOntologySourceAssertionRow,\n type PgOntologySourceRow,\n type PgRootOperation,\n sourceAssertion,\n sourceRecord,\n toIsoString,\n} from \"./shared\"\nimport { cleanupSourceVersions, purgeAbandonedSourceVersions } from \"./source-cleanup\"\nimport { assertSourceRootCoverage, sourceAssertionColumns, stageSourceRoots } from \"./source-roots\"\n\nexport class PgOntologySourceStorage implements OntologySourceStorage {\n constructor(private readonly runRootOperation: PgRootOperation) {}\n\n async beginMaterialization(\n input: BeginSourceMaterializationInput\n ): Promise<OntologySourceRecord> {\n return this.runRootOperation(async (sql) => {\n assertBeginInput(input)\n await this.assertExecution(sql, input, sourceMaterializationIdentity(input))\n await lockAdvisoryKeys(sql, [\n ontologyLockKey(\"source-candidate\", input.projectId, input.execution.projectionRunId),\n ontologyLockKey(\n \"source-materialization\",\n input.projectId,\n input.source.projectionId,\n input.materializationId\n ),\n ])\n\n const existing = await this.getManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n if (existing) {\n if (isExactStagingManifest(sourceRecord(existing), input)) return sourceRecord(existing)\n throw sourceConflict(\n `Source materialization '${input.materializationId}' already exists with different identity or state.`\n )\n }\n\n const candidate = await this.getRunCandidate(sql, input)\n if (candidate) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' already has a nonterminal source materialization; adopt it before beginning another.`\n )\n }\n\n const rows = await sql<PgOntologySourceRow[]>`\n INSERT INTO ontology_sources (\n project_id, source_id, materialization_id, projection_run_id,\n projection_kind, protocol, status, execution_token,\n dataset_id, dataset_version_id, dataset_version_created_at,\n projection_revision, ownership_hash, ontology_revision,\n root_count, assertion_count, created_at, ready_at, activated_at,\n terminal_at, last_commit_id, updated_at, base_materialization_id, base_commit_id\n ) VALUES (\n ${input.projectId}, ${input.source.projectionId}, ${input.materializationId},\n ${input.execution.projectionRunId}, ${input.projectionKind}, 'replacement',\n 'staging', ${input.execution.executionToken}, ${input.datasetVersion.datasetId},\n ${input.datasetVersion.versionId}, ${input.datasetVersion.createdAt},\n ${input.projectionRevision}, ${input.ownershipHash}, ${input.ontologyRevision},\n NULL, NULL, ${input.createdAt}, NULL, NULL, NULL, NULL, ${input.createdAt},\n ${input.base?.materializationId ?? null}, ${input.base?.lastCommitId ?? null}\n )\n ON CONFLICT DO NOTHING\n RETURNING *\n `\n if (rows[0]) return sourceRecord(rows[0])\n\n const racedManifest = await this.getManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n if (racedManifest && isExactStagingManifest(sourceRecord(racedManifest), input)) {\n return sourceRecord(racedManifest)\n }\n if (await this.getRunCandidate(sql, input)) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' already has a nonterminal source materialization; adopt it before beginning another.`\n )\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' already exists with different identity or state.`\n )\n })\n }\n\n async stageRows(input: StageSourceRowsInput): Promise<StageSourceRowsResult> {\n return this.runRootOperation(async (sql) => {\n assertWriteIdentity(input)\n await this.assertExecution(sql, input)\n const manifest = await this.requireManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n assertSourceCandidateOwner(sourceRecord(manifest), input.execution)\n if (manifest.status !== \"staging\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' is '${manifest.status}' and cannot accept rows.`\n )\n }\n\n const rows = sourceStageRows(manifest.projection_kind, input.rows)\n const existing = await this.findStageRows(sql, manifest, rows)\n const { pending, unchanged } = reconcileSourceStageRows(rows, existing)\n await stageSourceRoots(sql, manifest, input)\n await this.insertStageRows(sql, manifest, pending)\n return { inserted: pending.length, unchanged }\n })\n }\n\n async markReady(input: MarkSourceMaterializationReadyInput): Promise<OntologySourceRecord> {\n return this.runRootOperation(async (sql) => {\n assertWriteIdentity(input)\n assertTimestamp(input.readyAt, \"Source readyAt\", true)\n assertNonnegativeInteger(input.rootCount, \"Source root count\")\n assertNonnegativeInteger(input.assertionCount, \"Source assertion count\")\n await this.assertExecution(sql, input)\n const manifest = await this.requireManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n assertSourceCandidateOwner(sourceRecord(manifest), input.execution)\n if (manifest.status === \"ready\") {\n if (\n numberOrNull(manifest.root_count) === input.rootCount &&\n numberOrNull(manifest.assertion_count) === input.assertionCount &&\n toIsoString(manifest.ready_at!) === input.readyAt\n ) {\n return sourceRecord(manifest)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' was marked ready with different counts or time.`\n )\n }\n if (manifest.status !== \"staging\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' cannot transition from '${manifest.status}' to 'ready'.`\n )\n }\n if (input.readyAt < toIsoString(manifest.created_at)) {\n throw new MaterializationValidationError(\"Source readyAt cannot precede source createdAt.\")\n }\n // A newly loaded run is absent from the planner statistics. Without refreshing them,\n // PostgreSQL can scan the whole run for each identity instead of using its full key.\n // Sparse deltas avoid this table-level sampling cost.\n if (input.assertionCount >= 1_000 || input.rootCount >= 1_000) {\n await sql`ANALYZE ontology_source_rows, ontology_source_roots`\n }\n await this.assertReadyState(sql, manifest, input.rootCount, input.assertionCount)\n const rows = await sql<PgOntologySourceRow[]>`\n UPDATE ontology_sources\n SET status = 'ready', root_count = ${input.rootCount},\n assertion_count = ${input.assertionCount}, ready_at = ${input.readyAt},\n updated_at = ${input.readyAt}\n WHERE project_id = ${input.projectId}\n AND source_id = ${input.source.projectionId}\n AND materialization_id = ${input.materializationId}\n AND status = 'staging'\n AND execution_token = ${input.execution.executionToken}\n RETURNING *\n `\n if (!rows[0]) {\n throw sourceConflict(`Source materialization '${input.materializationId}' changed.`)\n }\n return sourceRecord(rows[0])\n })\n }\n\n async getActive(input: GetActiveOntologySourceInput): Promise<OntologySourceRecord | null> {\n return this.runRootOperation(async (sql) => {\n assertProjectAndSource(input)\n const [row] = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${input.projectId}\n AND source_id = ${input.source.projectionId}\n AND status = 'active'\n `\n return row ? sourceRecord(row) : null\n })\n }\n\n async adopt(\n input: AdoptSourceMaterializationInput\n ): Promise<AdoptedSourceMaterialization | null> {\n return this.runRootOperation(async (sql) => {\n assertProjectAndSource(input)\n assertExecutionIdentity(input.execution.projectionRunId, input.execution.executionToken)\n assertTimestamp(input.adoptedAt, \"Source adoptedAt\", true)\n await this.assertExecution(sql, input)\n const candidate = await this.lockRunCandidate(sql, input)\n if (!candidate) return null\n // Workers' clocks differ; adoption never moves the record back in time.\n const [adopted] = await sql<PgOntologySourceRow[]>`\n UPDATE ontology_sources\n SET execution_token = ${input.execution.executionToken},\n updated_at = GREATEST(updated_at, ${input.adoptedAt}::timestamptz)\n WHERE project_id = ${candidate.project_id} AND source_id = ${candidate.source_id}\n AND materialization_id = ${candidate.materialization_id}\n AND status IN ('staging', 'ready')\n RETURNING *\n `\n if (!adopted) {\n throw sourceConflict(`Source materialization '${candidate.materialization_id}' changed.`)\n }\n return {\n record: sourceRecord(adopted),\n resumeStagingOrdinal:\n adopted.status === \"ready\"\n ? Number(adopted.root_count)\n : await this.lastStagedOrdinal(sql, adopted),\n }\n })\n }\n\n async abandon(input: AbandonSourceMaterializationCandidateInput): Promise<OntologySourceRecord>\n async abandon(input: AbandonRunSourceMaterializationInput): Promise<OntologySourceRecord | null>\n async abandon(input: AbandonSourceMaterializationInput): Promise<OntologySourceRecord | null> {\n return this.runRootOperation(async (sql) => {\n assertProjectAndSource(input)\n assertExecutionIdentity(input.execution.projectionRunId, input.execution.executionToken)\n assertTimestamp(input.abandonedAt, \"Source abandonedAt\", true)\n await this.assertExecution(sql, input)\n if (input.kind === \"candidate\") return this.abandonCandidate(sql, input)\n const candidate = await this.lockRunCandidate(sql, input)\n return candidate ? this.transitionToAbandoned(sql, candidate, input.abandonedAt) : null\n })\n }\n\n async cleanupTerminal(\n input: CleanupTerminalSourceMaterializationsInput\n ): Promise<CleanupTerminalSourceMaterializationsResult> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Terminal source cleanup project id\")\n assertTimestamp(input.terminalBefore, \"Terminal source cleanup cutoff\", true)\n assertPositiveInteger(input.limit, \"Terminal source cleanup limit\")\n return cleanupSourceVersions(sql, input)\n })\n }\n\n async purgeAbandoned(\n input: PurgeAbandonedSourceMaterializationsInput\n ): Promise<CleanupTerminalSourceMaterializationsResult> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Abandoned source purge project id\")\n assertPositiveInteger(input.limit, \"Abandoned source purge limit\")\n return purgeAbandonedSourceVersions(sql, input)\n })\n }\n\n async summarizeTerminal(\n input: SummarizeTerminalSourceMaterializationsInput\n ): Promise<TerminalSourceMaterializationSummary> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Terminal source summary project id\")\n const [summary] = await sql<\n {\n readonly terminal_count: number\n readonly oldest_terminal_at: Date | string | null\n }[]\n >`\n SELECT COUNT(*)::int AS terminal_count, MIN(terminal_at) AS oldest_terminal_at\n FROM ontology_sources\n WHERE project_id = ${input.projectId}\n AND status IN ('superseded', 'abandoned')\n `\n return {\n count: summary?.terminal_count ?? 0,\n oldestTerminalAt: toOptionalIsoString(summary?.oldest_terminal_at),\n }\n })\n }\n\n private async abandonCandidate(\n sql: SQLClient,\n input: AbandonSourceMaterializationCandidateInput\n ): Promise<OntologySourceRecord> {\n const manifest = await this.requireManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n if (manifest.status === \"abandoned\") {\n if (\n manifest.projection_run_id === input.execution.projectionRunId &&\n manifest.terminal_at !== null &&\n toIsoString(manifest.terminal_at) === input.abandonedAt\n ) {\n return sourceRecord(manifest)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' was abandoned by another execution or at another time.`\n )\n }\n assertSourceCandidateOwner(sourceRecord(manifest), input.execution)\n return this.transitionToAbandoned(sql, manifest, input.abandonedAt)\n }\n\n /** The run's one staging or ready candidate, locked, whichever execution staged it. */\n private async lockRunCandidate(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly source: { readonly projectionId: string }\n readonly execution: { readonly projectionRunId: string }\n }\n ): Promise<PgOntologySourceRow | null> {\n const candidates = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${input.projectId}\n AND source_id = ${input.source.projectionId}\n AND projection_run_id = ${input.execution.projectionRunId}\n AND status IN ('staging', 'ready')\n FOR UPDATE\n `\n if (candidates.length > 1) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' has multiple nonterminal source materializations.`\n )\n }\n return candidates[0] ?? null\n }\n\n private async lastStagedOrdinal(sql: SQLClient, manifest: PgOntologySourceRow): Promise<number> {\n const [last] = await sql<{ readonly ordinal: number | string | null }[]>`\n SELECT MAX(staging_ordinal) AS ordinal FROM ontology_source_roots\n WHERE version_id = ${manifest.version_id}\n `\n return last?.ordinal == null ? 0 : Number(last.ordinal)\n }\n\n private async transitionToAbandoned(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n abandonedAt: string\n ): Promise<OntologySourceRecord> {\n if (\n abandonedAt < toIsoString(manifest.created_at) ||\n (manifest.ready_at !== null && abandonedAt < toIsoString(manifest.ready_at))\n ) {\n throw new MaterializationValidationError(\n \"Source abandonedAt cannot precede source creation or readiness.\"\n )\n }\n const rows = await sql<PgOntologySourceRow[]>`\n UPDATE ontology_sources\n SET status = 'abandoned', execution_token = NULL,\n terminal_at = ${abandonedAt}, updated_at = ${abandonedAt}\n WHERE project_id = ${manifest.project_id}\n AND source_id = ${manifest.source_id}\n AND materialization_id = ${manifest.materialization_id}\n AND status IN ('staging', 'ready')\n RETURNING *\n `\n if (!rows[0]) {\n throw sourceConflict(\n `Source materialization '${manifest.materialization_id}' cannot transition to 'abandoned'.`\n )\n }\n // Its roots were never live and stay unpublished; purging removes them with the version.\n return sourceRecord(rows[0])\n }\n\n private async assertReadyState(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n rootCount: number,\n assertionCount: number\n ): Promise<void> {\n const version = manifest.version_id\n const [counts] = await sql<\n {\n readonly assertions: number | string\n readonly roots: number | string\n readonly ordinals: number | string\n readonly min_ordinal: number | string | null\n readonly max_ordinal: number | string | null\n }[]\n >`\n SELECT (SELECT COUNT(*) FROM ontology_source_roots AS roots\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${version}) AS assertions,\n COUNT(*) AS roots, COUNT(DISTINCT staging_ordinal) AS ordinals,\n MIN(staging_ordinal) AS min_ordinal, MAX(staging_ordinal) AS max_ordinal\n FROM ontology_source_roots\n WHERE version_id = ${version}\n `\n const assertions = Number(counts?.assertions ?? 0)\n const roots = Number(counts?.roots ?? 0)\n const ordinals = Number(counts?.ordinals ?? 0)\n const minimum = counts?.min_ordinal === null ? null : Number(counts?.min_ordinal)\n const maximum = counts?.max_ordinal === null ? null : Number(counts?.max_ordinal)\n if (\n assertions !== assertionCount ||\n roots !== rootCount ||\n ordinals !== rootCount ||\n (rootCount > 0 && (minimum !== 0 || maximum !== rootCount - 1))\n ) {\n throw new MaterializationValidationError(\n \"Source ready counts do not match the staged roots and assertions.\"\n )\n }\n await assertSourceRootCoverage(sql, manifest)\n\n // Roots store only their canonical key; compare its parts with each row's typed identity.\n const [invalid] =\n manifest.projection_kind === \"link\"\n ? await sql<{ readonly root_key: string }[]>`\n SELECT roots.root_key\n FROM ontology_source_roots AS roots\n CROSS JOIN LATERAL (SELECT roots.root_key::jsonb AS parts) AS root\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${version}\n GROUP BY roots.id, roots.root_key\n HAVING COUNT(*) <> 1\n OR BOOL_OR(root.parts->>0 <> 'link')\n OR BOOL_OR(rows.entity_kind <> 'link')\n OR BOOL_OR(rows.source_type_id <> root.parts->>1\n OR rows.source_primary_id <> root.parts->>2 OR rows.link_id <> root.parts->>3\n OR rows.target_type_id <> root.parts->>4 OR rows.target_primary_id <> root.parts->>5)\n LIMIT 1\n `\n : await sql<{ readonly root_key: string }[]>`\n SELECT roots.root_key\n FROM ontology_source_roots AS roots\n CROSS JOIN LATERAL (SELECT roots.root_key::jsonb AS parts) AS root\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${version}\n GROUP BY roots.id, roots.root_key\n HAVING BOOL_OR(root.parts->>0 <> 'object')\n OR COUNT(*) FILTER (\n WHERE rows.entity_kind = 'object' AND rows.object_type_id = root.parts->>1\n AND rows.primary_id = root.parts->>2\n ) <> 1\n OR COUNT(*) FILTER (\n WHERE (rows.entity_kind = 'object' AND (rows.object_type_id <> root.parts->>1\n OR rows.primary_id <> root.parts->>2))\n OR (rows.entity_kind = 'link' AND (rows.source_type_id <> root.parts->>1\n OR rows.source_primary_id <> root.parts->>2))\n ) <> 0\n OR COUNT(*) FILTER (WHERE rows.entity_kind = 'link') <> COUNT(DISTINCT (\n rows.link_id, rows.target_type_id, rows.target_primary_id\n )) FILTER (WHERE rows.entity_kind = 'link')\n LIMIT 1\n `\n if (invalid) {\n throw new MaterializationValidationError(\n manifest.projection_kind === \"link\"\n ? \"Link projection roots must contain exactly their matching link assertion.\"\n : \"Object projection roots must contain exactly their matching object assertion plus links sourced from that root.\"\n )\n }\n }\n\n /** Already staged assertions sharing a root or an ordinal with `rows`. */\n private async findStageRows(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n rows: readonly SourceStageRow[]\n ): Promise<readonly SourceStageRow[]> {\n if (rows.length === 0) return []\n const rootKeys = [...new Set(rows.map((row) => row.rootKey))]\n const ordinals = [...new Set(rows.map((row) => row.row.stagingOrdinal))]\n const existing = await sql<PgOntologySourceAssertionRow[]>`\n SELECT ${sourceAssertionColumns(sql)}\n FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${manifest.version_id}\n AND (\n roots.root_key = ANY(${sql.array(rootKeys)}::text[])\n OR roots.staging_ordinal = ANY(${sql.array(ordinals)}::bigint[])\n )\n `\n return existing.map((row) => sourceStageRow(sourceAssertion(row)))\n }\n\n private async insertStageRows(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n rows: readonly SourceStageRow[]\n ): Promise<void> {\n if (rows.length === 0) return\n const payload = rows.map(({ rootKey, row }) => {\n const entity = entityColumns(row.assertion)\n return {\n root_key: rootKey,\n entity_kind: row.assertion.kind,\n object_type_id: entity.objectTypeId,\n primary_id: entity.primaryId,\n source_type_id: entity.sourceTypeId,\n source_primary_id: entity.sourcePrimaryId,\n link_id: entity.linkId,\n target_type_id: entity.targetTypeId,\n target_primary_id: entity.targetPrimaryId,\n payload: sourceAssertionPayload(row.assertion),\n }\n })\n const inserted = await sql`\n INSERT INTO ontology_source_rows (\n root_id, entity_kind, object_type_id, primary_id,\n source_type_id, source_primary_id, link_id, target_type_id, target_primary_id, payload\n )\n SELECT roots.id, staged.entity_kind, staged.object_type_id, staged.primary_id,\n staged.source_type_id, staged.source_primary_id, staged.link_id,\n staged.target_type_id, staged.target_primary_id, staged.payload\n FROM jsonb_to_recordset(${jsonParameter(sql, payload)}) AS staged(\n root_key TEXT, entity_kind TEXT, object_type_id TEXT, primary_id TEXT,\n source_type_id TEXT, source_primary_id TEXT, link_id TEXT,\n target_type_id TEXT, target_primary_id TEXT, payload JSONB\n )\n JOIN ontology_source_roots AS roots\n ON roots.version_id = ${manifest.version_id} AND roots.root_key = staged.root_key\n `\n if (inserted.count !== rows.length) {\n throw sourceConflict(\"Staged source rows do not all belong to a staged root.\")\n }\n }\n\n private assertExecution(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly source: { readonly projectionId: string }\n readonly execution: { readonly projectionRunId: string; readonly executionToken: string }\n },\n identity?: AssertSourceMaterializationExecutionInput[\"identity\"]\n ): Promise<void> {\n return assertProjectionExecution(sql, {\n projectId: input.projectId,\n sourceId: input.source.projectionId,\n projectionRunId: input.execution.projectionRunId,\n executionToken: input.execution.executionToken,\n ...(identity ? { identity } : {}),\n })\n }\n\n private async getRunCandidate(\n sql: SQLClient,\n input: BeginSourceMaterializationInput\n ): Promise<PgOntologySourceRow | null> {\n const [row] = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${input.projectId}\n AND projection_run_id = ${input.execution.projectionRunId}\n AND status IN ('staging', 'ready')\n LIMIT 1\n FOR UPDATE\n `\n return row ?? null\n }\n\n private async getManifest(\n sql: SQLClient,\n projectId: string,\n sourceId: string,\n materializationId: string,\n lock = false\n ): Promise<PgOntologySourceRow | null> {\n const lockFragment = lock ? sql`FOR UPDATE` : sql``\n const [row] = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId}\n AND source_id = ${sourceId}\n AND materialization_id = ${materializationId}\n ${lockFragment}\n `\n return row ?? null\n }\n\n private async requireManifest(\n sql: SQLClient,\n projectId: string,\n sourceId: string,\n materializationId: string,\n lock = false\n ): Promise<PgOntologySourceRow> {\n const row = await this.getManifest(sql, projectId, sourceId, materializationId, lock)\n if (!row) throw sourceConflict(`Source materialization '${materializationId}' does not exist.`)\n return row\n }\n}\n\nfunction toOptionalIsoString(value: Date | string | null | undefined): string | null {\n if (value === null || value === undefined) return null\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n\nfunction numberOrNull(value: number | string | null): number | null {\n return value === null ? null : Number(value)\n}\n",
46
- "import type {\n CleanupTerminalSourceMaterializationsInput,\n CleanupTerminalSourceMaterializationsResult,\n PurgeAbandonedSourceMaterializationsInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\n\n/**\n * Superseded versions can still hold live roots (a delta keeps unchanged roots where they were),\n * so they are cleaned root by root once retired. An abandoned candidate was never published:\n * everything it holds goes, one whole version at a time, each delete on its own version prefix.\n */\nexport async function purgeAbandonedSourceVersions(\n sql: SQLClient,\n input: PurgeAbandonedSourceMaterializationsInput\n): Promise<CleanupTerminalSourceMaterializationsResult> {\n let remaining = input.limit\n let rowsDeleted = 0\n let materializationsDeleted = 0\n while (remaining > 0) {\n const [candidate] = await sql<{ readonly version_id: string }[]>`\n SELECT version_id FROM ontology_sources\n WHERE project_id = ${input.projectId} AND status = 'abandoned'\n ORDER BY terminal_at, source_id, materialization_id\n LIMIT 1 FOR UPDATE SKIP LOCKED\n `\n if (!candidate) break\n const rows = await sql`\n DELETE FROM ontology_source_rows WHERE ctid IN (\n SELECT rows.ctid FROM ontology_source_roots AS roots\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${candidate.version_id} LIMIT ${remaining}\n )\n `\n rowsDeleted += rows.count\n remaining -= rows.count\n if (remaining === 0) break\n const roots = await sql`\n DELETE FROM ontology_source_roots WHERE ctid IN (\n SELECT ctid FROM ontology_source_roots\n WHERE version_id = ${candidate.version_id} LIMIT ${remaining}\n )\n `\n rowsDeleted += roots.count\n remaining -= roots.count\n if (remaining === 0) break\n const manifest = await sql`\n DELETE FROM ontology_sources\n WHERE version_id = ${candidate.version_id} AND status = 'abandoned'\n `\n if (manifest.count === 0) break\n materializationsDeleted += manifest.count\n remaining -= manifest.count\n }\n return { rowsDeleted, materializationsDeleted }\n}\n\nexport async function cleanupSourceVersions(\n sql: SQLClient,\n input: CleanupTerminalSourceMaterializationsInput\n): Promise<CleanupTerminalSourceMaterializationsResult> {\n let remaining = input.limit\n const retired = sql`roots.project_id = ${input.projectId}\n AND roots.retired_at < ${input.terminalBefore} AND versions.status = 'superseded'`\n const removedRows = await sql`\n WITH selected AS (\n SELECT rows.ctid FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE ${retired}\n ORDER BY roots.retired_at, roots.id\n LIMIT ${remaining} FOR UPDATE OF rows SKIP LOCKED\n ) DELETE FROM ontology_source_rows AS rows USING selected WHERE rows.ctid = selected.ctid RETURNING 1\n `\n let rowsDeleted = removedRows.length\n remaining -= rowsDeleted\n if (remaining > 0) {\n const removed = await sql`\n WITH selected AS (\n SELECT roots.ctid FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n WHERE ${retired}\n AND NOT EXISTS (SELECT 1 FROM ontology_source_rows AS rows WHERE rows.root_id = roots.id)\n ORDER BY roots.retired_at, roots.id\n LIMIT ${remaining} FOR UPDATE OF roots SKIP LOCKED\n ) DELETE FROM ontology_source_roots AS roots USING selected WHERE roots.ctid = selected.ctid RETURNING 1\n `\n rowsDeleted += removed.length\n remaining -= removed.length\n }\n const removedManifests =\n remaining === 0\n ? []\n : await sql`\n WITH selected AS (\n SELECT versions.ctid FROM ontology_sources AS versions\n WHERE project_id = ${input.projectId} AND status = 'superseded'\n AND terminal_at < ${input.terminalBefore}\n AND NOT EXISTS (SELECT 1 FROM ontology_source_roots AS roots\n WHERE roots.version_id = versions.version_id)\n ORDER BY terminal_at, source_id, materialization_id LIMIT ${remaining} FOR UPDATE SKIP LOCKED\n ) DELETE FROM ontology_sources AS versions USING selected WHERE versions.ctid = selected.ctid RETURNING 1\n `\n return { rowsDeleted, materializationsDeleted: removedManifests.length }\n}\n",
44
+ "import {\n assertPinnedDatasetWatermark,\n linkRefKey,\n linkRefSortKey,\n linkScopeSortKey,\n MaterializationConflictError,\n MaterializationValidationError,\n objectRefKey,\n objectRefSortKey,\n telemetryPointKey,\n telemetryPointSortKey,\n} from \"@sixb/core/internal/materialization\"\nimport {\n assertExpectedLinkRevision,\n assertExpectedLinkScopeRevision,\n assertExpectedObjectRevision,\n assertMaterializationFinalizationCorrelation,\n assertMaterializationHeader,\n assertPageRows,\n assertSourceActivationCorrelation,\n beginMaterializationApply,\n beginMaterializationVectorChanges,\n cardinalityViolation,\n invalidCorrelation,\n sameNonnegativeCounts as sameCounts,\n uniqueSorted,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n AppliedMaterialization,\n ApplyMaterializationInput,\n ApplyMaterializationResult,\n FinalizeMaterializationInput,\n MaterializationPlanHeader,\n MaterializationSession,\n MaterializationStatePage,\n MaterializationVectorChangePage,\n OntologyCommitRecord,\n OntologyMaterializationStorage,\n SourceActivationWrite,\n StageMaterializationWorkInput,\n StreamMaterializationStateInput,\n StreamMaterializationVectorChangesInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { isUniqueViolation } from \"../storage-errors\"\nimport { lockAdvisoryKeys } from \"../transactions\"\nimport {\n type PgMaterializationSessionState,\n PgMaterializationSessions,\n type PgOntologyTransactionContext,\n} from \"./materialization-session\"\nimport { linkSortExpression, PgMaterializationStateReader } from \"./materialization-state\"\nimport { PgMaterializationWriter } from \"./materialization-writer\"\nimport { boundReplacementPlan } from \"./replacement-plans\"\nimport {\n assertProjectionExecution,\n commitRecord,\n jsonParameter,\n ontologyLockKey,\n originColumns,\n type PgOntologyCommitRow,\n type PgOntologySourceRow,\n toIsoString,\n} from \"./shared\"\nimport { activateSourceRoots } from \"./source-roots\"\n\ninterface TelemetrySummaryRow {\n readonly classified_points: number | string\n readonly points_created: number | string\n readonly points_updated: number | string\n readonly latest_objects_changed: number | string\n}\n\nexport class PgOntologyMaterializationStorage implements OntologyMaterializationStorage {\n private readonly sessions: PgMaterializationSessions\n private readonly writer: PgMaterializationWriter\n\n constructor(\n private readonly sql: SQLClient,\n context: PgOntologyTransactionContext | null\n ) {\n this.sessions = new PgMaterializationSessions(sql, context)\n this.writer = new PgMaterializationWriter(sql)\n }\n\n assertVectorSession(session: MaterializationSession, projectId: string, commitId?: string): void {\n const active = this.sessions.require(session)\n if (\n active.header.commit.projectId !== projectId ||\n (commitId !== undefined && active.header.commit.id !== commitId)\n ) {\n throw new MaterializationValidationError(\n \"Vector mutation does not belong to this materialization session.\"\n )\n }\n }\n\n async begin(input: MaterializationPlanHeader): Promise<MaterializationSession> {\n assertMaterializationHeader(input)\n const session = await this.sessions.create(\n input,\n input.plan ? await boundReplacementPlan(this.sql, input) : null\n )\n try {\n await lockAdvisoryKeys(this.sql, materializationLockKeys(input))\n await this.assertCommitAbsent(input)\n const reader = new PgMaterializationStateReader(this.sql, input.commit.projectId)\n await this.assertSources(input.expected.sources, input.commit.projectId)\n const objectRevisions = await reader.effectiveObjectRevisions(\n input.expected.objects.map((expected) => expected.ref),\n true\n )\n for (const expected of input.expected.objects) {\n assertExpectedObjectRevision(\n objectRevisions.get(objectRefKey(expected.ref)) ?? null,\n expected\n )\n }\n const linkRevisions = await reader.effectiveLinkLastCommits(\n input.expected.links.map((expected) => expected.ref),\n true\n )\n for (const expected of input.expected.links) {\n assertExpectedLinkRevision(linkRevisions.get(linkRefKey(expected.ref)), expected)\n }\n const linkScopeRevisions = await reader.linkScopeRevisions(input.expected.linkScopes)\n for (const [index, expected] of input.expected.linkScopes.entries()) {\n assertExpectedLinkScopeRevision(linkScopeRevisions[index]?.fingerprint, expected)\n }\n const points = await reader.exactPoints(input.expected.points, true)\n const pointRevisions = new Map(\n points.map(\n (point) => [telemetryPointKey(point.series, point.at), point.lastCommitId] as const\n )\n )\n for (const expected of input.expected.points) {\n if (\n (pointRevisions.get(telemetryPointKey(expected.series, expected.at)) ?? null) !==\n expected.lastCommitId\n ) {\n throw new MaterializationConflictError(\n \"timeseries-point\",\n `Telemetry point ${telemetryPointKey(expected.series, expected.at)} changed.`\n )\n }\n }\n return session.publicSession()\n } catch (error) {\n await this.sessions.release(session)\n throw error\n }\n }\n\n async *streamState(\n input: StreamMaterializationStateInput\n ): AsyncIterable<MaterializationStatePage> {\n const session = this.sessions.require(input.session)\n assertPageRows(input.pageRows)\n const reader = new PgMaterializationStateReader(this.sql, session.header.commit.projectId)\n for await (const request of input.requests) {\n this.sessions.require(input.session)\n const objects = uniqueSorted(request.objects, objectRefKey, objectRefSortKey)\n for (let offset = 0; offset < objects.length; offset += input.pageRows) {\n const states = await reader.objectStates(objects.slice(offset, offset + input.pageRows))\n yield { objects: states, links: [], linkScopes: [], points: [] }\n }\n const links = uniqueSorted(request.links, linkRefKey, linkRefSortKey)\n for (let offset = 0; offset < links.length; offset += input.pageRows) {\n const states = await reader.linkStates(links.slice(offset, offset + input.pageRows))\n yield { objects: [], links: states, linkScopes: [], points: [] }\n }\n for await (const refs of reader.incidentLinks(request.incidentObjects, input.pageRows)) {\n this.sessions.require(input.session)\n yield {\n objects: [],\n links: await reader.linkStates(refs),\n linkScopes: [],\n points: [],\n }\n }\n const scopes = uniqueSorted(\n request.linkScopes,\n (scope) =>\n JSON.stringify([scope.source.objectTypeId, scope.source.primaryId, scope.linkId]),\n (scope) => linkScopeSortKey(scope.source, scope.linkId)\n )\n for (let offset = 0; offset < scopes.length; offset += input.pageRows) {\n yield {\n objects: [],\n links: [],\n linkScopes: await reader.linkSlotStates(scopes.slice(offset, offset + input.pageRows)),\n points: [],\n }\n }\n const points = uniqueSorted(\n request.points,\n (point) => telemetryPointKey(point.series, point.at),\n (point) => telemetryPointSortKey(point.series, point.at)\n )\n for (let offset = 0; offset < points.length; offset += input.pageRows) {\n const stored = await reader.exactPoints(points.slice(offset, offset + input.pageRows))\n if (stored.length > 0) {\n yield { objects: [], links: [], linkScopes: [], points: stored }\n }\n }\n }\n }\n\n async stageWork(input: StageMaterializationWorkInput): Promise<void> {\n await this.sessions.stage(input)\n }\n\n async *streamVectorChanges(\n input: StreamMaterializationVectorChangesInput\n ): AsyncIterable<MaterializationVectorChangePage> {\n const session = this.sessions.require(input.session)\n assertPageRows(input.pageRows)\n beginMaterializationVectorChanges(session)\n await this.sessions.analyzeSealedWork(session)\n for await (const items of this.sessions.vectorChangePages(\n session,\n input.objectTypeIds,\n input.pageRows\n )) {\n yield { items }\n }\n }\n\n async apply(input: ApplyMaterializationInput): Promise<AppliedMaterialization> {\n const session = this.sessions.require(input.session)\n beginMaterializationApply(session)\n await this.sessions.analyzeSealedWork(session)\n await this.assertStagedCardinality(session)\n const { commit } = session.header\n const applied = await this.writer.applyStaged({\n workTable: session.workTable,\n workId: session.workId,\n projectId: commit.projectId,\n commitId: commit.id,\n committedAt: commit.committedAt,\n })\n session.changedObjects = applied.objectWrites\n session.changedLinks = applied.linkWrites\n session.appliedEventCount = applied.eventCount\n return { eventCount: applied.eventCount }\n }\n\n async finalize(input: FinalizeMaterializationInput): Promise<ApplyMaterializationResult> {\n const session = this.sessions.require(input.session)\n await this.assertCommitAbsent(session.header)\n await this.assertFinalization(session, input)\n for (const activation of input.finalization.sourceActivations) {\n await this.activateSource(session, activation)\n }\n // The next sparse projection must see the distribution of a newly published bulk load.\n // With empty/stale statistics, a link lookup can scan every edge sharing its target.\n await refreshMaterializedStatistics(this.sql, \"objects\", session.changedObjects)\n await refreshMaterializedStatistics(this.sql, \"links\", session.changedLinks)\n const record = await this.insertCommit(session.header, input)\n await this.sessions.release(session)\n return { commit: record }\n }\n\n deactivateSessions(): void {\n this.sessions.deactivateAll()\n }\n\n private async assertCommitAbsent(header: MaterializationPlanHeader): Promise<void> {\n const [duplicateIdentity] = await this.sql<\n { readonly id: string; readonly idempotency_key: string }[]\n >`\n SELECT id, idempotency_key\n FROM ontology_commits\n WHERE project_id = ${header.commit.projectId}\n AND (id = ${header.commit.id} OR idempotency_key = ${header.commit.idempotencyKey})\n ORDER BY CASE WHEN id = ${header.commit.id} THEN 0 ELSE 1 END\n LIMIT 1\n FOR UPDATE\n `\n if (duplicateIdentity) {\n throw new MaterializationConflictError(\n \"idempotency\",\n duplicateIdentity.id === header.commit.id\n ? `Ontology commit '${header.commit.id}' already exists.`\n : \"Ontology idempotency key already exists.\"\n )\n }\n\n const origin = originColumns(header.commit.origin)\n if (origin.runId === null) return\n const [duplicateOrigin] =\n origin.batchOrdinal === null\n ? await this.sql<{ readonly id: string }[]>`\n SELECT id FROM ontology_commits\n WHERE project_id = ${header.commit.projectId}\n AND origin_kind = ${origin.kind}\n AND origin_run_id = ${origin.runId}\n AND origin_batch_ordinal IS NULL\n LIMIT 1\n FOR UPDATE\n `\n : await this.sql<{ readonly id: string }[]>`\n SELECT id FROM ontology_commits\n WHERE project_id = ${header.commit.projectId}\n AND origin_kind = ${origin.kind}\n AND origin_run_id = ${origin.runId}\n AND origin_batch_ordinal = ${origin.batchOrdinal}\n LIMIT 1\n FOR UPDATE\n `\n if (duplicateOrigin) {\n throw new MaterializationConflictError(\n \"run-correlation\",\n \"Ontology commit origin already has an authoritative commit.\"\n )\n }\n }\n\n private async assertSources(\n expectedSources: MaterializationPlanHeader[\"expected\"][\"sources\"],\n projectId: string\n ): Promise<void> {\n if (expectedSources.length === 0) return\n const rows = await this.sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId}\n AND source_id = ANY(\n ${this.sql.array(expectedSources.map((expected) => expected.source.projectionId))}::text[]\n )\n AND status = 'active'\n FOR UPDATE\n `\n const active = new Map(rows.map((row) => [row.source_id, row] as const))\n for (const expected of expectedSources) {\n this.assertSourceRow(expected, active.get(expected.source.projectionId) ?? null)\n }\n }\n\n private assertSourceRow(\n expected: MaterializationPlanHeader[\"expected\"][\"sources\"][number],\n active: PgOntologySourceRow | null\n ): void {\n if (\n (active?.materialization_id ?? null) !== expected.activeMaterializationId ||\n (active?.last_commit_id ?? null) !== expected.lastCommitId\n ) {\n throw new MaterializationConflictError(\n \"projection-fence\",\n `Source '${expected.source.projectionId}' changed.`\n )\n }\n }\n\n private async assertFinalization(\n session: PgMaterializationSessionState,\n input: FinalizeMaterializationInput\n ): Promise<void> {\n const { commit } = session.header\n const { result } = input.finalization\n assertMaterializationFinalizationCorrelation(session, input)\n if (await this.sessions.hasCardinalityWork(session)) await this.assertFinalCardinality(session)\n const eventCount = session.appliedEventCount\n const [outbox] = await this.sql<\n {\n readonly count: number | string\n readonly minimum: number | string | null\n readonly maximum: number | string | null\n }[]\n >`\n SELECT COUNT(*) AS count, MIN(commit_ordinal) AS minimum,\n MAX(commit_ordinal) AS maximum\n FROM ontology_outbox\n WHERE project_id = ${commit.projectId} AND commit_id = ${commit.id}\n `\n const outboxCount = Number(outbox?.count ?? 0)\n const minimum = outbox?.minimum === null ? null : Number(outbox?.minimum)\n const maximum = outbox?.maximum === null ? null : Number(outbox?.maximum)\n if (\n outboxCount !== eventCount ||\n (eventCount > 0 && (minimum !== 0 || maximum !== eventCount - 1))\n ) {\n invalidCorrelation(\"Outbox event ordinals must be contiguous from zero.\")\n }\n\n if (commit.intent.kind === \"telemetry\") {\n const summary = await this.telemetrySummary(session, commit.intent.pointCount)\n if (summary.classifiedPoints !== commit.intent.pointCount) {\n invalidCorrelation(\n \"Telemetry point classification coverage does not match the commit intent.\"\n )\n }\n if (result.kind !== \"telemetry\" || !sameCounts(result, summary.counts)) {\n invalidCorrelation(\"Telemetry result counts do not correlate with finalized work.\")\n }\n }\n if (commit.intent.kind === \"projection\") {\n if (result.kind !== \"projection\") return\n await this.sessions.assertClassificationCoverage(session)\n const counts = await this.sessions.projectionCounts(session)\n if (!counts || !sameCounts(result.counts, counts)) {\n invalidCorrelation(\"Projection result counts do not correlate with finalized work.\")\n }\n }\n }\n\n /** Rejects a cardinality-one scope that two staged occupants claim, effective view first. */\n private async assertStagedCardinality(session: PgMaterializationSessionState): Promise<void> {\n // Cardinality records are unique per view, scope and link: two occupied in one scope is the\n // violation, and only its scope needs reading back.\n const [violation] = await this.sql<\n { readonly major_order: number; readonly sort_one: string }[]\n >`\n SELECT major_order, sort_one\n FROM ${this.sql(session.workTable)}\n WHERE work_id = ${session.workId} AND lane = 'cardinality'\n AND cardinality_occupied\n GROUP BY major_order, sort_one\n HAVING COUNT(*) > 1\n ORDER BY major_order, sort_one\n LIMIT 1\n `\n if (!violation) return\n const [scope] = await this.sql<{ readonly source_type_id: string; readonly link_id: string }[]>`\n SELECT payload->'ref'->'source'->>'objectTypeId' AS source_type_id,\n payload->'ref'->>'linkId' AS link_id\n FROM ${this.sql(session.workTable)}\n WHERE work_id = ${session.workId} AND lane = 'cardinality'\n AND major_order = ${violation.major_order} AND sort_one = ${violation.sort_one}\n LIMIT 1\n `\n throw cardinalityViolation(\n violation.major_order === 0 ? \"effective\" : \"candidate\",\n scope?.source_type_id ?? \"\",\n scope?.link_id ?? \"\"\n )\n }\n\n private async assertFinalCardinality(session: PgMaterializationSessionState): Promise<void> {\n // A mixed work table can hide a few occupied scopes among millions of other records.\n // Even ANALYZE can miss that population. Isolate it before planning the final join so\n // the planner sees a relation of scopes, without JSON/session selectivity guesses.\n // Session IDs are provider-generated UUIDs. Use unprepared statements for this private\n // identifier so each session does not leave a new statement in the connection cache.\n const table = `ontology_cardinality_${session.id.replaceAll(\"-\", \"\")}`\n await this.sql.unsafe(\n `CREATE TEMP TABLE ${table} ON COMMIT DROP AS\n SELECT sort_one AS scope_sort_key, sort_two AS link_sort_key,\n cardinality_occupied AS occupied,\n payload->'ref'->'source'->>'objectTypeId' AS source_type_id,\n payload->'ref'->'source'->>'primaryId' AS source_id,\n payload->'ref'->>'linkId' AS link_id\n FROM ${session.workTable}\n WHERE work_id = $1 AND lane = 'cardinality' AND major_order = 0`,\n [session.workId]\n )\n await this.sql.unsafe(`ANALYZE ${table}`)\n // Apply already rejected a scope with two staged occupants; this checks what it wrote.\n const [violation] = await this.sql.unsafe<{ readonly mismatch: number }[]>(\n `WITH work AS (\n SELECT * FROM ${table}\n ), scopes AS (\n SELECT DISTINCT scope_sort_key, source_type_id, source_id, link_id FROM work\n ), expected AS (\n SELECT scope_sort_key, link_sort_key FROM work WHERE occupied\n ), actual AS (\n SELECT scopes.scope_sort_key,\n ${linkSortExpression(\"links\")} AS link_sort_key\n FROM scopes\n JOIN links USING (source_type_id, source_id, link_id)\n WHERE links.project_id = $1\n ), differences AS (\n (SELECT * FROM expected EXCEPT SELECT * FROM actual)\n UNION ALL\n (SELECT * FROM actual EXCEPT SELECT * FROM expected)\n )\n SELECT 1 AS mismatch FROM differences LIMIT 1`,\n [session.header.commit.projectId]\n )\n await this.sql.unsafe(`DROP TABLE ${table}`)\n if (violation) {\n invalidCorrelation(\n \"Materialization cardinality work does not match the final effective link scope.\"\n )\n }\n }\n\n private async telemetrySummary(session: PgMaterializationSessionState, pointCount: number) {\n const [row] = await this.sql<TelemetrySummaryRow[]>`\n SELECT\n COUNT(*) FILTER (\n WHERE kind = 'classification' AND payload->>'entityKind' = 'point'\n ) AS classified_points,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'point-upsert'\n AND payload->'item'->'value'->'expected'->>'lastCommitId' IS NULL\n ) AS points_created,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'point-upsert'\n AND payload->'item'->'value'->'expected'->>'lastCommitId' IS NOT NULL\n ) AS points_updated,\n COUNT(*) FILTER (\n WHERE kind = 'plan' AND payload->'item'->>'kind' = 'object-upsert'\n ) AS latest_objects_changed\n FROM ${this.sql(session.workTable)}\n WHERE work_id = ${session.workId}\n `\n const pointsCreated = databaseCount(row?.points_created)\n const pointsUpdated = databaseCount(row?.points_updated)\n return {\n classifiedPoints: databaseCount(row?.classified_points),\n counts: {\n pointsCreated,\n pointsUpdated,\n pointsUnchanged: pointCount - pointsCreated - pointsUpdated,\n latestObjectsChanged: databaseCount(row?.latest_objects_changed),\n },\n }\n }\n\n private async activateSource(\n session: PgMaterializationSessionState,\n activation: SourceActivationWrite\n ): Promise<void> {\n const { commit } = session.header\n assertSourceActivationCorrelation(session, activation)\n const candidate = await this.getSource(\n commit.projectId,\n activation.source.projectionId,\n activation.materializationId,\n true\n )\n if (!candidate || candidate.status !== \"ready\" || candidate.execution_token === null) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source activation candidate is missing or is not ready.\"\n )\n }\n await assertProjectionExecution(this.sql, {\n projectId: commit.projectId,\n sourceId: activation.source.projectionId,\n projectionRunId: activation.execution.projectionRunId,\n executionToken: activation.execution.executionToken,\n })\n if (\n candidate.projection_run_id !== activation.execution.projectionRunId ||\n candidate.execution_token !== activation.execution.executionToken ||\n candidate.projection_kind !== activation.projectionKind ||\n candidate.protocol !== activation.protocol ||\n candidate.dataset_id !== activation.datasetVersion.datasetId ||\n candidate.dataset_version_id !== activation.datasetVersion.versionId ||\n toIsoString(candidate.dataset_version_created_at) !== activation.datasetVersion.createdAt ||\n candidate.projection_revision !== activation.projectionRevision ||\n candidate.ownership_hash !== activation.ownershipHash ||\n candidate.ontology_revision !== activation.ontologyRevision ||\n candidate.ready_at === null ||\n activation.updatedAt < toIsoString(candidate.ready_at)\n ) {\n invalidCorrelation(\"Source activation does not match its ready candidate identity.\")\n }\n const previous = await this.getActiveSource(\n commit.projectId,\n activation.source.projectionId,\n true\n )\n this.assertSourceRow(activation.expected, previous)\n await activateSourceRoots(this.sql, commit.projectId, candidate, activation)\n if (previous) {\n assertPinnedDatasetWatermark(\n {\n datasetId: previous.dataset_id,\n versionId: previous.dataset_version_id,\n createdAt: toIsoString(previous.dataset_version_created_at),\n },\n activation.datasetVersion,\n \"Source activation\"\n )\n if (activation.updatedAt < toIsoString(previous.updated_at)) {\n invalidCorrelation(\"Source activation cannot precede the active materialization update.\")\n }\n const superseded = await this.sql<{ readonly materialization_id: string }[]>`\n UPDATE ontology_sources\n SET status = 'superseded', execution_token = NULL,\n terminal_at = ${activation.updatedAt}, updated_at = ${activation.updatedAt}\n WHERE project_id = ${commit.projectId}\n AND source_id = ${activation.source.projectionId}\n AND materialization_id = ${previous.materialization_id}\n AND status = 'active'\n AND last_commit_id IS NOT DISTINCT FROM ${activation.expected.lastCommitId}\n RETURNING materialization_id\n `\n if (superseded.length !== 1) {\n throw new MaterializationConflictError(\n \"projection-fence\",\n `Source '${activation.source.projectionId}' changed.`\n )\n }\n }\n let activated: readonly { readonly materialization_id: string }[]\n try {\n activated = await this.sql<{ readonly materialization_id: string }[]>`\n UPDATE ontology_sources\n SET status = 'active', execution_token = NULL,\n activated_at = ${activation.updatedAt}, last_commit_id = ${activation.lastCommitId},\n updated_at = ${activation.updatedAt}\n WHERE project_id = ${commit.projectId}\n AND source_id = ${activation.source.projectionId}\n AND materialization_id = ${activation.materializationId}\n AND status = 'ready'\n AND execution_token = ${activation.execution.executionToken}\n RETURNING materialization_id\n `\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new MaterializationConflictError(\n \"projection-fence\",\n `Source '${activation.source.projectionId}' changed.`\n )\n }\n throw error\n }\n if (activated.length !== 1) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source activation candidate changed.\"\n )\n }\n }\n\n private async insertCommit(\n header: MaterializationPlanHeader,\n input: FinalizeMaterializationInput\n ): Promise<OntologyCommitRecord> {\n const { commit } = header\n const origin = originColumns(commit.origin)\n const rows = await this.sql<PgOntologyCommitRow[]>`\n INSERT INTO ontology_commits (\n project_id, id, idempotency_key, request_hash, execution_id,\n origin_kind, origin_run_id, origin_batch_ordinal, origin,\n ontology_revision, projection_revision, ownership_hash,\n intent, result, committed_at\n ) VALUES (\n ${commit.projectId}, ${commit.id}, ${commit.idempotencyKey}, ${commit.requestHash},\n ${commit.executionId},\n ${origin.kind}, ${origin.runId}, ${origin.batchOrdinal},\n ${jsonParameter(this.sql, commit.origin)}, ${commit.ontologyRevision},\n ${commit.projectionRevision ?? null}, ${commit.ownershipHash ?? null},\n ${jsonParameter(this.sql, commit.intent)},\n ${jsonParameter(this.sql, input.finalization.result)}, ${commit.committedAt}\n )\n ON CONFLICT DO NOTHING\n RETURNING *\n `\n if (!rows[0]) {\n await this.assertCommitAbsent(header)\n throw new MaterializationConflictError(\n \"idempotency\",\n \"Ontology commit identity already exists.\"\n )\n }\n return commitRecord(rows[0])\n }\n\n private async getActiveSource(\n projectId: string,\n sourceId: string,\n lock = false\n ): Promise<PgOntologySourceRow | null> {\n const lockFragment = lock ? this.sql`FOR UPDATE` : this.sql``\n const [row] = await this.sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId} AND source_id = ${sourceId} AND status = 'active'\n ${lockFragment}\n `\n return row ?? null\n }\n\n private async getSource(\n projectId: string,\n sourceId: string,\n materializationId: string,\n lock = false\n ): Promise<PgOntologySourceRow | null> {\n const lockFragment = lock ? this.sql`FOR UPDATE` : this.sql``\n const [row] = await this.sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId}\n AND source_id = ${sourceId}\n AND materialization_id = ${materializationId}\n ${lockFragment}\n `\n return row ?? null\n }\n}\n\nfunction materializationLockKeys(header: MaterializationPlanHeader): string[] {\n const { commit, expected } = header\n const origin = originColumns(commit.origin)\n return [\n ontologyLockKey(\"commit-id\", commit.projectId, commit.id),\n ontologyLockKey(\"commit-idempotency\", commit.projectId, commit.idempotencyKey),\n ...(origin.runId === null\n ? []\n : [\n ontologyLockKey(\n \"commit-origin\",\n commit.projectId,\n origin.kind,\n origin.runId,\n origin.batchOrdinal === null ? \"\" : String(origin.batchOrdinal)\n ),\n ]),\n ...expected.sources.map((value) =>\n ontologyLockKey(\"source\", commit.projectId, value.source.projectionId)\n ),\n ...expected.objects.map((value) =>\n ontologyLockKey(\"object\", commit.projectId, objectRefKey(value.ref))\n ),\n ...expected.links.map((value) =>\n ontologyLockKey(\"link\", commit.projectId, linkRefKey(value.ref))\n ),\n ...expected.linkScopes.map((value) =>\n ontologyLockKey(\n \"link-scope\",\n commit.projectId,\n value.source.objectTypeId,\n value.source.primaryId,\n value.linkId\n )\n ),\n ...expected.points.map((value) =>\n ontologyLockKey(\"point\", commit.projectId, telemetryPointKey(value.series, value.at))\n ),\n ]\n}\n\nfunction databaseCount(value: number | string | undefined): number {\n return Number(value ?? 0)\n}\n\n/** Keep the first bulk publication queryable without analyzing every small subsequent delta.\n * Expression indexes make full ANALYZE expensive. Only a substantial current publication\n * forces synchronous work. Autovacuum accumulates smaller writes separately; its modification\n * count can still include a previous transaction's manually analyzed writes at this point. */\nasync function refreshMaterializedStatistics(\n sql: SQLClient,\n table: \"objects\" | \"links\",\n changed: number\n): Promise<void> {\n if (changed < 1_000) return\n const [state] = await sql<{ rows: number }[]>`\n SELECT reltuples AS rows FROM pg_class WHERE oid=${table}::regclass`\n if (!state || state.rows <= 0 || changed >= Math.max(10_000, state.rows * 0.1))\n await sql.unsafe(`ANALYZE ${table}`)\n}\n",
45
+ "import { MaterializationConflictError } from \"@sixb/core/internal/materialization\"\nimport {\n duplicateMaterializationWork as duplicateWork,\n materializationApplyPhase,\n materializationPlanKindRank,\n ProviderMaterializationSessionState,\n type ProviderMaterializationTransactionLifecycle,\n prepareMaterializationWork,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n MaterializationPlanHeader,\n MaterializationPlanWorkRecord,\n MaterializationSession,\n MaterializationVectorChange,\n StageMaterializationWorkInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { isUniqueViolation } from \"../storage-errors\"\nimport { PG_MATERIALIZATION_WORK_TABLE } from \"./materialization-state\"\nimport {\n assertReplacementPlanCoverage,\n PG_PLAN_WORK_TABLE,\n type PgReplacementPlan,\n replacementPlanCounts,\n} from \"./replacement-plans\"\nimport { jsonParameter } from \"./shared\"\n\nexport interface PgOntologyTransactionContext {\n readonly id: object\n readonly materializations: ProviderMaterializationTransactionLifecycle\n active: boolean\n}\n\nexport class PgMaterializationSessionState extends ProviderMaterializationSessionState {\n stagedWorkCount = 0\n changedObjects = 0\n changedLinks = 0\n workAnalyzed = false\n /** Work staged on the session lives in a temp table; a plan-bound session reads its plan's. */\n readonly workTable: string\n readonly workId: string\n\n constructor(\n header: MaterializationPlanHeader,\n transactionId: object,\n readonly plan: PgReplacementPlan | null\n ) {\n super(header, transactionId)\n this.workTable = plan ? PG_PLAN_WORK_TABLE : PG_MATERIALIZATION_WORK_TABLE\n this.workId = plan ? plan.versionId : this.id\n }\n}\n\nexport class PgMaterializationSessions {\n private readonly sessions = new WeakMap<object, PgMaterializationSessionState>()\n private readonly live = new Set<PgMaterializationSessionState>()\n private tablesReady = false\n\n constructor(\n private readonly sql: SQLClient,\n private readonly context: PgOntologyTransactionContext | null\n ) {}\n\n async create(\n header: MaterializationPlanHeader,\n plan: PgReplacementPlan | null\n ): Promise<PgMaterializationSessionState> {\n if (!this.context?.active) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Materialization sessions require an active storage transaction.\"\n )\n }\n await this.ensureTables()\n const session = new PgMaterializationSessionState(\n structuredClone(header),\n this.context.id,\n plan\n )\n this.sessions.set(session.providerToken, session)\n this.live.add(session)\n this.context.materializations.register(session.providerToken)\n return session\n }\n\n require(session: MaterializationSession): PgMaterializationSessionState {\n const value = this.sessions.get(session.providerToken)\n if (\n !value ||\n !value.active ||\n !this.context?.active ||\n value.transactionId !== this.context.id\n ) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Materialization session is inactive.\"\n )\n }\n return value\n }\n\n async release(session: PgMaterializationSessionState): Promise<void> {\n if (!session.active) return\n // A plan's rows outlive the session: maintenance deletes them once the candidate moved on.\n if (!session.plan) await this.deleteWork(session.id)\n session.active = false\n this.live.delete(session)\n this.context?.materializations.complete(session.providerToken)\n }\n\n deactivateAll(): void {\n for (const session of this.live) session.active = false\n this.live.clear()\n }\n\n async stage(input: StageMaterializationWorkInput): Promise<void> {\n const session = this.require(input.session)\n const records = prepareMaterializationWork(session, input)\n if (records.length === 0) return\n const payload = records.map(({ record, uniqueKey, columns }) => {\n return {\n recordKey: record.recordKey,\n uniqueKey,\n kind: record.kind,\n lane: columns.lane,\n majorOrder: columns.majorOrder,\n minorOrder: columns.minorOrder,\n sortOne: columns.sortOne,\n sortTwo: columns.sortTwo,\n occupied: record.kind === \"cardinality\" ? record.occupied : null,\n record,\n }\n })\n // This session is the only writer to its transaction-local temp rows. Let the two unique\n // constraints arbitrate cross-chunk duplicates instead of issuing a duplicate probe before\n // every insert; a violation aborts the enclosing materialization transaction and is mapped\n // back to the provider contract below.\n try {\n await this.sql`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(this.sql, payload)}::jsonb)\n )\n INSERT INTO ${this.sql(PG_MATERIALIZATION_WORK_TABLE)} (\n work_id, record_key, unique_key, kind, lane,\n major_order, minor_order, sort_one, sort_two, cardinality_occupied, payload\n )\n SELECT ${session.id}, value->>'recordKey', value->>'uniqueKey', value->>'kind',\n value->>'lane', (value->>'majorOrder')::integer, (value->>'minorOrder')::integer,\n value->>'sortOne', value->>'sortTwo', (value->>'occupied')::boolean, value->'record'\n FROM staged\n `\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw duplicateWork()\n }\n throw error\n }\n session.stagedWorkCount += records.length\n }\n\n /**\n * Refreshes the work table's statistics once planning has finished writing a large population,\n * before set-based reads join it; small edits avoid the extra round trip.\n */\n async analyzeSealedWork(session: PgMaterializationSessionState): Promise<void> {\n if (session.workAnalyzed) return\n session.workAnalyzed = true\n // A plan's shared tables are analyzed as it is planned, outside any commit transaction.\n if (session.plan || session.stagedWorkCount < 10_000) return\n await this.sql`ANALYZE ${this.sql(session.workTable)}`\n }\n\n /** Staged object upserts and deletes of profiled types, or of objects with a stored vector. */\n async *vectorChangePages(\n session: PgMaterializationSessionState,\n objectTypeIds: readonly string[],\n pageRows: number\n ): AsyncIterable<readonly MaterializationVectorChange[]> {\n if (objectTypeIds.length === 0) {\n const [stored] = await this.sql`\n SELECT 1 FROM object_vectors WHERE project_id = ${session.header.commit.projectId} LIMIT 1\n `\n if (!stored) return\n }\n // Each kind is one range of the lane index, paged in its order.\n for (const kind of [\"object-delete\", \"object-upsert\"] as const) {\n let after: readonly [string, string, string] = [\"\", \"\", \"\"]\n while (true) {\n this.require(session.publicSession())\n const rows = await this.sql<\n {\n readonly sort_one: string\n readonly sort_two: string\n readonly record_key: string\n readonly payload: unknown\n }[]\n >`\n WITH changes AS (\n SELECT sort_one, sort_two, record_key, payload,\n COALESCE(payload->'item'->'value'->'row'->'ref', payload->'item'->'value'->'ref')\n AS ref\n FROM ${this.sql(session.workTable)}\n WHERE work_id = ${session.workId} AND lane = 'apply'\n AND major_order = ${materializationApplyPhase(kind)}\n AND minor_order = ${materializationPlanKindRank(kind)}\n AND (sort_one, sort_two, record_key) > (${after[0]}, ${after[1]}, ${after[2]})\n )\n SELECT sort_one, sort_two, record_key, payload FROM changes\n WHERE ref->>'objectTypeId' = ANY(${this.sql.array([...objectTypeIds])}::text[])\n OR EXISTS (\n SELECT 1 FROM object_vectors\n WHERE project_id = ${session.header.commit.projectId}\n AND object_type_id = changes.ref->>'objectTypeId'\n AND primary_id = changes.ref->>'primaryId'\n )\n ORDER BY sort_one, sort_two, record_key\n LIMIT ${pageRows}\n `\n if (rows.length === 0) break\n const last = rows[rows.length - 1]!\n after = [last.sort_one, last.sort_two, last.record_key]\n yield rows.map(\n (row) => (row.payload as MaterializationPlanWorkRecord).item\n ) as MaterializationVectorChange[]\n }\n }\n }\n\n async hasCardinalityWork(session: PgMaterializationSessionState): Promise<boolean> {\n const [row] = await this.sql`\n SELECT 1 FROM ${this.sql(session.workTable)}\n WHERE work_id = ${session.workId} AND lane = 'cardinality'\n LIMIT 1\n `\n return row !== undefined\n }\n\n async assertClassificationCoverage(session: PgMaterializationSessionState): Promise<void> {\n if (session.plan) await assertReplacementPlanCoverage(this.sql, session.plan)\n }\n\n async projectionCounts(session: PgMaterializationSessionState) {\n return session.plan ? replacementPlanCounts(this.sql, session.plan.versionId) : null\n }\n\n private async ensureTables(): Promise<void> {\n if (this.tablesReady) return\n await this.sql`\n CREATE TEMP TABLE ${this.sql(PG_MATERIALIZATION_WORK_TABLE)} (\n work_id TEXT NOT NULL,\n record_key TEXT COLLATE \"C\" NOT NULL,\n unique_key TEXT NOT NULL,\n kind TEXT NOT NULL,\n lane TEXT NOT NULL,\n major_order INTEGER NOT NULL,\n minor_order INTEGER NOT NULL,\n sort_one TEXT COLLATE \"C\" NOT NULL,\n sort_two TEXT COLLATE \"C\" NOT NULL,\n cardinality_occupied BOOLEAN,\n payload JSONB NOT NULL,\n PRIMARY KEY (work_id, record_key),\n UNIQUE (work_id, unique_key)\n ) ON COMMIT DROP\n `\n await this.sql`\n CREATE INDEX ontology_materialization_work_lane\n ON ${this.sql(PG_MATERIALIZATION_WORK_TABLE)} (\n work_id, lane, major_order, minor_order, sort_one, sort_two, record_key\n )\n `\n this.tablesReady = true\n }\n\n private async deleteWork(sessionId: string): Promise<void> {\n if (!this.tablesReady) return\n await this.sql`\n DELETE FROM ${this.sql(PG_MATERIALIZATION_WORK_TABLE)} WHERE work_id = ${sessionId}\n `\n }\n}\n",
46
+ "import type {\n EffectiveLinkSnapshot,\n EffectiveObjectSnapshot,\n OntologyLinkRef,\n OntologyObjectRef,\n ProjectionEntityRef,\n TelemetrySeriesRef,\n} from \"@sixb/core/internal/materialization\"\nimport {\n linkRefKey,\n linkScopeSortKey,\n MaterializationConflictError,\n objectRefKey,\n projectionEntityKey,\n telemetryPointKey,\n telemetryPointSortKey,\n} from \"@sixb/core/internal/materialization\"\nimport {\n appendScopeSnapshot,\n finishScopeAccumulator,\n linkSlotOverrideValue,\n startScopeAccumulator,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n MaterializationLinkScopeRevision,\n MaterializationLinkScopeState,\n MaterializationLinkState,\n MaterializationObjectState,\n SourceReplacementLinkState,\n SourceReplacementObjectState,\n StoredLinkOverride,\n StoredLinkSlotOverride,\n StoredObjectOverride,\n StoredSourceAssertion,\n StoredSourceLinkAssertion,\n StoredSourceObjectAssertion,\n StoredTelemetryPoint,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport {\n jsonParameter,\n jsonTupleExpression,\n linkRefFromColumns,\n objectRefFromColumns,\n type PgOntologySourceAssertionRow,\n type PgStoredOverrideRow,\n sourceAssertion,\n toIsoString,\n} from \"./shared\"\nimport {\n activeSourceRows,\n liveSourceRowsJoin,\n replacementAssertionRows,\n sourceAssertionColumns,\n} from \"./source-roots\"\n\nexport const PG_MATERIALIZATION_WORK_TABLE = \"ontology_materialization_work\"\n\ninterface EffectiveObjectRow {\n readonly object_type_id: string\n readonly primary_id: string\n readonly properties: unknown\n readonly created_at: Date | string\n readonly updated_at: Date | string\n readonly version: number\n readonly last_commit_id: string | null\n}\n\ninterface EffectiveLinkRow {\n readonly source_type_id: string\n readonly source_id: string\n readonly link_id: string\n readonly target_type_id: string\n readonly target_id: string\n readonly properties: unknown | null\n readonly created_at: Date | string\n readonly updated_at: Date | string\n readonly last_commit_id: string | null\n}\n\ninterface TelemetryRow {\n readonly object_type_id: string\n readonly object_id: string\n readonly property_id: string\n readonly value: unknown\n readonly unit: string | null\n readonly at: Date | string\n readonly last_commit_id: string | null\n}\n\ninterface LinkIdentityRow {\n readonly source_type_id: string\n readonly source_id: string\n readonly link_id: string\n readonly target_type_id: string\n readonly target_id: string\n readonly sort_key: string\n}\n\ninterface LinkScopeRow extends EffectiveLinkRow {\n readonly scope_sort_key: string\n readonly link_sort_key: string\n}\n\ninterface ObjectOverrideRow extends PgStoredOverrideRow {\n readonly object_type_id: string\n readonly primary_id: string\n readonly edited_at: unknown\n}\n\ninterface LinkOverrideRow extends PgStoredOverrideRow {\n readonly source_type_id: string\n readonly source_primary_id: string\n readonly link_id: string\n readonly target_type_id: string\n readonly target_primary_id: string\n}\n\ninterface LinkSlotOverrideRow {\n readonly source_type_id: string\n readonly source_primary_id: string\n readonly link_id: string\n readonly target_type_id: string\n readonly target_primary_id: string\n readonly value: unknown\n readonly last_commit_id: string\n readonly updated_at: Date | string\n}\n\n/** A link a replacement plan decides, and whether its plan needs a diff. */\nexport interface ReplacementLinkIdentity {\n readonly ref: OntologyLinkRef\n readonly sortKey: string\n readonly diffRequired: boolean\n}\n\ninterface ReplacementSources {\n readonly owned: ReadonlySet<string>\n readonly byMaterialization: ReadonlyMap<string, ReadonlyMap<string, StoredSourceAssertion>>\n}\n\nexport class PgMaterializationStateReader {\n constructor(\n private readonly sql: SQLClient,\n readonly projectId: string\n ) {}\n\n async objectState(ref: OntologyObjectRef): Promise<MaterializationObjectState> {\n const [state] = await this.objectStates([ref])\n return state!\n }\n\n async objectStates(\n refs: readonly OntologyObjectRef[]\n ): Promise<readonly MaterializationObjectState[]> {\n if (refs.length === 0) return []\n const requested = refs.map((ref) => ({\n object_type_id: ref.objectTypeId,\n primary_id: ref.primaryId,\n }))\n const requestedParameter = jsonParameter(this.sql, requested)\n const [effectiveRows, sourceRows, overrideRows, telemetryRows] = await Promise.all([\n this.sql<EffectiveObjectRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n )\n SELECT objects.* FROM objects\n JOIN requested USING (object_type_id, primary_id)\n WHERE objects.project_id = ${this.projectId}\n `,\n activeSourceRows(\n this.sql,\n this.projectId,\n refs.map((ref) => ({ kind: \"object\", ref }))\n ),\n this.sql<ObjectOverrideRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n )\n SELECT overrides.* FROM ontology_object_overrides AS overrides\n JOIN requested USING (object_type_id, primary_id)\n WHERE overrides.project_id = ${this.projectId}\n `,\n this.sql<TelemetryRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n )\n SELECT latest.*\n FROM timeseries_latest AS latest\n JOIN requested\n ON requested.object_type_id = latest.object_type_id\n AND requested.primary_id = latest.object_id\n WHERE latest.project_id = ${this.projectId}\n `,\n ])\n\n const effective = new Map(\n effectiveRows.map((row) => [objectRefKey(objectRefFromColumns(row)), row] as const)\n )\n const sources = activeSourceMap(sourceRows)\n const overrides = new Map(\n overrideRows.map(\n (row) => [objectRefKey(objectRefFromColumns(row)), storedObjectOverride(row)] as const\n )\n )\n const telemetry = new Map<string, StoredTelemetryPoint[]>()\n for (const row of telemetryRows) {\n const key = objectRefKey({ objectTypeId: row.object_type_id, primaryId: row.object_id })\n const points = telemetry.get(key) ?? []\n points.push(storedPoint(row))\n telemetry.set(key, points)\n }\n for (const points of telemetry.values()) {\n points.sort((left, right) =>\n telemetryPointSortKey(left.series, left.at).localeCompare(\n telemetryPointSortKey(right.series, right.at)\n )\n )\n }\n\n return refs.map((ref) => {\n const key = objectRefKey(ref)\n const effectiveRow = effective.get(key)\n return {\n ref: structuredClone(ref),\n source: sourceObject(sources.get(projectionEntityKey({ kind: \"object\", ref }))),\n override: overrides.get(key) ?? null,\n effective: effectiveRow ? effectiveObjectSnapshot(effectiveRow) : null,\n latestTelemetry: telemetry.get(key) ?? [],\n }\n })\n }\n\n async linkState(ref: OntologyLinkRef): Promise<MaterializationLinkState> {\n const [state] = await this.linkStates([ref])\n return state!\n }\n\n async linkStates(refs: readonly OntologyLinkRef[]): Promise<readonly MaterializationLinkState[]> {\n if (refs.length === 0) return []\n const requested = refs.map((ref) => ({\n source_type_id: ref.source.objectTypeId,\n source_id: ref.source.primaryId,\n source_primary_id: ref.source.primaryId,\n link_id: ref.linkId,\n target_type_id: ref.target.objectTypeId,\n target_id: ref.target.primaryId,\n target_primary_id: ref.target.primaryId,\n }))\n const requestedParameter = jsonParameter(this.sql, requested)\n const [effectiveRows, sourceRows, overrideRows, slotOverrideRows] = await Promise.all([\n this.sql<EffectiveLinkRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter}) AS requested_values(\n source_type_id TEXT, source_id TEXT, link_id TEXT,\n target_type_id TEXT, target_id TEXT\n )\n )\n SELECT links.* FROM links\n JOIN requested USING (source_type_id, source_id, link_id, target_type_id, target_id)\n WHERE links.project_id = ${this.projectId}\n `,\n activeSourceRows(\n this.sql,\n this.projectId,\n refs.map((ref) => ({ kind: \"link\", ref }))\n ),\n this.sql<LinkOverrideRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter}) AS requested_values(\n source_type_id TEXT, source_primary_id TEXT, link_id TEXT,\n target_type_id TEXT, target_primary_id TEXT\n )\n )\n SELECT overrides.* FROM ontology_link_overrides AS overrides\n JOIN requested USING (\n source_type_id, source_primary_id, link_id, target_type_id, target_primary_id\n )\n WHERE overrides.project_id = ${this.projectId}\n AND overrides.identity_kind = 'edge'\n `,\n this.sql<LinkSlotOverrideRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter}) AS requested_values(\n source_type_id TEXT, source_primary_id TEXT, link_id TEXT\n )\n )\n SELECT overrides.* FROM ontology_link_overrides AS overrides\n JOIN requested USING (source_type_id, source_primary_id, link_id)\n WHERE overrides.project_id = ${this.projectId}\n AND overrides.identity_kind = 'slot'\n `,\n ])\n const effective = new Map(\n effectiveRows.map((row) => [linkRefKey(linkRefFromColumns(row)), row] as const)\n )\n const sources = activeSourceMap(sourceRows)\n const overrides = new Map(\n overrideRows.map(\n (row) => [linkRefKey(linkRefFromOverrideColumns(row)), storedLinkOverride(row)] as const\n )\n )\n const slotOverrides = new Map(\n slotOverrideRows.map((row) => {\n const stored = storedLinkSlotOverride(row)\n return [linkScopeSortKey(stored.ref.source, stored.ref.linkId), stored] as const\n })\n )\n return refs.map((ref) => {\n const key = linkRefKey(ref)\n const effectiveRow = effective.get(key)\n return {\n ref: structuredClone(ref),\n source: sourceLink(sources.get(projectionEntityKey({ kind: \"link\", ref }))),\n override: overrides.get(key) ?? null,\n slotOverride: slotOverrides.get(linkScopeSortKey(ref.source, ref.linkId)) ?? null,\n effective: effectiveRow ? effectiveLinkSnapshot(effectiveRow) : null,\n }\n })\n }\n\n async exactPoint(\n series: TelemetrySeriesRef,\n at: string,\n lock = false\n ): Promise<StoredTelemetryPoint | null> {\n return (await this.exactPoints([{ series, at }], lock))[0] ?? null\n }\n\n async exactPoints(\n points: readonly { readonly series: TelemetrySeriesRef; readonly at: string }[],\n lock = false\n ): Promise<readonly StoredTelemetryPoint[]> {\n if (points.length === 0) return []\n const requested = points.map(({ series, at }) => ({\n object_type_id: series.object.objectTypeId,\n object_id: series.object.primaryId,\n property_id: series.propertyId,\n at,\n }))\n const lockFragment = lock ? this.sql`FOR UPDATE OF timeseries` : this.sql``\n const rows = await this.sql<TelemetryRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${jsonParameter(this.sql, requested)}) AS requested_values(\n object_type_id TEXT, object_id TEXT, property_id TEXT, at TIMESTAMPTZ\n )\n )\n SELECT timeseries.* FROM timeseries\n JOIN requested USING (object_type_id, object_id, property_id, at)\n WHERE timeseries.project_id = ${this.projectId}\n ${lockFragment}\n `\n const found = new Map(\n rows.map((row) => {\n const point = storedPoint(row)\n return [telemetryPointKey(point.series, point.at), point] as const\n })\n )\n return points.flatMap((point) => {\n const stored = found.get(telemetryPointKey(point.series, point.at))\n return stored ? [stored] : []\n })\n }\n\n async linkScopeRevisions(\n scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]\n ): Promise<readonly MaterializationLinkScopeRevision[]> {\n if (scopes.length === 0) return []\n return (await this.readEffectiveLinkScopes(scopes)).revisions\n }\n\n async linkSlotStates(\n scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]\n ): Promise<readonly MaterializationLinkScopeState[]> {\n if (scopes.length === 0) return []\n const requested = scopes.map(({ source, linkId }) => ({\n scope_sort_key: linkScopeSortKey(source, linkId),\n source_type_id: source.objectTypeId,\n source_id: source.primaryId,\n link_id: linkId,\n }))\n const requestedParameter = jsonParameter(this.sql, requested)\n const [sourceRows, slotOverrideRows] = await Promise.all([\n this.sql<PgOntologySourceAssertionRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(\n scope_sort_key TEXT, source_type_id TEXT, source_id TEXT, link_id TEXT\n )\n )\n SELECT ${sourceAssertionColumns(this.sql)}\n FROM ontology_source_rows AS rows\n JOIN requested\n ON requested.source_type_id = rows.source_type_id\n AND requested.source_id = rows.source_primary_id\n AND requested.link_id = rows.link_id\n ${liveSourceRowsJoin(this.sql, this.projectId)}\n WHERE rows.entity_kind = 'link'\n `,\n this.sql<LinkSlotOverrideRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(\n scope_sort_key TEXT, source_type_id TEXT, source_id TEXT, link_id TEXT\n )\n )\n SELECT overrides.*\n FROM ontology_link_overrides AS overrides\n JOIN requested\n ON requested.source_type_id = overrides.source_type_id\n AND requested.source_id = overrides.source_primary_id\n AND requested.link_id = overrides.link_id\n WHERE overrides.project_id = ${this.projectId}\n AND overrides.identity_kind = 'slot'\n `,\n ])\n const sources = activeScopeSourceMap(sourceRows)\n const overrides = new Map(\n slotOverrideRows.map((row) => {\n const stored = storedLinkSlotOverride(row)\n return [linkScopeSortKey(stored.ref.source, stored.ref.linkId), stored] as const\n })\n )\n const { revisions, effective } = await this.readEffectiveLinkScopes(scopes)\n return scopes.map(({ source, linkId }, index) => {\n const key = linkScopeSortKey(source, linkId)\n return {\n ...revisions[index]!,\n sourceAssertion: sources.get(key) ?? null,\n override: overrides.get(key) ?? null,\n effective: effective.get(key) ?? null,\n }\n })\n }\n\n private async readEffectiveLinkScopes(\n scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]\n ): Promise<{\n readonly revisions: readonly MaterializationLinkScopeRevision[]\n readonly effective: ReadonlyMap<string, EffectiveLinkSnapshot | null>\n }> {\n const requested = scopes.map(({ source, linkId }) => ({\n scope_sort_key: linkScopeSortKey(source, linkId),\n source_type_id: source.objectTypeId,\n source_id: source.primaryId,\n link_id: linkId,\n }))\n const requestedParameter = jsonParameter(this.sql, requested)\n const accumulators = new Map(\n scopes.map(({ source, linkId }) => {\n const key = linkScopeSortKey(source, linkId)\n return [key, startScopeAccumulator(source, linkId)] as const\n })\n )\n const effective = new Map<string, EffectiveLinkSnapshot | null>()\n let scopeCursor: string | null = null\n let linkCursor: string | null = null\n while (true) {\n const rows: LinkScopeRow[] = await this.sql`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${requestedParameter})\n AS requested_values(\n scope_sort_key TEXT, source_type_id TEXT, source_id TEXT, link_id TEXT\n )\n ), selected AS (\n SELECT requested.scope_sort_key, links.*,\n ${this.sql.unsafe(linkSortExpression(\"links\"))} AS link_sort_key\n FROM links\n JOIN requested USING (source_type_id, source_id, link_id)\n WHERE links.project_id = ${this.projectId}\n )\n SELECT * FROM selected\n WHERE (${scopeCursor}::text IS NULL OR (scope_sort_key, link_sort_key) >\n (${scopeCursor}, ${linkCursor}))\n ORDER BY scope_sort_key, link_sort_key\n LIMIT 500\n `\n for (const row of rows) {\n const accumulator = accumulators.get(row.scope_sort_key)\n if (!accumulator) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Unexpected link scope '${row.scope_sort_key}' returned by storage.`\n )\n }\n const snapshot = effectiveLinkSnapshot(row)\n appendScopeSnapshot(accumulator, snapshot)\n effective.set(row.scope_sort_key, accumulator.effectiveCount === 1 ? snapshot : null)\n }\n if (rows.length < 500) break\n const last: LinkScopeRow = rows[rows.length - 1]!\n scopeCursor = last.scope_sort_key\n linkCursor = last.link_sort_key\n }\n return {\n revisions: scopes.map(({ source, linkId }) =>\n finishScopeAccumulator(accumulators.get(linkScopeSortKey(source, linkId))!)\n ),\n effective,\n }\n }\n\n async *incidentLinks(\n objects: readonly OntologyObjectRef[],\n pageRows: number\n ): AsyncIterable<OntologyLinkRef[]> {\n if (objects.length === 0) return\n const requested = objects.map((ref) => ({\n object_type_id: ref.objectTypeId,\n primary_id: ref.primaryId,\n }))\n let cursor: string | null = null\n while (true) {\n const rows: LinkIdentityRow[] = await this.sql`\n WITH requested AS (\n SELECT DISTINCT *\n FROM jsonb_to_recordset(${jsonParameter(this.sql, requested)})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n ), authority_links AS (\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links\n JOIN requested\n ON requested.object_type_id = links.source_type_id\n AND requested.primary_id = links.source_id\n WHERE links.project_id = ${this.projectId}\n UNION\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links\n JOIN requested\n ON requested.object_type_id = links.target_type_id\n AND requested.primary_id = links.target_id\n WHERE links.project_id = ${this.projectId}\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id AS source_id,\n overrides.link_id, overrides.target_type_id,\n overrides.target_primary_id AS target_id\n FROM ontology_link_overrides AS overrides\n JOIN requested\n ON requested.object_type_id = overrides.source_type_id\n AND requested.primary_id = overrides.source_primary_id\n WHERE overrides.project_id = ${this.projectId}\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id AS source_id,\n overrides.link_id, overrides.target_type_id,\n overrides.target_primary_id AS target_id\n FROM ontology_link_overrides AS overrides\n JOIN requested\n ON requested.object_type_id = overrides.target_type_id\n AND requested.primary_id = overrides.target_primary_id\n WHERE overrides.project_id = ${this.projectId}\n UNION\n SELECT rows.source_type_id, rows.source_primary_id AS source_id,\n rows.link_id, rows.target_type_id, rows.target_primary_id AS target_id\n FROM ontology_source_rows AS rows\n ${liveSourceRowsJoin(this.sql, this.projectId)}\n JOIN requested\n ON requested.object_type_id = rows.source_type_id\n AND requested.primary_id = rows.source_primary_id\n WHERE rows.entity_kind = 'link'\n UNION\n SELECT rows.source_type_id, rows.source_primary_id AS source_id,\n rows.link_id, rows.target_type_id, rows.target_primary_id AS target_id\n FROM ontology_source_rows AS rows\n ${liveSourceRowsJoin(this.sql, this.projectId)}\n JOIN requested\n ON requested.object_type_id = rows.target_type_id\n AND requested.primary_id = rows.target_primary_id\n WHERE rows.entity_kind = 'link'\n ), selected AS (\n SELECT DISTINCT links.*,\n ${this.sql.unsafe(linkSortExpression(\"links\"))} AS sort_key\n FROM authority_links AS links\n )\n SELECT * FROM selected\n WHERE (${cursor}::text IS NULL OR sort_key > ${cursor})\n ORDER BY sort_key\n LIMIT ${pageRows}\n `\n if (rows.length === 0) break\n yield rows.map(linkRefFromColumns)\n cursor = rows[rows.length - 1]?.sort_key ?? null\n }\n }\n\n async replacementObjectStates(\n sourceId: string,\n candidateMaterializationId: string,\n refs: readonly OntologyObjectRef[]\n ): Promise<readonly SourceReplacementObjectState[]> {\n const base = await this.objectStates(refs)\n const candidates = await this.replacementSources(\n sourceId,\n [candidateMaterializationId],\n refs.map((ref) => ({ kind: \"object\" as const, ref }))\n )\n return base.map((state) => ({\n ref: state.ref,\n candidateSource: sourceObject(\n candidates.byMaterialization\n .get(candidateMaterializationId)\n ?.get(projectionEntityKey({ kind: \"object\", ref: state.ref }))\n ),\n override: state.override,\n effective: state.effective,\n latestTelemetry: state.latestTelemetry,\n }))\n }\n\n async replacementLinkStates(\n sourceId: string,\n candidateMaterializationId: string,\n materializationIds: readonly string[],\n identities: readonly ReplacementLinkIdentity[],\n incremental = false\n ): Promise<readonly SourceReplacementLinkState[]> {\n const refs = identities.map((identity) => identity.ref)\n const base = await this.linkStates(refs)\n const replacements = await this.replacementSources(\n sourceId,\n materializationIds,\n refs.map((ref) => ({ kind: \"link\" as const, ref })),\n incremental\n )\n const candidate = replacements.byMaterialization.get(candidateMaterializationId)\n return base.map((state, index) => {\n const key = projectionEntityKey({ kind: \"link\", ref: state.ref })\n return {\n ref: state.ref,\n candidateSource: replacements.owned.has(key)\n ? sourceLink(candidate?.get(key))\n : state.source,\n override: state.override,\n slotOverride: state.slotOverride,\n effective: state.effective,\n diffRequired: identities[index]!.diffRequired,\n }\n })\n }\n\n async effectiveObjectRevision(\n ref: OntologyObjectRef,\n lock = false\n ): Promise<{ readonly version: number; readonly lastCommitId: string | null } | null> {\n return (await this.effectiveObjectRevisions([ref], lock)).get(objectRefKey(ref)) ?? null\n }\n\n async effectiveObjectRevisions(\n refs: readonly OntologyObjectRef[],\n lock = false\n ): Promise<\n ReadonlyMap<string, { readonly version: number; readonly lastCommitId: string | null }>\n > {\n if (refs.length === 0) return new Map()\n const requested = refs.map((ref) => ({\n object_type_id: ref.objectTypeId,\n primary_id: ref.primaryId,\n }))\n const lockFragment = lock ? this.sql`FOR UPDATE OF objects` : this.sql``\n const rows = await this.sql<\n {\n readonly object_type_id: string\n readonly primary_id: string\n readonly version: number\n readonly last_commit_id: string | null\n }[]\n >`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${jsonParameter(this.sql, requested)})\n AS requested_values(object_type_id TEXT, primary_id TEXT)\n )\n SELECT objects.object_type_id, objects.primary_id, objects.version,\n objects.last_commit_id\n FROM objects JOIN requested USING (object_type_id, primary_id)\n WHERE objects.project_id = ${this.projectId}\n ${lockFragment}\n `\n return new Map(\n rows.map(\n (row) =>\n [\n objectRefKey(objectRefFromColumns(row)),\n { version: row.version, lastCommitId: row.last_commit_id },\n ] as const\n )\n )\n }\n\n async effectiveLinkLastCommit(\n ref: OntologyLinkRef,\n lock = false\n ): Promise<string | null | undefined> {\n return (await this.effectiveLinkLastCommits([ref], lock)).get(linkRefKey(ref))\n }\n\n async effectiveLinkLastCommits(\n refs: readonly OntologyLinkRef[],\n lock = false\n ): Promise<ReadonlyMap<string, string | null>> {\n if (refs.length === 0) return new Map()\n const requested = refs.map((ref) => ({\n source_type_id: ref.source.objectTypeId,\n source_id: ref.source.primaryId,\n link_id: ref.linkId,\n target_type_id: ref.target.objectTypeId,\n target_id: ref.target.primaryId,\n }))\n const lockFragment = lock ? this.sql`FOR UPDATE OF links` : this.sql``\n const rows = await this.sql<EffectiveLinkRow[]>`\n WITH requested AS (\n SELECT DISTINCT * FROM jsonb_to_recordset(${jsonParameter(this.sql, requested)})\n AS requested_values(\n source_type_id TEXT, source_id TEXT, link_id TEXT,\n target_type_id TEXT, target_id TEXT\n )\n )\n SELECT links.* FROM links\n JOIN requested USING (source_type_id, source_id, link_id, target_type_id, target_id)\n WHERE links.project_id = ${this.projectId}\n ${lockFragment}\n `\n return new Map(\n rows.map((row) => [linkRefKey(linkRefFromColumns(row)), row.last_commit_id] as const)\n )\n }\n\n private async replacementSources(\n sourceId: string,\n materializationIds: readonly string[],\n refs: readonly ProjectionEntityRef[],\n incremental = false\n ): Promise<ReplacementSources> {\n if (materializationIds.length === 0 || refs.length === 0) {\n return { owned: new Set(), byMaterialization: new Map() }\n }\n const rows = await replacementAssertionRows(this.sql, {\n projectId: this.projectId,\n sourceId,\n materializationId: materializationIds[0]!,\n incremental,\n includePrevious: materializationIds.length > 1,\n refs,\n })\n const owned = new Set<string>()\n const byMaterialization = new Map<string, Map<string, StoredSourceAssertion>>()\n for (const row of rows) {\n const source = storedSource(row)\n const key = projectionEntityKey(source.assertion)\n owned.add(key)\n const materialization = byMaterialization.get(row.materialization_id) ?? new Map()\n materialization.set(key, source)\n byMaterialization.set(row.materialization_id, materialization)\n }\n return { owned, byMaterialization }\n }\n}\n\nfunction activeSourceMap(\n rows: readonly PgOntologySourceAssertionRow[]\n): ReadonlyMap<string, StoredSourceAssertion> {\n const result = new Map<string, StoredSourceAssertion>()\n for (const row of rows) {\n const source = storedSource(row)\n const key = projectionEntityKey(source.assertion)\n if (result.has(key)) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Multiple active sources assert ${key}.`\n )\n }\n result.set(key, source)\n }\n return result\n}\n\nfunction activeScopeSourceMap(\n rows: readonly PgOntologySourceAssertionRow[]\n): ReadonlyMap<string, StoredSourceLinkAssertion> {\n const result = new Map<string, StoredSourceLinkAssertion>()\n for (const row of rows) {\n const source = sourceLink(storedSource(row))\n if (!source) continue\n const ref = source.assertion.ref\n const key = linkScopeSortKey(ref.source, ref.linkId)\n if (result.has(key)) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Multiple active sources assert cardinality-one link slot ${key}.`\n )\n }\n result.set(key, source)\n }\n return result\n}\n\nfunction sourceObject(\n source: StoredSourceAssertion | undefined\n): StoredSourceObjectAssertion | null {\n return source?.assertion.kind === \"object\" ? (source as StoredSourceObjectAssertion) : null\n}\n\nfunction sourceLink(source: StoredSourceAssertion | undefined): StoredSourceLinkAssertion | null {\n return source?.assertion.kind === \"link\" ? (source as StoredSourceLinkAssertion) : null\n}\n\nfunction storedObjectOverride(row: ObjectOverrideRow): StoredObjectOverride {\n const ref = objectRefFromColumns(row)\n return {\n ref,\n value: structuredClone(row.value) as StoredObjectOverride[\"value\"],\n editedAt: structuredClone(row.edited_at) as Readonly<Record<string, string>>,\n lastCommitId: row.last_commit_id,\n updatedAt: toIsoString(row.updated_at),\n }\n}\n\nfunction storedLinkOverride(row: LinkOverrideRow): StoredLinkOverride {\n const ref = linkRefFromOverrideColumns(row)\n return {\n ref,\n value: structuredClone(row.value) as StoredLinkOverride[\"value\"],\n lastCommitId: row.last_commit_id,\n updatedAt: toIsoString(row.updated_at),\n }\n}\n\nfunction storedLinkSlotOverride(row: LinkSlotOverrideRow): StoredLinkSlotOverride {\n const ref = {\n source: { objectTypeId: row.source_type_id, primaryId: row.source_primary_id },\n linkId: row.link_id,\n }\n return {\n ref,\n value: linkSlotOverrideValue(row.value, linkScopeLabel(ref)),\n lastCommitId: row.last_commit_id,\n updatedAt: toIsoString(row.updated_at),\n }\n}\n\nfunction linkRefFromOverrideColumns(row: LinkOverrideRow): OntologyLinkRef {\n return {\n source: { objectTypeId: row.source_type_id, primaryId: row.source_primary_id },\n linkId: row.link_id,\n target: { objectTypeId: row.target_type_id, primaryId: row.target_primary_id },\n }\n}\n\nfunction linkScopeLabel(scope: {\n readonly source: OntologyObjectRef\n readonly linkId: string\n}): string {\n return JSON.stringify([scope.source.objectTypeId, scope.source.primaryId, scope.linkId])\n}\n\nfunction storedSource(row: PgOntologySourceAssertionRow): StoredSourceAssertion {\n return {\n source: { projectionId: row.source_id },\n materializationId: row.materialization_id,\n ...sourceAssertion(row),\n } as StoredSourceAssertion\n}\n\nfunction effectiveObjectSnapshot(row: EffectiveObjectRow): EffectiveObjectSnapshot {\n if (!row.last_commit_id) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Effective object ${row.object_type_id}:${row.primary_id} lacks materializer provenance.`\n )\n }\n return {\n ref: objectRefFromColumns(row),\n properties: structuredClone(row.properties) as EffectiveObjectSnapshot[\"properties\"],\n version: row.version,\n createdAt: toIsoString(row.created_at),\n updatedAt: toIsoString(row.updated_at),\n lastCommitId: row.last_commit_id,\n }\n}\n\nfunction effectiveLinkSnapshot(row: EffectiveLinkRow): EffectiveLinkSnapshot {\n if (!row.last_commit_id) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Effective link ${linkRefKey(linkRefFromColumns(row))} lacks materializer provenance.`\n )\n }\n return {\n ref: linkRefFromColumns(row),\n ...(row.properties === null\n ? {}\n : {\n properties: structuredClone(row.properties) as NonNullable<\n EffectiveLinkSnapshot[\"properties\"]\n >,\n }),\n createdAt: toIsoString(row.created_at),\n updatedAt: toIsoString(row.updated_at),\n lastCommitId: row.last_commit_id,\n }\n}\n\nfunction storedPoint(row: TelemetryRow): StoredTelemetryPoint {\n const at = toIsoString(row.at)\n if (!row.last_commit_id) {\n throw new MaterializationConflictError(\n \"timeseries-point\",\n `Telemetry point ${telemetryPointSortKey(\n {\n object: { objectTypeId: row.object_type_id, primaryId: row.object_id },\n propertyId: row.property_id,\n },\n at\n )} lacks materializer provenance.`\n )\n }\n return {\n series: {\n object: { objectTypeId: row.object_type_id, primaryId: row.object_id },\n propertyId: row.property_id,\n },\n value: structuredClone(row.value) as StoredTelemetryPoint[\"value\"],\n ...(row.unit === null ? {} : { unit: row.unit }),\n at,\n lastCommitId: row.last_commit_id,\n }\n}\n\nexport function linkSortExpression(alias?: string): string {\n const prefix = alias ? `${alias}.` : \"\"\n return utf8SortExpression([\n `to_jsonb(${prefix}source_type_id)::text`,\n `to_jsonb(${prefix}source_id)::text`,\n `to_jsonb(${prefix}link_id)::text`,\n `to_jsonb(${prefix}target_type_id)::text`,\n `to_jsonb(${prefix}target_id)::text`,\n ])\n}\n\nfunction utf8SortExpression(parts: readonly string[]): string {\n return `encode(convert_to(${jsonTupleExpression(parts)}, 'UTF8'), 'hex')`\n}\n",
47
+ "import type { ProjectionEntityRef } from \"@sixb/core/internal/materialization\"\nimport {\n MaterializationConflictError,\n MaterializationValidationError,\n projectionEntityKey,\n} from \"@sixb/core/internal/materialization\"\nimport {\n sourceEntityColumns,\n sourceStageRoots,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type { SourceActivationWrite, StageSourceRowsInput } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport type { PgOntologySourceAssertionRow } from \"./shared\"\nimport { columnKeyExpression, jsonParameter, type PgOntologySourceRow } from \"./shared\"\n\n/**\n * Source storage in three levels: a version (`ontology_sources`, one per run), its roots (one per\n * logical dataset row, keyed by the canonical entity key) and their rows (what each root asserts).\n *\n * A root is live while its version is published (active or superseded), it is not retired and it\n * is not a deletion. Activation retires the live roots its candidate replaces and flips the\n * version; the candidate's own roots are never rewritten. One live root per source and key holds\n * because activation, under the source fence, retires every root the candidate replaces.\n */\nexport const PUBLISHED = \"('active', 'superseded')\"\n\n/** The columns `sourceAssertion` reads, over `versions`, `roots` and `rows`. */\nexport function sourceAssertionColumns(sql: SQLClient) {\n return sql.unsafe(`versions.source_id, versions.materialization_id, roots.root_key,\n roots.staging_ordinal, rows.entity_kind, rows.object_type_id, rows.primary_id,\n rows.source_type_id, rows.source_primary_id, rows.link_id, rows.target_type_id,\n rows.target_primary_id, rows.payload`)\n}\n\n/** Keeps `rows` to those of live roots in `projectId`, joined as `roots` and `versions`. */\nexport function liveSourceRowsJoin(sql: SQLClient, projectId: string) {\n return sql`\n JOIN ontology_source_roots AS roots ON roots.id = rows.root_id\n AND roots.project_id = ${projectId} AND roots.retired_at IS NULL AND NOT roots.deleted\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n AND versions.status IN ${sql.unsafe(PUBLISHED)}\n `\n}\n\nfunction candidateVersion(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly sourceId: string\n readonly materializationId: string\n }\n) {\n return sql`(SELECT version_id FROM ontology_sources WHERE project_id = ${input.projectId}\n AND source_id = ${input.sourceId} AND materialization_id = ${input.materializationId})`\n}\n\n/** The typed identity of `rows` equals the one requested. */\nconst ENTITY_MATCH = `rows.entity_kind = requested.entity_kind\n AND rows.object_type_id IS NOT DISTINCT FROM requested.object_type_id\n AND rows.primary_id IS NOT DISTINCT FROM requested.primary_id\n AND rows.source_type_id IS NOT DISTINCT FROM requested.source_type_id\n AND rows.source_primary_id IS NOT DISTINCT FROM requested.source_primary_id\n AND rows.link_id IS NOT DISTINCT FROM requested.link_id\n AND rows.target_type_id IS NOT DISTINCT FROM requested.target_type_id\n AND rows.target_primary_id IS NOT DISTINCT FROM requested.target_primary_id`\n\nconst REQUESTED_ENTITY = `entity_kind TEXT, object_type_id TEXT, primary_id TEXT,\n source_type_id TEXT, source_primary_id TEXT, link_id TEXT, target_type_id TEXT,\n target_primary_id TEXT`\n\n/** An entity's own key, and for a link the key of the object root that may assert it. */\nfunction requestedEntity(ref: ProjectionEntityRef) {\n const columns = sourceEntityColumns(ref)\n const key = projectionEntityKey(ref)\n return {\n entity_kind: ref.kind,\n object_type_id: columns.objectTypeId,\n primary_id: columns.primaryId,\n source_type_id: columns.sourceTypeId,\n source_primary_id: columns.sourcePrimaryId,\n link_id: columns.linkId,\n target_type_id: columns.targetTypeId,\n target_primary_id: columns.targetPrimaryId,\n root_keys:\n ref.kind === \"object\"\n ? [key]\n : [key, projectionEntityKey({ kind: \"object\", ref: ref.ref.source })],\n }\n}\n\n/** The candidate's rows, plus the rows of the live roots it may replace. */\nexport function replacementSourceRows(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly sourceId: string\n readonly materializationId: string\n readonly incremental: boolean\n }\n) {\n const live = sql`roots.retired_at IS NULL AND NOT roots.deleted\n AND versions.source_id = ${input.sourceId} AND versions.status IN ${sql.unsafe(PUBLISHED)}`\n const roots = input.incremental\n ? sql`\n SELECT live.id FROM ontology_source_roots AS changed\n CROSS JOIN LATERAL (\n SELECT roots.id FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n WHERE roots.project_id = ${input.projectId} AND roots.root_key = changed.root_key AND ${live}\n OFFSET 0\n ) AS live\n WHERE changed.version_id = ${candidateVersion(sql, input)}\n `\n : sql`\n SELECT roots.id FROM ontology_sources AS versions\n JOIN ontology_source_roots AS roots ON roots.version_id = versions.version_id\n WHERE versions.project_id = ${input.projectId} AND ${live}\n `\n return sql`\n SELECT rows.* FROM ontology_source_roots AS roots\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${candidateVersion(sql, input)}\n UNION ALL\n SELECT rows.* FROM (${roots}) AS roots\n CROSS JOIN LATERAL (\n SELECT rows.* FROM ontology_source_rows AS rows WHERE rows.root_id = roots.id OFFSET 0\n ) AS rows\n `\n}\n\nexport async function stageSourceRoots(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n input: StageSourceRowsInput\n): Promise<void> {\n const roots = sourceStageRoots(manifest.projection_kind, input)\n if (roots.length === 0) return\n if (!manifest.base_materialization_id && roots.some((root) => root.deleted)) {\n throw new MaterializationValidationError(\"Root deletions require a source delta base.\")\n }\n const values = jsonParameter(\n sql,\n roots.map((root) => ({\n root_key: root.rootKey,\n staging_ordinal: root.stagingOrdinal,\n deleted: root.deleted,\n }))\n )\n const inserted = await sql<{ root_key: string }[]>`\n INSERT INTO ontology_source_roots (version_id, project_id, root_key, staging_ordinal, deleted)\n SELECT ${manifest.version_id}, ${input.projectId}, root_key, staging_ordinal, deleted\n FROM jsonb_to_recordset(${values}) AS input(root_key TEXT, staging_ordinal BIGINT, deleted BOOLEAN)\n ON CONFLICT DO NOTHING RETURNING root_key\n `\n if (inserted.length === roots.length) return\n const insertedKeys = new Set(inserted.map((row) => row.root_key))\n const skipped = roots.filter((root) => !insertedKeys.has(root.rootKey))\n const stored = await sql<\n { root_key: string; staging_ordinal: string | number; deleted: boolean }[]\n >`\n SELECT root_key, staging_ordinal, deleted FROM ontology_source_roots\n WHERE version_id = ${manifest.version_id}\n AND root_key = ANY(${sql.array(skipped.map((root) => root.rootKey))}::text[])\n `\n const existing = new Map(stored.map((root) => [root.root_key, root]))\n if (\n skipped.some((root) => {\n const previous = existing.get(root.rootKey)\n return (\n !previous ||\n Number(previous.staging_ordinal) !== root.stagingOrdinal ||\n previous.deleted !== root.deleted\n )\n })\n )\n throw new MaterializationValidationError(\n \"Source materialization repeats root or stream ordinal with different content.\"\n )\n}\n\n/**\n * Retires what the candidate replaces; its own roots go live when its version turns active. Every\n * link those roots assert changes its live source, which the commit records as touched.\n */\nexport async function activateSourceRoots(\n sql: SQLClient,\n projectId: string,\n candidate: PgOntologySourceRow,\n activation: SourceActivationWrite\n): Promise<void> {\n if (\n candidate.base_materialization_id !== null &&\n (candidate.base_materialization_id !== activation.expected.activeMaterializationId ||\n candidate.base_commit_id !== activation.expected.lastCommitId)\n )\n throw new MaterializationConflictError(\n \"projection-fence\",\n \"Source delta base changed before activation.\"\n )\n if (candidate.base_materialization_id !== null && Number(candidate.root_count) === 0) return\n const live = sql`roots.retired_at IS NULL AND NOT roots.deleted\n AND versions.version_id = roots.version_id AND versions.project_id = ${projectId}\n AND versions.source_id = ${activation.source.projectionId}\n AND versions.status IN ${sql.unsafe(PUBLISHED)}`\n const retired =\n candidate.base_materialization_id === null\n ? sql`\n UPDATE ontology_source_roots AS roots SET retired_at = ${activation.updatedAt}\n FROM ontology_sources AS versions WHERE ${live}\n RETURNING roots.id\n `\n : sql`\n UPDATE ontology_source_roots AS roots SET retired_at = ${activation.updatedAt}\n FROM ontology_source_roots AS changed, ontology_sources AS versions\n WHERE changed.version_id = ${candidate.version_id} AND roots.project_id = ${projectId}\n AND roots.root_key = changed.root_key AND ${live}\n RETURNING roots.id\n `\n await sql`\n WITH retired AS (${retired}), changed AS (\n SELECT id FROM retired\n UNION ALL\n SELECT id FROM ontology_source_roots WHERE version_id = ${candidate.version_id}\n )\n INSERT INTO ontology_commit_touches (project_id, entity_kind, identity_key)\n SELECT DISTINCT ${projectId}, 'link', ${sql.unsafe(\n columnKeyExpression([\n \"rows.source_type_id\",\n \"rows.source_primary_id\",\n \"rows.link_id\",\n \"rows.target_type_id\",\n \"rows.target_primary_id\",\n ])\n )}\n FROM changed\n CROSS JOIN LATERAL (\n SELECT * FROM ontology_source_rows AS rows\n WHERE rows.root_id = changed.id AND rows.entity_kind = 'link'\n OFFSET 0\n ) AS rows\n `\n // Deletions are never live; retiring them lets cleanup remove them with their version.\n await sql`\n UPDATE ontology_source_roots SET retired_at = ${activation.updatedAt}\n WHERE version_id = ${candidate.version_id} AND deleted\n `\n}\n\nexport async function assertSourceRootCoverage(\n sql: SQLClient,\n manifest: PgOntologySourceRow\n): Promise<void> {\n const [invalid] = await sql`\n SELECT 1 FROM ontology_source_roots AS roots\n WHERE roots.version_id = ${manifest.version_id}\n AND roots.deleted = EXISTS (\n SELECT 1 FROM ontology_source_rows AS rows WHERE rows.root_id = roots.id\n )\n LIMIT 1\n `\n if (invalid)\n throw new MaterializationValidationError(\n \"Source roots must have complete assertions or an explicit deletion, never both.\"\n )\n}\n\n/** The live assertions of `refs`, whichever source asserts them. */\nexport function activeSourceRows(\n sql: SQLClient,\n projectId: string,\n refs: readonly ProjectionEntityRef[]\n) {\n const requested = refs.flatMap((ref) => {\n const { root_keys, ...entity } = requestedEntity(ref)\n return root_keys.map((root_key) => ({ ...entity, root_key }))\n })\n return sql<PgOntologySourceAssertionRow[]>`\n SELECT ${sourceAssertionColumns(sql)}\n FROM jsonb_to_recordset(${jsonParameter(sql, requested)})\n AS requested(root_key TEXT, ${sql.unsafe(REQUESTED_ENTITY)})\n JOIN ontology_source_roots AS roots ON roots.project_id = ${projectId}\n AND roots.root_key = requested.root_key AND roots.retired_at IS NULL AND NOT roots.deleted\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n AND versions.status IN ${sql.unsafe(PUBLISHED)}\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id AND ${sql.unsafe(ENTITY_MATCH)}\n `\n}\n\n/** The candidate's assertions of `refs`, and optionally the live ones they would replace. */\nexport function replacementAssertionRows(\n sql: SQLClient,\n input: {\n projectId: string\n sourceId: string\n materializationId: string\n incremental: boolean\n includePrevious: boolean\n refs: readonly ProjectionEntityRef[]\n }\n) {\n const version = candidateVersion(sql, input)\n const previous = !input.includePrevious\n ? sql``\n : sql`UNION ALL\n SELECT ${sourceAssertionColumns(sql)} FROM (\n SELECT roots.* FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n WHERE roots.project_id = ${input.projectId} AND roots.root_key = ANY(requested.root_keys)\n AND roots.retired_at IS NULL AND NOT roots.deleted\n AND versions.source_id = ${input.sourceId} AND versions.status IN ${sql.unsafe(PUBLISHED)}\n ${\n !input.incremental\n ? sql``\n : sql`AND EXISTS (SELECT 1 FROM ontology_source_roots AS changed\n WHERE changed.version_id = ${version} AND changed.root_key = roots.root_key)`\n }\n OFFSET 0\n ) AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n CROSS JOIN LATERAL (\n SELECT rows.* FROM ontology_source_rows AS rows\n WHERE rows.root_id = roots.id AND ${sql.unsafe(ENTITY_MATCH)}\n OFFSET 0\n ) AS rows\n `\n // Keep each JSON request as an indexed identity lookup even with fresh/stale statistics.\n // Flattening this LATERAL caused a cold 10k-root run to spend seconds on each state page.\n return sql<PgOntologySourceAssertionRow[]>`\n SELECT selected.* FROM jsonb_to_recordset(${jsonParameter(sql, input.refs.map(requestedEntity))})\n AS requested(${sql.unsafe(REQUESTED_ENTITY)}, root_keys TEXT[])\n CROSS JOIN LATERAL (\n SELECT ${sourceAssertionColumns(sql)} FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id AND ${sql.unsafe(ENTITY_MATCH)}\n WHERE roots.version_id = ${version} AND roots.root_key = ANY(requested.root_keys)\n ${previous}\n OFFSET 0\n ) AS selected\n `\n}\n",
48
+ "import {\n type EffectiveChangeCounts,\n MaterializationConflictError,\n MaterializationValidationError,\n type OntologyLinkRef,\n type OntologyObjectRef,\n objectRefKey,\n} from \"@sixb/core/internal/materialization\"\nimport {\n assertNonblank,\n assertPageRows,\n assertPositiveInteger,\n assertReplacementPlanCommit,\n duplicateMaterializationWork,\n invalidCorrelation,\n materializationWorkColumns,\n prepareReplacementIdentities,\n workUniquenessKey,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n MaterializationObjectExistence,\n OntologyCommitWrite,\n OntologyReplacementPlanStorage,\n OpenedReplacementPlan,\n OpenReplacementPlanInput,\n PurgeReplacementPlansInput,\n ReplacementPlanRef,\n ReplacementPlanStatePage,\n ReplacementPlanStatus,\n StageReplacementPlanInput,\n StreamReplacementPlanStateInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { isUniqueViolation } from \"../storage-errors\"\nimport { isWithinPgTransaction, runPgTransaction } from \"../transactions\"\nimport { PgMaterializationStateReader } from \"./materialization-state\"\nimport {\n assertProjectionExecution,\n columnKeyExpression,\n jsonParameter,\n jsonTupleExpression,\n type PgOntologySourceRow,\n toIsoString,\n} from \"./shared\"\nimport { PUBLISHED, replacementSourceRows } from \"./source-roots\"\n\nexport const PG_PLAN_WORK_TABLE = \"ontology_replacement_plan_work\"\nconst IDENTITIES = \"ontology_replacement_plan_identities\"\n/** An identity's planning order: its key's UTF-8 bytes, as `objectRefSortKey`/`linkRefSortKey`. */\nconst SORT_KEY = \"encode(convert_to(identity_key, 'UTF8'), 'hex')\"\n\n/**\n * Rows a plan writes at once before its tables are analyzed again. Autovacuum lags behind a bulk\n * write, and with the statistics of near-empty tables the planner scans a plan's whole work for\n * each keyed lookup instead of seeking it.\n */\nconst ANALYZE_ROWS = 10_000\n\n/** The plan a session applies: its work rows carry the candidate's source version as `work_id`. */\nexport interface PgReplacementPlan {\n readonly versionId: string\n readonly projectionKind: \"object\" | \"link\"\n}\n\ninterface PlanRow {\n readonly version_id: string\n readonly commit_id: string\n readonly committed_at: Date | string\n readonly replaced_materialization_id: string | null\n readonly replaced_last_commit_id: string | null\n}\n\ninterface IdentityRow {\n readonly identity_key: string\n readonly sort_key: string\n readonly diff_required: boolean\n}\n\n/**\n * The revision of an object identity: its effective row, its override and the latest point of each\n * telemetry property. `type` and `id` are SQL expressions; `$1` is the project id.\n */\nfunction objectRevision(type: string, id: string): string {\n return `jsonb_build_array(\n (SELECT jsonb_build_array(version, last_commit_id) FROM objects\n WHERE project_id = $1 AND object_type_id = ${type} AND primary_id = ${id}),\n (SELECT last_commit_id FROM ontology_object_overrides\n WHERE project_id = $1 AND object_type_id = ${type} AND primary_id = ${id}),\n -- An instant, not its rendering in the session's time zone.\n (SELECT jsonb_agg(\n jsonb_build_array(property_id, extract(epoch FROM at), last_commit_id) ORDER BY property_id\n )\n FROM timeseries_latest\n WHERE project_id = $1 AND object_type_id = ${type} AND object_id = ${id})\n )`\n}\n\n/**\n * The revision of a link endpoint, which a link plan reads only for its existence. One this plan\n * decides exists as planned, which follows its whole object revision; any other exists as it is.\n * `$2` is the plan's version id.\n */\nfunction endpointRevision(type: string, id: string): string {\n return `CASE WHEN EXISTS (\n SELECT 1 FROM ${IDENTITIES} AS endpoint\n WHERE endpoint.version_id = $2 AND endpoint.entity_kind = 'object'\n AND endpoint.identity_key = ${jsonTupleExpression([`to_jsonb(${type})::text`, `to_jsonb(${id})::text`])}\n ) THEN ${objectRevision(type, id)}\n ELSE to_jsonb(EXISTS (\n SELECT 1 FROM objects WHERE project_id = $1 AND object_type_id = ${type} AND primary_id = ${id}\n ))\n END`\n}\n\n/**\n * The revision of a link identity, from its key column `key`: its effective row, its edge and slot\n * overrides, the live source root asserting it, and the existence of both endpoints. A live root\n * that asserts a link is keyed by the link or by its source object.\n */\nfunction linkRevision(key: string): string {\n const part = (index: number) => `(${key}::jsonb->>${index})`\n return `jsonb_build_array(\n (SELECT last_commit_id FROM links\n WHERE project_id = $1 AND source_type_id = ${part(0)} AND source_id = ${part(1)}\n AND link_id = ${part(2)} AND target_type_id = ${part(3)} AND target_id = ${part(4)}),\n (SELECT last_commit_id FROM ontology_link_overrides\n WHERE project_id = $1 AND identity_kind = 'edge' AND identity_key = ${key}::jsonb),\n (SELECT last_commit_id FROM ontology_link_overrides\n WHERE project_id = $1 AND identity_kind = 'slot'\n AND identity_key = jsonb_build_array(${part(0)}, ${part(1)}, ${part(2)})),\n (SELECT MAX(roots.id) FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n AND versions.status IN ${PUBLISHED}\n WHERE roots.project_id = $1 AND roots.retired_at IS NULL AND NOT roots.deleted\n AND roots.root_key IN (\n '[\"link\",' || substr(${key}, 2),\n ${jsonTupleExpression([`'\"object\"'`, `to_jsonb(${part(0)})::text`, `to_jsonb(${part(1)})::text`])}\n )\n AND EXISTS (\n SELECT 1 FROM ontology_source_rows AS rows\n WHERE rows.root_id = roots.id AND rows.entity_kind = 'link'\n AND rows.source_type_id = ${part(0)} AND rows.source_primary_id = ${part(1)}\n AND rows.link_id = ${part(2)} AND rows.target_type_id = ${part(3)}\n AND rows.target_primary_id = ${part(4)}\n )),\n ${endpointRevision(part(0), part(1))},\n ${endpointRevision(part(3), part(4))}\n )`\n}\n\n/** The revision of the identity rows aliased `identities`, as text. */\nfunction revision(kind: \"object\" | \"link\"): string {\n const key = \"identities.identity_key\"\n return kind === \"object\"\n ? `${objectRevision(`(${key}::jsonb->>0)`, `(${key}::jsonb->>1)`)}::text`\n : `${linkRevision(key)}::text`\n}\n\nexport class PgOntologyReplacementPlanStorage implements OntologyReplacementPlanStorage {\n constructor(private readonly sql: SQLClient) {}\n\n async open(input: OpenReplacementPlanInput): Promise<OpenedReplacementPlan> {\n const { commit } = input\n assertReplacementPlanCommit(commit)\n return runPgTransaction(this.sql, async (sql) => {\n const candidate = await requireCandidate(sql, input, true)\n const [active] = await sql<\n { readonly materialization_id: string; readonly last_commit_id: string | null }[]\n >`\n SELECT materialization_id, last_commit_id FROM ontology_sources\n WHERE project_id = ${input.projectId} AND source_id = ${input.source.projectionId}\n AND status = 'active'\n `\n const replacedMaterializationId = active?.materialization_id ?? null\n const replacedLastCommitId = active?.last_commit_id ?? null\n const existing = await planRow(sql, candidate.version_id)\n // A plan decides the entities of the source it replaces: once that moved, it starts over.\n if (\n existing?.replaced_materialization_id === replacedMaterializationId &&\n existing.replaced_last_commit_id === replacedLastCommitId\n ) {\n return { committedAt: toIsoString(existing.committed_at) }\n }\n if (existing) await deletePlan(sql, candidate.version_id)\n await sql`\n INSERT INTO ontology_replacement_plans (\n version_id, project_id, commit_id, committed_at, replaced_materialization_id,\n replaced_last_commit_id, watermark\n ) VALUES (\n ${candidate.version_id}, ${input.projectId}, ${commit.id}, ${commit.committedAt},\n ${replacedMaterializationId}, ${replacedLastCommitId}, pg_current_snapshot()\n )\n `\n const rows = replacementSourceRows(sql, {\n projectId: input.projectId,\n sourceId: input.source.projectionId,\n materializationId: input.materializationId,\n incremental: candidate.base_materialization_id !== null,\n })\n // Every entity of the candidate and of the roots it replaces needs a diff.\n const sourceKey = columnKeyExpression([\"source_type_id\", \"source_primary_id\"])\n const targetKey = columnKeyExpression([\"target_type_id\", \"target_primary_id\"])\n const opened = await sql`\n WITH keyed AS (\n SELECT DISTINCT entity_kind, CASE entity_kind\n WHEN 'object' THEN ${sql.unsafe(columnKeyExpression([\"object_type_id\", \"primary_id\"]))}\n ELSE ${sql.unsafe(\n columnKeyExpression([\n \"source_type_id\",\n \"source_primary_id\",\n \"link_id\",\n \"target_type_id\",\n \"target_primary_id\",\n ])\n )}\n END AS identity_key,\n CASE entity_kind\n WHEN 'link' THEN ${sql.unsafe(sourceKey)}\n END AS source_key,\n CASE entity_kind\n WHEN 'link' THEN ${sql.unsafe(targetKey)}\n END AS target_key\n FROM (${rows}) AS rows\n )\n INSERT INTO ${sql(IDENTITIES)} (\n version_id, entity_kind, identity_key, sort_key, diff_required, expand_at, source_key,\n target_key\n )\n SELECT ${candidate.version_id}, entity_kind, identity_key,\n ${sql.unsafe(SORT_KEY)}, TRUE, CASE entity_kind WHEN 'link' THEN 0 END, source_key,\n target_key\n FROM keyed\n `\n if (opened.count >= ANALYZE_ROWS) await analyzePlans(sql)\n return { committedAt: commit.committedAt }\n })\n }\n\n async *streamState(\n input: StreamReplacementPlanStateInput\n ): AsyncIterable<ReplacementPlanStatePage> {\n assertPageRows(input.pageRows)\n await runPgTransaction(this.sql, async (sql) => {\n const { candidate } = await requirePlan(sql, input)\n if (input.entityKind === \"object\" && candidate.projection_kind !== \"object\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Link projection replacement cannot stream object state.\"\n )\n }\n if (input.entityKind === \"link\") {\n if ((await unplannedCount(sql, candidate.version_id, \"object\")) > 0) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Object projection replacement must plan every object before its links.\"\n )\n }\n const expanded = await expandLinks(sql, candidate.version_id, input.projectId, \"pending\")\n if (expanded >= ANALYZE_ROWS && !isWithinPgTransaction(this.sql)) await analyzePlans(sql)\n }\n })\n let after = \"\"\n let streamed = 0\n while (true) {\n // Each page reads its state and the revision of that state in one snapshot.\n const page = await runPgTransaction(\n this.sql,\n async (sql) => {\n const { candidate } = await requirePlan(sql, input)\n const rows = await sql<IdentityRow[]>`\n SELECT identity_key, sort_key, diff_required FROM ${sql(IDENTITIES)}\n WHERE version_id = ${candidate.version_id} AND entity_kind = ${input.entityKind}\n AND planned_revision IS NULL AND sort_key > ${after}\n ORDER BY sort_key\n LIMIT ${input.pageRows}\n `\n if (rows.length === 0) return null\n after = rows[rows.length - 1]!.sort_key\n streamed += rows.length\n const state = await readPage(sql, input, candidate, rows)\n await sql.unsafe(\n `UPDATE ${IDENTITIES} AS identities\n SET read_revision = ${revision(input.entityKind)}\n WHERE version_id = $2 AND entity_kind = $3 AND identity_key = ANY($4::text[])`,\n [\n input.projectId,\n candidate.version_id,\n input.entityKind,\n rows.map((row) => row.identity_key),\n ]\n )\n return state\n },\n { isolation: \"repeatableRead\" }\n )\n if (!page) {\n // Every page is staged by now: later lookups and the commit join this work. Never in the\n // commit transaction, where ANALYZE would hold a lock other commits queue behind.\n if (streamed >= ANALYZE_ROWS && !isWithinPgTransaction(this.sql)) {\n await analyzePlans(this.sql)\n }\n return\n }\n yield page\n }\n }\n\n async stage(input: StageReplacementPlanInput): Promise<void> {\n await runPgTransaction(this.sql, async (sql) => {\n const { plan, candidate } = await requirePlan(sql, input)\n const identities = prepareReplacementIdentities(input, planCommit(plan))\n const versionId = candidate.version_id\n const summary = identities.map((identity) => ({\n entityKind: identity.kind,\n identityKey: identity.key,\n classified: identity.classified,\n change: identity.change,\n }))\n // Only an identity streamed and still to plan has the revision its work is planned from,\n // and holds no work: unplanning one deletes its work and forgets what it read.\n const planned = await sql`\n WITH planned AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(sql, summary)}::jsonb)\n )\n UPDATE ${sql(IDENTITIES)} AS identities\n SET planned_revision = identities.read_revision,\n classified = (planned.value->>'classified')::boolean,\n change = planned.value->>'change',\n -- A planned object may flip its existence: the next link expansion starts from it.\n expand_at = CASE identities.entity_kind\n WHEN 'object' THEN (\n SELECT expansions FROM ontology_replacement_plans WHERE version_id = ${versionId}\n )\n ELSE identities.expand_at\n END\n FROM planned\n WHERE identities.version_id = ${versionId}\n AND identities.entity_kind = planned.value->>'entityKind'\n AND identities.identity_key = planned.value->>'identityKey'\n AND identities.read_revision IS NOT NULL AND identities.planned_revision IS NULL\n RETURNING identities.entity_kind, identities.identity_key\n `\n if (planned.length !== identities.length) {\n const streamed = new Set(planned.map((row) => `${row.entity_kind}:${row.identity_key}`))\n const missing = identities.find(\n (identity) => !streamed.has(`${identity.kind}:${identity.key}`)\n )\n throw new MaterializationValidationError(\n `Replacement identity ${missing?.entityKey} is not streamed and still to plan.`\n )\n }\n const work = identities.flatMap((identity) =>\n identity.records.map((record) => {\n const columns = materializationWorkColumns(record)\n return {\n entityKind: identity.kind,\n identityKey: identity.key,\n recordKey: record.recordKey,\n uniqueKey: workUniquenessKey(record),\n kind: record.kind,\n lane: columns.lane,\n majorOrder: columns.majorOrder,\n minorOrder: columns.minorOrder,\n sortOne: columns.sortOne,\n sortTwo: columns.sortTwo,\n occupied: record.kind === \"cardinality\" ? record.occupied : null,\n record,\n }\n })\n )\n if (work.length > 0) {\n try {\n await sql`\n WITH staged AS (\n SELECT value FROM jsonb_array_elements(${jsonParameter(sql, work)}::jsonb)\n )\n INSERT INTO ${sql(PG_PLAN_WORK_TABLE)} (\n work_id, entity_kind, identity_key, record_key, unique_key, kind, lane,\n major_order, minor_order, sort_one, sort_two, cardinality_occupied, payload\n )\n SELECT ${versionId}, value->>'entityKind', value->>'identityKey', value->>'recordKey',\n value->>'uniqueKey', value->>'kind', value->>'lane',\n (value->>'majorOrder')::integer, (value->>'minorOrder')::integer,\n value->>'sortOne', value->>'sortTwo', (value->>'occupied')::boolean,\n value->'record'\n FROM staged\n `\n } catch (error) {\n if (isUniqueViolation(error)) throw duplicateMaterializationWork()\n throw error\n }\n }\n })\n }\n\n async refresh(input: ReplacementPlanRef): Promise<ReplacementPlanStatus> {\n // Already within the commit transaction there: the unplanning and its work go together.\n return runPgTransaction(this.sql, async (sql) => {\n const { candidate } = await requirePlan(sql, input)\n const versionId = candidate.version_id\n const pending = await unplannedCount(sql, versionId)\n if (pending > 0) return { fresh: false, unplanned: pending }\n if (!(await committedSince(sql, versionId, input.projectId))) {\n return { fresh: true, counts: await replacementPlanCounts(sql, versionId) }\n }\n const whole = await touchesIncomplete(sql, versionId, input.projectId)\n // Taken before the revisions are read, so a commit they might miss stays past the watermark.\n const [seen] = await sql<{ readonly snapshot: string }[]>`\n SELECT pg_current_snapshot()::text AS snapshot\n `\n let unplanned = 0\n for (const kind of [\"object\", \"link\"] as const) {\n const stale = await sql.unsafe(\n `${whole ? \"\" : `WITH ${TOUCHED}`}\n UPDATE ${IDENTITIES} AS identities\n SET read_revision = NULL, planned_revision = NULL, classified = FALSE, change = NULL\n WHERE identities.version_id = $2 AND identities.entity_kind = '${kind}'\n ${whole ? \"\" : `AND identities.identity_key = ANY(ARRAY(${touchedIdentities(kind)}))`}\n AND identities.planned_revision IS DISTINCT FROM ${revision(kind)}`,\n [input.projectId, versionId]\n )\n if (stale.count === 0) continue\n await dropUnplannedWork(sql, versionId, kind)\n unplanned += stale.count\n }\n unplanned += whole\n ? await expandLinks(sql, versionId, input.projectId, \"all\")\n : await expandTouched(sql, versionId, input.projectId)\n await sql`\n UPDATE ontology_replacement_plans SET watermark = ${seen!.snapshot}::pg_snapshot\n WHERE version_id = ${versionId}\n `\n if (unplanned > 0) return { fresh: false, unplanned }\n return { fresh: true, counts: await replacementPlanCounts(sql, versionId) }\n })\n }\n\n async purge(input: PurgeReplacementPlansInput): Promise<number> {\n assertNonblank(input.projectId, \"Replacement plan purge project id\")\n assertPositiveInteger(input.limit, \"Replacement plan purge limit\")\n return runPgTransaction(this.sql, async (sql) => {\n let deleted = 0\n // A plan's row goes last, so a plan whose rows outlast the budget is found again next time.\n while (deleted < input.limit) {\n const [spent] = await sql<{ readonly version_id: string }[]>`\n SELECT plans.version_id FROM ontology_replacement_plans AS plans\n JOIN ontology_sources AS versions USING (version_id)\n WHERE plans.project_id = ${input.projectId} AND versions.status <> 'ready'\n ORDER BY plans.version_id\n LIMIT 1\n `\n if (!spent) break\n for (const [table, column] of [\n [PG_PLAN_WORK_TABLE, \"work_id\"],\n [IDENTITIES, \"version_id\"],\n ] as const) {\n const rows = await sql`\n DELETE FROM ${sql(table)} WHERE ctid = ANY(ARRAY(\n SELECT ctid FROM ${sql(table)} WHERE ${sql(column)} = ${spent.version_id}\n LIMIT ${input.limit - deleted}\n ))\n `\n deleted += rows.count\n if (deleted >= input.limit) return deleted\n }\n await sql`DELETE FROM ontology_replacement_plans WHERE version_id = ${spent.version_id}`\n deleted += 1\n }\n return deleted + (await purgeTouches(sql, input.projectId, input.limit - deleted))\n })\n }\n}\n\n/** The fresh, fully planned plan a session applies, with exactly its commit. */\nexport async function boundReplacementPlan(\n sql: SQLClient,\n header: {\n readonly commit: OntologyCommitWrite\n readonly plan?: {\n readonly source: { readonly projectionId: string }\n readonly materializationId: string\n }\n }\n): Promise<PgReplacementPlan> {\n const ref = header.plan\n const candidate = ref\n ? await sourceRow(sql, header.commit.projectId, ref.source.projectionId, ref.materializationId)\n : null\n const plan = candidate ? await planRow(sql, candidate.version_id) : null\n if (!ref || !candidate || !plan || header.commit.intent.kind !== \"projection\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"A plan-bound session needs the open plan of a projection candidate.\"\n )\n }\n const opened = planCommit(plan)\n if (opened.commitId !== header.commit.id || opened.committedAt !== header.commit.committedAt) {\n throw new MaterializationValidationError(\n \"A plan-bound session must begin with the commit its plan carries.\"\n )\n }\n if (\n (await unplannedCount(sql, candidate.version_id)) > 0 ||\n (await committedSince(sql, candidate.version_id, header.commit.projectId))\n ) {\n throw new MaterializationValidationError(\n \"A replacement plan applies only fully planned and just refreshed.\"\n )\n }\n return { versionId: candidate.version_id, projectionKind: candidate.projection_kind }\n}\n\n/**\n * Every identity the plan decides with a diff is classified, and nothing else is. Staging records\n * whether an identity's work holds its classification, so this reads identities only.\n */\nexport async function assertReplacementPlanCoverage(\n sql: SQLClient,\n plan: PgReplacementPlan\n): Promise<void> {\n const [mismatch] = await sql`\n SELECT 1 FROM ${sql(IDENTITIES)}\n WHERE version_id = ${plan.versionId}\n AND classified <> (diff_required AND (entity_kind = 'link' OR ${plan.projectionKind === \"object\"}))\n LIMIT 1\n `\n if (mismatch) {\n invalidCorrelation(\"Projection replacement classification coverage does not match its plan.\")\n }\n}\n\n/** The change counts of a plan, from what its identities planned. */\nexport async function replacementPlanCounts(\n sql: SQLClient,\n versionId: string\n): Promise<EffectiveChangeCounts> {\n const rows = await sql<\n {\n readonly entity_kind: \"object\" | \"link\"\n readonly change: \"created\" | \"updated\" | \"deleted\" | \"unchanged\"\n readonly count: number | string\n }[]\n >`\n SELECT entity_kind, COALESCE(change, 'unchanged') AS change, COUNT(*) AS count\n FROM ${sql(IDENTITIES)}\n WHERE version_id = ${versionId} AND classified\n GROUP BY entity_kind, COALESCE(change, 'unchanged')\n `\n const count = (kind: \"object\" | \"link\", change: string) =>\n Number(rows.find((row) => row.entity_kind === kind && row.change === change)?.count ?? 0)\n return {\n objectsCreated: count(\"object\", \"created\"),\n objectsUpdated: count(\"object\", \"updated\"),\n objectsDeleted: count(\"object\", \"deleted\"),\n objectsUnchanged: count(\"object\", \"unchanged\"),\n linksCreated: count(\"link\", \"created\"),\n linksUpdated: count(\"link\", \"updated\"),\n linksDeleted: count(\"link\", \"deleted\"),\n linksUnchanged: count(\"link\", \"unchanged\"),\n }\n}\n\n/**\n * Whether a commit of the project that this transaction sees is missing from the plan's watermark\n * snapshot. Transaction ids only order commits of one cluster: after a logical restore into\n * another, restored ids may lie ahead of this one's, and a restored plan's watermark too. Neither\n * ever reads as fresh: a commit this snapshot does not see counts for nothing, and a watermark\n * from beyond it counts as stale, so `refresh` checks every revision and resets it.\n */\nasync function committedSince(sql: SQLClient, versionId: string, projectId: string) {\n const [row] = await sql<{ readonly committed: boolean }[]>`\n SELECT pg_snapshot_xmax(plans.watermark) > pg_snapshot_xmax(pg_current_snapshot()) OR EXISTS (\n SELECT 1 FROM ontology_commits AS commits\n WHERE commits.project_id = ${projectId}\n AND commits.xact_id >= pg_snapshot_xmin(plans.watermark)\n AND NOT pg_visible_in_snapshot(commits.xact_id, plans.watermark)\n AND pg_visible_in_snapshot(commits.xact_id, pg_current_snapshot())\n ) AS committed\n FROM ontology_replacement_plans AS plans\n WHERE plans.version_id = ${versionId}\n `\n return row?.committed ?? true\n}\n\nasync function readPage(\n sql: SQLClient,\n input: StreamReplacementPlanStateInput,\n candidate: PgOntologySourceRow,\n rows: readonly IdentityRow[]\n): Promise<ReplacementPlanStatePage> {\n const reader = new PgMaterializationStateReader(sql, input.projectId)\n if (input.entityKind === \"object\") {\n const refs = rows.map((row) => {\n const [objectTypeId, primaryId] = JSON.parse(row.identity_key) as string[]\n return { objectTypeId: objectTypeId!, primaryId: primaryId! }\n })\n return {\n objects: await reader.replacementObjectStates(\n input.source.projectionId,\n input.materializationId,\n refs\n ),\n links: [],\n endpoints: [],\n }\n }\n const identities = rows.map((row) => {\n const parts = JSON.parse(row.identity_key) as string[]\n const ref: OntologyLinkRef = {\n source: { objectTypeId: parts[0]!, primaryId: parts[1]! },\n linkId: parts[2]!,\n target: { objectTypeId: parts[3]!, primaryId: parts[4]! },\n }\n return { ref, sortKey: row.sort_key, diffRequired: row.diff_required }\n })\n const [previous] = await sql<{ readonly materialization_id: string }[]>`\n SELECT materialization_id FROM ontology_sources\n WHERE project_id = ${input.projectId} AND source_id = ${input.source.projectionId}\n AND status = 'active'\n `\n const links = await reader.replacementLinkStates(\n input.source.projectionId,\n input.materializationId,\n [input.materializationId, ...(previous ? [previous.materialization_id] : [])],\n identities,\n candidate.base_materialization_id !== null\n )\n return {\n objects: [],\n links,\n endpoints: await endpoints(\n sql,\n candidate.version_id,\n input.projectId,\n identities.flatMap(({ ref }) => [ref.source, ref.target])\n ),\n }\n}\n\n/** Planned existence where the plan decides an endpoint, effective existence elsewhere. */\nasync function endpoints(\n sql: SQLClient,\n versionId: string,\n projectId: string,\n refs: readonly OntologyObjectRef[]\n): Promise<MaterializationObjectExistence[]> {\n const unique = [...new Map(refs.map((ref) => [objectRefKey(ref), ref] as const)).values()]\n const rows = await sql<{ readonly key: string; readonly exists: boolean }[]>`\n SELECT requested.key, COALESCE(\n (SELECT (payload->>'exists')::boolean FROM ${sql(PG_PLAN_WORK_TABLE)}\n WHERE work_id = ${versionId} AND unique_key = 'object-existence:' || requested.key),\n EXISTS (\n SELECT 1 FROM objects\n WHERE project_id = ${projectId} AND object_type_id = requested.key::jsonb->>0\n AND primary_id = requested.key::jsonb->>1\n )\n ) AS exists\n FROM unnest(${sql.array(unique.map((ref) => objectRefKey(ref)))}::text[]) AS requested(key)\n `\n const existence = new Map(rows.map((row) => [row.key, row.exists] as const))\n return unique.map((ref) => ({ ref, exists: existence.get(objectRefKey(ref)) ?? false }))\n}\n\n/** The keys of the links of `relation` (columns as `links`), and of both their endpoints. */\nfunction linkKeys(relation: string): string {\n const key = columnKeyExpression(LINK_COLUMNS.split(\", \"))\n return `SELECT ${key} AS identity_key,\n ${columnKeyExpression([\"source_type_id\", \"source_id\"])} AS source_key,\n ${columnKeyExpression([\"target_type_id\", \"target_id\"])} AS target_key\n FROM ${relation}`\n}\n\nconst LINK_COLUMNS = \"source_type_id, source_id, link_id, target_type_id, target_id\"\n\n/** The run of link expansion an identity added now waits for: the next one. */\nconst NEXT_EXPANSION = `(SELECT expansions FROM ontology_replacement_plans WHERE version_id = $2)`\n\n/**\n * Inserts the links of `incident_links` (columns as `links`) as identities that need a diff, or\n * makes an existing member need one; the next expansion starts from each of them.\n */\nconst INSERT_INCIDENT_LINKS = `\n INSERT INTO ${IDENTITIES} AS identities (\n version_id, entity_kind, identity_key, sort_key, diff_required, expand_at, source_key,\n target_key\n )\n SELECT $2, 'link', identity_key, ${SORT_KEY}, TRUE, ${NEXT_EXPANSION}, source_key, target_key\n FROM (${linkKeys(\"incident_links\")}) AS keyed\n ON CONFLICT (version_id, entity_kind, identity_key) DO UPDATE\n SET diff_required = TRUE, read_revision = NULL, planned_revision = NULL, classified = FALSE,\n change = NULL, expand_at = EXCLUDED.expand_at\n WHERE NOT identities.diff_required`\n\n/** Inserts the links of `members` (columns as `links`) as identities planned without a diff. */\nconst INSERT_MEMBER_LINKS = `\n INSERT INTO ${IDENTITIES} (\n version_id, entity_kind, identity_key, sort_key, diff_required, source_key, target_key\n )\n SELECT $2, 'link', identity_key, ${SORT_KEY}, FALSE, source_key, target_key\n FROM (${linkKeys(\"members\")}) AS keyed\n ON CONFLICT (version_id, entity_kind, identity_key) DO NOTHING`\n\n/**\n * Adds the links the plan must decide besides its own: those incident to an object it flips,\n * and every member of a scope it changes. `pending` starts only from the identities planned or\n * added since the previous expansion, `all` from every identity. Returns how many identities this\n * left to plan, counting an existing member that now needs a diff. What commits add later is\n * found from their touches by `expandTouched`.\n */\nasync function expandLinks(\n sql: SQLClient,\n versionId: string,\n projectId: string,\n from: \"pending\" | \"all\"\n): Promise<number> {\n const pending = from === \"pending\"\n const incidentObjects = pending\n ? `SELECT work.payload->'ref'->>'objectTypeId' AS object_type_id,\n work.payload->'ref'->>'primaryId' AS primary_id\n FROM ${IDENTITIES} AS objects\n JOIN ${PG_PLAN_WORK_TABLE} AS work ON work.work_id = $2\n AND work.unique_key = 'incident-object:' || objects.identity_key\n WHERE objects.version_id = $2 AND objects.entity_kind = 'object'\n AND objects.expand_at = ${NEXT_EXPANSION}`\n : `SELECT DISTINCT payload->'ref'->>'objectTypeId' AS object_type_id,\n payload->'ref'->>'primaryId' AS primary_id\n FROM ${PG_PLAN_WORK_TABLE}\n WHERE work_id = $2 AND kind = 'incident-object'`\n const live = `JOIN ontology_source_roots AS roots ON roots.id = rows.root_id\n AND roots.project_id = $1 AND roots.retired_at IS NULL AND NOT roots.deleted\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n AND versions.status IN ${PUBLISHED}`\n const incident = await sql.unsafe(\n `WITH incident_objects AS (${incidentObjects}), incident_links AS (\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links JOIN incident_objects\n ON incident_objects.object_type_id = links.source_type_id\n AND incident_objects.primary_id = links.source_id\n WHERE links.project_id = $1\n UNION\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links JOIN incident_objects\n ON incident_objects.object_type_id = links.target_type_id\n AND incident_objects.primary_id = links.target_id\n WHERE links.project_id = $1\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id, overrides.link_id,\n overrides.target_type_id, overrides.target_primary_id\n FROM ontology_link_overrides AS overrides JOIN incident_objects\n ON incident_objects.object_type_id = overrides.source_type_id\n AND incident_objects.primary_id = overrides.source_primary_id\n WHERE overrides.project_id = $1\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id, overrides.link_id,\n overrides.target_type_id, overrides.target_primary_id\n FROM ontology_link_overrides AS overrides JOIN incident_objects\n ON incident_objects.object_type_id = overrides.target_type_id\n AND incident_objects.primary_id = overrides.target_primary_id\n WHERE overrides.project_id = $1\n UNION\n SELECT rows.source_type_id, rows.source_primary_id, rows.link_id,\n rows.target_type_id, rows.target_primary_id\n FROM ontology_source_rows AS rows ${live}\n JOIN incident_objects\n ON incident_objects.object_type_id = rows.source_type_id\n AND incident_objects.primary_id = rows.source_primary_id\n WHERE rows.entity_kind = 'link'\n UNION\n SELECT rows.source_type_id, rows.source_primary_id, rows.link_id,\n rows.target_type_id, rows.target_primary_id\n FROM ontology_source_rows AS rows ${live}\n JOIN incident_objects\n ON incident_objects.object_type_id = rows.target_type_id\n AND incident_objects.primary_id = rows.target_primary_id\n WHERE rows.entity_kind = 'link'\n )\n ${INSERT_INCIDENT_LINKS}`,\n [projectId, versionId]\n )\n // An upgraded member planned without a diff keeps no work from before.\n if (incident.count > 0) await dropUnplannedWork(sql, versionId, \"link\")\n const members = await sql.unsafe(\n `WITH scopes AS (\n SELECT DISTINCT identity_key::jsonb->>0 AS source_type_id,\n identity_key::jsonb->>1 AS source_id, identity_key::jsonb->>2 AS link_id\n FROM ${IDENTITIES}\n WHERE version_id = $2 AND entity_kind = 'link' AND diff_required\n ${pending ? `AND expand_at = ${NEXT_EXPANSION}` : \"\"}\n ), members AS (\n SELECT links.source_type_id, links.source_id, links.link_id,\n links.target_type_id, links.target_id\n FROM links JOIN scopes USING (source_type_id, source_id, link_id)\n WHERE links.project_id = $1\n UNION\n SELECT overrides.source_type_id, overrides.source_primary_id, overrides.link_id,\n overrides.target_type_id, overrides.target_primary_id\n FROM ontology_link_overrides AS overrides JOIN scopes\n ON scopes.source_type_id = overrides.source_type_id\n AND scopes.source_id = overrides.source_primary_id\n AND scopes.link_id = overrides.link_id\n WHERE overrides.project_id = $1 AND overrides.identity_kind = 'slot'\n )\n ${INSERT_MEMBER_LINKS}`,\n [projectId, versionId]\n )\n await sql`\n UPDATE ontology_replacement_plans SET expansions = expansions + 1\n WHERE version_id = ${versionId}\n `\n return incident.count + members.count\n}\n\n/**\n * What the commits since the watermark of plan `$2` touched in project `$1`: those its snapshot\n * did not see and this one does.\n */\nconst TOUCHED = `touched AS MATERIALIZED (\n SELECT DISTINCT touches.entity_kind, touches.identity_key\n FROM ontology_replacement_plans AS plans\n JOIN ontology_commit_touches AS touches ON touches.project_id = $1\n AND touches.xact_id >= pg_snapshot_xmin(plans.watermark)\n AND NOT pg_visible_in_snapshot(touches.xact_id, plans.watermark)\n AND pg_visible_in_snapshot(touches.xact_id, pg_current_snapshot())\n WHERE plans.version_id = $2\n)`\n\n/**\n * The keys of the identities of `kind` of plan `$2` whose revision reads something `touched`\n * holds: an object its own row, override and telemetry; a link its row and edge override, its\n * scope's slot override, its live source assertion and its endpoints. A scope's links are found\n * from its source object. Each lookup is an indexed `= ANY`, whatever the plan tables' statistics.\n */\nfunction touchedIdentities(kind: \"object\" | \"link\"): string {\n if (kind === \"object\") {\n return `SELECT identity_key FROM touched WHERE entity_kind = 'object'`\n }\n const sourceKey = columnKeyExpression([\"(identity_key::jsonb->>0)\", \"(identity_key::jsonb->>1)\"])\n return `SELECT identity_key FROM touched WHERE entity_kind = 'link'\n UNION ALL\n SELECT links.identity_key FROM ${IDENTITIES} AS links\n WHERE links.version_id = $2 AND links.source_key = ANY(ARRAY(\n SELECT ${sourceKey} FROM touched WHERE entity_kind IN ('object', 'scope')\n ))\n UNION ALL\n SELECT links.identity_key FROM ${IDENTITIES} AS links\n WHERE links.version_id = $2 AND links.target_key = ANY(ARRAY(\n SELECT identity_key FROM touched WHERE entity_kind = 'object'\n ))`\n}\n\n/**\n * Adds the links commits brought within the plan's reach, from what they touched: a link that\n * now exists incident to an object the plan flips, or in a scope a planned link changes. It\n * considers the links `expandLinks` would find, among those the commits touched.\n */\nasync function expandTouched(\n sql: SQLClient,\n versionId: string,\n projectId: string\n): Promise<number> {\n const touchedLinks = `touched_links AS (\n SELECT identity_key, identity_key::jsonb->>0 AS source_type_id,\n identity_key::jsonb->>1 AS source_id, identity_key::jsonb->>2 AS link_id,\n identity_key::jsonb->>3 AS target_type_id, identity_key::jsonb->>4 AS target_id\n FROM touched WHERE entity_kind = 'link'\n ), slot_targets AS (\n SELECT overrides.source_type_id, overrides.source_primary_id AS source_id, overrides.link_id,\n overrides.target_type_id, overrides.target_primary_id AS target_id\n FROM touched JOIN ontology_link_overrides AS overrides ON overrides.project_id = $1\n AND overrides.identity_kind = 'slot' AND overrides.identity_key = touched.identity_key::jsonb\n WHERE touched.entity_kind = 'scope'\n )`\n const columns = LINK_COLUMNS\n const sourceKey = columnKeyExpression([\"candidates.source_type_id\", \"candidates.source_id\"])\n const targetKey = columnKeyExpression([\"candidates.target_type_id\", \"candidates.target_id\"])\n const effective = `EXISTS (\n SELECT 1 FROM links AS stored\n WHERE stored.project_id = $1 AND stored.source_type_id = touched_links.source_type_id\n AND stored.source_id = touched_links.source_id AND stored.link_id = touched_links.link_id\n AND stored.target_type_id = touched_links.target_type_id\n AND stored.target_id = touched_links.target_id\n )`\n const incident = await sql.unsafe(\n `WITH ${TOUCHED}, ${touchedLinks}, incident_links AS (\n SELECT candidates.* FROM (\n SELECT ${columns} FROM touched_links\n WHERE ${effective} OR EXISTS (\n SELECT 1 FROM ontology_link_overrides AS overrides\n WHERE overrides.project_id = $1 AND overrides.identity_kind = 'edge'\n AND overrides.identity_key = touched_links.identity_key::jsonb\n ) OR EXISTS (\n SELECT 1 FROM ontology_source_rows AS rows\n JOIN ontology_source_roots AS roots ON roots.id = rows.root_id\n AND roots.project_id = $1 AND roots.retired_at IS NULL AND NOT roots.deleted\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n AND versions.status IN ${PUBLISHED}\n WHERE rows.entity_kind = 'link' AND rows.source_type_id = touched_links.source_type_id\n AND rows.source_primary_id = touched_links.source_id\n AND rows.link_id = touched_links.link_id\n AND rows.target_type_id = touched_links.target_type_id\n AND rows.target_primary_id = touched_links.target_id\n )\n UNION\n SELECT ${columns} FROM slot_targets\n ) AS candidates\n WHERE EXISTS (\n SELECT 1 FROM ${PG_PLAN_WORK_TABLE} AS work\n WHERE work.work_id = $2 AND work.unique_key IN (\n 'incident-object:' || ${sourceKey}, 'incident-object:' || ${targetKey}\n )\n )\n )\n ${INSERT_INCIDENT_LINKS}`,\n [projectId, versionId]\n )\n if (incident.count > 0) await dropUnplannedWork(sql, versionId, \"link\")\n const members = await sql.unsafe(\n `WITH ${TOUCHED}, ${touchedLinks}, members AS (\n SELECT candidates.* FROM (\n SELECT ${columns} FROM touched_links WHERE ${effective}\n UNION\n SELECT ${columns} FROM slot_targets\n ) AS candidates\n WHERE EXISTS (\n SELECT 1 FROM ${IDENTITIES} AS changed\n WHERE changed.version_id = $2 AND changed.source_key = ${sourceKey}\n AND changed.diff_required AND changed.identity_key::jsonb->>2 = candidates.link_id\n )\n )\n ${INSERT_MEMBER_LINKS}`,\n [projectId, versionId]\n )\n return incident.count + members.count\n}\n\n/**\n * Whether the touches since the plan's watermark may be incomplete, so that `refresh` checks every\n * identity: purge deleted touches the watermark did not see, or the watermark comes from a cluster\n * further along (see `committedSince`).\n */\nasync function touchesIncomplete(\n sql: SQLClient,\n versionId: string,\n projectId: string\n): Promise<boolean> {\n const [row] = await sql<{ readonly incomplete: boolean }[]>`\n SELECT pg_snapshot_xmax(plans.watermark) > pg_snapshot_xmax(pg_current_snapshot())\n OR COALESCE(pg_snapshot_xmin(plans.watermark) < (\n SELECT xact_id FROM ontology_commit_touch_horizons WHERE project_id = ${projectId}\n ), FALSE) AS incomplete\n FROM ontology_replacement_plans AS plans\n WHERE plans.version_id = ${versionId}\n `\n return row?.incomplete ?? true\n}\n\n/**\n * Deletes touches no ready plan of the project needs, up to `limit`: those of commits every ready\n * plan's watermark sees. A plan opening meanwhile may not be visible yet, so the horizon records\n * how far touches are gone, and a plan watermarked before it checks every identity.\n */\nasync function purgeTouches(sql: SQLClient, projectId: string, limit: number): Promise<number> {\n if (limit <= 0) return 0\n const [horizon] = await sql<{ readonly xact_id: string }[]>`\n SELECT LEAST(\n pg_snapshot_xmin(pg_current_snapshot()),\n (SELECT pg_snapshot_xmin(plans.watermark) FROM ontology_replacement_plans AS plans\n JOIN ontology_sources AS versions USING (version_id)\n WHERE plans.project_id = ${projectId} AND versions.status = 'ready'\n ORDER BY 1 LIMIT 1)\n )::text AS xact_id\n `\n const deleted = await sql`\n DELETE FROM ontology_commit_touches WHERE ctid = ANY(ARRAY(\n SELECT ctid FROM ontology_commit_touches\n WHERE project_id = ${projectId} AND xact_id < ${horizon!.xact_id}::xid8\n LIMIT ${limit}\n ))\n `\n if (deleted.count > 0) {\n await sql`\n INSERT INTO ontology_commit_touch_horizons AS horizons (project_id, xact_id)\n VALUES (${projectId}, ${horizon!.xact_id}::xid8)\n ON CONFLICT (project_id) DO UPDATE\n SET xact_id = GREATEST(horizons.xact_id, EXCLUDED.xact_id)\n `\n }\n return deleted.count\n}\n\nasync function analyzePlans(sql: SQLClient): Promise<void> {\n await sql`ANALYZE ${sql(IDENTITIES)}, ${sql(PG_PLAN_WORK_TABLE)}`\n}\n\n/**\n * Deletes the work of the identities of `kind` left to plan: an identity to plan holds none. The\n * keys come first, so the work is sought by key whatever the plan tables' statistics.\n */\nasync function dropUnplannedWork(\n sql: SQLClient,\n versionId: string,\n kind: \"object\" | \"link\"\n): Promise<void> {\n await sql`\n DELETE FROM ${sql(PG_PLAN_WORK_TABLE)}\n WHERE work_id = ${versionId} AND entity_kind = ${kind} AND identity_key = ANY(ARRAY(\n SELECT identity_key FROM ${sql(IDENTITIES)}\n WHERE version_id = ${versionId} AND entity_kind = ${kind} AND planned_revision IS NULL\n ))\n `\n}\n\nasync function unplannedCount(\n sql: SQLClient,\n versionId: string,\n kind?: \"object\" | \"link\"\n): Promise<number> {\n const [row] = await sql<{ readonly count: number | string }[]>`\n SELECT COUNT(*) AS count FROM ${sql(IDENTITIES)}\n WHERE version_id = ${versionId} AND planned_revision IS NULL\n ${kind ? sql`AND entity_kind = ${kind}` : sql``}\n `\n return Number(row?.count ?? 0)\n}\n\nasync function requireCandidate(\n sql: SQLClient,\n input: ReplacementPlanRef,\n lock = false\n): Promise<PgOntologySourceRow> {\n const candidate = await sourceRow(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n lock\n )\n if (\n !candidate ||\n candidate.status !== \"ready\" ||\n candidate.projection_run_id !== input.execution.projectionRunId ||\n candidate.execution_token !== input.execution.executionToken\n ) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Candidate source materialization '${input.materializationId}' is missing, not ready, or owned by another execution.`\n )\n }\n await assertProjectionExecution(sql, {\n projectId: input.projectId,\n sourceId: input.source.projectionId,\n projectionRunId: input.execution.projectionRunId,\n executionToken: input.execution.executionToken,\n })\n return candidate\n}\n\nasync function requirePlan(\n sql: SQLClient,\n input: ReplacementPlanRef\n): Promise<{ readonly plan: PlanRow; readonly candidate: PgOntologySourceRow }> {\n const candidate = await requireCandidate(sql, input)\n const plan = await planRow(sql, candidate.version_id)\n if (!plan) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Candidate source materialization '${input.materializationId}' has no open plan.`\n )\n }\n return { plan, candidate }\n}\n\nasync function deletePlan(sql: SQLClient, versionId: string): Promise<void> {\n await sql`DELETE FROM ${sql(PG_PLAN_WORK_TABLE)} WHERE work_id = ${versionId}`\n await sql`DELETE FROM ${sql(IDENTITIES)} WHERE version_id = ${versionId}`\n await sql`DELETE FROM ontology_replacement_plans WHERE version_id = ${versionId}`\n}\n\nasync function planRow(sql: SQLClient, versionId: string): Promise<PlanRow | null> {\n const [row] = await sql<PlanRow[]>`\n SELECT version_id, commit_id, committed_at, replaced_materialization_id,\n replaced_last_commit_id\n FROM ontology_replacement_plans\n WHERE version_id = ${versionId}\n `\n return row ?? null\n}\n\n/** The commit a plan was opened with, as its staged work and its session must carry it. */\nfunction planCommit(plan: PlanRow) {\n return { commitId: plan.commit_id, committedAt: toIsoString(plan.committed_at) }\n}\n\nasync function sourceRow(\n sql: SQLClient,\n projectId: string,\n sourceId: string,\n materializationId: string,\n lock = false\n): Promise<PgOntologySourceRow | null> {\n const [row] = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId} AND source_id = ${sourceId}\n AND materialization_id = ${materializationId}\n ${lock ? sql`FOR UPDATE` : sql``}\n `\n return row ?? null\n}\n",
49
+ "import {\n linkRefKey,\n MaterializationConflictError,\n type OntologyLinkRef,\n type OntologyObjectRef,\n objectRefKey,\n type TelemetrySeriesRef,\n telemetryPointKey,\n} from \"@sixb/core/internal/materialization\"\nimport {\n canonicalJson,\n effectiveConflict,\n materializationApplyPhase,\n materializationPlanKindRank,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type { MaterializationPlanWorkItem } from \"@sixb/core/storage\"\nimport type postgres from \"postgres\"\nimport type { SQL, SQLClient } from \"../pg-client\"\n\nexport interface PgStagedPlanTarget {\n /** The work table and the id its rows carry: a session's temp table, or a durable plan. */\n readonly workTable: string\n readonly workId: string\n readonly projectId: string\n readonly commitId: string\n readonly committedAt: string\n}\n\nexport interface PgAppliedPlan {\n readonly objectWrites: number\n readonly linkWrites: number\n readonly eventCount: number\n}\n\ninterface WriteCounts {\n readonly staged: number | string\n readonly written: number | string\n}\n\ntype Fragment = ReturnType<SQL[\"unsafe\"]>\ntype Query = postgres.PendingQuery<postgres.Row[]>\n\n/**\n * Applies a session's staged plan where it is stored: each statement reads one item kind from the\n * work table and writes it set-based, so planned rows never travel back through the client.\n *\n * Every write still checks the revision its plan expected. A statement that writes fewer rows than\n * it staged is a conflict; only then does a second, indexed query find the entity to name, so the\n * normal path never correlates the written rows back to the staged ones.\n */\nexport class PgMaterializationWriter {\n constructor(private readonly sql: SQLClient) {}\n\n async applyStaged(target: PgStagedPlanTarget): Promise<PgAppliedPlan> {\n await this.applyObjectOverrides(target)\n await this.applyLinkOverrides(target)\n await this.applyPoints(target)\n let linkWrites = await this.deleteLinks(target)\n let objectWrites = await this.deleteObjects(target)\n objectWrites += await this.upsertObjects(target)\n linkWrites += await this.upsertLinks(target)\n const eventCount = await this.writeOutbox(target)\n await this.writeTouches(target)\n return { objectWrites, linkWrites, eventCount }\n }\n\n /** The staged values of one plan item kind, as `value`. */\n private staged(target: PgStagedPlanTarget, kind: MaterializationPlanWorkItem[\"kind\"]) {\n return this.sql`\n SELECT payload->'item'->'value' AS value\n FROM ${this.sql(target.workTable)}\n WHERE work_id = ${target.workId} AND lane = 'apply'\n AND major_order = ${materializationApplyPhase(kind)}\n AND minor_order = ${materializationPlanKindRank(kind)}\n `\n }\n\n private async applyObjectOverrides(target: PgStagedPlanTarget): Promise<void> {\n const { projectId } = target\n const inserts = this.sql`\n SELECT value FROM (${this.staged(target, \"object-override-upsert\")}) AS staged\n WHERE value->>'expectedLastCommitId' IS NULL\n `\n await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${inserts}), written AS (\n INSERT INTO ontology_object_overrides (\n project_id, object_type_id, primary_id, value, edited_at, last_commit_id, updated_at\n )\n SELECT ${projectId}, value->'ref'->>'objectTypeId', value->'ref'->>'primaryId',\n value->'value', value->'editedAt', value->>'lastCommitId',\n (value->>'updatedAt')::timestamptz\n FROM candidates\n ON CONFLICT DO NOTHING\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n throw objectOverrideConflict()\n }\n )\n const updates = this.sql`\n SELECT value FROM (${this.staged(target, \"object-override-upsert\")}) AS staged\n WHERE value->>'expectedLastCommitId' IS NOT NULL\n `\n await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${updates}), written AS (\n UPDATE ontology_object_overrides AS stored\n SET value = candidates.value->'value', edited_at = candidates.value->'editedAt',\n last_commit_id = candidates.value->>'lastCommitId',\n updated_at = (candidates.value->>'updatedAt')::timestamptz\n FROM candidates\n WHERE stored.project_id = ${projectId} AND ${this.matches(\"object\", \"value->'ref'\")}\n AND stored.last_commit_id = candidates.value->>'expectedLastCommitId'\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n throw objectOverrideConflict()\n }\n )\n await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${this.staged(target, \"object-override-delete\")}), written AS (\n DELETE FROM ontology_object_overrides AS stored USING candidates\n WHERE stored.project_id = ${projectId} AND ${this.matches(\"object\", \"value->'ref'\")}\n AND stored.last_commit_id = candidates.value->>'expectedLastCommitId'\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n throw objectOverrideConflict()\n }\n )\n }\n\n private async applyLinkOverrides(target: PgStagedPlanTarget): Promise<void> {\n const { projectId, commitId } = target\n // An edge is keyed by its whole link ref and targets it; a slot is keyed by its scope and\n // targets the member its value names.\n const identified = (\n edges: MaterializationPlanWorkItem[\"kind\"],\n slots: MaterializationPlanWorkItem[\"kind\"]\n ) => this.sql`\n SELECT 'edge' AS identity_kind,\n jsonb_build_array(\n value->'ref'->'source'->>'objectTypeId', value->'ref'->'source'->>'primaryId',\n value->'ref'->>'linkId',\n value->'ref'->'target'->>'objectTypeId', value->'ref'->'target'->>'primaryId'\n ) AS identity_key,\n value->'ref'->'target' AS target, value\n FROM (${this.staged(target, edges)}) AS edges\n UNION ALL\n SELECT 'slot',\n jsonb_build_array(\n value->'ref'->'source'->>'objectTypeId', value->'ref'->'source'->>'primaryId',\n value->'ref'->>'linkId'\n ),\n value->'value'->'target', value\n FROM (${this.staged(target, slots)}) AS slots\n `\n const upserts = identified(\"link-override-upsert\", \"link-slot-override-upsert\")\n const writes = (inserts: boolean) => this.sql`\n SELECT * FROM (${upserts}) AS upserts\n WHERE (value->>'expectedLastCommitId' IS NULL) = ${inserts}\n `\n const deletes = identified(\"link-override-delete\", \"link-slot-override-delete\")\n const stored = this.sql`\n SELECT 1 FROM ontology_link_overrides AS stored\n WHERE stored.project_id = ${projectId}\n AND stored.identity_kind = candidates.identity_kind\n AND stored.identity_key = candidates.identity_key\n `\n const firstUnwritten = (source: typeof upserts) => async () => {\n const [row] = await this.sql<{ readonly identity_kind: string }[]>`\n SELECT identity_kind FROM (${source}) AS candidates\n WHERE NOT EXISTS (${stored} AND stored.last_commit_id = ${commitId})\n LIMIT 1\n `\n throw linkOverrideConflict(row?.identity_kind)\n }\n await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${writes(true)}), written AS (\n INSERT INTO ontology_link_overrides (\n project_id, identity_kind, identity_key, source_type_id, source_primary_id, link_id,\n target_type_id, target_primary_id, value, last_commit_id, updated_at\n )\n SELECT ${projectId}, identity_kind, identity_key,\n value->'ref'->'source'->>'objectTypeId', value->'ref'->'source'->>'primaryId',\n value->'ref'->>'linkId', target->>'objectTypeId', target->>'primaryId',\n value->'value', value->>'lastCommitId', (value->>'updatedAt')::timestamptz\n FROM candidates\n ON CONFLICT DO NOTHING\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n firstUnwritten(writes(true))\n )\n await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${writes(false)}), written AS (\n UPDATE ontology_link_overrides AS stored\n SET target_type_id = candidates.target->>'objectTypeId',\n target_primary_id = candidates.target->>'primaryId',\n value = candidates.value->'value',\n last_commit_id = candidates.value->>'lastCommitId',\n updated_at = (candidates.value->>'updatedAt')::timestamptz\n FROM candidates\n WHERE stored.project_id = ${projectId}\n AND stored.identity_kind = candidates.identity_kind\n AND stored.identity_key = candidates.identity_key\n AND stored.last_commit_id = candidates.value->>'expectedLastCommitId'\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n firstUnwritten(writes(false))\n )\n await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${deletes}), written AS (\n DELETE FROM ontology_link_overrides AS stored USING candidates\n WHERE stored.project_id = ${projectId}\n AND stored.identity_kind = candidates.identity_kind\n AND stored.identity_key = candidates.identity_key\n AND stored.last_commit_id = candidates.value->>'expectedLastCommitId'\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n const [row] = await this.sql<{ readonly identity_kind: string }[]>`\n SELECT identity_kind FROM (${deletes}) AS candidates WHERE EXISTS (${stored}) LIMIT 1\n `\n throw linkOverrideConflict(row?.identity_kind)\n }\n )\n }\n\n private async applyPoints(target: PgStagedPlanTarget): Promise<void> {\n const { projectId, commitId } = target\n const points = (inserts: boolean) => this.sql`\n SELECT value->'point'->'series'->'object'->>'objectTypeId' AS object_type_id,\n value->'point'->'series'->'object'->>'primaryId' AS object_id,\n value->'point'->'series'->>'propertyId' AS property_id,\n value->'point'->'value' AS value, value->'point'->>'unit' AS unit,\n (value->'point'->>'at')::timestamptz AS at,\n value->'point'->>'lastCommitId' AS last_commit_id,\n value->'expected'->>'lastCommitId' AS expected_last_commit_id,\n value->'point' AS point\n FROM (${this.staged(target, \"point-upsert\")}) AS staged\n WHERE (value->'expected'->>'lastCommitId' IS NULL) = ${inserts}\n `\n // Both statements keep `timeseries_latest` on the newest point of each series.\n const latest = this.sql`\n latest_candidates AS (\n SELECT DISTINCT ON (project_id, object_type_id, object_id, property_id)\n project_id, object_type_id, object_id, property_id, value, unit, at, last_commit_id\n FROM written\n ORDER BY project_id, object_type_id, object_id, property_id, at DESC\n ), latest AS (\n INSERT INTO timeseries_latest (\n project_id, object_type_id, object_id, property_id, value, unit, at, last_commit_id\n )\n SELECT project_id, object_type_id, object_id, property_id, value, unit, at,\n last_commit_id\n FROM latest_candidates\n ON CONFLICT (project_id, object_type_id, object_id, property_id)\n DO UPDATE SET value = EXCLUDED.value, unit = EXCLUDED.unit, at = EXCLUDED.at,\n last_commit_id = EXCLUDED.last_commit_id\n WHERE EXCLUDED.at >= timeseries_latest.at\n )\n `\n const firstUnwritten = (inserts: boolean) => async () => {\n const [row] = await this.sql<{ readonly point: unknown }[]>`\n SELECT point FROM (${points(inserts)}) AS candidates\n WHERE NOT EXISTS (\n SELECT 1 FROM timeseries AS stored\n WHERE stored.project_id = ${projectId}\n AND stored.object_type_id = candidates.object_type_id\n AND stored.object_id = candidates.object_id\n AND stored.property_id = candidates.property_id\n AND stored.at = candidates.at\n AND stored.last_commit_id = ${commitId}\n )\n LIMIT 1\n `\n throw pointConflict(row?.point)\n }\n await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${points(true)}), written AS (\n INSERT INTO timeseries (\n project_id, object_type_id, object_id, property_id, value, unit, at, last_commit_id\n )\n SELECT ${projectId}, object_type_id, object_id, property_id, value, unit, at,\n last_commit_id\n FROM candidates\n ON CONFLICT DO NOTHING\n RETURNING *\n ), ${latest}\n ${counts(this.sql)}\n `,\n firstUnwritten(true)\n )\n await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${points(false)}), written AS (\n UPDATE timeseries AS stored\n SET value = candidates.value, unit = candidates.unit,\n last_commit_id = candidates.last_commit_id\n FROM candidates\n WHERE stored.project_id = ${projectId}\n AND stored.object_type_id = candidates.object_type_id\n AND stored.object_id = candidates.object_id\n AND stored.property_id = candidates.property_id\n AND stored.at = candidates.at\n AND stored.last_commit_id = candidates.expected_last_commit_id\n RETURNING stored.*\n ), ${latest}\n ${counts(this.sql)}\n `,\n firstUnwritten(false)\n )\n }\n\n private async deleteLinks(target: PgStagedPlanTarget): Promise<number> {\n const candidates = this.staged(target, \"link-delete\")\n return this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${candidates}), written AS (\n DELETE FROM links AS stored USING candidates\n WHERE stored.project_id = ${target.projectId} AND ${this.matches(\"link\", \"value->'ref'\")}\n AND stored.last_commit_id = candidates.value->'expected'->>'lastCommitId'\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n const ref = await this.firstConflict(target, candidates, \"link\", \"value->'ref'\", \"delete\")\n throw effectiveLinkConflict(ref as OntologyLinkRef | undefined)\n }\n )\n }\n\n private async deleteObjects(target: PgStagedPlanTarget): Promise<number> {\n const candidates = this.staged(target, \"object-delete\")\n return this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${candidates}), written AS (\n DELETE FROM objects AS stored USING candidates\n WHERE stored.project_id = ${target.projectId} AND ${this.matches(\"object\", \"value->'ref'\")}\n AND stored.version = (candidates.value->'expected'->>'version')::integer\n AND stored.last_commit_id = candidates.value->'expected'->>'lastCommitId'\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n const ref = await this.firstConflict(target, candidates, \"object\", \"value->'ref'\", \"delete\")\n throw effectiveObjectConflict(ref as OntologyObjectRef | undefined)\n }\n )\n }\n\n private async upsertObjects(target: PgStagedPlanTarget): Promise<number> {\n const { projectId } = target\n const subset = (exists: boolean) => this.sql`\n SELECT value FROM (${this.staged(target, \"object-upsert\")}) AS staged\n WHERE ((value->'expected'->>'exists')::boolean IS TRUE) = ${exists}\n `\n const inserted = await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${subset(false)}), written AS (\n INSERT INTO objects (\n project_id, object_type_id, primary_id, properties, created_at, updated_at,\n version, last_commit_id\n )\n SELECT ${projectId}, value->'row'->'ref'->>'objectTypeId',\n value->'row'->'ref'->>'primaryId', value->'row'->'properties',\n (value->'row'->>'createdAt')::timestamptz, (value->'row'->>'updatedAt')::timestamptz,\n (value->'row'->>'version')::integer, value->'row'->>'lastCommitId'\n FROM candidates\n ON CONFLICT DO NOTHING\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n const ref = await this.firstConflict(\n target,\n subset(false),\n \"object\",\n \"value->'row'->'ref'\",\n \"insert\"\n )\n throw effectiveConflict(\n `Expected ${objectLabel(ref as OntologyObjectRef | undefined)} to be absent.`\n )\n }\n )\n const updated = await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${subset(true)}), written AS (\n UPDATE objects AS stored\n SET properties = candidates.value->'row'->'properties',\n created_at = (candidates.value->'row'->>'createdAt')::timestamptz,\n updated_at = (candidates.value->'row'->>'updatedAt')::timestamptz,\n version = (candidates.value->'row'->>'version')::integer,\n last_commit_id = candidates.value->'row'->>'lastCommitId'\n FROM candidates\n WHERE stored.project_id = ${projectId}\n AND ${this.matches(\"object\", \"value->'row'->'ref'\")}\n AND stored.version = (candidates.value->'expected'->>'version')::integer\n AND stored.last_commit_id = candidates.value->'expected'->>'lastCommitId'\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n const ref = await this.firstConflict(\n target,\n subset(true),\n \"object\",\n \"value->'row'->'ref'\",\n \"update\"\n )\n throw effectiveObjectConflict(ref as OntologyObjectRef | undefined)\n }\n )\n return inserted + updated\n }\n\n private async upsertLinks(target: PgStagedPlanTarget): Promise<number> {\n const { projectId } = target\n const subset = (exists: boolean) => this.sql`\n SELECT value FROM (${this.staged(target, \"link-upsert\")}) AS staged\n WHERE ((value->'expected'->>'exists')::boolean IS TRUE) = ${exists}\n `\n const inserted = await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${subset(false)}), written AS (\n INSERT INTO links (\n project_id, source_type_id, source_id, link_id, target_type_id, target_id,\n properties, created_at, updated_at, last_commit_id\n )\n SELECT ${projectId}, value->'row'->'ref'->'source'->>'objectTypeId',\n value->'row'->'ref'->'source'->>'primaryId', value->'row'->'ref'->>'linkId',\n value->'row'->'ref'->'target'->>'objectTypeId',\n value->'row'->'ref'->'target'->>'primaryId', value->'row'->'properties',\n (value->'row'->>'createdAt')::timestamptz, (value->'row'->>'updatedAt')::timestamptz,\n value->'row'->>'lastCommitId'\n FROM candidates\n ON CONFLICT DO NOTHING\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n const ref = await this.firstConflict(\n target,\n subset(false),\n \"link\",\n \"value->'row'->'ref'\",\n \"insert\"\n )\n throw effectiveConflict(\n `Expected ${linkLabel(ref as OntologyLinkRef | undefined)} to be absent.`\n )\n }\n )\n const updated = await this.write(\n this.sql<WriteCounts[]>`\n WITH candidates AS (${subset(true)}), written AS (\n UPDATE links AS stored\n SET properties = candidates.value->'row'->'properties',\n created_at = (candidates.value->'row'->>'createdAt')::timestamptz,\n updated_at = (candidates.value->'row'->>'updatedAt')::timestamptz,\n last_commit_id = candidates.value->'row'->>'lastCommitId'\n FROM candidates\n WHERE stored.project_id = ${projectId}\n AND ${this.matches(\"link\", \"value->'row'->'ref'\")}\n AND stored.last_commit_id = candidates.value->'expected'->>'lastCommitId'\n RETURNING 1\n )\n ${counts(this.sql)}\n `,\n async () => {\n const ref = await this.firstConflict(\n target,\n subset(true),\n \"link\",\n \"value->'row'->'ref'\",\n \"update\"\n )\n throw effectiveLinkConflict(ref as OntologyLinkRef | undefined)\n }\n )\n return inserted + updated\n }\n\n /**\n * Writes the staged event drafts in canonical order. Event ids hash the canonical JSON of\n * `[projectId, commitId, ordinal]`; the provider-fixed prefix is rendered here, the ordinal by\n * PostgreSQL, so the outbox matches `createEventId` without one id crossing the wire.\n */\n private async writeOutbox(target: PgStagedPlanTarget): Promise<number> {\n const prefix = `${canonicalJson([target.projectId, target.commitId]).slice(0, -1)},`\n const [row] = await this.sql<WriteCounts[]>`\n WITH candidates AS (\n SELECT payload->'draft' AS draft,\n row_number() OVER (\n ORDER BY major_order, minor_order, sort_one, sort_two, record_key\n ) - 1 AS ordinal\n FROM ${this.sql(target.workTable)}\n WHERE work_id = ${target.workId} AND lane = 'event'\n ), identified AS (\n SELECT draft, ordinal,\n encode(sha256(convert_to(${prefix}::text || ordinal::text || ']', 'UTF8')), 'hex') AS id\n FROM candidates\n ), written AS (\n INSERT INTO ontology_outbox (\n project_id, id, commit_id, commit_ordinal, event,\n available_at, attempts, lease_id, lease_expires_at,\n published_at, last_failure, created_at\n )\n SELECT ${target.projectId}, id, ${target.commitId}, ordinal, draft,\n ${target.committedAt}::timestamptz, 0, NULL, NULL, NULL, NULL,\n ${target.committedAt}::timestamptz\n FROM identified\n ON CONFLICT DO NOTHING\n RETURNING 1\n )\n ${counts(this.sql)}\n `\n const staged = Number(row?.staged ?? 0)\n if (Number(row?.written ?? 0) !== staged) {\n throw effectiveConflict(`Outbox events of commit '${target.commitId}' already exist.`)\n }\n return staged\n }\n\n /**\n * Records the entities whose plan inputs this commit changed, once each, as the in-memory\n * `touchPlanItem` does: a replacement plan's refresh rechecks only those.\n */\n private async writeTouches(target: PgStagedPlanTarget): Promise<void> {\n await this.sql`\n INSERT INTO ontology_commit_touches (project_id, entity_kind, identity_key)\n SELECT DISTINCT ${target.projectId}, entity.kind,\n CASE entity.kind\n WHEN 'object' THEN\n concat('[', entity.ref->'objectTypeId', ',', entity.ref->'primaryId', ']')\n WHEN 'scope' THEN concat('[', entity.ref->'source'->'objectTypeId', ',',\n entity.ref->'source'->'primaryId', ',', entity.ref->'linkId', ']')\n ELSE concat('[', entity.ref->'source'->'objectTypeId', ',',\n entity.ref->'source'->'primaryId', ',', entity.ref->'linkId', ',',\n entity.ref->'target'->'objectTypeId', ',', entity.ref->'target'->'primaryId', ']')\n END\n FROM ${this.sql(target.workTable)} AS work\n CROSS JOIN LATERAL (\n SELECT CASE work.payload->'item'->>'kind'\n WHEN 'object-upsert' THEN 'object'\n WHEN 'object-delete' THEN 'object'\n WHEN 'object-override-upsert' THEN 'object'\n WHEN 'object-override-delete' THEN 'object'\n WHEN 'point-upsert' THEN 'object'\n WHEN 'link-upsert' THEN 'link'\n WHEN 'link-delete' THEN 'link'\n WHEN 'link-override-upsert' THEN 'link'\n WHEN 'link-override-delete' THEN 'link'\n WHEN 'link-slot-override-upsert' THEN 'scope'\n WHEN 'link-slot-override-delete' THEN 'scope'\n END AS kind,\n CASE work.payload->'item'->>'kind'\n WHEN 'object-upsert' THEN work.payload->'item'->'value'->'row'->'ref'\n WHEN 'link-upsert' THEN work.payload->'item'->'value'->'row'->'ref'\n WHEN 'point-upsert' THEN work.payload->'item'->'value'->'point'->'series'->'object'\n ELSE work.payload->'item'->'value'->'ref'\n END AS ref\n ) AS entity\n WHERE work.work_id = ${target.workId} AND work.lane = 'apply'\n `\n }\n\n private async write(\n statement: Promise<readonly WriteCounts[]>,\n conflict: () => Promise<never>\n ): Promise<number> {\n const [row] = await statement\n const written = Number(row?.written ?? 0)\n if (written !== Number(row?.staged ?? 0)) await conflict()\n return written\n }\n\n /** Matches a staged ref, at a static JSON path of `candidates.value`, to `stored`. */\n private matches(kind: \"object\" | \"link\", path: string): Fragment {\n const ref = `(candidates.${path})`\n return this.sql.unsafe(\n kind === \"object\"\n ? `stored.object_type_id = ${ref}->>'objectTypeId'\n AND stored.primary_id = ${ref}->>'primaryId'`\n : `stored.source_type_id = ${ref}->'source'->>'objectTypeId'\n AND stored.source_id = ${ref}->'source'->>'primaryId'\n AND stored.link_id = ${ref}->>'linkId'\n AND stored.target_type_id = ${ref}->'target'->>'objectTypeId'\n AND stored.target_id = ${ref}->'target'->>'primaryId'`\n )\n }\n\n /**\n * The ref of the first staged entity whose stored row tells why a write missed it: it still\n * exists after a delete, another commit wrote it before an insert, or an update left it without\n * this commit. None when no stored row tells, as for a delete whose row is already gone.\n */\n private async firstConflict(\n target: PgStagedPlanTarget,\n candidates: Query,\n kind: \"object\" | \"link\",\n path: string,\n missed: \"delete\" | \"insert\" | \"update\"\n ): Promise<unknown> {\n const table = kind === \"object\" ? \"objects\" : \"links\"\n const revision =\n missed === \"insert\"\n ? this.sql`AND stored.last_commit_id <> ${target.commitId}`\n : missed === \"update\"\n ? this.sql`AND stored.last_commit_id = ${target.commitId}`\n : this.sql``\n const stored = this.sql`\n EXISTS (\n SELECT 1 FROM ${this.sql(table)} AS stored\n WHERE stored.project_id = ${target.projectId} AND ${this.matches(kind, path)} ${revision}\n )\n `\n const [row] = await this.sql<{ readonly ref: unknown }[]>`\n SELECT ${this.sql.unsafe(`candidates.${path}`)} AS ref FROM (${candidates}) AS candidates\n WHERE ${missed === \"update\" ? this.sql`NOT` : this.sql``} ${stored}\n LIMIT 1\n `\n return row?.ref\n }\n}\n\nfunction counts(sql: SQLClient) {\n return sql`SELECT (SELECT COUNT(*) FROM candidates) AS staged,\n (SELECT COUNT(*) FROM written) AS written`\n}\n\nfunction objectOverrideConflict(): MaterializationConflictError {\n return effectiveConflict(\"Expected object override changed.\")\n}\n\nfunction linkOverrideConflict(identityKind: string | undefined): MaterializationConflictError {\n return effectiveConflict(\n identityKind === \"slot\"\n ? \"Expected link slot override changed.\"\n : \"Expected link edge override changed.\"\n )\n}\n\nfunction effectiveObjectConflict(ref: OntologyObjectRef | undefined): MaterializationConflictError {\n return effectiveConflict(`Expected ${objectLabel(ref)} changed.`)\n}\n\nfunction effectiveLinkConflict(ref: OntologyLinkRef | undefined): MaterializationConflictError {\n return effectiveConflict(`Expected ${linkLabel(ref)} changed.`)\n}\n\nfunction objectLabel(ref: OntologyObjectRef | undefined): string {\n return ref ? `object ${objectRefKey(ref)}` : \"object\"\n}\n\nfunction linkLabel(ref: OntologyLinkRef | undefined): string {\n return ref ? `link ${linkRefKey(ref)}` : \"link\"\n}\n\nfunction pointConflict(point: unknown): MaterializationConflictError {\n const found = point as { readonly series: TelemetrySeriesRef; readonly at: string } | undefined\n return new MaterializationConflictError(\n \"timeseries-point\",\n found\n ? `Telemetry point ${telemetryPointKey(found.series, found.at)} changed.`\n : \"Telemetry point changed.\"\n )\n}\n",
50
+ "import { serializeSixbFailure } from \"@sixb/core/internal/errors\"\nimport {\n MaterializationConflictError,\n MaterializationValidationError,\n type OntologyMaterializationEventCommit,\n} from \"@sixb/core/internal/materialization\"\nimport {\n claimedOutboxRows,\n type OutboxEventContext,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n ClaimedOntologyOutboxRow,\n ClaimOntologyOutboxInput,\n CompleteOntologyOutboxLeaseInput,\n OntologyOutboxStorage,\n OntologyOutboxSummary,\n PurgePublishedOntologyOutboxInput,\n RescheduleOntologyOutboxLeaseInput,\n SummarizeOntologyOutboxInput,\n} from \"@sixb/core/storage\"\nimport { ONTOLOGY_OUTBOX_FAILURE_CODES } from \"@sixb/core/storage\"\nimport { type PgExecutionRow, pgExecutionRecord } from \"../pg-execution-storage\"\nimport {\n assertNonblank,\n assertPositiveInteger,\n assertTimestamp,\n claimedOutboxDraft,\n type PgOntologyOutboxRow,\n type PgRootOperation,\n toIsoString,\n} from \"./shared\"\n\n/** A commit's own fields, prefixed, beside every column of the execution it ran under. */\ninterface PgOutboxContextRow extends PgExecutionRow {\n readonly commit_id: string\n readonly commit_committed_at: Date | string\n readonly commit_origin: OntologyMaterializationEventCommit[\"origin\"]\n}\n\nexport class PgOntologyOutboxStorage implements OntologyOutboxStorage {\n constructor(private readonly runRootOperation: PgRootOperation) {}\n\n async claim(input: ClaimOntologyOutboxInput): Promise<readonly ClaimedOntologyOutboxRow[]> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertPositiveInteger(input.limit, \"Ontology outbox limit\")\n const now = assertTimestamp(input.now, \"Ontology outbox claim time\")\n const leaseExpiry = assertTimestamp(input.leaseExpiresAt, \"Ontology outbox lease expiry\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n if (leaseExpiry <= now) {\n throw new MaterializationValidationError(\n \"Ontology outbox lease expiry must be later than the claim time.\"\n )\n }\n\n const rows = await sql<PgOntologyOutboxRow[]>`\n WITH candidates AS (\n SELECT project_id, id\n FROM ontology_outbox\n WHERE project_id = ${input.projectId}\n AND published_at IS NULL\n AND available_at <= ${input.now}\n AND (lease_expires_at IS NULL OR lease_expires_at <= ${input.now})\n ORDER BY created_at, commit_id, commit_ordinal\n LIMIT ${input.limit}\n FOR UPDATE SKIP LOCKED\n ), claimed AS (\n UPDATE ontology_outbox AS outbox\n SET attempts = outbox.attempts + 1,\n lease_id = ${input.leaseId},\n lease_expires_at = ${input.leaseExpiresAt}\n FROM candidates\n WHERE outbox.project_id = candidates.project_id AND outbox.id = candidates.id\n RETURNING outbox.id, outbox.commit_id, outbox.commit_ordinal, outbox.event,\n outbox.available_at, outbox.attempts, outbox.lease_id, outbox.lease_expires_at,\n outbox.published_at, outbox.last_failure, outbox.created_at\n )\n SELECT * FROM claimed ORDER BY created_at, commit_id, commit_ordinal\n `\n if (rows.length === 0) return []\n // Each commit and its execution are read once, however many of its events the batch holds.\n const commitIds = [...new Set(rows.map((row) => row.commit_id))]\n const contexts = await sql<PgOutboxContextRow[]>`\n SELECT commits.id AS commit_id, commits.committed_at AS commit_committed_at,\n commits.origin AS commit_origin, executions.*\n FROM ontology_commits AS commits\n JOIN executions\n ON executions.project_id = commits.project_id AND executions.id = commits.execution_id\n WHERE commits.project_id = ${input.projectId}\n AND commits.id = ANY(${sql.array(commitIds)}::text[])\n `\n const contextOf = new Map(\n contexts.map((row) => [row.commit_id, outboxEventContext(input.projectId, row)])\n )\n return claimedOutboxRows(rows.map(claimedOutboxDraft), (commitId) => contextOf.get(commitId))\n })\n }\n\n async markPublished(input: CompleteOntologyOutboxLeaseInput): Promise<void> {\n await this.runRootOperation(async (sql) => {\n assertLeaseInput(input)\n assertTimestamp(input.publishedAt, \"Ontology outbox publishedAt\")\n const ids = validateLeaseIds(input.ids)\n if (ids.length === 0) return\n const rows = await sql<{ readonly id: string }[]>`\n WITH leased AS MATERIALIZED (\n SELECT id FROM ontology_outbox\n WHERE project_id = ${input.projectId}\n AND id = ANY(${sql.array(ids)}::text[])\n AND lease_id = ${input.leaseId}\n AND lease_expires_at IS NOT NULL\n FOR UPDATE\n ), eligible AS (\n SELECT id FROM leased\n WHERE (SELECT COUNT(*) FROM leased) = ${ids.length}\n )\n UPDATE ontology_outbox AS outbox\n SET published_at = ${input.publishedAt}, lease_id = NULL, lease_expires_at = NULL\n FROM eligible\n WHERE outbox.project_id = ${input.projectId} AND outbox.id = eligible.id\n RETURNING outbox.id\n `\n if (rows.length !== ids.length) throw leaseConflict()\n })\n }\n\n async reschedule(input: RescheduleOntologyOutboxLeaseInput): Promise<void> {\n await this.runRootOperation(async (sql) => {\n assertLeaseInput(input)\n assertTimestamp(input.availableAt, \"Ontology outbox availableAt\")\n const ids = validateLeaseIds(input.ids)\n if (ids.length === 0) return\n const failure =\n input.failure === undefined\n ? null\n : serializeSixbFailure(input.failure, ONTOLOGY_OUTBOX_FAILURE_CODES)\n const rows = await sql<{ readonly id: string }[]>`\n WITH leased AS MATERIALIZED (\n SELECT id FROM ontology_outbox\n WHERE project_id = ${input.projectId}\n AND id = ANY(${sql.array(ids)}::text[])\n AND lease_id = ${input.leaseId}\n AND lease_expires_at IS NOT NULL\n FOR UPDATE\n ), eligible AS (\n SELECT id FROM leased\n WHERE (SELECT COUNT(*) FROM leased) = ${ids.length}\n )\n UPDATE ontology_outbox AS outbox\n SET available_at = ${input.availableAt},\n last_failure = COALESCE(${failure}::text::jsonb, outbox.last_failure),\n lease_id = NULL, lease_expires_at = NULL\n FROM eligible\n WHERE outbox.project_id = ${input.projectId} AND outbox.id = eligible.id\n RETURNING outbox.id\n `\n if (rows.length !== ids.length) throw leaseConflict()\n })\n }\n\n async purgePublished(input: PurgePublishedOntologyOutboxInput): Promise<number> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertPositiveInteger(input.limit, \"Ontology outbox limit\")\n assertTimestamp(input.publishedBefore, \"Ontology outbox purge cutoff\")\n const rows = await sql<{ readonly id: string }[]>`\n WITH selected AS (\n SELECT project_id, id\n FROM ontology_outbox\n WHERE project_id = ${input.projectId}\n AND published_at IS NOT NULL\n AND published_at < ${input.publishedBefore}\n ORDER BY published_at, id\n LIMIT ${input.limit}\n FOR UPDATE SKIP LOCKED\n )\n DELETE FROM ontology_outbox AS outbox\n USING selected\n WHERE outbox.project_id = selected.project_id AND outbox.id = selected.id\n RETURNING outbox.id\n `\n return rows.length\n })\n }\n\n async summarize(input: SummarizeOntologyOutboxInput): Promise<OntologyOutboxSummary> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n const [summary] = await sql<\n {\n readonly pending_count: number\n readonly oldest_pending_at: Date | string | null\n readonly retrying_count: number\n readonly max_attempts: number\n }[]\n >`\n SELECT COUNT(*)::int AS pending_count,\n MIN(created_at) AS oldest_pending_at,\n COUNT(*) FILTER (WHERE attempts > 0)::int AS retrying_count,\n COALESCE(MAX(attempts), 0)::int AS max_attempts\n FROM ontology_outbox\n WHERE project_id = ${input.projectId} AND published_at IS NULL\n `\n return {\n pendingCount: summary?.pending_count ?? 0,\n oldestPendingAt: toOptionalIsoString(summary?.oldest_pending_at),\n retryingCount: summary?.retrying_count ?? 0,\n maxAttempts: summary?.max_attempts ?? 0,\n }\n })\n }\n}\n\nfunction outboxEventContext(projectId: string, row: PgOutboxContextRow): OutboxEventContext {\n return {\n commit: {\n projectId,\n id: row.commit_id,\n committedAt: toIsoString(row.commit_committed_at),\n origin: row.commit_origin,\n },\n execution: pgExecutionRecord(row),\n }\n}\n\nfunction toOptionalIsoString(value: Date | string | null | undefined): string | null {\n if (value === null || value === undefined) return null\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n\nfunction validateLeaseIds(ids: readonly string[]): string[] {\n const seen = new Set<string>()\n for (const id of ids) {\n assertNonblank(id, \"Ontology outbox event id\")\n if (seen.has(id)) {\n throw new MaterializationValidationError(`Ontology outbox lease batch repeats event '${id}'.`)\n }\n seen.add(id)\n }\n return [...seen]\n}\n\nfunction assertLeaseInput(input: {\n readonly projectId: string\n readonly ids: readonly string[]\n readonly leaseId: string\n}): void {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n}\n\nfunction leaseConflict(): MaterializationConflictError {\n return new MaterializationConflictError(\"outbox-lease\", \"Ontology outbox lease does not match.\")\n}\n",
51
+ "import {\n type ExecutionStorageRow,\n executionRecordFromStorageRow,\n executionRecordToStorageRow,\n prepareExecutionRecord,\n} from \"@sixb/core/internal/execution-storage\"\nimport type {\n CreateExecutionInput,\n ExecutionRecord,\n ExecutionStorage,\n ShareSessionStorage,\n} from \"@sixb/core/storage\"\nimport { ExecutionStorageError } from \"@sixb/core/storage\"\nimport type { PgAuthStorage } from \"./auth-storage\"\nimport { isUniqueViolation } from \"./storage-errors\"\nimport type { PgStoreClient } from \"./transactions\"\n\nexport class PgExecutionStorage implements ExecutionStorage {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly auth: PgAuthStorage,\n private readonly shareSessions: Pick<ShareSessionStorage, \"getById\">\n ) {}\n\n async create(input: CreateExecutionInput): Promise<ExecutionRecord> {\n const record = await prepareExecutionRecord(input, {\n auth: this.auth,\n getExecution: (params) => this.getById(params),\n getShareSession: (params) => this.shareSessions.getById(params),\n })\n const row = executionRecordToStorageRow(record)\n\n try {\n const [created] = await this.sql<PgExecutionRow[]>`\n INSERT INTO executions (\n project_id,\n id,\n executor_kind,\n executor_id,\n source_kind,\n source_id,\n requested_by_user_id,\n requested_by_service_account_id,\n requester_group_ids,\n correlation_id,\n parent_execution_id,\n authority_kind,\n authority_user_id,\n authority_service_account_id,\n authority_session_id,\n authority_access_token_id,\n authority_primitive_kind,\n authority_primitive_id,\n authority_kernel_operation,\n authority_delegation_kind,\n authority_delegation_id,\n authority_delegation_session_id,\n created_at\n ) VALUES (\n ${row.projectId},\n ${row.id},\n ${row.executorKind},\n ${row.executorId},\n ${row.sourceKind},\n ${row.sourceId},\n ${row.requestedByUserId},\n ${row.requestedByServiceAccountId},\n ${JSON.stringify(row.requesterGroupIds)}::text::jsonb,\n ${row.correlationId},\n ${row.parentExecutionId},\n ${row.authorityKind},\n ${row.authorityUserId},\n ${row.authorityServiceAccountId},\n ${row.authoritySessionId},\n ${row.authorityAccessTokenId},\n ${row.authorityPrimitiveKind},\n ${row.authorityPrimitiveId},\n ${row.authorityKernelOperation},\n ${row.authorityDelegationKind},\n ${row.authorityDelegationId},\n ${row.authorityDelegationSessionId},\n ${row.createdAt}\n )\n RETURNING *\n `\n\n if (!created) {\n throw new Error(\"[SixbPg] Execution insert returned no row.\")\n }\n return pgExecutionRecord(created)\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new ExecutionStorageError(\n \"duplicate_execution\",\n `[SixbPg] Execution '${record.id}' already exists in project '${record.projectId}'.`,\n { cause: error }\n )\n }\n throw error\n }\n }\n\n async getById(params: {\n readonly projectId: string\n readonly id: string\n }): Promise<ExecutionRecord | null> {\n const [row] = await this.sql<PgExecutionRow[]>`\n SELECT *\n FROM executions\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n return row ? pgExecutionRecord(row) : null\n }\n}\n\n/** An `executions` row as its record, for any store that reads executions alongside its own rows. */\nexport function pgExecutionRecord(row: PgExecutionRow): ExecutionRecord {\n return executionRecordFromStorageRow(toStorageRow(row))\n}\n\nfunction toStorageRow(row: PgExecutionRow): ExecutionStorageRow {\n return {\n projectId: row.project_id,\n id: row.id,\n executorKind: row.executor_kind,\n executorId: row.executor_id,\n sourceKind: row.source_kind,\n sourceId: row.source_id,\n requestedByUserId: row.requested_by_user_id,\n requestedByServiceAccountId: row.requested_by_service_account_id,\n requesterGroupIds: row.requester_group_ids,\n correlationId: row.correlation_id,\n parentExecutionId: row.parent_execution_id,\n authorityKind: row.authority_kind,\n authorityUserId: row.authority_user_id,\n authorityServiceAccountId: row.authority_service_account_id,\n authoritySessionId: row.authority_session_id,\n authorityAccessTokenId: row.authority_access_token_id,\n authorityPrimitiveKind: row.authority_primitive_kind,\n authorityPrimitiveId: row.authority_primitive_id,\n authorityKernelOperation: row.authority_kernel_operation,\n authorityDelegationKind: row.authority_delegation_kind,\n authorityDelegationId: row.authority_delegation_id,\n authorityDelegationSessionId: row.authority_delegation_session_id,\n createdAt: new Date(row.created_at),\n }\n}\n\nexport interface PgExecutionRow {\n readonly project_id: string\n readonly id: string\n readonly executor_kind: ExecutionStorageRow[\"executorKind\"]\n readonly executor_id: string\n readonly source_kind: ExecutionStorageRow[\"sourceKind\"]\n readonly source_id: string\n readonly requested_by_user_id: string | null\n readonly requested_by_service_account_id: string | null\n readonly requester_group_ids: string[]\n readonly correlation_id: string\n readonly parent_execution_id: string | null\n readonly authority_kind: ExecutionStorageRow[\"authorityKind\"]\n readonly authority_user_id: string | null\n readonly authority_service_account_id: string | null\n readonly authority_session_id: string | null\n readonly authority_access_token_id: string | null\n readonly authority_primitive_kind: ExecutionStorageRow[\"authorityPrimitiveKind\"]\n readonly authority_primitive_id: string | null\n readonly authority_kernel_operation: ExecutionStorageRow[\"authorityKernelOperation\"]\n readonly authority_delegation_kind: ExecutionStorageRow[\"authorityDelegationKind\"]\n readonly authority_delegation_id: string | null\n readonly authority_delegation_session_id: string | null\n readonly created_at: Date | string\n}\n",
52
+ "import { MaterializationValidationError } from \"@sixb/core/internal/materialization\"\nimport {\n assertSourceBeginInput as assertBeginInput,\n assertSourceExecutionIdentity as assertExecutionIdentity,\n assertSourceProject as assertProjectAndSource,\n assertSourceCandidateOwner,\n assertSourceWriteIdentity as assertWriteIdentity,\n sourceEntityColumns as entityColumns,\n isExactStagingManifest,\n reconcileSourceStageRows,\n type SourceStageRow,\n sourceAssertionPayload,\n sourceConflict,\n sourceMaterializationIdentity,\n sourceStageRow,\n sourceStageRows,\n} from \"@sixb/core/internal/ontology-storage-provider\"\nimport type {\n AbandonRunSourceMaterializationInput,\n AbandonSourceMaterializationCandidateInput,\n AbandonSourceMaterializationInput,\n AdoptedSourceMaterialization,\n AdoptSourceMaterializationInput,\n AssertSourceMaterializationExecutionInput,\n BeginSourceMaterializationInput,\n CleanupTerminalSourceMaterializationsInput,\n CleanupTerminalSourceMaterializationsResult,\n GetActiveOntologySourceInput,\n MarkSourceMaterializationReadyInput,\n OntologySourceRecord,\n OntologySourceStorage,\n PurgeAbandonedSourceMaterializationsInput,\n StageSourceRowsInput,\n StageSourceRowsResult,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { lockAdvisoryKeys } from \"../transactions\"\nimport {\n assertNonblank,\n assertNonnegativeInteger,\n assertPositiveInteger,\n assertProjectionExecution,\n assertTimestamp,\n jsonParameter,\n ontologyLockKey,\n type PgOntologySourceAssertionRow,\n type PgOntologySourceRow,\n type PgRootOperation,\n sourceAssertion,\n sourceRecord,\n toIsoString,\n} from \"./shared\"\nimport { cleanupSourceVersions, purgeAbandonedSourceVersions } from \"./source-cleanup\"\nimport { assertSourceRootCoverage, sourceAssertionColumns, stageSourceRoots } from \"./source-roots\"\n\nexport class PgOntologySourceStorage implements OntologySourceStorage {\n constructor(private readonly runRootOperation: PgRootOperation) {}\n\n async beginMaterialization(\n input: BeginSourceMaterializationInput\n ): Promise<OntologySourceRecord> {\n return this.runRootOperation(async (sql) => {\n assertBeginInput(input)\n await this.assertExecution(sql, input, sourceMaterializationIdentity(input))\n await lockAdvisoryKeys(sql, [\n ontologyLockKey(\"source-candidate\", input.projectId, input.execution.projectionRunId),\n ontologyLockKey(\n \"source-materialization\",\n input.projectId,\n input.source.projectionId,\n input.materializationId\n ),\n ])\n\n const existing = await this.getManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n if (existing) {\n if (isExactStagingManifest(sourceRecord(existing), input)) return sourceRecord(existing)\n throw sourceConflict(\n `Source materialization '${input.materializationId}' already exists with different identity or state.`\n )\n }\n\n const candidate = await this.getRunCandidate(sql, input)\n if (candidate) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' already has a nonterminal source materialization; adopt it before beginning another.`\n )\n }\n\n const rows = await sql<PgOntologySourceRow[]>`\n INSERT INTO ontology_sources (\n project_id, source_id, materialization_id, projection_run_id,\n projection_kind, protocol, status, execution_token,\n dataset_id, dataset_version_id, dataset_version_created_at,\n projection_revision, ownership_hash, ontology_revision,\n root_count, assertion_count, created_at, ready_at, activated_at,\n terminal_at, last_commit_id, updated_at, base_materialization_id, base_commit_id\n ) VALUES (\n ${input.projectId}, ${input.source.projectionId}, ${input.materializationId},\n ${input.execution.projectionRunId}, ${input.projectionKind}, 'replacement',\n 'staging', ${input.execution.executionToken}, ${input.datasetVersion.datasetId},\n ${input.datasetVersion.versionId}, ${input.datasetVersion.createdAt},\n ${input.projectionRevision}, ${input.ownershipHash}, ${input.ontologyRevision},\n NULL, NULL, ${input.createdAt}, NULL, NULL, NULL, NULL, ${input.createdAt},\n ${input.base?.materializationId ?? null}, ${input.base?.lastCommitId ?? null}\n )\n ON CONFLICT DO NOTHING\n RETURNING *\n `\n if (rows[0]) return sourceRecord(rows[0])\n\n const racedManifest = await this.getManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n if (racedManifest && isExactStagingManifest(sourceRecord(racedManifest), input)) {\n return sourceRecord(racedManifest)\n }\n if (await this.getRunCandidate(sql, input)) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' already has a nonterminal source materialization; adopt it before beginning another.`\n )\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' already exists with different identity or state.`\n )\n })\n }\n\n async stageRows(input: StageSourceRowsInput): Promise<StageSourceRowsResult> {\n return this.runRootOperation(async (sql) => {\n assertWriteIdentity(input)\n await this.assertExecution(sql, input)\n const manifest = await this.requireManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n assertSourceCandidateOwner(sourceRecord(manifest), input.execution)\n if (manifest.status !== \"staging\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' is '${manifest.status}' and cannot accept rows.`\n )\n }\n\n const rows = sourceStageRows(manifest.projection_kind, input.rows)\n const existing = await this.findStageRows(sql, manifest, rows)\n const { pending, unchanged } = reconcileSourceStageRows(rows, existing)\n await stageSourceRoots(sql, manifest, input)\n await this.insertStageRows(sql, manifest, pending)\n return { inserted: pending.length, unchanged }\n })\n }\n\n async markReady(input: MarkSourceMaterializationReadyInput): Promise<OntologySourceRecord> {\n return this.runRootOperation(async (sql) => {\n assertWriteIdentity(input)\n assertTimestamp(input.readyAt, \"Source readyAt\", true)\n assertNonnegativeInteger(input.rootCount, \"Source root count\")\n assertNonnegativeInteger(input.assertionCount, \"Source assertion count\")\n await this.assertExecution(sql, input)\n const manifest = await this.requireManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n assertSourceCandidateOwner(sourceRecord(manifest), input.execution)\n if (manifest.status === \"ready\") {\n if (\n numberOrNull(manifest.root_count) === input.rootCount &&\n numberOrNull(manifest.assertion_count) === input.assertionCount &&\n toIsoString(manifest.ready_at!) === input.readyAt\n ) {\n return sourceRecord(manifest)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' was marked ready with different counts or time.`\n )\n }\n if (manifest.status !== \"staging\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' cannot transition from '${manifest.status}' to 'ready'.`\n )\n }\n if (input.readyAt < toIsoString(manifest.created_at)) {\n throw new MaterializationValidationError(\"Source readyAt cannot precede source createdAt.\")\n }\n // A newly loaded run is absent from the planner statistics. Without refreshing them,\n // PostgreSQL can scan the whole run for each identity instead of using its full key.\n // Sparse deltas avoid this table-level sampling cost.\n if (input.assertionCount >= 1_000 || input.rootCount >= 1_000) {\n await sql`ANALYZE ontology_source_rows, ontology_source_roots`\n }\n await this.assertReadyState(sql, manifest, input.rootCount, input.assertionCount)\n const rows = await sql<PgOntologySourceRow[]>`\n UPDATE ontology_sources\n SET status = 'ready', root_count = ${input.rootCount},\n assertion_count = ${input.assertionCount}, ready_at = ${input.readyAt},\n updated_at = ${input.readyAt}\n WHERE project_id = ${input.projectId}\n AND source_id = ${input.source.projectionId}\n AND materialization_id = ${input.materializationId}\n AND status = 'staging'\n AND execution_token = ${input.execution.executionToken}\n RETURNING *\n `\n if (!rows[0]) {\n throw sourceConflict(`Source materialization '${input.materializationId}' changed.`)\n }\n return sourceRecord(rows[0])\n })\n }\n\n async getActive(input: GetActiveOntologySourceInput): Promise<OntologySourceRecord | null> {\n return this.runRootOperation(async (sql) => {\n assertProjectAndSource(input)\n const [row] = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${input.projectId}\n AND source_id = ${input.source.projectionId}\n AND status = 'active'\n `\n return row ? sourceRecord(row) : null\n })\n }\n\n async adopt(\n input: AdoptSourceMaterializationInput\n ): Promise<AdoptedSourceMaterialization | null> {\n return this.runRootOperation(async (sql) => {\n assertProjectAndSource(input)\n assertExecutionIdentity(input.execution.projectionRunId, input.execution.executionToken)\n assertTimestamp(input.adoptedAt, \"Source adoptedAt\", true)\n await this.assertExecution(sql, input)\n const candidate = await this.lockRunCandidate(sql, input)\n if (!candidate) return null\n // Workers' clocks differ; adoption never moves the record back in time.\n const [adopted] = await sql<PgOntologySourceRow[]>`\n UPDATE ontology_sources\n SET execution_token = ${input.execution.executionToken},\n updated_at = GREATEST(updated_at, ${input.adoptedAt}::timestamptz)\n WHERE project_id = ${candidate.project_id} AND source_id = ${candidate.source_id}\n AND materialization_id = ${candidate.materialization_id}\n AND status IN ('staging', 'ready')\n RETURNING *\n `\n if (!adopted) {\n throw sourceConflict(`Source materialization '${candidate.materialization_id}' changed.`)\n }\n return {\n record: sourceRecord(adopted),\n resumeStagingOrdinal:\n adopted.status === \"ready\"\n ? Number(adopted.root_count)\n : await this.lastStagedOrdinal(sql, adopted),\n }\n })\n }\n\n async abandon(input: AbandonSourceMaterializationCandidateInput): Promise<OntologySourceRecord>\n async abandon(input: AbandonRunSourceMaterializationInput): Promise<OntologySourceRecord | null>\n async abandon(input: AbandonSourceMaterializationInput): Promise<OntologySourceRecord | null> {\n return this.runRootOperation(async (sql) => {\n assertProjectAndSource(input)\n assertExecutionIdentity(input.execution.projectionRunId, input.execution.executionToken)\n assertTimestamp(input.abandonedAt, \"Source abandonedAt\", true)\n await this.assertExecution(sql, input)\n if (input.kind === \"candidate\") return this.abandonCandidate(sql, input)\n const candidate = await this.lockRunCandidate(sql, input)\n return candidate ? this.transitionToAbandoned(sql, candidate, input.abandonedAt) : null\n })\n }\n\n async cleanupTerminal(\n input: CleanupTerminalSourceMaterializationsInput\n ): Promise<CleanupTerminalSourceMaterializationsResult> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Terminal source cleanup project id\")\n assertTimestamp(input.terminalBefore, \"Terminal source cleanup cutoff\", true)\n assertPositiveInteger(input.limit, \"Terminal source cleanup limit\")\n return cleanupSourceVersions(sql, input)\n })\n }\n\n async purgeAbandoned(\n input: PurgeAbandonedSourceMaterializationsInput\n ): Promise<CleanupTerminalSourceMaterializationsResult> {\n return this.runRootOperation(async (sql) => {\n assertNonblank(input.projectId, \"Abandoned source purge project id\")\n assertPositiveInteger(input.limit, \"Abandoned source purge limit\")\n return purgeAbandonedSourceVersions(sql, input)\n })\n }\n\n private async abandonCandidate(\n sql: SQLClient,\n input: AbandonSourceMaterializationCandidateInput\n ): Promise<OntologySourceRecord> {\n const manifest = await this.requireManifest(\n sql,\n input.projectId,\n input.source.projectionId,\n input.materializationId,\n true\n )\n if (manifest.status === \"abandoned\") {\n if (\n manifest.projection_run_id === input.execution.projectionRunId &&\n manifest.terminal_at !== null &&\n toIsoString(manifest.terminal_at) === input.abandonedAt\n ) {\n return sourceRecord(manifest)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' was abandoned by another execution or at another time.`\n )\n }\n assertSourceCandidateOwner(sourceRecord(manifest), input.execution)\n return this.transitionToAbandoned(sql, manifest, input.abandonedAt)\n }\n\n /** The run's one staging or ready candidate, locked, whichever execution staged it. */\n private async lockRunCandidate(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly source: { readonly projectionId: string }\n readonly execution: { readonly projectionRunId: string }\n }\n ): Promise<PgOntologySourceRow | null> {\n const candidates = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${input.projectId}\n AND source_id = ${input.source.projectionId}\n AND projection_run_id = ${input.execution.projectionRunId}\n AND status IN ('staging', 'ready')\n FOR UPDATE\n `\n if (candidates.length > 1) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' has multiple nonterminal source materializations.`\n )\n }\n return candidates[0] ?? null\n }\n\n private async lastStagedOrdinal(sql: SQLClient, manifest: PgOntologySourceRow): Promise<number> {\n const [last] = await sql<{ readonly ordinal: number | string | null }[]>`\n SELECT MAX(staging_ordinal) AS ordinal FROM ontology_source_roots\n WHERE version_id = ${manifest.version_id}\n `\n return last?.ordinal == null ? 0 : Number(last.ordinal)\n }\n\n private async transitionToAbandoned(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n abandonedAt: string\n ): Promise<OntologySourceRecord> {\n if (\n abandonedAt < toIsoString(manifest.created_at) ||\n (manifest.ready_at !== null && abandonedAt < toIsoString(manifest.ready_at))\n ) {\n throw new MaterializationValidationError(\n \"Source abandonedAt cannot precede source creation or readiness.\"\n )\n }\n const rows = await sql<PgOntologySourceRow[]>`\n UPDATE ontology_sources\n SET status = 'abandoned', execution_token = NULL,\n terminal_at = ${abandonedAt}, updated_at = ${abandonedAt}\n WHERE project_id = ${manifest.project_id}\n AND source_id = ${manifest.source_id}\n AND materialization_id = ${manifest.materialization_id}\n AND status IN ('staging', 'ready')\n RETURNING *\n `\n if (!rows[0]) {\n throw sourceConflict(\n `Source materialization '${manifest.materialization_id}' cannot transition to 'abandoned'.`\n )\n }\n // Its roots were never live and stay unpublished; purging removes them with the version.\n return sourceRecord(rows[0])\n }\n\n private async assertReadyState(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n rootCount: number,\n assertionCount: number\n ): Promise<void> {\n const version = manifest.version_id\n const [counts] = await sql<\n {\n readonly assertions: number | string\n readonly roots: number | string\n readonly ordinals: number | string\n readonly min_ordinal: number | string | null\n readonly max_ordinal: number | string | null\n }[]\n >`\n SELECT (SELECT COUNT(*) FROM ontology_source_roots AS roots\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${version}) AS assertions,\n COUNT(*) AS roots, COUNT(DISTINCT staging_ordinal) AS ordinals,\n MIN(staging_ordinal) AS min_ordinal, MAX(staging_ordinal) AS max_ordinal\n FROM ontology_source_roots\n WHERE version_id = ${version}\n `\n const assertions = Number(counts?.assertions ?? 0)\n const roots = Number(counts?.roots ?? 0)\n const ordinals = Number(counts?.ordinals ?? 0)\n const minimum = counts?.min_ordinal === null ? null : Number(counts?.min_ordinal)\n const maximum = counts?.max_ordinal === null ? null : Number(counts?.max_ordinal)\n if (\n assertions !== assertionCount ||\n roots !== rootCount ||\n ordinals !== rootCount ||\n (rootCount > 0 && (minimum !== 0 || maximum !== rootCount - 1))\n ) {\n throw new MaterializationValidationError(\n \"Source ready counts do not match the staged roots and assertions.\"\n )\n }\n await assertSourceRootCoverage(sql, manifest)\n\n // Roots store only their canonical key; compare its parts with each row's typed identity.\n const [invalid] =\n manifest.projection_kind === \"link\"\n ? await sql<{ readonly root_key: string }[]>`\n SELECT roots.root_key\n FROM ontology_source_roots AS roots\n CROSS JOIN LATERAL (SELECT roots.root_key::jsonb AS parts) AS root\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${version}\n GROUP BY roots.id, roots.root_key\n HAVING COUNT(*) <> 1\n OR BOOL_OR(root.parts->>0 <> 'link')\n OR BOOL_OR(rows.entity_kind <> 'link')\n OR BOOL_OR(rows.source_type_id <> root.parts->>1\n OR rows.source_primary_id <> root.parts->>2 OR rows.link_id <> root.parts->>3\n OR rows.target_type_id <> root.parts->>4 OR rows.target_primary_id <> root.parts->>5)\n LIMIT 1\n `\n : await sql<{ readonly root_key: string }[]>`\n SELECT roots.root_key\n FROM ontology_source_roots AS roots\n CROSS JOIN LATERAL (SELECT roots.root_key::jsonb AS parts) AS root\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${version}\n GROUP BY roots.id, roots.root_key\n HAVING BOOL_OR(root.parts->>0 <> 'object')\n OR COUNT(*) FILTER (\n WHERE rows.entity_kind = 'object' AND rows.object_type_id = root.parts->>1\n AND rows.primary_id = root.parts->>2\n ) <> 1\n OR COUNT(*) FILTER (\n WHERE (rows.entity_kind = 'object' AND (rows.object_type_id <> root.parts->>1\n OR rows.primary_id <> root.parts->>2))\n OR (rows.entity_kind = 'link' AND (rows.source_type_id <> root.parts->>1\n OR rows.source_primary_id <> root.parts->>2))\n ) <> 0\n OR COUNT(*) FILTER (WHERE rows.entity_kind = 'link') <> COUNT(DISTINCT (\n rows.link_id, rows.target_type_id, rows.target_primary_id\n )) FILTER (WHERE rows.entity_kind = 'link')\n LIMIT 1\n `\n if (invalid) {\n throw new MaterializationValidationError(\n manifest.projection_kind === \"link\"\n ? \"Link projection roots must contain exactly their matching link assertion.\"\n : \"Object projection roots must contain exactly their matching object assertion plus links sourced from that root.\"\n )\n }\n }\n\n /** Already staged assertions sharing a root or an ordinal with `rows`. */\n private async findStageRows(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n rows: readonly SourceStageRow[]\n ): Promise<readonly SourceStageRow[]> {\n if (rows.length === 0) return []\n const rootKeys = [...new Set(rows.map((row) => row.rootKey))]\n const ordinals = [...new Set(rows.map((row) => row.row.stagingOrdinal))]\n const existing = await sql<PgOntologySourceAssertionRow[]>`\n SELECT ${sourceAssertionColumns(sql)}\n FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${manifest.version_id}\n AND (\n roots.root_key = ANY(${sql.array(rootKeys)}::text[])\n OR roots.staging_ordinal = ANY(${sql.array(ordinals)}::bigint[])\n )\n `\n return existing.map((row) => sourceStageRow(sourceAssertion(row)))\n }\n\n private async insertStageRows(\n sql: SQLClient,\n manifest: PgOntologySourceRow,\n rows: readonly SourceStageRow[]\n ): Promise<void> {\n if (rows.length === 0) return\n const payload = rows.map(({ rootKey, row }) => {\n const entity = entityColumns(row.assertion)\n return {\n root_key: rootKey,\n entity_kind: row.assertion.kind,\n object_type_id: entity.objectTypeId,\n primary_id: entity.primaryId,\n source_type_id: entity.sourceTypeId,\n source_primary_id: entity.sourcePrimaryId,\n link_id: entity.linkId,\n target_type_id: entity.targetTypeId,\n target_primary_id: entity.targetPrimaryId,\n payload: sourceAssertionPayload(row.assertion),\n }\n })\n const inserted = await sql`\n INSERT INTO ontology_source_rows (\n root_id, entity_kind, object_type_id, primary_id,\n source_type_id, source_primary_id, link_id, target_type_id, target_primary_id, payload\n )\n SELECT roots.id, staged.entity_kind, staged.object_type_id, staged.primary_id,\n staged.source_type_id, staged.source_primary_id, staged.link_id,\n staged.target_type_id, staged.target_primary_id, staged.payload\n FROM jsonb_to_recordset(${jsonParameter(sql, payload)}) AS staged(\n root_key TEXT, entity_kind TEXT, object_type_id TEXT, primary_id TEXT,\n source_type_id TEXT, source_primary_id TEXT, link_id TEXT,\n target_type_id TEXT, target_primary_id TEXT, payload JSONB\n )\n JOIN ontology_source_roots AS roots\n ON roots.version_id = ${manifest.version_id} AND roots.root_key = staged.root_key\n `\n if (inserted.count !== rows.length) {\n throw sourceConflict(\"Staged source rows do not all belong to a staged root.\")\n }\n }\n\n private assertExecution(\n sql: SQLClient,\n input: {\n readonly projectId: string\n readonly source: { readonly projectionId: string }\n readonly execution: { readonly projectionRunId: string; readonly executionToken: string }\n },\n identity?: AssertSourceMaterializationExecutionInput[\"identity\"]\n ): Promise<void> {\n return assertProjectionExecution(sql, {\n projectId: input.projectId,\n sourceId: input.source.projectionId,\n projectionRunId: input.execution.projectionRunId,\n executionToken: input.execution.executionToken,\n ...(identity ? { identity } : {}),\n })\n }\n\n private async getRunCandidate(\n sql: SQLClient,\n input: BeginSourceMaterializationInput\n ): Promise<PgOntologySourceRow | null> {\n const [row] = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${input.projectId}\n AND projection_run_id = ${input.execution.projectionRunId}\n AND status IN ('staging', 'ready')\n LIMIT 1\n FOR UPDATE\n `\n return row ?? null\n }\n\n private async getManifest(\n sql: SQLClient,\n projectId: string,\n sourceId: string,\n materializationId: string,\n lock = false\n ): Promise<PgOntologySourceRow | null> {\n const lockFragment = lock ? sql`FOR UPDATE` : sql``\n const [row] = await sql<PgOntologySourceRow[]>`\n SELECT * FROM ontology_sources\n WHERE project_id = ${projectId}\n AND source_id = ${sourceId}\n AND materialization_id = ${materializationId}\n ${lockFragment}\n `\n return row ?? null\n }\n\n private async requireManifest(\n sql: SQLClient,\n projectId: string,\n sourceId: string,\n materializationId: string,\n lock = false\n ): Promise<PgOntologySourceRow> {\n const row = await this.getManifest(sql, projectId, sourceId, materializationId, lock)\n if (!row) throw sourceConflict(`Source materialization '${materializationId}' does not exist.`)\n return row\n }\n}\n\nfunction numberOrNull(value: number | string | null): number | null {\n return value === null ? null : Number(value)\n}\n",
53
+ "import type {\n CleanupTerminalSourceMaterializationsInput,\n CleanupTerminalSourceMaterializationsResult,\n PurgeAbandonedSourceMaterializationsInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\n\n/** A version outlives its replacement plan, which references it. */\nconst PLAN_PURGED = `NOT EXISTS (\n SELECT 1 FROM ontology_replacement_plans AS plans WHERE plans.version_id = versions.version_id\n)`\n\n/**\n * Superseded versions can still hold live roots (a delta keeps unchanged roots where they were),\n * so they are cleaned root by root once retired. An abandoned candidate was never published:\n * everything it holds goes, one whole version at a time, each delete on its own version prefix.\n */\nexport async function purgeAbandonedSourceVersions(\n sql: SQLClient,\n input: PurgeAbandonedSourceMaterializationsInput\n): Promise<CleanupTerminalSourceMaterializationsResult> {\n let remaining = input.limit\n let rowsDeleted = 0\n let materializationsDeleted = 0\n while (remaining > 0) {\n const [candidate] = await sql<{ readonly version_id: string }[]>`\n SELECT version_id FROM ontology_sources AS versions\n WHERE project_id = ${input.projectId} AND status = 'abandoned' AND ${sql.unsafe(PLAN_PURGED)}\n ORDER BY terminal_at, source_id, materialization_id\n LIMIT 1 FOR UPDATE SKIP LOCKED\n `\n if (!candidate) break\n const rows = await sql`\n DELETE FROM ontology_source_rows WHERE ctid IN (\n SELECT rows.ctid FROM ontology_source_roots AS roots\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE roots.version_id = ${candidate.version_id} LIMIT ${remaining}\n )\n `\n rowsDeleted += rows.count\n remaining -= rows.count\n if (remaining === 0) break\n const roots = await sql`\n DELETE FROM ontology_source_roots WHERE ctid IN (\n SELECT ctid FROM ontology_source_roots\n WHERE version_id = ${candidate.version_id} LIMIT ${remaining}\n )\n `\n rowsDeleted += roots.count\n remaining -= roots.count\n if (remaining === 0) break\n const manifest = await sql`\n DELETE FROM ontology_sources\n WHERE version_id = ${candidate.version_id} AND status = 'abandoned'\n `\n if (manifest.count === 0) break\n materializationsDeleted += manifest.count\n remaining -= manifest.count\n }\n return { rowsDeleted, materializationsDeleted }\n}\n\nexport async function cleanupSourceVersions(\n sql: SQLClient,\n input: CleanupTerminalSourceMaterializationsInput\n): Promise<CleanupTerminalSourceMaterializationsResult> {\n let remaining = input.limit\n const retired = sql`roots.project_id = ${input.projectId}\n AND roots.retired_at < ${input.terminalBefore} AND versions.status = 'superseded'`\n const removedRows = await sql`\n WITH selected AS (\n SELECT rows.ctid FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n JOIN ontology_source_rows AS rows ON rows.root_id = roots.id\n WHERE ${retired}\n ORDER BY roots.retired_at, roots.id\n LIMIT ${remaining} FOR UPDATE OF rows SKIP LOCKED\n ) DELETE FROM ontology_source_rows AS rows USING selected WHERE rows.ctid = selected.ctid RETURNING 1\n `\n let rowsDeleted = removedRows.length\n remaining -= rowsDeleted\n if (remaining > 0) {\n // Each version's root_count follows its roots down, so a drained version is found by index.\n const [removed] = await sql<{ readonly count: number }[]>`\n WITH selected AS (\n SELECT roots.ctid FROM ontology_source_roots AS roots\n JOIN ontology_sources AS versions ON versions.version_id = roots.version_id\n WHERE ${retired}\n AND NOT EXISTS (SELECT 1 FROM ontology_source_rows AS rows WHERE rows.root_id = roots.id)\n ORDER BY roots.retired_at, roots.id\n LIMIT ${remaining} FOR UPDATE OF roots SKIP LOCKED\n ), removed AS (\n DELETE FROM ontology_source_roots AS roots USING selected WHERE roots.ctid = selected.ctid\n RETURNING roots.version_id\n ), drained AS (\n UPDATE ontology_sources AS versions SET root_count = versions.root_count - counts.count\n FROM (SELECT version_id, count(*)::int AS count FROM removed GROUP BY version_id) AS counts\n WHERE versions.version_id = counts.version_id\n RETURNING counts.count\n ) SELECT COALESCE(sum(count), 0)::int AS count FROM drained\n `\n rowsDeleted += removed?.count ?? 0\n remaining -= removed?.count ?? 0\n }\n const removedManifests =\n remaining === 0\n ? []\n : await sql`\n WITH selected AS (\n SELECT versions.ctid FROM ontology_sources AS versions\n WHERE project_id = ${input.projectId} AND status = 'superseded' AND root_count = 0\n AND terminal_at < ${input.terminalBefore} AND ${sql.unsafe(PLAN_PURGED)}\n ORDER BY terminal_at, source_id, materialization_id LIMIT ${remaining} FOR UPDATE SKIP LOCKED\n ) DELETE FROM ontology_sources AS versions USING selected WHERE versions.ctid = selected.ctid RETURNING 1\n `\n return { rowsDeleted, materializationsDeleted: removedManifests.length }\n}\n",
47
54
  "import { parseSixbFailure } from \"@sixb/core/internal/errors\"\nimport {\n type MaterializationSession,\n type OntologyVectorIndexingStorage,\n VECTOR_INDEXING_FAILURE_CODES,\n type VectorIndexingRequest,\n type VectorIndexingWork,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { jsonParameter as json, type PgRootOperation } from \"./shared\"\n\ninterface WorkRow {\n batch_id: string | null\n request: VectorIndexingRequest\n status: VectorIndexingWork[\"status\"]\n available_at: Date | string\n values_json: number[] | null\n error: string | null\n}\n\nexport class PgVectorIndexingStorage implements OntologyVectorIndexingStorage {\n constructor(\n private readonly sql: SQLClient,\n private readonly run: PgRootOperation,\n private readonly assertSession: (session: MaterializationSession, projectId: string) => void\n ) {}\n\n async schedule(input: Parameters<OntologyVectorIndexingStorage[\"schedule\"]>[0]) {\n this.assertSession(input.session, input.projectId)\n if (input.deleted.length)\n await this.sql`\n DELETE FROM object_vector_indexing AS work\n USING jsonb_array_elements(${json(this.sql, input.deleted)}::jsonb) AS deleted(ref)\n WHERE work.project_id = ${input.projectId}\n AND work.object_type_id = deleted.ref->>'objectTypeId'\n AND work.primary_id = deleted.ref->>'primaryId'\n `\n if (input.requests.length)\n await this.sql`\n INSERT INTO object_vector_indexing (\n project_id, id, object_type_id, primary_id, profile, batch_id, request, status, available_at, dispatch_at\n )\n SELECT ${input.projectId}, entry->>'id', entry#>>'{ref,objectTypeId}',\n entry#>>'{ref,primaryId}', entry->>'profile', entry->>'batchId', entry - 'batchId', 'pending',\n ${input.availableAt}::timestamptz, ${input.availableAt}::timestamptz\n FROM jsonb_array_elements(${json(this.sql, input.requests)}::jsonb) AS pending(entry)\n ON CONFLICT (project_id, object_type_id, primary_id, profile) DO UPDATE SET\n id = EXCLUDED.id, batch_id = EXCLUDED.batch_id, request = EXCLUDED.request, status = 'pending',\n available_at = EXCLUDED.available_at, dispatch_at = EXCLUDED.dispatch_at,\n values_json = NULL, error = NULL\n `\n }\n async complete(input: Parameters<OntologyVectorIndexingStorage[\"complete\"]>[0]) {\n this.assertSession(input.session, input.projectId)\n if (!input.entries.length) return\n await this.sql`\n DELETE FROM object_vector_indexing AS work\n USING jsonb_array_elements(${json(this.sql, input.entries)}::jsonb) AS completed(entry)\n WHERE work.project_id = ${input.projectId}\n AND work.object_type_id = entry#>>'{ref,objectTypeId}'\n AND work.primary_id = entry#>>'{ref,primaryId}'\n AND work.profile = entry->>'profile'\n AND work.request->>'configuration' = entry->>'configuration'\n AND work.request->>'sourceFingerprint' = entry->>'sourceFingerprint'\n `\n }\n\n async dispatched(input: Parameters<OntologyVectorIndexingStorage[\"dispatched\"]>[0]) {\n if (!input.ids.length) return\n await this.run(async (sql) => {\n await sql`UPDATE object_vector_indexing SET dispatch_at = ${input.nextDispatchAt} WHERE project_id = ${input.projectId} AND id = ANY(${sql.array([...input.ids])}::text[])`\n })\n }\n async get(input: Parameters<OntologyVectorIndexingStorage[\"get\"]>[0]) {\n return this.run(async (sql) => {\n const rows = await sql<\n WorkRow[]\n >`SELECT batch_id, request, status, available_at, values_json, error FROM object_vector_indexing WHERE project_id = ${input.projectId} AND id = ${input.id}`\n return rows[0] ? decode(rows[0]) : null\n })\n }\n async getBatch(input: Parameters<OntologyVectorIndexingStorage[\"getBatch\"]>[0]) {\n return this.run(async (sql) =>\n (\n await sql<WorkRow[]>`\n SELECT batch_id, request, status, available_at, values_json, error\n FROM object_vector_indexing WHERE project_id = ${input.projectId}\n AND batch_id = ${input.batchId} ORDER BY id`\n ).map(decode)\n )\n }\n\n async getBatchMember(input: Parameters<OntologyVectorIndexingStorage[\"getBatchMember\"]>[0]) {\n return this.run(async (sql) => {\n const rows = await sql<WorkRow[]>`\n SELECT batch_id, request, status, available_at, values_json, error\n FROM object_vector_indexing WHERE project_id = ${input.projectId}\n AND object_type_id = ${input.ref.objectTypeId} AND primary_id = ${input.ref.primaryId}\n AND profile = ${input.profile} AND batch_id = ${input.batchId}`\n return rows[0] ? decode(rows[0]) : null\n })\n }\n\n async updateBatch(input: Parameters<OntologyVectorIndexingStorage[\"updateBatch\"]>[0]) {\n if (!input.updates.length) return true\n return this.run(async (sql) => {\n const rows = await sql<{ id: string }[]>`\n WITH changes AS MATERIALIZED (\n SELECT item FROM jsonb_array_elements(${json(sql, input.updates)}::jsonb) AS entries(item)\n ), locked AS MATERIALIZED (\n SELECT work.id FROM object_vector_indexing AS work\n JOIN changes ON work.id = item->>'id' AND work.status = item->>'expectedStatus'\n WHERE work.project_id = ${input.projectId} ORDER BY work.id FOR UPDATE OF work\n )\n UPDATE object_vector_indexing AS work SET\n status = changes.item->>'status', available_at = (changes.item->>'availableAt')::timestamptz,\n values_json = COALESCE(changes.item->'values', work.values_json),\n error = (changes.item->'error')::text\n FROM changes, locked\n WHERE work.project_id = ${input.projectId} AND work.id = locked.id\n AND work.id = changes.item->>'id'\n AND (${!input.requireAll} OR (SELECT count(*) FROM locked) = ${input.updates.length})\n RETURNING work.id`\n return !input.requireAll || rows.length === input.updates.length\n })\n }\n\n async listDue(input: Parameters<OntologyVectorIndexingStorage[\"listDue\"]>[0]) {\n return this.run(async (sql) =>\n (\n await sql<\n WorkRow[]\n >`SELECT batch_id, request, status, available_at, NULL AS values_json, error FROM object_vector_indexing WHERE project_id = ${input.projectId} AND status <> 'failed' AND dispatch_at <= ${input.now} ORDER BY dispatch_at, id LIMIT ${input.limit}`\n ).map(decode)\n )\n }\n async update(input: Parameters<OntologyVectorIndexingStorage[\"update\"]>[0]) {\n return this.run(\n async (sql) =>\n (\n await sql`\n UPDATE object_vector_indexing SET status = ${input.status}, available_at = ${input.availableAt},\n values_json = COALESCE(${input.values ? json(sql, input.values) : null}, values_json), error = ${input.error ? JSON.stringify(input.error) : null}\n WHERE project_id = ${input.projectId} AND id = ${input.id} AND status = ${input.expectedStatus} RETURNING id\n `\n ).length === 1\n )\n }\n async remove(input: Parameters<OntologyVectorIndexingStorage[\"remove\"]>[0]) {\n await this.run(async (sql) => {\n await sql`DELETE FROM object_vector_indexing WHERE project_id = ${input.projectId} AND id = ${input.id}`\n })\n }\n}\nfunction decode(row: WorkRow): VectorIndexingWork {\n return {\n ...row.request,\n ...(row.batch_id ? { batchId: row.batch_id } : {}),\n status: row.status,\n availableAt: new Date(row.available_at).toISOString(),\n ...(row.values_json ? { values: row.values_json } : {}),\n ...(row.error\n ? {\n error: parseSixbFailure(row.error, VECTOR_INDEXING_FAILURE_CODES),\n }\n : {}),\n }\n}\n",
48
55
  "import { MaterializationConflictError } from \"@sixb/core/internal/materialization\"\nimport type {\n MaterializationSession,\n ObjectVectorState,\n OntologyVectorStorage,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { jsonParameter as json, type PgRootOperation } from \"./shared\"\n\ninterface VectorMetadataRow {\n readonly profile: string\n readonly configuration: string\n readonly source: string[]\n readonly source_fingerprint: string\n readonly last_commit_id: string\n}\n\nexport class PgOntologyVectorStorage implements OntologyVectorStorage {\n constructor(\n private readonly sql: SQLClient,\n private readonly runRootOperation: PgRootOperation,\n private readonly assertSession: (\n session: MaterializationSession,\n projectId: string,\n commitId?: string\n ) => void\n ) {}\n\n async list(\n input: Parameters<OntologyVectorStorage[\"list\"]>[0]\n ): Promise<readonly ObjectVectorState[]> {\n return this.runRootOperation(async (sql) => {\n const rows = await sql<VectorMetadataRow[]>`\n SELECT profile, configuration, source, source_fingerprint, last_commit_id\n FROM object_vectors\n WHERE project_id = ${input.projectId}\n AND object_type_id = ${input.ref.objectTypeId} AND primary_id = ${input.ref.primaryId}\n ORDER BY profile\n `\n return rows.map((row) => ({\n ref: { ...input.ref },\n profile: row.profile,\n configuration: row.configuration,\n source: row.source,\n sourceFingerprint: row.source_fingerprint,\n lastCommitId: row.last_commit_id,\n }))\n })\n }\n\n async listBatch(\n input: Parameters<OntologyVectorStorage[\"listBatch\"]>[0]\n ): Promise<readonly ObjectVectorState[]> {\n if (!input.refs.length) return []\n return this.runRootOperation(async (sql) => {\n const rows = await sql<\n (VectorMetadataRow & { object_type_id: string; primary_id: string })[]\n >`\n SELECT stored.object_type_id, stored.primary_id, stored.profile, stored.configuration,\n stored.source, stored.source_fingerprint, stored.last_commit_id\n FROM (SELECT DISTINCT ref->>'objectTypeId' AS object_type_id, ref->>'primaryId' AS primary_id\n FROM jsonb_array_elements(${json(sql, input.refs)}::jsonb) AS requested(ref)) AS requested\n JOIN object_vectors AS stored ON stored.project_id = ${input.projectId}\n AND stored.object_type_id = requested.object_type_id AND stored.primary_id = requested.primary_id\n ORDER BY stored.object_type_id, stored.primary_id, stored.profile\n `\n return rows.map((row) => ({\n ref: { objectTypeId: row.object_type_id, primaryId: row.primary_id },\n profile: row.profile,\n configuration: row.configuration,\n source: row.source,\n sourceFingerprint: row.source_fingerprint,\n lastCommitId: row.last_commit_id,\n }))\n })\n }\n\n async removeBatch(input: Parameters<OntologyVectorStorage[\"removeBatch\"]>[0]): Promise<void> {\n this.assertSession(input.session, input.projectId)\n if (!input.entries.length) return\n const removed = await this.sql`\n DELETE FROM object_vectors AS stored\n USING jsonb_array_elements(${json(this.sql, input.entries)}::jsonb) AS requested(entry)\n WHERE stored.project_id = ${input.projectId}\n AND stored.object_type_id = entry#>>'{ref,objectTypeId}'\n AND stored.primary_id = entry#>>'{ref,primaryId}' AND stored.profile = entry->>'profile'\n AND stored.last_commit_id = entry->>'expectedCommitId'\n RETURNING stored.profile\n `\n if (removed.length !== input.entries.length) throw vectorConflict()\n }\n\n async write(input: Parameters<OntologyVectorStorage[\"write\"]>[0]): Promise<void> {\n await this.writeBatch({ session: input.session, projectId: input.projectId, entries: [input] })\n }\n\n async writeBatch(input: Parameters<OntologyVectorStorage[\"writeBatch\"]>[0]): Promise<void> {\n const entries = input.entries.map(({ value, expectedCommitId }) => {\n this.assertSession(input.session, input.projectId, value.lastCommitId)\n return {\n object_type_id: value.ref.objectTypeId,\n primary_id: value.ref.primaryId,\n profile: value.profile,\n configuration: value.configuration,\n source: [...value.source],\n source_fingerprint: value.sourceFingerprint,\n embedding: [...value.values],\n last_commit_id: value.lastCommitId,\n expected_commit_id: expectedCommitId,\n }\n })\n const inserts = entries.filter((entry) => entry.expected_commit_id === null)\n const updates = entries.filter((entry) => entry.expected_commit_id !== null)\n\n // Keep insert-if-absent and revision-checked update distinct: an upsert could recreate\n // a deleted vector or overwrite a representation produced after preparation.\n if (inserts.length) {\n const rows = await this.sql`\n INSERT INTO object_vectors (\n project_id, object_type_id, primary_id, profile, configuration,\n source, source_fingerprint, embedding, last_commit_id\n )\n SELECT ${input.projectId}, object_type_id, primary_id, profile, configuration,\n source, source_fingerprint, embedding, last_commit_id\n FROM jsonb_to_recordset(${json(this.sql, inserts)}::jsonb) AS incoming(\n object_type_id text, primary_id text, profile text, configuration text,\n source text[], source_fingerprint text, embedding real[], last_commit_id text\n )\n ORDER BY object_type_id, primary_id, profile\n ON CONFLICT (project_id, object_type_id, primary_id, profile) DO NOTHING\n RETURNING profile`\n if (rows.length !== inserts.length) throw vectorConflict()\n }\n\n if (updates.length) {\n const rows = await this.sql`\n UPDATE object_vectors AS stored SET\n configuration = incoming.configuration, source = incoming.source,\n source_fingerprint = incoming.source_fingerprint, embedding = incoming.embedding,\n last_commit_id = incoming.last_commit_id\n FROM jsonb_to_recordset(${json(this.sql, updates)}::jsonb) AS incoming(\n object_type_id text, primary_id text, profile text, configuration text,\n source text[], source_fingerprint text, embedding real[], last_commit_id text,\n expected_commit_id text\n )\n WHERE stored.project_id = ${input.projectId}\n AND stored.object_type_id = incoming.object_type_id AND stored.primary_id = incoming.primary_id\n AND stored.profile = incoming.profile AND stored.last_commit_id = incoming.expected_commit_id\n RETURNING stored.profile`\n if (rows.length !== updates.length) throw vectorConflict()\n }\n }\n\n async remove(input: Parameters<OntologyVectorStorage[\"remove\"]>[0]): Promise<void> {\n this.assertSession(input.session, input.projectId)\n const rows = await this.sql`\n DELETE FROM object_vectors\n WHERE project_id = ${input.projectId}\n AND object_type_id = ${input.ref.objectTypeId} AND primary_id = ${input.ref.primaryId}\n AND profile = ${input.profile} AND last_commit_id = ${input.expectedCommitId}\n RETURNING profile\n `\n if (rows.length !== 1) throw vectorConflict()\n }\n}\n\nfunction vectorConflict(): MaterializationConflictError {\n return new MaterializationConflictError(\n \"effective-state\",\n \"Vector changed since it was prepared.\"\n )\n}\n",
49
- "import type { OntologyStorage } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { PgOntologyCommitStorage } from \"./commits\"\nimport type { PgOntologyTransactionContext } from \"./materialization-session\"\nimport { PgOntologyMaterializationStorage } from \"./materializations\"\nimport { PgOntologyOutboxStorage } from \"./outbox\"\nimport type { PgRootOperation } from \"./shared\"\nimport { PgOntologySourceStorage } from \"./sources\"\nimport { PgVectorIndexingStorage } from \"./vector-indexing\"\nimport { PgOntologyVectorStorage } from \"./vectors\"\n\nexport class PgOntologyStorage implements OntologyStorage {\n readonly commits: PgOntologyCommitStorage\n readonly sources: PgOntologySourceStorage\n readonly materializations: PgOntologyMaterializationStorage\n readonly outbox: PgOntologyOutboxStorage\n readonly vectorIndexing: PgVectorIndexingStorage\n readonly vectors: PgOntologyVectorStorage\n\n constructor(input: {\n readonly sql: SQLClient\n readonly runRootOperation: PgRootOperation\n readonly transactionContext: PgOntologyTransactionContext | null\n }) {\n this.commits = new PgOntologyCommitStorage(input.runRootOperation)\n this.sources = new PgOntologySourceStorage(input.runRootOperation)\n this.materializations = new PgOntologyMaterializationStorage(\n input.sql,\n input.transactionContext\n )\n this.outbox = new PgOntologyOutboxStorage(input.runRootOperation)\n this.vectorIndexing = new PgVectorIndexingStorage(\n input.sql,\n input.runRootOperation,\n (session, projectId) => this.materializations.assertVectorSession(session, projectId)\n )\n this.vectors = new PgOntologyVectorStorage(\n input.sql,\n input.runRootOperation,\n (session, projectId, commitId) =>\n this.materializations.assertVectorSession(session, projectId, commitId)\n )\n }\n\n deactivateSessions(): void {\n this.materializations.deactivateSessions()\n }\n}\n\nexport type { PgOntologyTransactionContext } from \"./materialization-session\"\n",
56
+ "import type { OntologyStorage } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"../pg-client\"\nimport { PgOntologyCommitStorage } from \"./commits\"\nimport type { PgOntologyTransactionContext } from \"./materialization-session\"\nimport { PgOntologyMaterializationStorage } from \"./materializations\"\nimport { PgOntologyOutboxStorage } from \"./outbox\"\nimport { PgOntologyReplacementPlanStorage } from \"./replacement-plans\"\nimport type { PgRootOperation } from \"./shared\"\nimport { PgOntologySourceStorage } from \"./sources\"\nimport { PgVectorIndexingStorage } from \"./vector-indexing\"\nimport { PgOntologyVectorStorage } from \"./vectors\"\n\nexport class PgOntologyStorage implements OntologyStorage {\n readonly commits: PgOntologyCommitStorage\n readonly sources: PgOntologySourceStorage\n readonly materializations: PgOntologyMaterializationStorage\n readonly replacementPlans: PgOntologyReplacementPlanStorage\n readonly outbox: PgOntologyOutboxStorage\n readonly vectorIndexing: PgVectorIndexingStorage\n readonly vectors: PgOntologyVectorStorage\n\n constructor(input: {\n readonly sql: SQLClient\n readonly runRootOperation: PgRootOperation\n readonly transactionContext: PgOntologyTransactionContext | null\n }) {\n this.commits = new PgOntologyCommitStorage(input.runRootOperation)\n this.sources = new PgOntologySourceStorage(input.runRootOperation)\n this.materializations = new PgOntologyMaterializationStorage(\n input.sql,\n input.transactionContext\n )\n this.replacementPlans = new PgOntologyReplacementPlanStorage(input.sql)\n this.outbox = new PgOntologyOutboxStorage(input.runRootOperation)\n this.vectorIndexing = new PgVectorIndexingStorage(\n input.sql,\n input.runRootOperation,\n (session, projectId) => this.materializations.assertVectorSession(session, projectId)\n )\n this.vectors = new PgOntologyVectorStorage(\n input.sql,\n input.runRootOperation,\n (session, projectId, commitId) =>\n this.materializations.assertVectorSession(session, projectId, commitId)\n )\n }\n\n deactivateSessions(): void {\n this.materializations.deactivateSessions()\n }\n}\n\nexport type { PgOntologyTransactionContext } from \"./materialization-session\"\n",
50
57
  "import type { ActionSubject, JsonValue } from \"@sixb/core\"\nimport {\n parseActionRunFailure,\n serializeActionRunFailure,\n} from \"@sixb/core/internal/action-run-storage\"\nimport { assertActionRunExecution } from \"@sixb/core/internal/action-run-storage-provider\"\nimport {\n actionRunPhaseRecordsEqual,\n canRequeueActionRunAfterEnqueueFailure,\n finishActionRunPhase,\n} from \"@sixb/core/internal/storage\"\nimport type {\n ActionRunEffectsRecord,\n ActionRunFailure,\n ActionRunParams,\n ActionRunPhase,\n ActionRunRecord,\n ActionRunStorage,\n ActionRunWritebackRecord,\n EnterActionRunPhaseInput,\n ExecutionStorage,\n FinishActionRunInput,\n ListActionRunsInput,\n ListActionRunsResult,\n LockActionMaterializationRunInput,\n QueueActionRunInput,\n RecordActionEffectsInput,\n RecordActionWritebackInput,\n StartActionRunInput,\n} from \"@sixb/core/storage\"\nimport { ActionRunError, isTerminalActionRun } from \"@sixb/core/storage\"\nimport type { SQLClient, SqlParameter } from \"./pg-client\"\nimport { isUniqueViolation } from \"./storage-errors\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport class PgActionRunStorage implements ActionRunStorage {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly executions: ExecutionStorage\n ) {}\n\n async lockForMaterialization(input: LockActionMaterializationRunInput): Promise<ActionRunRecord> {\n const [row] = await this.sql<DatabaseRow[]>`\n SELECT *\n FROM action_runs\n WHERE project_id = ${input.projectId} AND id = ${input.runId}\n FOR UPDATE\n `\n if (!row) {\n throw new ActionRunError(\n `[SixbPg] Action run '${input.runId}' not found for project '${input.projectId}'.`\n )\n }\n if (row.action_id !== input.actionId) {\n throw new ActionRunError(\n `[SixbPg] Action run '${input.runId}' does not belong to action '${input.actionId}'.`\n )\n }\n if (row.status !== \"running\") {\n throw new ActionRunError(\n `[SixbPg] Action run '${input.runId}' cannot materialize from status '${row.status}'.`\n )\n }\n return rowToActionRunRecord(row)\n }\n\n async queue(input: QueueActionRunInput): Promise<ActionRunRecord> {\n await assertActionRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n actionId: input.actionId,\n })\n\n try {\n const [row] = await this.sql<DatabaseRow[]>`\n INSERT INTO action_runs (\n project_id,\n id,\n execution_id,\n action_id,\n subject_kind,\n object_type_id,\n primary_id,\n status,\n phase,\n queued_at,\n started_at,\n finished_at,\n params,\n idempotency_key,\n writeback_status,\n writeback_completed_at,\n writeback_result,\n writeback_error,\n effects_status,\n effects_completed_at,\n effects_error,\n error\n ) VALUES (\n ${input.projectId},\n ${input.id},\n ${input.executionId},\n ${input.actionId},\n ${input.subject.kind},\n ${input.subject.kind === \"object\" ? input.subject.objectTypeId : null},\n ${input.subject.kind === \"object\" ? input.subject.primaryId : null},\n ${\"queued\"},\n ${\"request\"},\n ${input.queuedAt ?? new Date()},\n ${null},\n ${null},\n ${JSON.stringify(input.params)}::text::jsonb,\n ${input.idempotencyKey},\n ${null},\n ${null},\n ${null},\n ${null},\n ${null},\n ${null},\n ${null},\n ${null}\n )\n RETURNING *\n `\n\n return rowToActionRunRecord(row)\n } catch (error) {\n if (isUniqueViolation(error)) {\n return this.requeueAfterEnqueueFailure(input)\n }\n\n throw error\n }\n }\n\n private async requeueAfterEnqueueFailure(input: QueueActionRunInput): Promise<ActionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<DatabaseRow[]>`\n SELECT * FROM action_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n\n if (\n !existing ||\n !canRequeueActionRunAfterEnqueueFailure(rowToActionRunRecord(existing), input)\n ) {\n throw new ActionRunError(\n `[SixbPg] Action run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE action_runs\n SET\n status = ${\"queued\"},\n phase = ${\"request\"},\n queued_at = ${input.queuedAt ?? new Date()},\n started_at = ${null},\n finished_at = ${null},\n writeback_status = ${null},\n writeback_completed_at = ${null},\n writeback_result = ${null},\n writeback_error = ${null},\n effects_status = ${null},\n effects_completed_at = ${null},\n effects_error = ${null},\n error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n return rowToActionRunRecord(updated)\n })\n }\n\n async start(input: StartActionRunInput): Promise<ActionRunRecord> {\n const [updated] = await this.sql<DatabaseRow[]>`\n UPDATE action_runs\n SET\n status = ${\"running\"},\n phase = ${input.phase ?? \"validation\"},\n started_at = ${input.startedAt ?? new Date()},\n error = ${null}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"queued\"}\n RETURNING *\n `\n\n if (updated) {\n return rowToActionRunRecord(updated)\n }\n\n const existing = await this.getById({ projectId: input.projectId, id: input.id })\n if (!existing) {\n throw new ActionRunError(\n `[SixbPg] Action run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n throw new ActionRunError(\n `[SixbPg] Action run '${input.id}' cannot start from status '${existing.status}'.`\n )\n }\n\n async enterPhase(input: EnterActionRunPhaseInput): Promise<ActionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n await this.requireRunningRun(tx, input.projectId, input.id, \"transition phase\")\n\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE action_runs\n SET phase = ${input.phase}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n return rowToActionRunRecord(updated)\n })\n }\n\n async recordWriteback(input: RecordActionWritebackInput): Promise<ActionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existing = await this.requireRunningRun(\n tx,\n input.projectId,\n input.id,\n \"record writeback\"\n )\n const nextWriteback = toWritebackRecord(input, new Date(input.completedAt ?? new Date()))\n const currentWriteback = toActionRunWritebackRecord(existing)\n\n if (currentWriteback) {\n if (actionRunPhaseRecordsEqual(currentWriteback, nextWriteback)) {\n return rowToActionRunRecord(existing)\n }\n\n throw new ActionRunError(\n `[SixbPg] Action run '${input.id}' already has a different writeback record.`\n )\n }\n\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE action_runs\n SET\n phase = ${\"writeback\"},\n writeback_status = ${input.status},\n writeback_completed_at = ${nextWriteback.completedAt},\n writeback_result = ${input.status === \"succeeded\" ? JSON.stringify(input.result) : null}::text::jsonb,\n writeback_error = ${input.status === \"failed\" ? serializeActionRunFailure(input.error, \"writeback\") : null}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n return rowToActionRunRecord(updated)\n })\n }\n\n async recordEffects(input: RecordActionEffectsInput): Promise<ActionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existing = await this.requireRunningRun(tx, input.projectId, input.id, \"record effects\")\n const nextEffects = toEffectsRecord(input, new Date(input.completedAt ?? new Date()))\n const currentEffects = toActionRunEffectsRecord(existing)\n\n if (currentEffects) {\n if (actionRunPhaseRecordsEqual(currentEffects, nextEffects)) {\n return rowToActionRunRecord(existing)\n }\n\n throw new ActionRunError(\n `[SixbPg] Action run '${input.id}' already has a different effects record.`\n )\n }\n\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE action_runs\n SET\n phase = ${\"effects\"},\n effects_status = ${input.status},\n effects_completed_at = ${nextEffects.completedAt},\n effects_error = ${input.status === \"failed\" ? serializeActionRunFailure(input.error, \"effects\") : null}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n return rowToActionRunRecord(updated)\n })\n }\n\n async finish(input: FinishActionRunInput): Promise<ActionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<DatabaseRow[]>`\n SELECT * FROM action_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n\n if (!existing) {\n throw new ActionRunError(\n `[SixbPg] Action run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n if (isTerminalActionRun({ status: existing.status })) {\n throw new ActionRunError(\n `[SixbPg] Action run '${input.id}' cannot finish from terminal status '${existing.status}'.`\n )\n }\n\n const phase = finishActionRunPhase(input, existing.phase)\n\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE action_runs\n SET\n status = ${input.status},\n phase = ${phase},\n finished_at = ${input.finishedAt ?? new Date()},\n error = ${input.status === \"succeeded\" ? null : serializeActionRunFailure(input.error)}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n return rowToActionRunRecord(updated)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<ActionRunRecord | null> {\n const [row] = await this.sql<DatabaseRow[]>`\n SELECT * FROM action_runs\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n\n return row ? rowToActionRunRecord(row) : null\n }\n\n async list(input: ListActionRunsInput): Promise<ListActionRunsResult> {\n if ((input.statuses && input.statuses.length === 0) || input.actionIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.actionId) {\n whereClauses.push(`action_id = $${index++}`)\n params.push(input.actionId)\n }\n\n if (input.actionIds) {\n const placeholders = input.actionIds.map(() => `$${index++}`)\n whereClauses.push(`action_id IN (${placeholders.join(\", \")})`)\n params.push(...input.actionIds)\n }\n\n if (input.objectTypeIds) {\n if (input.objectTypeIds.length === 0) {\n whereClauses.push(`subject_kind <> $${index++}`)\n params.push(\"object\")\n } else {\n const subjectKindIndex = index++\n const placeholders = input.objectTypeIds.map(() => `$${index++}`)\n whereClauses.push(\n `(subject_kind <> $${subjectKindIndex} OR object_type_id IN (${placeholders.join(\", \")}))`\n )\n params.push(\"object\", ...input.objectTypeIds)\n }\n }\n\n if (input.objectTypeId) {\n whereClauses.push(`subject_kind = $${index++}`)\n params.push(\"object\")\n whereClauses.push(`object_type_id = $${index++}`)\n params.push(input.objectTypeId)\n }\n\n if (input.primaryId) {\n whereClauses.push(`subject_kind = $${index++}`)\n params.push(\"object\")\n whereClauses.push(`primary_id = $${index++}`)\n params.push(input.primaryId)\n }\n\n if (input.subject) {\n whereClauses.push(`subject_kind = $${index++}`)\n params.push(input.subject.kind)\n if (input.subject.kind === \"object\") {\n whereClauses.push(`object_type_id = $${index++}`)\n params.push(input.subject.objectTypeId)\n whereClauses.push(`primary_id = $${index++}`)\n params.push(input.subject.primaryId)\n }\n }\n\n if (input.statuses) {\n const placeholders = input.statuses.map(() => `$${index++}`)\n whereClauses.push(`status IN (${placeholders.join(\", \")})`)\n params.push(...input.statuses)\n }\n\n if (input.startedAfter) {\n whereClauses.push(`COALESCE(started_at, queued_at) >= $${index++}`)\n params.push(input.startedAfter)\n }\n\n if (input.startedBefore) {\n whereClauses.push(`COALESCE(started_at, queued_at) <= $${index++}`)\n params.push(input.startedBefore)\n }\n\n const where = `WHERE ${whereClauses.join(\" AND \")}`\n const order = input.order === \"asc\" ? \"ASC\" : \"DESC\"\n const offset = input.offset ?? 0\n\n const [totalRow] = await this.sql.unsafe<{ count: string | number }[]>(\n `SELECT COUNT(*)::bigint AS count FROM action_runs ${where}`,\n params\n )\n\n const queryParams = [...params]\n let query = `\n SELECT * FROM action_runs\n ${where}\n ORDER BY COALESCE(started_at, queued_at) ${order}, id ${order}\n `\n\n if (input.limit !== undefined) {\n query += ` LIMIT $${index++} OFFSET $${index++}`\n queryParams.push(input.limit, offset)\n } else if (offset > 0) {\n query += ` OFFSET $${index++}`\n queryParams.push(offset)\n }\n\n const rows = await this.sql.unsafe<DatabaseRow[]>(query, queryParams)\n const total = Number(totalRow?.count ?? 0)\n const runs = rows.map((row) => rowToActionRunRecord(row))\n\n return {\n runs,\n hasMore: offset + runs.length < total,\n total,\n }\n }\n\n private async requireRunningRun(\n runner: SQLClient,\n projectId: string,\n id: string,\n operation: string\n ): Promise<DatabaseRow> {\n const [existing] = await runner<DatabaseRow[]>`\n SELECT * FROM action_runs\n WHERE project_id = ${projectId} AND id = ${id}\n FOR UPDATE\n `\n\n if (!existing) {\n throw new ActionRunError(`[SixbPg] Action run '${id}' not found for project '${projectId}'.`)\n }\n\n if (existing.status !== \"running\") {\n throw new ActionRunError(\n `[SixbPg] Action run '${id}' cannot ${operation} from status '${existing.status}'.`\n )\n }\n\n return existing\n }\n}\n\nfunction toActionRunFailure(row: DatabaseRow): ActionRunFailure | undefined {\n return row.error === null ? undefined : parseActionRunFailure(row.error)\n}\n\nfunction parsePhaseFailure<TPhase extends Extract<ActionRunPhase, \"writeback\" | \"effects\">>(\n value: unknown,\n expectedPhase: TPhase\n): ActionRunFailure<TPhase> {\n return parseActionRunFailure(value, expectedPhase)\n}\n\nfunction toActionRunWritebackRecord(row: DatabaseRow): ActionRunWritebackRecord | undefined {\n if (!row.writeback_status) {\n return undefined\n }\n\n const completedAt = row.writeback_completed_at\n ? new Date(row.writeback_completed_at)\n : new Date(row.queued_at)\n\n if (row.writeback_status === \"succeeded\") {\n return {\n status: \"succeeded\",\n completedAt,\n result: (row.writeback_result ?? null) as JsonValue,\n }\n }\n\n return {\n status: \"failed\",\n completedAt,\n error: parsePhaseFailure(row.writeback_error, \"writeback\"),\n }\n}\n\nfunction toActionRunEffectsRecord(row: DatabaseRow): ActionRunEffectsRecord | undefined {\n if (!row.effects_status) {\n return undefined\n }\n\n const completedAt = row.effects_completed_at\n ? new Date(row.effects_completed_at)\n : new Date(row.queued_at)\n\n if (row.effects_status === \"succeeded\") {\n return {\n status: \"succeeded\",\n completedAt,\n }\n }\n\n return {\n status: \"failed\",\n completedAt,\n error: parsePhaseFailure(row.effects_error, \"effects\"),\n }\n}\n\nfunction toWritebackRecord(\n input: RecordActionWritebackInput,\n completedAt: Date\n): ActionRunWritebackRecord {\n if (input.status === \"succeeded\") {\n return {\n status: \"succeeded\",\n completedAt,\n result: input.result,\n }\n }\n\n return {\n status: \"failed\",\n completedAt,\n error: input.error,\n }\n}\n\nfunction toEffectsRecord(\n input: RecordActionEffectsInput,\n completedAt: Date\n): ActionRunEffectsRecord {\n if (input.status === \"succeeded\") {\n return {\n status: \"succeeded\",\n completedAt,\n }\n }\n\n return {\n status: \"failed\",\n completedAt,\n error: input.error,\n }\n}\n\nfunction rowToActionRunRecord(row: DatabaseRow): ActionRunRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n actionId: row.action_id,\n subject: rowToActionSubject(row),\n status: row.status,\n phase: row.phase ?? undefined,\n queuedAt: new Date(row.queued_at),\n startedAt: row.started_at ? new Date(row.started_at) : undefined,\n finishedAt: row.finished_at ? new Date(row.finished_at) : undefined,\n params: row.params,\n idempotencyKey: row.idempotency_key,\n writeback: toActionRunWritebackRecord(row),\n effects: toActionRunEffectsRecord(row),\n error: toActionRunFailure(row),\n }\n}\n\nfunction rowToActionSubject(row: DatabaseRow): ActionSubject {\n if (row.subject_kind === \"none\") {\n return { kind: \"none\" }\n }\n\n if (!row.object_type_id || !row.primary_id) {\n throw new ActionRunError(`[SixbPg] Action run '${row.id}' has an invalid object subject.`)\n }\n\n return {\n kind: \"object\",\n objectTypeId: row.object_type_id,\n primaryId: row.primary_id,\n }\n}\n\ninterface DatabaseRow {\n project_id: string\n id: string\n execution_id: string\n action_id: string\n subject_kind: ActionSubject[\"kind\"]\n object_type_id: string | null\n primary_id: string | null\n status: ActionRunRecord[\"status\"]\n phase: ActionRunPhase | null\n queued_at: Date | string\n started_at: Date | string | null\n finished_at: Date | string | null\n params: ActionRunParams\n idempotency_key: string\n writeback_status: ActionRunWritebackRecord[\"status\"] | null\n writeback_completed_at: Date | string | null\n writeback_result: JsonValue | null\n writeback_error: unknown | null\n effects_status: ActionRunEffectsRecord[\"status\"] | null\n effects_completed_at: Date | string | null\n effects_error: unknown | null\n error: unknown | null\n}\n",
51
- "import {\n type AiAccountingAggregateFragment,\n type AiAccountingRecordSetItem,\n aiModelCallCostDetails,\n aiModelCallCostMatchesUsage,\n buildAiAccountingOverviewFromFragments,\n directModelCallAttribution,\n normalizeAiAccountingQuery,\n normalizeAiModelCallAccountingQuery,\n normalizeAiModelCallCostRecord,\n parseAiModelCallCostDetails,\n toAccountingItem,\n} from \"@sixb/core/internal/ai-cost-storage-provider\"\nimport { normalizeModelProviderIds } from \"@sixb/core/models\"\nimport type { ReadonlyJsonObject } from \"@sixb/core/storage\"\nimport {\n type AiAccountingOverview,\n type AiCostStorage,\n AiCostStorageError,\n type AiCostSummary,\n type AiModelCallCostRecord,\n type AiModelCallUsageRecord,\n type ListAiModelCallAccountingInput,\n type ListAiModelCallAccountingResult,\n type ListAiModelCallGroupsInput,\n type ListAiModelCallGroupsResult,\n type QueryAiAccountingOverviewInput,\n type SummarizeAiCostExecutionsInput,\n} from \"@sixb/core/storage\"\nimport { listAiModelCallGroups } from \"./ai-cost-groups\"\nimport { requestedReasoningFromRow } from \"./pg-ai-usage-storage\"\nimport type { PgStoreClient } from \"./transactions\"\nimport { runPgTransaction } from \"./transactions\"\n\n/** PostgreSQL-backed immutable valuations stored in one append-only table. */\nexport class PgAiCostStorage implements AiCostStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async listModelCallGroups(\n input: ListAiModelCallGroupsInput\n ): Promise<ListAiModelCallGroupsResult> {\n return listAiModelCallGroups(this.sql, input)\n }\n\n async recordModelCallCost(input: AiModelCallCostRecord): Promise<void> {\n const record = normalizeAiModelCallCostRecord(input)\n await runPgTransaction(this.sql, async (tx) => {\n const usage = await findUsage(tx, record.projectId, record.usageRecordId)\n if (!usage) throw missingUsage(record)\n assertCostMatchesUsage(record, usage)\n if (await findCost(tx, record.projectId, record.usageRecordId)) return\n const rated = record.status === \"rated\" ? record : undefined\n const inserted = await tx<{ usage_record_id: string }[]>`\n INSERT INTO ai_model_call_valuations (\n project_id, usage_record_id, status, provider_id, model_id,\n currency, amount_nanos, reason, details, rated_at\n ) VALUES (\n ${record.projectId}, ${record.usageRecordId}, ${record.status},\n ${record.billingIdentity?.providerId ?? null},\n ${record.billingIdentity?.modelId ?? null}, ${rated?.money.currency ?? null},\n ${rated?.money.amountNanos ?? null},\n ${record.status === \"unpriceable\" ? record.reason : null},\n ${JSON.stringify(aiModelCallCostDetails(record))}::text::jsonb, ${record.ratedAt}\n )\n ON CONFLICT DO NOTHING\n RETURNING usage_record_id\n `\n if (inserted.length === 0 && !(await findCost(tx, record.projectId, record.usageRecordId))) {\n throw new Error(\"[SixbPg] AI valuation insert conflicted without a visible row.\")\n }\n })\n }\n\n async summarizeExecutions(\n input: SummarizeAiCostExecutionsInput\n ): Promise<readonly AiCostSummary[]> {\n assertNonBlank(input.projectId, \"cost summary projectId\")\n for (const id of input.executionIds) assertNonBlank(id, \"cost summary executionId\")\n if (input.executionIds.length === 0) return []\n const ids = [...new Set(input.executionIds)]\n const rows = await this.sql<SummaryRow[]>`\n WITH requested(execution_id) AS (\n SELECT DISTINCT * FROM unnest(${this.sql.array(ids)}::text[])\n )\n SELECT usage.execution_id,\n cost.status,\n cost.currency,\n cost.amount_nanos\n FROM requested\n JOIN ai_model_call_usage AS usage\n ON usage.project_id = ${input.projectId} AND usage.execution_id = requested.execution_id\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n `\n return aggregateSummaryRows(input.executionIds, rows)\n }\n\n async queryProjectOverview(input: QueryAiAccountingOverviewInput): Promise<AiAccountingOverview> {\n const query = normalizeAiAccountingQuery(input)\n const providerId = query.providerId ?? null\n const modelId = query.modelId ?? null\n const rows = await this.sql<AggregateRow[]>`\n WITH filtered AS (\n SELECT usage.provider_id,\n usage.requested_model_id,\n usage.occurred_at,\n usage.input_tokens,\n usage.output_tokens,\n usage.uncached_input_tokens,\n usage.cache_read_input_tokens,\n usage.cache_write_input_tokens,\n usage.text_output_tokens,\n usage.reasoning_output_tokens,\n usage.reporting_status,\n CASE\n WHEN direct_agent.kind = 'conversation' THEN 'agent'\n WHEN workflow_agent.node_run_id IS NOT NULL THEN 'workflowAgent'\n ELSE NULL\n END AS attribution_agent_kind,\n workflow_node.node_id AS attribution_agent_step_id,\n COALESCE(workflow_node.workflow_id,\n CASE WHEN execution.executor_kind = 'workflow' THEN execution.authority_primitive_id END\n ) AS attribution_workflow_id,\n cost.status AS cost_status,\n cost.currency AS cost_currency,\n cost.amount_nanos AS cost_amount_nanos\n FROM ai_model_call_usage AS usage\n JOIN executions AS execution ON execution.project_id = usage.project_id AND execution.id = usage.execution_id\n LEFT JOIN agent_runs AS direct_agent\n ON direct_agent.project_id = usage.project_id\n AND direct_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_agent_node_runs AS workflow_agent\n ON workflow_agent.project_id = usage.project_id\n AND workflow_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_node_runs AS workflow_node\n ON workflow_node.project_id = workflow_agent.project_id\n AND workflow_node.id = workflow_agent.node_run_id\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n WHERE usage.project_id = ${query.projectId}\n AND usage.occurred_at >= ${query.from} AND usage.occurred_at < ${query.to}\n AND (${providerId}::text IS NULL OR usage.provider_id = ${providerId})\n AND (${modelId}::text IS NULL OR usage.requested_model_id = ${modelId})\n ), classified AS (\n SELECT filtered.*,\n CASE\n WHEN cost_status = 'rated' THEN 'rated'\n WHEN cost_status = 'unpriceable' THEN 'unpriceable'\n ELSE 'unvalued'\n END AS valuation_status,\n CASE WHEN cost_status = 'rated' THEN cost_currency ELSE NULL END AS amount_currency,\n CASE WHEN cost_status = 'rated' THEN cost_amount_nanos ELSE NULL END AS amount_nanos\n FROM filtered\n ), expanded AS (\n SELECT 'totals'::text AS dimension,\n NULL::text AS key_1,\n NULL::text AS key_2,\n NULL::text AS key_3,\n NULL::timestamptz AS bucket_start,\n classified.*\n FROM classified\n UNION ALL\n SELECT 'series', NULL, NULL, NULL,\n CASE ${input.bucket}::text\n WHEN 'hour' THEN\n date_trunc('hour', occurred_at AT TIME ZONE 'UTC') AT TIME ZONE 'UTC'\n WHEN 'day' THEN\n date_trunc('day', occurred_at AT TIME ZONE 'UTC') AT TIME ZONE 'UTC'\n ELSE date_trunc('week', occurred_at AT TIME ZONE 'UTC') AT TIME ZONE 'UTC'\n END,\n classified.*\n FROM classified\n UNION ALL\n SELECT 'model', provider_id, requested_model_id, NULL, NULL, classified.* FROM classified\n UNION ALL\n SELECT 'agent', attribution_agent_kind, attribution_workflow_id, attribution_agent_step_id, NULL, classified.*\n FROM classified WHERE attribution_agent_kind IS NOT NULL\n UNION ALL\n SELECT 'workflow', attribution_workflow_id, NULL, NULL, NULL, classified.*\n FROM classified WHERE attribution_workflow_id IS NOT NULL\n )\n SELECT dimension,\n key_1,\n key_2,\n key_3,\n bucket_start,\n amount_currency,\n COUNT(*)::text AS model_call_count,\n COUNT(*) FILTER (WHERE reporting_status <> 'unavailable')::text\n AS reported_usage_call_count,\n COUNT(*) FILTER (WHERE input_tokens IS NOT NULL AND output_tokens IS NOT NULL)::text\n AS complete_usage_call_count,\n COUNT(input_tokens)::text AS input_tokens_count,\n SUM(input_tokens)::text AS input_tokens_sum,\n COUNT(output_tokens)::text AS output_tokens_count,\n SUM(output_tokens)::text AS output_tokens_sum,\n COUNT(uncached_input_tokens)::text AS uncached_input_tokens_count,\n SUM(uncached_input_tokens)::text AS uncached_input_tokens_sum,\n COUNT(cache_read_input_tokens)::text AS cache_read_input_tokens_count,\n SUM(cache_read_input_tokens)::text AS cache_read_input_tokens_sum,\n COUNT(cache_write_input_tokens)::text AS cache_write_input_tokens_count,\n SUM(cache_write_input_tokens)::text AS cache_write_input_tokens_sum,\n COUNT(text_output_tokens)::text AS text_output_tokens_count,\n SUM(text_output_tokens)::text AS text_output_tokens_sum,\n COUNT(reasoning_output_tokens)::text AS reasoning_output_tokens_count,\n SUM(reasoning_output_tokens)::text AS reasoning_output_tokens_sum,\n COUNT(*) FILTER (WHERE valuation_status = 'rated')::text AS rated_call_count,\n COUNT(*) FILTER (WHERE valuation_status = 'unpriceable')::text\n AS unpriceable_call_count,\n COUNT(*) FILTER (WHERE valuation_status = 'unvalued')::text\n AS unvalued_call_count,\n SUM(amount_nanos)::text AS amount_nanos\n FROM expanded\n GROUP BY dimension, key_1, key_2, key_3, bucket_start, amount_currency\n `\n return buildAiAccountingOverviewFromFragments(input, rows.map(aggregateFragmentFromRow))\n }\n\n async listModelCalls(\n input: ListAiModelCallAccountingInput\n ): Promise<ListAiModelCallAccountingResult> {\n const query = normalizeAiModelCallAccountingQuery(input)\n const providerId = query.providerId ?? null\n const modelId = query.modelId ?? null\n const executionId = query.executionId ?? null\n const valuationStatus = query.valuationStatus ?? null\n const [count] = await this.sql<CountRow[]>`\n SELECT COUNT(*)::text AS total\n FROM ai_model_call_usage AS usage\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n WHERE usage.project_id = ${query.projectId}\n AND usage.occurred_at >= ${query.from} AND usage.occurred_at < ${query.to}\n AND (${providerId}::text IS NULL OR usage.provider_id = ${providerId})\n AND (${modelId}::text IS NULL OR usage.requested_model_id = ${modelId})\n AND (${executionId}::text IS NULL OR usage.execution_id = ${executionId})\n AND (\n ${valuationStatus}::text IS NULL OR ${valuationStatus} = CASE\n WHEN cost.status = 'rated' THEN 'rated'\n WHEN cost.status = 'unpriceable' THEN 'unpriceable'\n ELSE 'unvalued'\n END\n )\n `\n const rows = await this.sql<JoinedRow[]>`\n SELECT usage.*,\n CASE\n WHEN direct_agent.kind = 'conversation' THEN 'agent'\n WHEN direct_agent.kind = 'subagent' THEN 'subagent'\n WHEN workflow_agent.node_run_id IS NOT NULL THEN 'workflowAgent'\n ELSE NULL\n END AS attribution_kind,\n workflow_node.node_id AS attribution_agent_step_id,\n direct_agent.id AS attribution_agent_run_id,\n direct_agent.thread_id AS attribution_thread_id,\n direct_agent.parent_run_id AS attribution_parent_run_id,\n workflow_agent.node_run_id AS attribution_node_run_id,\n workflow_node.workflow_id AS attribution_workflow_id,\n workflow_node.workflow_run_id AS attribution_workflow_run_id,\n execution.executor_kind, execution.executor_id, execution.authority_primitive_id AS primitive_id,\n COALESCE((\n SELECT jsonb_agg(groups.group_id ORDER BY groups.group_id)\n FROM ai_model_call_usage_groups AS groups\n WHERE groups.project_id = usage.project_id AND groups.usage_record_id = usage.id\n ), '[]'::jsonb) AS requester_group_ids,\n cost.status AS cost_status,\n cost.provider_id AS cost_provider_id,\n cost.model_id AS cost_model_id,\n cost.currency AS cost_currency,\n cost.amount_nanos AS cost_amount_nanos,\n cost.reason AS cost_reason,\n cost.details AS cost_details,\n cost.rated_at AS cost_rated_at\n FROM ai_model_call_usage AS usage\n JOIN executions AS execution ON execution.project_id = usage.project_id AND execution.id = usage.execution_id\n LEFT JOIN agent_runs AS direct_agent\n ON direct_agent.project_id = usage.project_id\n AND direct_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_agent_node_runs AS workflow_agent\n ON workflow_agent.project_id = usage.project_id\n AND workflow_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_node_runs AS workflow_node\n ON workflow_node.project_id = workflow_agent.project_id\n AND workflow_node.id = workflow_agent.node_run_id\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n WHERE usage.project_id = ${query.projectId}\n AND usage.occurred_at >= ${query.from} AND usage.occurred_at < ${query.to}\n AND (${providerId}::text IS NULL OR usage.provider_id = ${providerId})\n AND (${modelId}::text IS NULL OR usage.requested_model_id = ${modelId})\n AND (${executionId}::text IS NULL OR usage.execution_id = ${executionId})\n AND (\n ${valuationStatus}::text IS NULL OR ${valuationStatus} = CASE\n WHEN cost.status = 'rated' THEN 'rated'\n WHEN cost.status = 'unpriceable' THEN 'unpriceable'\n ELSE 'unvalued'\n END\n )\n ORDER BY usage.occurred_at DESC, usage.id ASC\n LIMIT ${query.limit} OFFSET ${query.offset}\n `\n const items = rows.map((row) => toAccountingItem(accountingItemFromRow(row)))\n if (!count) throw new Error(\"[SixbPg] AI accounting count query returned no row.\")\n const total = safeSqlCount(count.total, \"model-call list total\")\n return structuredClone({\n items,\n total,\n hasMore: query.offset + items.length < total,\n })\n }\n}\n\ninterface ValuationRow {\n readonly project_id: string\n readonly usage_record_id: string\n readonly status: \"rated\" | \"unpriceable\"\n readonly provider_id: string | null\n readonly model_id: string | null\n readonly currency: string | null\n readonly amount_nanos: string | null\n readonly reason: string | null\n readonly details: unknown\n readonly rated_at: Date | string\n}\n\ninterface UsageRow {\n readonly project_id: string\n readonly id: string\n readonly execution_id: string\n readonly attempt: number | string\n readonly call_id: string\n readonly provider_id: string\n readonly requested_model_id: string\n readonly requested_reasoning: string | Record<string, unknown> | null\n readonly response_model_id: string | null\n readonly response_id: string\n readonly input_tokens: number | string | null\n readonly output_tokens: number | string | null\n readonly total_tokens: number | string | null\n readonly uncached_input_tokens: number | string | null\n readonly cache_read_input_tokens: number | string | null\n readonly cache_write_input_tokens: number | string | null\n readonly text_output_tokens: number | string | null\n readonly reasoning_output_tokens: number | string | null\n readonly reporting_status: AiModelCallUsageRecord[\"usage\"][\"reportingStatus\"]\n readonly raw_usage: ReadonlyJsonObject | string | null\n readonly provider_ids: Record<string, unknown> | string | null\n readonly occurred_at: Date | string\n readonly recorded_at: Date | string\n}\n\ninterface JoinedRow extends UsageRow {\n readonly executor_kind: string | null\n readonly executor_id: string | null\n readonly primitive_id: string | null\n readonly attribution_kind: \"agent\" | \"subagent\" | \"workflowAgent\" | null\n readonly attribution_agent_step_id: string | null\n readonly attribution_agent_run_id: string | null\n readonly attribution_thread_id: string | null\n readonly attribution_parent_run_id: string | null\n readonly attribution_node_run_id: string | null\n readonly attribution_workflow_id: string | null\n readonly attribution_workflow_run_id: string | null\n readonly requester_group_ids: unknown\n readonly cost_status: ValuationRow[\"status\"] | null\n readonly cost_provider_id: string | null\n readonly cost_model_id: string | null\n readonly cost_currency: string | null\n readonly cost_amount_nanos: string | null\n readonly cost_reason: string | null\n readonly cost_details: unknown\n readonly cost_rated_at: Date | string | null\n}\n\ninterface AggregateRow {\n readonly dimension: AiAccountingAggregateFragment[\"dimension\"]\n readonly key_1: string | null\n readonly key_2: string | null\n readonly key_3: string | null\n readonly bucket_start: Date | string | null\n readonly amount_currency: string | null\n readonly model_call_count: string\n readonly reported_usage_call_count: string\n readonly complete_usage_call_count: string\n readonly input_tokens_count: string\n readonly input_tokens_sum: string | null\n readonly output_tokens_count: string\n readonly output_tokens_sum: string | null\n readonly uncached_input_tokens_count: string\n readonly uncached_input_tokens_sum: string | null\n readonly cache_read_input_tokens_count: string\n readonly cache_read_input_tokens_sum: string | null\n readonly cache_write_input_tokens_count: string\n readonly cache_write_input_tokens_sum: string | null\n readonly text_output_tokens_count: string\n readonly text_output_tokens_sum: string | null\n readonly reasoning_output_tokens_count: string\n readonly reasoning_output_tokens_sum: string | null\n readonly rated_call_count: string\n readonly unpriceable_call_count: string\n readonly unvalued_call_count: string\n readonly amount_nanos: string | null\n}\n\ninterface CountRow {\n readonly total: string\n}\n\ninterface SummaryRow {\n readonly execution_id: string\n readonly status: ValuationRow[\"status\"] | null\n readonly currency: string | null\n readonly amount_nanos: string | null\n}\n\nasync function findCost(\n sql: PgStoreClient,\n projectId: string,\n usageId: string\n): Promise<AiModelCallCostRecord | null> {\n const [row] = await sql<ValuationRow[]>`\n SELECT * FROM ai_model_call_valuations\n WHERE project_id = ${projectId} AND usage_record_id = ${usageId}\n `\n return row ? rowToCost(row) : null\n}\n\nasync function findUsage(\n sql: PgStoreClient,\n projectId: string,\n id: string\n): Promise<AiModelCallUsageRecord | null> {\n const [row] = await sql<UsageRow[]>`\n SELECT * FROM ai_model_call_usage WHERE project_id = ${projectId} AND id = ${id}\n `\n return row ? usageFromRow(row, []) : null\n}\n\nfunction aggregateFragmentFromRow(row: AggregateRow): AiAccountingAggregateFragment {\n const dimensionKeys =\n row.dimension === \"model\"\n ? { providerId: required(row.key_1), modelId: required(row.key_2) }\n : row.dimension === \"agent\"\n ? {\n agentKind: required(row.key_1) as \"agent\" | \"workflowAgent\",\n ...(row.key_1 === \"workflowAgent\"\n ? { workflowId: required(row.key_2), agentStepId: required(row.key_3) }\n : {}),\n }\n : row.dimension === \"workflow\"\n ? { workflowId: required(row.key_1) }\n : row.dimension === \"series\"\n ? { start: new Date(required(row.bucket_start)) }\n : {}\n return {\n dimension: row.dimension,\n ...dimensionKeys,\n modelCallCount: row.model_call_count,\n usage: {\n reportedCallCount: row.reported_usage_call_count,\n completeCallCount: row.complete_usage_call_count,\n inputTokens: meterFragment(row.input_tokens_count, row.input_tokens_sum),\n outputTokens: meterFragment(row.output_tokens_count, row.output_tokens_sum),\n uncachedInputTokens: meterFragment(\n row.uncached_input_tokens_count,\n row.uncached_input_tokens_sum\n ),\n cacheReadInputTokens: meterFragment(\n row.cache_read_input_tokens_count,\n row.cache_read_input_tokens_sum\n ),\n cacheWriteInputTokens: meterFragment(\n row.cache_write_input_tokens_count,\n row.cache_write_input_tokens_sum\n ),\n textOutputTokens: meterFragment(row.text_output_tokens_count, row.text_output_tokens_sum),\n reasoningOutputTokens: meterFragment(\n row.reasoning_output_tokens_count,\n row.reasoning_output_tokens_sum\n ),\n },\n costs: {\n ...(row.amount_currency === null || row.amount_nanos === null\n ? {}\n : {\n amount: {\n currency: row.amount_currency,\n amountNanos: row.amount_nanos,\n },\n }),\n ratedCallCount: row.rated_call_count,\n unpriceableCallCount: row.unpriceable_call_count,\n unvaluedCallCount: row.unvalued_call_count,\n },\n }\n}\n\nfunction meterFragment(presentCallCount: string, total: string | null) {\n return { presentCallCount, total }\n}\n\nfunction accountingItemFromRow(row: JoinedRow): AiAccountingRecordSetItem {\n const usage = usageFromRow(row, parseStringArray(row.requester_group_ids))\n const cost = row.cost_status === null ? undefined : costFromJoinedRow(row)\n const attribution =\n row.attribution_kind === null\n ? directModelCallAttribution(row.executor_kind, row.executor_id, row.primitive_id)\n : row.attribution_kind === \"agent\"\n ? {\n kind: \"agent\" as const,\n agentRunId: required(row.attribution_agent_run_id),\n threadId: required(row.attribution_thread_id),\n }\n : row.attribution_kind === \"subagent\"\n ? {\n kind: \"subagent\" as const,\n subagentRunId: required(row.attribution_agent_run_id),\n parentRunId: required(row.attribution_parent_run_id),\n }\n : {\n kind: \"workflowAgent\" as const,\n agentStepId: required(row.attribution_agent_step_id),\n nodeRunId: required(row.attribution_node_run_id),\n workflowId: required(row.attribution_workflow_id),\n workflowRunId: required(row.attribution_workflow_run_id),\n }\n return {\n usage,\n ...(attribution ? { attribution } : {}),\n ...(cost ? { cost } : {}),\n }\n}\n\nfunction usageFromRow(row: UsageRow, requesterGroupIds: readonly string[]): AiModelCallUsageRecord {\n const number = (value: number | string | null) => (value === null ? undefined : Number(value))\n return {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n attempt: Number(row.attempt),\n callId: row.call_id,\n requesterGroupIds,\n providerId: row.provider_id,\n ...(row.provider_ids === null\n ? {}\n : {\n providerIds: normalizeModelProviderIds(\n typeof row.provider_ids === \"string\" ? JSON.parse(row.provider_ids) : row.provider_ids\n ),\n }),\n requestedModelId: row.requested_model_id,\n ...(row.requested_reasoning === null\n ? {}\n : { requestedReasoning: requestedReasoningFromRow(row.requested_reasoning) }),\n ...(row.response_model_id === null ? {} : { responseModelId: row.response_model_id }),\n responseId: row.response_id,\n usage: {\n ...(number(row.input_tokens) === undefined ? {} : { inputTokens: number(row.input_tokens) }),\n ...(number(row.output_tokens) === undefined\n ? {}\n : { outputTokens: number(row.output_tokens) }),\n ...(number(row.total_tokens) === undefined ? {} : { totalTokens: number(row.total_tokens) }),\n ...(number(row.uncached_input_tokens) === undefined\n ? {}\n : { uncachedInputTokens: number(row.uncached_input_tokens) }),\n ...(number(row.cache_read_input_tokens) === undefined\n ? {}\n : { cacheReadInputTokens: number(row.cache_read_input_tokens) }),\n ...(number(row.cache_write_input_tokens) === undefined\n ? {}\n : { cacheWriteInputTokens: number(row.cache_write_input_tokens) }),\n ...(number(row.text_output_tokens) === undefined\n ? {}\n : { textOutputTokens: number(row.text_output_tokens) }),\n ...(number(row.reasoning_output_tokens) === undefined\n ? {}\n : { reasoningOutputTokens: number(row.reasoning_output_tokens) }),\n reportingStatus: row.reporting_status,\n },\n ...(row.raw_usage === null ? {} : { rawUsage: parseJsonObject(row.raw_usage) }),\n occurredAt: new Date(row.occurred_at),\n recordedAt: new Date(row.recorded_at),\n }\n}\n\nfunction rowToCost(row: ValuationRow): AiModelCallCostRecord {\n return costRecord({\n projectId: row.project_id,\n usageId: row.usage_record_id,\n status: row.status,\n providerId: row.provider_id,\n modelId: row.model_id,\n currency: row.currency,\n amountNanos: row.amount_nanos,\n reason: row.reason,\n details: row.details,\n ratedAt: row.rated_at,\n })\n}\n\nfunction costFromJoinedRow(row: JoinedRow): AiModelCallCostRecord {\n return costRecord({\n projectId: row.project_id,\n usageId: row.id,\n status: required(row.cost_status),\n providerId: row.cost_provider_id,\n modelId: row.cost_model_id,\n currency: row.cost_currency,\n amountNanos: row.cost_amount_nanos,\n reason: row.cost_reason,\n details: row.cost_details,\n ratedAt: required(row.cost_rated_at),\n })\n}\n\nfunction costRecord(input: {\n projectId: string\n usageId: string\n status: ValuationRow[\"status\"]\n providerId: string | null\n modelId: string | null\n currency: string | null\n amountNanos: string | null\n reason: string | null\n details: unknown\n ratedAt: Date | string\n}): AiModelCallCostRecord {\n const details = parseAiModelCallCostDetails(input.details)\n const priceSource =\n details.priceSource === undefined\n ? undefined\n : { ...details.priceSource, observedAt: new Date(details.priceSource.observedAt) }\n const base = {\n ...(details.estimate === undefined ? {} : { estimate: details.estimate }),\n projectId: input.projectId,\n usageRecordId: input.usageId,\n pricingContext: details.pricingContext,\n ratedAt: new Date(input.ratedAt),\n }\n if (input.status === \"rated\") {\n return normalizeAiModelCallCostRecord({\n ...base,\n status: \"rated\",\n billingIdentity: { providerId: required(input.providerId), modelId: required(input.modelId) },\n priceSource: required(priceSource),\n money: { currency: required(input.currency), amountNanos: required(input.amountNanos) },\n components: required(details.components),\n })\n }\n return normalizeAiModelCallCostRecord({\n ...base,\n status: \"unpriceable\",\n ...(input.providerId && input.modelId\n ? { billingIdentity: { providerId: input.providerId, modelId: input.modelId } }\n : {}),\n ...(priceSource === undefined ? {} : { priceSource }),\n reason: required(input.reason) as Extract<\n AiModelCallCostRecord,\n { status: \"unpriceable\" }\n >[\"reason\"],\n ...(details.missingMeters ? { missingMeters: details.missingMeters } : {}),\n })\n}\n\nfunction aggregateSummaryRows(\n ids: readonly string[],\n rows: readonly SummaryRow[]\n): AiCostSummary[] {\n const map = new Map(ids.map((id) => [id, accumulator()]))\n for (const row of rows) {\n const value = map.get(row.execution_id)\n if (!value) continue\n if (row.status === null) value.unvaluedCallCount += 1\n else if (row.status === \"unpriceable\") value.unpriceableCallCount += 1\n else {\n value.ratedCallCount += 1\n add(value.amounts, required(row.currency), required(row.amount_nanos))\n }\n }\n return ids.map((id) => finish(map.get(id)!))\n}\n\ninterface Accumulator {\n amounts: Map<string, bigint>\n ratedCallCount: number\n unpriceableCallCount: number\n unvaluedCallCount: number\n}\n\nfunction accumulator(): Accumulator {\n return {\n amounts: new Map(),\n ratedCallCount: 0,\n unpriceableCallCount: 0,\n unvaluedCallCount: 0,\n }\n}\n\nfunction finish(value: Accumulator): AiCostSummary {\n return {\n amounts: [...value.amounts]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amount]) => ({ currency, amountNanos: amount.toString() })),\n ratedCallCount: value.ratedCallCount,\n unpriceableCallCount: value.unpriceableCallCount,\n unvaluedCallCount: value.unvaluedCallCount,\n }\n}\n\nfunction add(amounts: Map<string, bigint>, currency: string, amount: string): void {\n amounts.set(currency, (amounts.get(currency) ?? 0n) + BigInt(amount))\n}\n\nfunction parseStringArray(value: unknown): string[] {\n const parsed: unknown = typeof value === \"string\" ? JSON.parse(value) : value\n if (!Array.isArray(parsed) || parsed.some((item) => typeof item !== \"string\")) {\n throw new Error(\"[SixbPg] AI requester group ids are invalid.\")\n }\n return parsed\n}\n\nfunction parseJsonObject(value: unknown): ReadonlyJsonObject {\n return (typeof value === \"string\" ? JSON.parse(value) : value) as ReadonlyJsonObject\n}\n\nfunction assertCostMatchesUsage(\n record: AiModelCallCostRecord,\n usage: AiModelCallUsageRecord\n): void {\n if (!aiModelCallCostMatchesUsage(record, usage)) {\n throw new AiCostStorageError(\n \"cost_mismatch\",\n `[SixbPg] AI valuation for usage '${record.usageRecordId}' does not match its usage record.`\n )\n }\n}\n\nfunction missingUsage(record: { projectId: string; usageRecordId: string }) {\n return new AiCostStorageError(\n \"missing_usage\",\n `[SixbPg] AI usage '${record.usageRecordId}' does not exist.`\n )\n}\n\nfunction assertNonBlank(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI ${field} must be nonblank.`)\n }\n}\n\nfunction safeSqlCount(value: string, field: string): number {\n if (!/^(0|[1-9]\\d*)$/.test(value)) {\n throw new Error(`[SixbPg] AI accounting ${field} is invalid.`)\n }\n const count = Number(value)\n if (!Number.isSafeInteger(count)) {\n throw new TypeError(`[Sixb] AI accounting ${field} exceeds the safe integer range.`)\n }\n return count\n}\n\nfunction required<T>(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error(\"[SixbPg] AI valuation column is unexpectedly null.\")\n }\n return value\n}\n",
58
+ "import {\n type AiAccountingAggregateFragment,\n type AiAccountingRecordSetItem,\n aiModelCallCostDetails,\n aiModelCallCostMatchesUsage,\n buildAiAccountingOverviewFromFragments,\n directModelCallAttribution,\n normalizeAiAccountingQuery,\n normalizeAiModelCallAccountingQuery,\n normalizeAiModelCallCostRecord,\n parseAiModelCallCostDetails,\n toAccountingItem,\n} from \"@sixb/core/internal/ai-cost-storage-provider\"\nimport { normalizeModelProviderIds } from \"@sixb/core/models\"\nimport type { ReadonlyJsonObject } from \"@sixb/core/storage\"\nimport {\n type AiAccountingOverview,\n type AiCostStorage,\n AiCostStorageError,\n type AiCostSummary,\n type AiModelCallCostRecord,\n type AiModelCallUsageRecord,\n type ListAiModelCallAccountingInput,\n type ListAiModelCallAccountingResult,\n type ListAiModelCallGroupsInput,\n type ListAiModelCallGroupsResult,\n type QueryAiAccountingOverviewInput,\n type SummarizeAiCostExecutionsInput,\n} from \"@sixb/core/storage\"\nimport { listAiModelCallGroups } from \"./ai-cost-groups\"\nimport { requestedReasoningFromRow } from \"./pg-ai-usage-storage\"\nimport type { PgStoreClient } from \"./transactions\"\nimport { runPgTransaction } from \"./transactions\"\n\n/** PostgreSQL-backed immutable valuations stored in one append-only table. */\nexport class PgAiCostStorage implements AiCostStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async listModelCallGroups(\n input: ListAiModelCallGroupsInput\n ): Promise<ListAiModelCallGroupsResult> {\n return listAiModelCallGroups(this.sql, input)\n }\n\n async recordModelCallCost(input: AiModelCallCostRecord): Promise<void> {\n const record = normalizeAiModelCallCostRecord(input)\n await runPgTransaction(this.sql, async (tx) => {\n const usage = await findUsage(tx, record.projectId, record.usageRecordId)\n if (!usage) throw missingUsage(record)\n assertCostMatchesUsage(record, usage)\n if (await findCost(tx, record.projectId, record.usageRecordId)) return\n const rated = record.status === \"rated\" ? record : undefined\n const inserted = await tx<{ usage_record_id: string }[]>`\n INSERT INTO ai_model_call_valuations (\n project_id, usage_record_id, status, provider_id, model_id,\n currency, amount_nanos, reason, details, rated_at\n ) VALUES (\n ${record.projectId}, ${record.usageRecordId}, ${record.status},\n ${record.billingIdentity?.providerId ?? null},\n ${record.billingIdentity?.modelId ?? null}, ${rated?.money.currency ?? null},\n ${rated?.money.amountNanos ?? null},\n ${record.status === \"unpriceable\" ? record.reason : null},\n ${JSON.stringify(aiModelCallCostDetails(record))}::text::jsonb, ${record.ratedAt}\n )\n ON CONFLICT DO NOTHING\n RETURNING usage_record_id\n `\n if (inserted.length === 0 && !(await findCost(tx, record.projectId, record.usageRecordId))) {\n throw new Error(\"[SixbPg] AI valuation insert conflicted without a visible row.\")\n }\n })\n }\n\n async summarizeExecutions(\n input: SummarizeAiCostExecutionsInput\n ): Promise<readonly AiCostSummary[]> {\n assertNonBlank(input.projectId, \"cost summary projectId\")\n for (const id of input.executionIds) assertNonBlank(id, \"cost summary executionId\")\n if (input.executionIds.length === 0) return []\n const ids = [...new Set(input.executionIds)]\n const rows = await this.sql<SummaryRow[]>`\n WITH requested(execution_id) AS (\n SELECT DISTINCT * FROM unnest(${this.sql.array(ids)}::text[])\n )\n SELECT usage.execution_id,\n cost.status,\n cost.currency,\n cost.amount_nanos\n FROM requested\n JOIN ai_model_call_usage AS usage\n ON usage.project_id = ${input.projectId} AND usage.execution_id = requested.execution_id\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n `\n return aggregateSummaryRows(input.executionIds, rows)\n }\n\n async queryProjectOverview(input: QueryAiAccountingOverviewInput): Promise<AiAccountingOverview> {\n const query = normalizeAiAccountingQuery(input)\n const providerId = query.providerId ?? null\n const modelId = query.modelId ?? null\n const rows = await this.sql<AggregateRow[]>`\n WITH filtered AS (\n SELECT usage.provider_id,\n usage.requested_model_id,\n usage.occurred_at,\n usage.input_tokens,\n usage.output_tokens,\n usage.uncached_input_tokens,\n usage.cache_read_input_tokens,\n usage.cache_write_input_tokens,\n usage.text_output_tokens,\n usage.reasoning_output_tokens,\n usage.audio_duration_ms,\n usage.reporting_status,\n CASE\n WHEN direct_agent.kind = 'conversation' THEN 'agent'\n WHEN workflow_agent.node_run_id IS NOT NULL THEN 'workflowAgent'\n ELSE NULL\n END AS attribution_agent_kind,\n workflow_node.node_id AS attribution_agent_step_id,\n COALESCE(workflow_node.workflow_id,\n CASE WHEN execution.executor_kind = 'workflow' THEN execution.authority_primitive_id END\n ) AS attribution_workflow_id,\n cost.status AS cost_status,\n cost.currency AS cost_currency,\n cost.amount_nanos AS cost_amount_nanos\n FROM ai_model_call_usage AS usage\n JOIN executions AS execution ON execution.project_id = usage.project_id AND execution.id = usage.execution_id\n LEFT JOIN agent_runs AS direct_agent\n ON direct_agent.project_id = usage.project_id\n AND direct_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_agent_node_runs AS workflow_agent\n ON workflow_agent.project_id = usage.project_id\n AND workflow_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_node_runs AS workflow_node\n ON workflow_node.project_id = workflow_agent.project_id\n AND workflow_node.id = workflow_agent.node_run_id\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n WHERE usage.project_id = ${query.projectId}\n AND usage.occurred_at >= ${query.from} AND usage.occurred_at < ${query.to}\n AND (${providerId}::text IS NULL OR usage.provider_id = ${providerId})\n AND (${modelId}::text IS NULL OR usage.requested_model_id = ${modelId})\n ), classified AS (\n SELECT filtered.*,\n CASE\n WHEN cost_status = 'rated' THEN 'rated'\n WHEN cost_status = 'unpriceable' THEN 'unpriceable'\n ELSE 'unvalued'\n END AS valuation_status,\n CASE WHEN cost_status = 'rated' THEN cost_currency ELSE NULL END AS amount_currency,\n CASE WHEN cost_status = 'rated' THEN cost_amount_nanos ELSE NULL END AS amount_nanos\n FROM filtered\n ), expanded AS (\n SELECT 'totals'::text AS dimension,\n NULL::text AS key_1,\n NULL::text AS key_2,\n NULL::text AS key_3,\n NULL::timestamptz AS bucket_start,\n classified.*\n FROM classified\n UNION ALL\n SELECT 'series', NULL, NULL, NULL,\n CASE ${input.bucket}::text\n WHEN 'hour' THEN\n date_trunc('hour', occurred_at AT TIME ZONE 'UTC') AT TIME ZONE 'UTC'\n WHEN 'day' THEN\n date_trunc('day', occurred_at AT TIME ZONE 'UTC') AT TIME ZONE 'UTC'\n ELSE date_trunc('week', occurred_at AT TIME ZONE 'UTC') AT TIME ZONE 'UTC'\n END,\n classified.*\n FROM classified\n UNION ALL\n SELECT 'model', provider_id, requested_model_id, NULL, NULL, classified.* FROM classified\n UNION ALL\n SELECT 'agent', attribution_agent_kind, attribution_workflow_id, attribution_agent_step_id, NULL, classified.*\n FROM classified WHERE attribution_agent_kind IS NOT NULL\n UNION ALL\n SELECT 'workflow', attribution_workflow_id, NULL, NULL, NULL, classified.*\n FROM classified WHERE attribution_workflow_id IS NOT NULL\n )\n SELECT dimension,\n key_1,\n key_2,\n key_3,\n bucket_start,\n amount_currency,\n COUNT(*)::text AS model_call_count,\n COUNT(*) FILTER (WHERE reporting_status <> 'unavailable')::text\n AS reported_usage_call_count,\n COUNT(*) FILTER (WHERE input_tokens IS NOT NULL AND output_tokens IS NOT NULL)::text\n AS complete_usage_call_count,\n COUNT(input_tokens)::text AS input_tokens_count,\n SUM(input_tokens)::text AS input_tokens_sum,\n COUNT(output_tokens)::text AS output_tokens_count,\n SUM(output_tokens)::text AS output_tokens_sum,\n COUNT(uncached_input_tokens)::text AS uncached_input_tokens_count,\n SUM(uncached_input_tokens)::text AS uncached_input_tokens_sum,\n COUNT(cache_read_input_tokens)::text AS cache_read_input_tokens_count,\n SUM(cache_read_input_tokens)::text AS cache_read_input_tokens_sum,\n COUNT(cache_write_input_tokens)::text AS cache_write_input_tokens_count,\n SUM(cache_write_input_tokens)::text AS cache_write_input_tokens_sum,\n COUNT(text_output_tokens)::text AS text_output_tokens_count,\n SUM(text_output_tokens)::text AS text_output_tokens_sum,\n COUNT(reasoning_output_tokens)::text AS reasoning_output_tokens_count,\n SUM(reasoning_output_tokens)::text AS reasoning_output_tokens_sum,\n COUNT(audio_duration_ms)::text AS audio_duration_ms_count,\n SUM(audio_duration_ms)::text AS audio_duration_ms_sum,\n COUNT(*) FILTER (WHERE valuation_status = 'rated')::text AS rated_call_count,\n COUNT(*) FILTER (WHERE valuation_status = 'unpriceable')::text\n AS unpriceable_call_count,\n COUNT(*) FILTER (WHERE valuation_status = 'unvalued')::text\n AS unvalued_call_count,\n SUM(amount_nanos)::text AS amount_nanos\n FROM expanded\n GROUP BY dimension, key_1, key_2, key_3, bucket_start, amount_currency\n `\n return buildAiAccountingOverviewFromFragments(input, rows.map(aggregateFragmentFromRow))\n }\n\n async listModelCalls(\n input: ListAiModelCallAccountingInput\n ): Promise<ListAiModelCallAccountingResult> {\n const query = normalizeAiModelCallAccountingQuery(input)\n const providerId = query.providerId ?? null\n const modelId = query.modelId ?? null\n const executionId = query.executionId ?? null\n const valuationStatus = query.valuationStatus ?? null\n const [count] = await this.sql<CountRow[]>`\n SELECT COUNT(*)::text AS total\n FROM ai_model_call_usage AS usage\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n WHERE usage.project_id = ${query.projectId}\n AND usage.occurred_at >= ${query.from} AND usage.occurred_at < ${query.to}\n AND (${providerId}::text IS NULL OR usage.provider_id = ${providerId})\n AND (${modelId}::text IS NULL OR usage.requested_model_id = ${modelId})\n AND (${executionId}::text IS NULL OR usage.execution_id = ${executionId})\n AND (\n ${valuationStatus}::text IS NULL OR ${valuationStatus} = CASE\n WHEN cost.status = 'rated' THEN 'rated'\n WHEN cost.status = 'unpriceable' THEN 'unpriceable'\n ELSE 'unvalued'\n END\n )\n `\n const rows = await this.sql<JoinedRow[]>`\n SELECT usage.*,\n CASE\n WHEN direct_agent.kind = 'conversation' THEN 'agent'\n WHEN direct_agent.kind = 'subagent' THEN 'subagent'\n WHEN workflow_agent.node_run_id IS NOT NULL THEN 'workflowAgent'\n ELSE NULL\n END AS attribution_kind,\n workflow_node.node_id AS attribution_agent_step_id,\n direct_agent.id AS attribution_agent_run_id,\n direct_agent.thread_id AS attribution_thread_id,\n direct_agent.parent_run_id AS attribution_parent_run_id,\n workflow_agent.node_run_id AS attribution_node_run_id,\n workflow_node.workflow_id AS attribution_workflow_id,\n workflow_node.workflow_run_id AS attribution_workflow_run_id,\n execution.executor_kind, execution.executor_id, execution.authority_primitive_id AS primitive_id,\n COALESCE((\n SELECT jsonb_agg(groups.group_id ORDER BY groups.group_id)\n FROM ai_model_call_usage_groups AS groups\n WHERE groups.project_id = usage.project_id AND groups.usage_record_id = usage.id\n ), '[]'::jsonb) AS requester_group_ids,\n cost.status AS cost_status,\n cost.provider_id AS cost_provider_id,\n cost.model_id AS cost_model_id,\n cost.currency AS cost_currency,\n cost.amount_nanos AS cost_amount_nanos,\n cost.reason AS cost_reason,\n cost.details AS cost_details,\n cost.rated_at AS cost_rated_at\n FROM ai_model_call_usage AS usage\n JOIN executions AS execution ON execution.project_id = usage.project_id AND execution.id = usage.execution_id\n LEFT JOIN agent_runs AS direct_agent\n ON direct_agent.project_id = usage.project_id\n AND direct_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_agent_node_runs AS workflow_agent\n ON workflow_agent.project_id = usage.project_id\n AND workflow_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_node_runs AS workflow_node\n ON workflow_node.project_id = workflow_agent.project_id\n AND workflow_node.id = workflow_agent.node_run_id\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n WHERE usage.project_id = ${query.projectId}\n AND usage.occurred_at >= ${query.from} AND usage.occurred_at < ${query.to}\n AND (${providerId}::text IS NULL OR usage.provider_id = ${providerId})\n AND (${modelId}::text IS NULL OR usage.requested_model_id = ${modelId})\n AND (${executionId}::text IS NULL OR usage.execution_id = ${executionId})\n AND (\n ${valuationStatus}::text IS NULL OR ${valuationStatus} = CASE\n WHEN cost.status = 'rated' THEN 'rated'\n WHEN cost.status = 'unpriceable' THEN 'unpriceable'\n ELSE 'unvalued'\n END\n )\n ORDER BY usage.occurred_at DESC, usage.id ASC\n LIMIT ${query.limit} OFFSET ${query.offset}\n `\n const items = rows.map((row) => toAccountingItem(accountingItemFromRow(row)))\n if (!count) throw new Error(\"[SixbPg] AI accounting count query returned no row.\")\n const total = safeSqlCount(count.total, \"model-call list total\")\n return structuredClone({\n items,\n total,\n hasMore: query.offset + items.length < total,\n })\n }\n}\n\ninterface ValuationRow {\n readonly project_id: string\n readonly usage_record_id: string\n readonly status: \"rated\" | \"unpriceable\"\n readonly provider_id: string | null\n readonly model_id: string | null\n readonly currency: string | null\n readonly amount_nanos: string | null\n readonly reason: string | null\n readonly details: unknown\n readonly rated_at: Date | string\n}\n\ninterface UsageRow {\n readonly project_id: string\n readonly id: string\n readonly execution_id: string\n readonly attempt: number | string\n readonly call_id: string\n readonly provider_id: string\n readonly requested_model_id: string\n readonly model_kind: AiModelCallUsageRecord[\"modelKind\"] | null\n readonly requested_reasoning: string | Record<string, unknown> | null\n readonly response_model_id: string | null\n readonly response_id: string\n readonly input_tokens: number | string | null\n readonly output_tokens: number | string | null\n readonly total_tokens: number | string | null\n readonly uncached_input_tokens: number | string | null\n readonly cache_read_input_tokens: number | string | null\n readonly cache_write_input_tokens: number | string | null\n readonly text_output_tokens: number | string | null\n readonly reasoning_output_tokens: number | string | null\n readonly audio_duration_ms: number | string | null\n readonly reporting_status: AiModelCallUsageRecord[\"usage\"][\"reportingStatus\"]\n readonly raw_usage: ReadonlyJsonObject | string | null\n readonly provider_ids: Record<string, unknown> | string | null\n readonly occurred_at: Date | string\n readonly recorded_at: Date | string\n}\n\ninterface JoinedRow extends UsageRow {\n readonly executor_kind: string | null\n readonly executor_id: string | null\n readonly primitive_id: string | null\n readonly attribution_kind: \"agent\" | \"subagent\" | \"workflowAgent\" | null\n readonly attribution_agent_step_id: string | null\n readonly attribution_agent_run_id: string | null\n readonly attribution_thread_id: string | null\n readonly attribution_parent_run_id: string | null\n readonly attribution_node_run_id: string | null\n readonly attribution_workflow_id: string | null\n readonly attribution_workflow_run_id: string | null\n readonly requester_group_ids: unknown\n readonly cost_status: ValuationRow[\"status\"] | null\n readonly cost_provider_id: string | null\n readonly cost_model_id: string | null\n readonly cost_currency: string | null\n readonly cost_amount_nanos: string | null\n readonly cost_reason: string | null\n readonly cost_details: unknown\n readonly cost_rated_at: Date | string | null\n}\n\ninterface AggregateRow {\n readonly dimension: AiAccountingAggregateFragment[\"dimension\"]\n readonly key_1: string | null\n readonly key_2: string | null\n readonly key_3: string | null\n readonly bucket_start: Date | string | null\n readonly amount_currency: string | null\n readonly model_call_count: string\n readonly reported_usage_call_count: string\n readonly complete_usage_call_count: string\n readonly input_tokens_count: string\n readonly input_tokens_sum: string | null\n readonly output_tokens_count: string\n readonly output_tokens_sum: string | null\n readonly uncached_input_tokens_count: string\n readonly uncached_input_tokens_sum: string | null\n readonly cache_read_input_tokens_count: string\n readonly cache_read_input_tokens_sum: string | null\n readonly cache_write_input_tokens_count: string\n readonly cache_write_input_tokens_sum: string | null\n readonly text_output_tokens_count: string\n readonly text_output_tokens_sum: string | null\n readonly reasoning_output_tokens_count: string\n readonly reasoning_output_tokens_sum: string | null\n readonly audio_duration_ms_count: string\n readonly audio_duration_ms_sum: string | null\n readonly rated_call_count: string\n readonly unpriceable_call_count: string\n readonly unvalued_call_count: string\n readonly amount_nanos: string | null\n}\n\ninterface CountRow {\n readonly total: string\n}\n\ninterface SummaryRow {\n readonly execution_id: string\n readonly status: ValuationRow[\"status\"] | null\n readonly currency: string | null\n readonly amount_nanos: string | null\n}\n\nasync function findCost(\n sql: PgStoreClient,\n projectId: string,\n usageId: string\n): Promise<AiModelCallCostRecord | null> {\n const [row] = await sql<ValuationRow[]>`\n SELECT * FROM ai_model_call_valuations\n WHERE project_id = ${projectId} AND usage_record_id = ${usageId}\n `\n return row ? rowToCost(row) : null\n}\n\nasync function findUsage(\n sql: PgStoreClient,\n projectId: string,\n id: string\n): Promise<AiModelCallUsageRecord | null> {\n const [row] = await sql<UsageRow[]>`\n SELECT * FROM ai_model_call_usage WHERE project_id = ${projectId} AND id = ${id}\n `\n return row ? usageFromRow(row, []) : null\n}\n\nfunction aggregateFragmentFromRow(row: AggregateRow): AiAccountingAggregateFragment {\n const dimensionKeys =\n row.dimension === \"model\"\n ? { providerId: required(row.key_1), modelId: required(row.key_2) }\n : row.dimension === \"agent\"\n ? {\n agentKind: required(row.key_1) as \"agent\" | \"workflowAgent\",\n ...(row.key_1 === \"workflowAgent\"\n ? { workflowId: required(row.key_2), agentStepId: required(row.key_3) }\n : {}),\n }\n : row.dimension === \"workflow\"\n ? { workflowId: required(row.key_1) }\n : row.dimension === \"series\"\n ? { start: new Date(required(row.bucket_start)) }\n : {}\n return {\n dimension: row.dimension,\n ...dimensionKeys,\n modelCallCount: row.model_call_count,\n usage: {\n reportedCallCount: row.reported_usage_call_count,\n completeCallCount: row.complete_usage_call_count,\n inputTokens: meterFragment(row.input_tokens_count, row.input_tokens_sum),\n outputTokens: meterFragment(row.output_tokens_count, row.output_tokens_sum),\n uncachedInputTokens: meterFragment(\n row.uncached_input_tokens_count,\n row.uncached_input_tokens_sum\n ),\n cacheReadInputTokens: meterFragment(\n row.cache_read_input_tokens_count,\n row.cache_read_input_tokens_sum\n ),\n cacheWriteInputTokens: meterFragment(\n row.cache_write_input_tokens_count,\n row.cache_write_input_tokens_sum\n ),\n textOutputTokens: meterFragment(row.text_output_tokens_count, row.text_output_tokens_sum),\n reasoningOutputTokens: meterFragment(\n row.reasoning_output_tokens_count,\n row.reasoning_output_tokens_sum\n ),\n audioDurationMs: meterFragment(row.audio_duration_ms_count, row.audio_duration_ms_sum),\n },\n costs: {\n ...(row.amount_currency === null || row.amount_nanos === null\n ? {}\n : {\n amount: {\n currency: row.amount_currency,\n amountNanos: row.amount_nanos,\n },\n }),\n ratedCallCount: row.rated_call_count,\n unpriceableCallCount: row.unpriceable_call_count,\n unvaluedCallCount: row.unvalued_call_count,\n },\n }\n}\n\nfunction meterFragment(presentCallCount: string, total: string | null) {\n return { presentCallCount, total }\n}\n\nfunction accountingItemFromRow(row: JoinedRow): AiAccountingRecordSetItem {\n const usage = usageFromRow(row, parseStringArray(row.requester_group_ids))\n const cost = row.cost_status === null ? undefined : costFromJoinedRow(row)\n const attribution =\n row.attribution_kind === null\n ? directModelCallAttribution(row.executor_kind, row.executor_id, row.primitive_id)\n : row.attribution_kind === \"agent\"\n ? {\n kind: \"agent\" as const,\n agentRunId: required(row.attribution_agent_run_id),\n threadId: required(row.attribution_thread_id),\n }\n : row.attribution_kind === \"subagent\"\n ? {\n kind: \"subagent\" as const,\n subagentRunId: required(row.attribution_agent_run_id),\n parentRunId: required(row.attribution_parent_run_id),\n }\n : {\n kind: \"workflowAgent\" as const,\n agentStepId: required(row.attribution_agent_step_id),\n nodeRunId: required(row.attribution_node_run_id),\n workflowId: required(row.attribution_workflow_id),\n workflowRunId: required(row.attribution_workflow_run_id),\n }\n return {\n usage,\n ...(attribution ? { attribution } : {}),\n ...(cost ? { cost } : {}),\n }\n}\n\nfunction usageFromRow(row: UsageRow, requesterGroupIds: readonly string[]): AiModelCallUsageRecord {\n const number = (value: number | string | null) => (value === null ? undefined : Number(value))\n return {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n attempt: Number(row.attempt),\n callId: row.call_id,\n requesterGroupIds,\n providerId: row.provider_id,\n ...(row.provider_ids === null\n ? {}\n : {\n providerIds: normalizeModelProviderIds(\n typeof row.provider_ids === \"string\" ? JSON.parse(row.provider_ids) : row.provider_ids\n ),\n }),\n requestedModelId: row.requested_model_id,\n ...(row.model_kind === null ? {} : { modelKind: row.model_kind }),\n ...(row.requested_reasoning === null\n ? {}\n : { requestedReasoning: requestedReasoningFromRow(row.requested_reasoning) }),\n ...(row.response_model_id === null ? {} : { responseModelId: row.response_model_id }),\n responseId: row.response_id,\n usage: {\n ...(number(row.input_tokens) === undefined ? {} : { inputTokens: number(row.input_tokens) }),\n ...(number(row.output_tokens) === undefined\n ? {}\n : { outputTokens: number(row.output_tokens) }),\n ...(number(row.total_tokens) === undefined ? {} : { totalTokens: number(row.total_tokens) }),\n ...(number(row.uncached_input_tokens) === undefined\n ? {}\n : { uncachedInputTokens: number(row.uncached_input_tokens) }),\n ...(number(row.cache_read_input_tokens) === undefined\n ? {}\n : { cacheReadInputTokens: number(row.cache_read_input_tokens) }),\n ...(number(row.cache_write_input_tokens) === undefined\n ? {}\n : { cacheWriteInputTokens: number(row.cache_write_input_tokens) }),\n ...(number(row.text_output_tokens) === undefined\n ? {}\n : { textOutputTokens: number(row.text_output_tokens) }),\n ...(number(row.reasoning_output_tokens) === undefined\n ? {}\n : { reasoningOutputTokens: number(row.reasoning_output_tokens) }),\n ...(number(row.audio_duration_ms) === undefined\n ? {}\n : { audioDurationMs: number(row.audio_duration_ms) }),\n reportingStatus: row.reporting_status,\n },\n ...(row.raw_usage === null ? {} : { rawUsage: parseJsonObject(row.raw_usage) }),\n occurredAt: new Date(row.occurred_at),\n recordedAt: new Date(row.recorded_at),\n }\n}\n\nfunction rowToCost(row: ValuationRow): AiModelCallCostRecord {\n return costRecord({\n projectId: row.project_id,\n usageId: row.usage_record_id,\n status: row.status,\n providerId: row.provider_id,\n modelId: row.model_id,\n currency: row.currency,\n amountNanos: row.amount_nanos,\n reason: row.reason,\n details: row.details,\n ratedAt: row.rated_at,\n })\n}\n\nfunction costFromJoinedRow(row: JoinedRow): AiModelCallCostRecord {\n return costRecord({\n projectId: row.project_id,\n usageId: row.id,\n status: required(row.cost_status),\n providerId: row.cost_provider_id,\n modelId: row.cost_model_id,\n currency: row.cost_currency,\n amountNanos: row.cost_amount_nanos,\n reason: row.cost_reason,\n details: row.cost_details,\n ratedAt: required(row.cost_rated_at),\n })\n}\n\nfunction costRecord(input: {\n projectId: string\n usageId: string\n status: ValuationRow[\"status\"]\n providerId: string | null\n modelId: string | null\n currency: string | null\n amountNanos: string | null\n reason: string | null\n details: unknown\n ratedAt: Date | string\n}): AiModelCallCostRecord {\n const details = parseAiModelCallCostDetails(input.details)\n const priceSource =\n details.priceSource === undefined\n ? undefined\n : { ...details.priceSource, observedAt: new Date(details.priceSource.observedAt) }\n const base = {\n ...(details.estimate === undefined ? {} : { estimate: details.estimate }),\n projectId: input.projectId,\n usageRecordId: input.usageId,\n pricingContext: details.pricingContext,\n ratedAt: new Date(input.ratedAt),\n }\n if (input.status === \"rated\") {\n return normalizeAiModelCallCostRecord({\n ...base,\n status: \"rated\",\n billingIdentity: { providerId: required(input.providerId), modelId: required(input.modelId) },\n priceSource: required(priceSource),\n money: { currency: required(input.currency), amountNanos: required(input.amountNanos) },\n components: required(details.components),\n })\n }\n return normalizeAiModelCallCostRecord({\n ...base,\n status: \"unpriceable\",\n ...(input.providerId && input.modelId\n ? { billingIdentity: { providerId: input.providerId, modelId: input.modelId } }\n : {}),\n ...(priceSource === undefined ? {} : { priceSource }),\n reason: required(input.reason) as Extract<\n AiModelCallCostRecord,\n { status: \"unpriceable\" }\n >[\"reason\"],\n ...(details.missingMeters ? { missingMeters: details.missingMeters } : {}),\n })\n}\n\nfunction aggregateSummaryRows(\n ids: readonly string[],\n rows: readonly SummaryRow[]\n): AiCostSummary[] {\n const map = new Map(ids.map((id) => [id, accumulator()]))\n for (const row of rows) {\n const value = map.get(row.execution_id)\n if (!value) continue\n if (row.status === null) value.unvaluedCallCount += 1\n else if (row.status === \"unpriceable\") value.unpriceableCallCount += 1\n else {\n value.ratedCallCount += 1\n add(value.amounts, required(row.currency), required(row.amount_nanos))\n }\n }\n return ids.map((id) => finish(map.get(id)!))\n}\n\ninterface Accumulator {\n amounts: Map<string, bigint>\n ratedCallCount: number\n unpriceableCallCount: number\n unvaluedCallCount: number\n}\n\nfunction accumulator(): Accumulator {\n return {\n amounts: new Map(),\n ratedCallCount: 0,\n unpriceableCallCount: 0,\n unvaluedCallCount: 0,\n }\n}\n\nfunction finish(value: Accumulator): AiCostSummary {\n return {\n amounts: [...value.amounts]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amount]) => ({ currency, amountNanos: amount.toString() })),\n ratedCallCount: value.ratedCallCount,\n unpriceableCallCount: value.unpriceableCallCount,\n unvaluedCallCount: value.unvaluedCallCount,\n }\n}\n\nfunction add(amounts: Map<string, bigint>, currency: string, amount: string): void {\n amounts.set(currency, (amounts.get(currency) ?? 0n) + BigInt(amount))\n}\n\nfunction parseStringArray(value: unknown): string[] {\n const parsed: unknown = typeof value === \"string\" ? JSON.parse(value) : value\n if (!Array.isArray(parsed) || parsed.some((item) => typeof item !== \"string\")) {\n throw new Error(\"[SixbPg] AI requester group ids are invalid.\")\n }\n return parsed\n}\n\nfunction parseJsonObject(value: unknown): ReadonlyJsonObject {\n return (typeof value === \"string\" ? JSON.parse(value) : value) as ReadonlyJsonObject\n}\n\nfunction assertCostMatchesUsage(\n record: AiModelCallCostRecord,\n usage: AiModelCallUsageRecord\n): void {\n if (!aiModelCallCostMatchesUsage(record, usage)) {\n throw new AiCostStorageError(\n \"cost_mismatch\",\n `[SixbPg] AI valuation for usage '${record.usageRecordId}' does not match its usage record.`\n )\n }\n}\n\nfunction missingUsage(record: { projectId: string; usageRecordId: string }) {\n return new AiCostStorageError(\n \"missing_usage\",\n `[SixbPg] AI usage '${record.usageRecordId}' does not exist.`\n )\n}\n\nfunction assertNonBlank(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI ${field} must be nonblank.`)\n }\n}\n\nfunction safeSqlCount(value: string, field: string): number {\n if (!/^(0|[1-9]\\d*)$/.test(value)) {\n throw new Error(`[SixbPg] AI accounting ${field} is invalid.`)\n }\n const count = Number(value)\n if (!Number.isSafeInteger(count)) {\n throw new TypeError(`[Sixb] AI accounting ${field} exceeds the safe integer range.`)\n }\n return count\n}\n\nfunction required<T>(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error(\"[SixbPg] AI valuation column is unexpectedly null.\")\n }\n return value\n}\n",
52
59
  "import {\n type AiModelCallGroupRow,\n aiModelCallGroupFragmentFromRow,\n buildAiModelCallGroupsFromFragments,\n normalizeAiModelCallAccountingQuery,\n} from \"@sixb/core/internal/ai-cost-storage-provider\"\nimport type { ListAiModelCallGroupsInput, ListAiModelCallGroupsResult } from \"@sixb/core/storage\"\nimport type { PgStoreClient } from \"./transactions\"\n\n/** Paginate initiating executions, then aggregate their matching calls without loading usage payloads. */\nexport async function listAiModelCallGroups(\n sql: PgStoreClient,\n input: ListAiModelCallGroupsInput\n): Promise<ListAiModelCallGroupsResult> {\n const query = normalizeAiModelCallAccountingQuery(input)\n const parameters = [\n query.projectId,\n query.from.toISOString(),\n query.to.toISOString(),\n query.providerId ?? null,\n query.modelId ?? null,\n query.valuationStatus ?? null,\n ]\n const [count] = await sql.unsafe<{ total: string }[]>(COUNT_SQL, parameters)\n const rows = await sql.unsafe<AiModelCallGroupRow[]>(PAGE_SQL, [\n ...parameters,\n query.limit,\n query.offset,\n ])\n const total = Number(count?.total)\n if (!Number.isSafeInteger(total) || total < 0)\n throw new RangeError(\"[Sixb] Invalid model-call group count.\")\n const items = buildAiModelCallGroupsFromFragments(rows.map(aiModelCallGroupFragmentFromRow))\n return { items, total, hasMore: query.offset + items.length < total }\n}\n\nconst FILTERED_SQL = `\nWITH filtered AS (\n SELECT COALESCE(root_agent.execution_id, usage.execution_id) AS root_execution_id,\n usage.execution_id, usage.provider_id, usage.requested_model_id, usage.occurred_at,\n usage.total_tokens,\n execution.executor_kind, execution.executor_id, execution.authority_primitive_id AS primitive_id,\n COALESCE(cost.status, 'unvalued') AS valuation_status,\n cost.currency AS amount_currency, cost.amount_nanos,\n root_agent.id AS root_agent_run_id,\n root_agent.thread_id AS root_thread_id,\n direct_agent.kind AS direct_kind,\n direct_agent.id AS direct_run_id,\n direct_agent.parent_run_id AS parent_run_id,\n workflow_node.node_id AS workflow_agent_step_id,\n workflow_agent.node_run_id AS workflow_node_run_id,\n workflow_node.workflow_id AS workflow_id,\n workflow_node.workflow_run_id AS workflow_run_id\n FROM ai_model_call_usage AS usage\n JOIN executions AS execution ON execution.project_id = usage.project_id AND execution.id = usage.execution_id\n LEFT JOIN agent_runs AS direct_agent\n ON direct_agent.project_id = usage.project_id AND direct_agent.execution_id = usage.execution_id\n LEFT JOIN agent_runs AS root_agent\n ON root_agent.project_id = usage.project_id\n AND root_agent.id = COALESCE(direct_agent.parent_run_id, direct_agent.id)\n LEFT JOIN workflow_agent_node_runs AS workflow_agent\n ON workflow_agent.project_id = usage.project_id AND workflow_agent.execution_id = usage.execution_id\n LEFT JOIN workflow_node_runs AS workflow_node\n ON workflow_node.project_id = workflow_agent.project_id AND workflow_node.id = workflow_agent.node_run_id\n LEFT JOIN ai_model_call_valuations AS cost\n ON cost.project_id = usage.project_id AND cost.usage_record_id = usage.id\n WHERE usage.project_id = $1\n AND usage.occurred_at >= $2::timestamptz\n AND usage.occurred_at < $3::timestamptz\n AND ($4::text IS NULL OR usage.provider_id = $4)\n AND ($5::text IS NULL OR usage.requested_model_id = $5)\n AND ($6::text IS NULL OR COALESCE(cost.status, 'unvalued') = $6)\n), roots AS (\n SELECT root_execution_id, MAX(occurred_at) AS last_call_at\n FROM filtered GROUP BY root_execution_id\n)\n`\nconst COUNT_SQL = `${FILTERED_SQL} SELECT CAST(COUNT(*) AS TEXT) AS total FROM roots`\nconst PAGE_SQL = `${FILTERED_SQL}, page AS (\n SELECT root_execution_id FROM roots\n ORDER BY last_call_at DESC, root_execution_id COLLATE \"C\" ASC LIMIT $7 OFFSET $8\n)\nSELECT filtered.root_execution_id, execution_id, provider_id, requested_model_id,\n MIN(occurred_at) AS first_call_at, MAX(occurred_at) AS last_call_at,\n CAST(COUNT(*) AS TEXT) AS call_count,\n CAST(COUNT(total_tokens) AS TEXT) AS token_count,\n CAST(SUM(total_tokens) AS TEXT) AS total_tokens,\n valuation_status, amount_currency,\n CAST(SUM(amount_nanos / 1000000000000) AS TEXT) AS amount_high,\n CAST(SUM((amount_nanos / 1000000) % 1000000) AS TEXT) AS amount_middle,\n CAST(SUM(amount_nanos % 1000000) AS TEXT) AS amount_low,\n MAX(root_agent_run_id) AS root_agent_run_id,\n MAX(executor_kind) AS executor_kind, MAX(executor_id) AS executor_id, MAX(primitive_id) AS primitive_id,\n MAX(root_thread_id) AS root_thread_id,\n MAX(direct_kind) AS direct_kind,\n MAX(direct_run_id) AS direct_run_id,\n MAX(parent_run_id) AS parent_run_id,\n MAX(workflow_agent_step_id) AS workflow_agent_step_id,\n MAX(workflow_node_run_id) AS workflow_node_run_id,\n MAX(workflow_id) AS workflow_id,\n MAX(workflow_run_id) AS workflow_run_id\nFROM filtered JOIN page ON page.root_execution_id = filtered.root_execution_id\nGROUP BY filtered.root_execution_id, execution_id, provider_id, requested_model_id,\n valuation_status, amount_currency\n`\n",
53
- "import { assertAiUsageExecutionId, normalizeAiModelCallRecord } from \"@sixb/core/internal/storage\"\nimport { isModelReasoning, normalizeModelProviderIds } from \"@sixb/core/models\"\nimport type { ReadonlyJsonObject } from \"@sixb/core/storage\"\nimport {\n type AiModelCallUsageInput,\n type AiModelCallUsageRecord,\n type AiUsageExecutionSummary,\n type AiUsageStorage,\n AiUsageStorageError,\n aggregateAiModelCallUsage,\n type GetLatestAiModelCallForExecutionInput,\n type RecordAiModelCallInput,\n type RecordAiModelCallResult,\n type SummarizeAiUsageExecutionInput,\n type SummarizeAiUsageExecutionsInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"./pg-client\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\n/** PostgreSQL-backed append-only model-call usage ledger. */\nexport class PgAiUsageStorage implements AiUsageStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async recordModelCall(input: RecordAiModelCallInput): Promise<RecordAiModelCallResult> {\n const record = normalizeAiModelCallRecord(input)\n return runPgTransaction(this.sql, async (tx) => {\n const existing = await this.findByIdempotencyKey(tx, record)\n if (existing) return { record: existing, created: false }\n await this.assertExecutionExists(tx, record.projectId, record.executionId)\n\n const inserted = await tx<{ id: string }[]>`\n INSERT INTO ai_model_call_usage (\n project_id,\n id,\n execution_id,\n attempt,\n call_id,\n provider_id,\n provider_ids,\n requested_model_id,\n requested_reasoning,\n response_model_id,\n response_id,\n input_tokens,\n output_tokens,\n total_tokens,\n uncached_input_tokens,\n cache_read_input_tokens,\n cache_write_input_tokens,\n text_output_tokens,\n reasoning_output_tokens,\n reporting_status,\n raw_usage,\n occurred_at,\n recorded_at\n ) VALUES (\n ${record.projectId},\n ${record.id},\n ${record.executionId},\n ${record.attempt},\n ${record.callId},\n ${record.providerId},\n ${record.providerIds === undefined ? null : JSON.stringify(record.providerIds)}::jsonb,\n ${record.requestedModelId},\n ${\n record.requestedReasoning === undefined\n ? null\n : JSON.stringify(record.requestedReasoning)\n }::text::jsonb,\n ${record.responseModelId ?? null},\n ${record.responseId},\n ${record.usage.inputTokens ?? null},\n ${record.usage.outputTokens ?? null},\n ${record.usage.totalTokens ?? null},\n ${record.usage.uncachedInputTokens ?? null},\n ${record.usage.cacheReadInputTokens ?? null},\n ${record.usage.cacheWriteInputTokens ?? null},\n ${record.usage.textOutputTokens ?? null},\n ${record.usage.reasoningOutputTokens ?? null},\n ${record.usage.reportingStatus},\n ${record.rawUsage === undefined ? null : JSON.stringify(record.rawUsage)}::text::jsonb,\n ${record.occurredAt},\n ${record.recordedAt}\n )\n ON CONFLICT DO NOTHING\n RETURNING id\n `\n\n if (inserted.length === 0) {\n const concurrent = await this.findByIdempotencyKey(tx, record)\n if (concurrent) return { record: concurrent, created: false }\n throw new AiUsageStorageError(\n \"duplicate_id\",\n `[SixbPg] AI usage record '${record.id}' already exists for project '${record.projectId}'.`\n )\n }\n\n for (const groupId of record.requesterGroupIds) {\n await tx`\n INSERT INTO ai_model_call_usage_groups (\n project_id, usage_record_id, group_id, occurred_at\n ) VALUES (\n ${record.projectId}, ${record.id}, ${groupId}, ${record.occurredAt}\n )\n `\n }\n\n return { record: await this.requireById(tx, record.projectId, record.id), created: true }\n })\n }\n\n async summarizeExecution(\n input: SummarizeAiUsageExecutionInput\n ): Promise<AiUsageExecutionSummary> {\n const [summary] = await this.summarizeExecutions({\n projectId: input.projectId,\n executionIds: [input.executionId],\n })\n return summary!\n }\n\n async getLatestForExecution(\n input: GetLatestAiModelCallForExecutionInput\n ): Promise<AiModelCallUsageRecord | null> {\n assertNonBlankProjectId(input.projectId)\n assertAiUsageExecutionId(input.executionId)\n const [row] = await this.sql<AiUsageRow[]>`\n SELECT * FROM ai_model_call_usage\n WHERE project_id = ${input.projectId} AND execution_id = ${input.executionId}\n ORDER BY occurred_at DESC, id DESC\n LIMIT 1\n `\n return row ? this.rowToRecord(this.sql, row) : null\n }\n\n async summarizeExecutions(\n input: SummarizeAiUsageExecutionsInput\n ): Promise<readonly AiUsageExecutionSummary[]> {\n assertNonBlankProjectId(input.projectId)\n for (const executionId of input.executionIds) assertAiUsageExecutionId(executionId)\n if (input.executionIds.length === 0) return []\n\n const rows = await this.executionRows(this.sql, input)\n return aggregateExecutionRows(input.executionIds, rows)\n }\n\n private async findByIdempotencyKey(\n sql: PgStoreClient,\n record: Pick<\n AiModelCallUsageRecord,\n \"projectId\" | \"executionId\" | \"attempt\" | \"callId\" | \"responseId\"\n >\n ): Promise<AiModelCallUsageRecord | null> {\n const rows = await sql<AiUsageRow[]>`\n SELECT * FROM ai_model_call_usage\n WHERE project_id = ${record.projectId}\n AND execution_id = ${record.executionId}\n AND attempt = ${record.attempt}\n AND call_id = ${record.callId}\n AND response_id = ${record.responseId}\n `\n return rows[0] ? this.rowToRecord(sql, rows[0]) : null\n }\n\n private async requireById(\n sql: SQLClient,\n projectId: string,\n id: string\n ): Promise<AiModelCallUsageRecord> {\n const [row] = await sql<AiUsageRow[]>`\n SELECT * FROM ai_model_call_usage WHERE project_id = ${projectId} AND id = ${id}\n `\n if (!row) throw new Error(`[SixbPg] AI usage record '${id}' disappeared after insert.`)\n return this.rowToRecord(sql, row)\n }\n\n private async rowToRecord(sql: PgStoreClient, row: AiUsageRow): Promise<AiModelCallUsageRecord> {\n const groupRows = await sql<Array<{ group_id: string }>>`\n SELECT group_id FROM ai_model_call_usage_groups\n WHERE project_id = ${row.project_id} AND usage_record_id = ${row.id}\n ORDER BY group_id\n `\n\n return {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n attempt: Number(row.attempt),\n callId: row.call_id,\n requesterGroupIds: groupRows.map((group) => group.group_id),\n providerId: row.provider_id,\n ...(row.provider_ids === null\n ? {}\n : {\n providerIds: normalizeModelProviderIds(\n typeof row.provider_ids === \"string\" ? JSON.parse(row.provider_ids) : row.provider_ids\n ),\n }),\n requestedModelId: row.requested_model_id,\n ...(row.requested_reasoning === null\n ? {}\n : { requestedReasoning: requestedReasoningFromRow(row.requested_reasoning) }),\n ...(row.response_model_id === null ? {} : { responseModelId: row.response_model_id }),\n responseId: row.response_id,\n usage: {\n ...usageFromRow(row),\n ...(row.total_tokens === null ? {} : { totalTokens: Number(row.total_tokens) }),\n reportingStatus: row.reporting_status,\n },\n ...(row.raw_usage === null ? {} : { rawUsage: rawUsageFromRow(row.raw_usage) }),\n occurredAt: new Date(row.occurred_at),\n recordedAt: new Date(row.recorded_at),\n }\n }\n\n private executionRows(\n sql: PgStoreClient,\n input: SummarizeAiUsageExecutionsInput\n ): Promise<AiUsageRow[]> {\n const executionIds = [...new Set(input.executionIds)]\n\n return sql<AiUsageRow[]>`\n WITH requested(execution_id) AS (\n SELECT * FROM unnest(${sql.array(executionIds)}::text[])\n )\n SELECT usage.* FROM requested\n JOIN ai_model_call_usage AS usage\n ON usage.project_id = ${input.projectId}\n AND usage.execution_id = requested.execution_id\n `\n }\n\n private async assertExecutionExists(\n sql: PgStoreClient,\n projectId: string,\n executionId: string\n ): Promise<void> {\n const [execution] = await sql<{ exists: boolean }[]>`\n SELECT EXISTS (\n SELECT 1 FROM executions WHERE project_id = ${projectId} AND id = ${executionId}\n ) AS exists\n `\n if (execution?.exists) return\n throw new AiUsageStorageError(\n \"missing_execution\",\n `[SixbPg] AI usage execution '${executionId}' does not exist in project '${projectId}'.`\n )\n }\n}\n\ninterface AiUsageRow {\n readonly project_id: string\n readonly id: string\n readonly execution_id: string\n readonly attempt: number | string\n readonly call_id: string\n readonly provider_id: string\n readonly provider_ids: Record<string, unknown> | string | null\n readonly requested_model_id: string\n readonly requested_reasoning: string | Record<string, unknown> | null\n readonly response_model_id: string | null\n readonly response_id: string\n readonly input_tokens: number | string | null\n readonly output_tokens: number | string | null\n readonly total_tokens: number | string | null\n readonly uncached_input_tokens: number | string | null\n readonly cache_read_input_tokens: number | string | null\n readonly cache_write_input_tokens: number | string | null\n readonly text_output_tokens: number | string | null\n readonly reasoning_output_tokens: number | string | null\n readonly reporting_status: AiModelCallUsageRecord[\"usage\"][\"reportingStatus\"]\n readonly raw_usage: ReadonlyJsonObject | string | null\n readonly occurred_at: Date | string\n readonly recorded_at: Date | string\n}\n\nfunction aggregateExecutionRows(\n executionIds: readonly string[],\n rows: readonly AiUsageRow[]\n): readonly AiUsageExecutionSummary[] {\n const usageByExecutionId = new Map<string, AiModelCallUsageInput[]>()\n for (const executionId of executionIds) usageByExecutionId.set(executionId, [])\n for (const row of rows) {\n usageByExecutionId.get(row.execution_id)?.push(usageFromRow(row))\n }\n return executionIds.map((executionId) => {\n const usages = usageByExecutionId.get(executionId) ?? []\n return {\n modelCallCount: usages.length,\n usage: aggregateAiModelCallUsage(usages),\n }\n })\n}\n\nfunction usageFromRow(row: AiUsageRow): AiModelCallUsageInput {\n return {\n ...(row.input_tokens === null ? {} : { inputTokens: Number(row.input_tokens) }),\n ...(row.output_tokens === null ? {} : { outputTokens: Number(row.output_tokens) }),\n ...(row.uncached_input_tokens === null\n ? {}\n : { uncachedInputTokens: Number(row.uncached_input_tokens) }),\n ...(row.cache_read_input_tokens === null\n ? {}\n : { cacheReadInputTokens: Number(row.cache_read_input_tokens) }),\n ...(row.cache_write_input_tokens === null\n ? {}\n : { cacheWriteInputTokens: Number(row.cache_write_input_tokens) }),\n ...(row.text_output_tokens === null\n ? {}\n : { textOutputTokens: Number(row.text_output_tokens) }),\n ...(row.reasoning_output_tokens === null\n ? {}\n : { reasoningOutputTokens: Number(row.reasoning_output_tokens) }),\n }\n}\n\nfunction rawUsageFromRow(value: Exclude<AiUsageRow[\"raw_usage\"], null>): ReadonlyJsonObject {\n return typeof value === \"string\" ? (JSON.parse(value) as ReadonlyJsonObject) : value\n}\n\nexport function requestedReasoningFromRow(\n value: Exclude<AiUsageRow[\"requested_reasoning\"], null>\n): AiModelCallUsageRecord[\"requestedReasoning\"] {\n const parsed: unknown =\n typeof value === \"string\" && (value.startsWith('\"') || value.startsWith(\"{\"))\n ? JSON.parse(value)\n : value\n if (!isModelReasoning(parsed)) {\n throw new Error(\"[SixbPg] Stored AI usage requested reasoning is invalid.\")\n }\n return parsed\n}\n\nfunction assertNonBlankProjectId(projectId: string): void {\n if (typeof projectId !== \"string\" || projectId.trim().length === 0) {\n throw new TypeError(\"[Sixb] AI usage projectId must be nonblank.\")\n }\n}\n",
54
- "import {\n type AiLimitAccountingEntry,\n AiLimitOperationLock,\n aiLimitAmountKey,\n aiLimitQuantityFromAmount,\n aiLimitReservationBuckets,\n aiLimitReservationRequestKey,\n aiLimitReservationRequestMatches,\n aiLimitSubjectFromParts,\n aiLimitSubjectKey,\n aiLimitSubjectParts,\n aiLimitSubjectsFromAccountingEntry,\n assertAiLimitAccountingMatchesReservation,\n assertNonBlank,\n cloneValidDate,\n type NormalizedAiLimitAmount,\n normalizeAiLimitAmount,\n normalizeAiLimitQuantities,\n normalizeAiModelCallReservationIdentity,\n normalizeCreateAiLimitPolicy,\n normalizeReserveAiModelCall,\n normalizeUpdateAiLimitPolicy,\n resolveAiLimitActual,\n} from \"@sixb/core/internal/ai-limit-storage-provider\"\nimport type {\n AiLimitPeriod,\n AiLimitPolicy,\n AiLimitPolicyStatus,\n AiLimitQuantity,\n AiLimitReservationBucket,\n AiLimitStorage,\n AiLimitSubject,\n AiModelCallReservation,\n CreateAiLimitPolicyInput,\n DeleteAiLimitPolicyInput,\n GetAiLimitPolicyInput,\n ListAiLimitPoliciesInput,\n ListAiLimitPolicyStatusesInput,\n MarkAiModelCallReservationUnknownInput,\n ReconcileAiModelCallInput,\n RecordAiModelCallLimitActualsInput,\n ReserveAiModelCallInput,\n ReserveAiModelCallResult,\n UpdateAiLimitPolicyInput,\n} from \"@sixb/core/storage\"\nimport { AiLimitStorageError, aiLimitCalendarMonth } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"./pg-client\"\nimport { lockAdvisoryKeys, type PgStoreClient, runPgTransaction } from \"./transactions\"\n\n/** PostgreSQL-backed editable AI limits and atomic model-call reservations. */\nexport class PgAiLimitStorage implements AiLimitStorage {\n private readonly operations = new AiLimitOperationLock()\n\n constructor(private readonly sql: PgStoreClient) {}\n\n /** @internal Keep queued work inside the lifetime of the owning SQL transaction. */\n settleOperations(): Promise<void> {\n return this.operations.settle()\n }\n\n async createPolicy(input: CreateAiLimitPolicyInput): Promise<AiLimitPolicy> {\n const policy = normalizeCreateAiLimitPolicy(input)\n return this.withProjectLock(policy.projectId, async (tx) => {\n const subject = aiLimitSubjectParts(policy.subject)\n const limit = normalizeAiLimitAmount(policy.limit)\n const inserted = await tx<{ id: string }[]>`\n INSERT INTO ai_usage_limits (\n project_id, id, subject_type, subject_id, meter, currency, limit_amount,\n period_kind, enabled, created_at, updated_at\n ) VALUES (\n ${policy.projectId}, ${policy.id}, ${subject.type}, ${subject.id}, ${limit.meter},\n ${limit.currency}, ${limit.amount.toString()}, ${policy.period}, ${policy.enabled},\n ${policy.createdAt}, ${policy.updatedAt}\n )\n ON CONFLICT DO NOTHING\n RETURNING id\n `\n if (inserted.length === 0) throw duplicatePolicy(policy)\n return this.requirePolicy(tx, policy.projectId, policy.id)\n })\n }\n\n async updatePolicy(input: UpdateAiLimitPolicyInput): Promise<AiLimitPolicy> {\n const update = normalizeUpdateAiLimitPolicy(input)\n return this.withProjectLock(update.projectId, async (tx) => {\n const existing = await this.requirePolicy(tx, update.projectId, update.id)\n if (update.limit !== undefined) assertSameDimension(existing.limit, update.limit)\n const limit = normalizeAiLimitAmount(update.limit ?? existing.limit)\n await tx`\n UPDATE ai_usage_limits\n SET limit_amount = ${limit.amount.toString()},\n enabled = ${update.enabled ?? existing.enabled},\n updated_at = ${update.updatedAt}\n WHERE project_id = ${update.projectId} AND id = ${update.id}\n `\n return this.requirePolicy(tx, update.projectId, update.id)\n })\n }\n\n async deletePolicy(input: DeleteAiLimitPolicyInput): Promise<boolean> {\n validatePolicyIdentity(input)\n return this.withProjectLock(input.projectId, async (tx) => {\n const deleted = await tx<{ id: string }[]>`\n DELETE FROM ai_usage_limits\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING id\n `\n return deleted.length > 0\n })\n }\n\n async getPolicy(input: GetAiLimitPolicyInput): Promise<AiLimitPolicy | null> {\n validatePolicyIdentity(input)\n const [row] = await this.sql<AiLimitPolicyRow[]>`\n SELECT * FROM ai_usage_limits\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n return row ? policyFromRow(row) : null\n }\n\n async listPolicies(input: ListAiLimitPoliciesInput): Promise<readonly AiLimitPolicy[]> {\n assertNonBlank(input.projectId, \"projectId\")\n return (await this.policyRows(this.sql, input.projectId, input.includeDisabled ?? false)).map(\n policyFromRow\n )\n }\n\n async listPolicyStatuses(\n input: ListAiLimitPolicyStatusesInput\n ): Promise<readonly AiLimitPolicyStatus[]> {\n assertNonBlank(input.projectId, \"projectId\")\n const period = aiLimitCalendarMonth(input.at ?? new Date())\n const existingGroups =\n input.existingGroupIds === undefined ? undefined : new Set(input.existingGroupIds)\n return this.withProjectLock(input.projectId, async (tx) => {\n const rows = await this.policyRows(tx, input.projectId, input.includeDisabled ?? false)\n return Promise.all(\n rows.map((row) => this.statusForPolicy(tx, policyFromRow(row), period, existingGroups))\n )\n })\n }\n\n async reserveModelCall(input: ReserveAiModelCallInput): Promise<ReserveAiModelCallResult> {\n const request = normalizeReserveAiModelCall(input)\n return this.withProjectLock(request.identity.projectId, async (tx) => {\n const existing = await this.findReservation(tx, request.identity)\n if (existing) {\n if (!aiLimitReservationRequestMatches(existing, request)) {\n throw new AiLimitStorageError(\n \"reservation_conflict\",\n `[SixbPg] AI model-call reservation '${input.callId}' was replayed with different subjects, estimates, or period.`\n )\n }\n if (existing.state !== \"active\") {\n return { status: \"terminal\", reservation: existing, created: false }\n }\n return { status: \"reserved\", reservation: existing, created: false }\n }\n await this.assertExecutionExists(tx, request.identity.projectId, request.identity.executionId)\n\n const subjectKeys = new Set(request.subjects.map(aiLimitSubjectKey))\n const estimates = new Map(\n request.estimates.map((quantity) => {\n const amount = normalizeAiLimitAmount(quantity)\n return [aiLimitAmountKey(amount), amount] as const\n })\n )\n const enabledPolicies = (await this.policyRows(tx, request.identity.projectId, false)).map(\n policyFromRow\n )\n const exhaustedPolicies: AiLimitPolicyStatus[] = []\n const unavailablePolicies: AiLimitPolicyStatus[] = []\n const unavailableReasons = new Set<\"missingEstimate\" | \"incompleteAccounting\">()\n for (const policy of enabledPolicies) {\n if (!subjectKeys.has(aiLimitSubjectKey(policy.subject))) continue\n const limit = normalizeAiLimitAmount(policy.limit)\n const estimate = estimates.get(aiLimitAmountKey(limit))\n const status = await this.statusForPolicy(tx, policy, request.period)\n if (!estimate || status.accountingStatus === \"unavailable\") {\n unavailablePolicies.push(status)\n if (!estimate) unavailableReasons.add(\"missingEstimate\")\n if (status.accountingStatus === \"unavailable\") {\n unavailableReasons.add(\"incompleteAccounting\")\n }\n continue\n }\n const consumed =\n normalizeAiLimitAmount(status.consumption.actual).amount +\n normalizeAiLimitAmount(status.consumption.reserved).amount +\n normalizeAiLimitAmount(status.consumption.unknown).amount\n if (consumed + estimate.amount > limit.amount) exhaustedPolicies.push(status)\n }\n if (unavailablePolicies.length > 0) {\n unavailablePolicies.sort((left, right) => left.policy.id.localeCompare(right.policy.id))\n return {\n status: \"unavailable\",\n unavailablePolicies,\n reasons: [...unavailableReasons].sort(),\n }\n }\n if (exhaustedPolicies.length > 0) {\n exhaustedPolicies.sort((left, right) => left.policy.id.localeCompare(right.policy.id))\n return {\n status: \"denied\",\n exhaustedPolicies,\n resetAt: new Date(\n Math.min(...exhaustedPolicies.map((status) => status.period.resetAt.getTime()))\n ),\n }\n }\n\n const buckets = aiLimitReservationBuckets(\n enabledPolicies,\n request.subjects,\n request.estimates\n )\n if (buckets.length === 0) return { status: \"notRequired\" }\n for (const bucket of buckets) {\n const amount = normalizeAiLimitAmount(bucket.estimate)\n await this.changeCounters(\n tx,\n request.identity.projectId,\n bucket.subject,\n amount,\n request.period,\n { reserved: amount.amount },\n request.reservedAt\n )\n }\n const reservation: AiModelCallReservation = {\n ...request.identity,\n buckets,\n requestKey: aiLimitReservationRequestKey(request),\n period: request.period,\n state: \"active\",\n reservedAt: request.reservedAt,\n updatedAt: new Date(request.reservedAt),\n }\n await this.insertReservation(tx, reservation)\n return { status: \"reserved\", reservation: structuredClone(reservation), created: true }\n })\n }\n\n async recordModelCallActuals(input: RecordAiModelCallLimitActualsInput): Promise<void> {\n assertNonBlank(input.projectId, \"projectId\")\n assertNonBlank(input.usageRecordId, \"usageRecordId\")\n const recordedAt = cloneValidDate(input.recordedAt ?? new Date(), \"recordedAt\")\n await this.withProjectLock(input.projectId, async (tx) => {\n const entry = await this.requireAccountingEntry(tx, input.projectId, input.usageRecordId)\n const period = aiLimitCalendarMonth(entry.occurredAt)\n for (const subjectValue of aiLimitSubjectsFromAccountingEntry(entry)) {\n const subject = aiLimitSubjectParts(subjectValue)\n const rows = await tx<AiLimitActualStateRow[]>`\n SELECT meter, currency, actual_amount, accounting_status\n FROM ai_usage_limit_periods\n WHERE project_id = ${input.projectId}\n AND subject_type = ${subject.type}\n AND subject_id = ${subject.id}\n AND period_start = ${period.start}\n FOR UPDATE\n `\n for (const row of rows) {\n const actual = resolveAiLimitActual([entry], row)\n await tx`\n UPDATE ai_usage_limit_periods\n SET actual_amount = ${(BigInt(row.actual_amount) + actual.amount).toString()},\n accounting_status = ${\n row.accounting_status === \"unavailable\" ||\n actual.accountingStatus === \"unavailable\"\n ? \"unavailable\"\n : \"complete\"\n },\n updated_at = ${recordedAt}\n WHERE project_id = ${input.projectId}\n AND subject_type = ${subject.type}\n AND subject_id = ${subject.id}\n AND meter = ${row.meter}\n AND currency = ${row.currency}\n AND period_start = ${period.start}\n `\n }\n }\n })\n }\n\n async reconcileModelCall(input: ReconcileAiModelCallInput): Promise<AiModelCallReservation> {\n const identity = normalizeAiModelCallReservationIdentity(input)\n assertNonBlank(input.usageRecordId, \"usageRecordId\")\n const reconciledAt = cloneValidDate(input.reconciledAt ?? new Date(), \"reconciledAt\")\n return this.withProjectLock(identity.projectId, async (tx) => {\n const reservation = await this.findReservation(tx, identity)\n if (!reservation) throw missingReservation(identity)\n if (reservation.state === \"reconciled\") {\n if (reservation.usageRecordId === input.usageRecordId) {\n return reservation\n }\n throw reconciliationConflict(identity.callId)\n }\n const accounting = await this.requireAccountingEntry(\n tx,\n identity.projectId,\n input.usageRecordId\n )\n assertAiLimitAccountingMatchesReservation(reservation, accounting)\n await this.reconcileEstimateCounters(tx, reservation, accounting, reconciledAt)\n const reconciled: AiModelCallReservation = {\n ...reservation,\n state: \"reconciled\",\n usageRecordId: input.usageRecordId,\n updatedAt: reconciledAt,\n }\n await this.updateReservation(tx, reconciled)\n return structuredClone(reconciled)\n })\n }\n\n async markReservationUnknown(\n input: MarkAiModelCallReservationUnknownInput\n ): Promise<AiModelCallReservation> {\n const identity = normalizeAiModelCallReservationIdentity(input)\n const markedAt = cloneValidDate(input.markedAt ?? new Date(), \"markedAt\")\n return this.withProjectLock(identity.projectId, async (tx) => {\n const reservation = await this.findReservation(tx, identity)\n if (!reservation) throw missingReservation(identity)\n if (reservation.state === \"unknown\") return reservation\n if (reservation.state !== \"active\") throw invalidState(reservation, \"mark unknown\")\n await this.moveEstimateCounters(tx, reservation, { reserved: -1n, unknown: 1n }, markedAt)\n const unknown = { ...reservation, state: \"unknown\" as const, updatedAt: markedAt }\n await this.updateReservation(tx, unknown)\n return structuredClone(unknown)\n })\n }\n\n private async withProjectLock<T>(\n projectId: string,\n run: (tx: SQLClient) => Promise<T>\n ): Promise<T> {\n return runPgTransaction(this.sql, async (tx) => {\n const operation = async () => {\n await lockAdvisoryKeys(tx, [`ai-limit:${projectId}`])\n return run(tx)\n }\n // Advisory locks are reentrant within one transaction. Serialize calls sharing this\n // transaction's store locally; independent root transactions retain their concurrency.\n return tx === this.sql ? this.operations.run(operation) : operation()\n })\n }\n\n private policyRows(\n sql: PgStoreClient,\n projectId: string,\n includeDisabled: boolean\n ): Promise<AiLimitPolicyRow[]> {\n return sql<AiLimitPolicyRow[]>`\n SELECT * FROM ai_usage_limits\n WHERE project_id = ${projectId} AND (${includeDisabled} OR enabled)\n ORDER BY id\n `\n }\n\n private async requirePolicy(\n sql: PgStoreClient,\n projectId: string,\n id: string\n ): Promise<AiLimitPolicy> {\n const [row] = await sql<AiLimitPolicyRow[]>`\n SELECT * FROM ai_usage_limits WHERE project_id = ${projectId} AND id = ${id}\n `\n if (row) return policyFromRow(row)\n throw new AiLimitStorageError(\n \"missing_policy\",\n `[SixbPg] AI limit policy '${id}' does not exist in project '${projectId}'.`\n )\n }\n\n private async statusForPolicy(\n sql: PgStoreClient,\n policy: AiLimitPolicy,\n period: AiLimitPeriod,\n existingGroups?: ReadonlySet<string>\n ): Promise<AiLimitPolicyStatus> {\n const subject = aiLimitSubjectParts(policy.subject)\n const limit = normalizeAiLimitAmount(policy.limit)\n let [row] = await sql<AiLimitPeriodStateRow[]>`\n SELECT actual_amount, reserved_amount, unknown_amount, accounting_status\n FROM ai_usage_limit_periods\n WHERE project_id = ${policy.projectId}\n AND subject_type = ${subject.type}\n AND subject_id = ${subject.id}\n AND meter = ${limit.meter}\n AND currency = ${limit.currency}\n AND period_start = ${period.start}\n `\n // Re-read incomplete accounting under the project lock; retain in-flight estimates.\n if (!row || row.accounting_status === \"unavailable\") {\n const actual = resolveAiLimitActual(await this.accountingEntries(sql, policy, period), limit)\n const [inserted] = await sql<AiLimitPeriodStateRow[]>`\n INSERT INTO ai_usage_limit_periods (\n project_id, subject_type, subject_id, meter, currency, period_start, period_end,\n actual_amount, reserved_amount, unknown_amount, accounting_status, updated_at\n ) VALUES (\n ${policy.projectId}, ${subject.type}, ${subject.id}, ${limit.meter}, ${limit.currency},\n ${period.start}, ${period.end}, ${actual.amount.toString()}, 0, 0,\n ${actual.accountingStatus}, ${new Date()}\n )\n ON CONFLICT (project_id, subject_type, subject_id, meter, currency, period_start)\n DO UPDATE SET\n actual_amount = excluded.actual_amount,\n accounting_status = excluded.accounting_status,\n updated_at = excluded.updated_at\n RETURNING actual_amount, reserved_amount, unknown_amount, accounting_status\n `\n row = inserted\n }\n if (!row) throw new Error(\"[SixbPg] Failed to initialize AI limit period state.\")\n return policyStatus(policy, period, row, existingGroups)\n }\n\n private async changeCounters(\n sql: PgStoreClient,\n projectId: string,\n subjectValue: AiLimitSubject,\n amount: NormalizedAiLimitAmount,\n period: AiLimitPeriod,\n changes: { readonly reserved?: bigint; readonly unknown?: bigint },\n updatedAt: Date\n ): Promise<void> {\n const subject = aiLimitSubjectParts(subjectValue)\n const [row] = await sql<AiLimitPeriodStateRow[]>`\n SELECT actual_amount, reserved_amount, unknown_amount, accounting_status\n FROM ai_usage_limit_periods\n WHERE project_id = ${projectId}\n AND subject_type = ${subject.type}\n AND subject_id = ${subject.id}\n AND meter = ${amount.meter}\n AND currency = ${amount.currency}\n AND period_start = ${period.start}\n FOR UPDATE\n `\n const reserved = BigInt(row?.reserved_amount ?? \"0\") + (changes.reserved ?? 0n)\n const unknown = BigInt(row?.unknown_amount ?? \"0\") + (changes.unknown ?? 0n)\n if (reserved < 0n || unknown < 0n) {\n throw new Error(\"[SixbPg] AI limit period counter became negative.\")\n }\n await sql`\n INSERT INTO ai_usage_limit_periods (\n project_id, subject_type, subject_id, meter, currency, period_start, period_end,\n actual_amount, reserved_amount, unknown_amount, accounting_status, updated_at\n ) VALUES (\n ${projectId}, ${subject.type}, ${subject.id}, ${amount.meter}, ${amount.currency},\n ${period.start}, ${period.end}, ${row?.actual_amount ?? \"0\"}, ${reserved.toString()},\n ${unknown.toString()}, ${row?.accounting_status ?? \"complete\"}, ${updatedAt}\n )\n ON CONFLICT (project_id, subject_type, subject_id, meter, currency, period_start)\n DO UPDATE SET\n period_end = excluded.period_end,\n actual_amount = excluded.actual_amount,\n reserved_amount = excluded.reserved_amount,\n unknown_amount = excluded.unknown_amount,\n accounting_status = excluded.accounting_status,\n updated_at = excluded.updated_at\n `\n }\n\n private async moveEstimateCounters(\n sql: PgStoreClient,\n reservation: AiModelCallReservation,\n directions: { readonly reserved?: bigint; readonly unknown?: bigint },\n updatedAt: Date\n ): Promise<void> {\n for (const bucket of reservation.buckets) {\n const amount = normalizeAiLimitAmount(bucket.estimate)\n await this.changeCounters(\n sql,\n reservation.projectId,\n bucket.subject,\n amount,\n reservation.period,\n {\n ...(directions.reserved === undefined\n ? {}\n : { reserved: directions.reserved * amount.amount }),\n ...(directions.unknown === undefined\n ? {}\n : { unknown: directions.unknown * amount.amount }),\n },\n updatedAt\n )\n }\n }\n\n private async reconcileEstimateCounters(\n sql: PgStoreClient,\n reservation: AiModelCallReservation,\n entry: AiLimitAccountingEntry,\n updatedAt: Date\n ): Promise<void> {\n for (const bucket of reservation.buckets) {\n const amount = normalizeAiLimitAmount(bucket.estimate)\n const actual = resolveAiLimitActual([entry], amount)\n if (actual.accountingStatus === \"complete\") {\n await this.changeCounters(\n sql,\n reservation.projectId,\n bucket.subject,\n amount,\n reservation.period,\n reservation.state === \"active\"\n ? { reserved: -amount.amount }\n : { unknown: -amount.amount },\n updatedAt\n )\n } else if (reservation.state === \"active\") {\n await this.changeCounters(\n sql,\n reservation.projectId,\n bucket.subject,\n amount,\n reservation.period,\n { reserved: -amount.amount, unknown: amount.amount },\n updatedAt\n )\n }\n }\n }\n\n private async insertReservation(\n sql: PgStoreClient,\n reservation: AiModelCallReservation\n ): Promise<void> {\n await sql`\n INSERT INTO ai_model_call_reservations (\n project_id, execution_id, attempt, call_id, buckets, request_key,\n period_start, period_end, state, usage_record_id, reserved_at, updated_at\n ) VALUES (\n ${reservation.projectId}, ${reservation.executionId}, ${reservation.attempt},\n ${reservation.callId}, ${JSON.stringify(reservation.buckets)}::text::jsonb,\n ${reservation.requestKey}, ${reservation.period.start},\n ${reservation.period.end}, ${reservation.state}, ${reservation.usageRecordId ?? null},\n ${reservation.reservedAt}, ${reservation.updatedAt}\n )\n `\n }\n\n private async updateReservation(\n sql: PgStoreClient,\n reservation: AiModelCallReservation\n ): Promise<void> {\n await sql`\n UPDATE ai_model_call_reservations\n SET state = ${reservation.state},\n usage_record_id = ${reservation.usageRecordId ?? null},\n updated_at = ${reservation.updatedAt}\n WHERE project_id = ${reservation.projectId}\n AND execution_id = ${reservation.executionId}\n AND attempt = ${reservation.attempt}\n AND call_id = ${reservation.callId}\n `\n }\n\n private async findReservation(\n sql: PgStoreClient,\n input: {\n readonly projectId: string\n readonly executionId: string\n readonly attempt: number\n readonly callId: string\n }\n ): Promise<AiModelCallReservation | null> {\n const [row] = await sql<AiModelCallReservationRow[]>`\n SELECT * FROM ai_model_call_reservations\n WHERE project_id = ${input.projectId}\n AND execution_id = ${input.executionId}\n AND attempt = ${input.attempt}\n AND call_id = ${input.callId}\n `\n return row ? reservationFromRow(row) : null\n }\n\n private async accountingEntries(\n sql: PgStoreClient,\n policy: AiLimitPolicy,\n period: AiLimitPeriod\n ): Promise<readonly AiLimitAccountingEntry[]> {\n const subject = aiLimitSubjectParts(policy.subject)\n const rows = await sql<AiLimitAccountingRow[]>`\n SELECT usage.project_id, usage.id AS usage_record_id, usage.execution_id,\n usage.attempt, usage.call_id, usage.occurred_at,\n usage.total_tokens::text AS total_tokens,\n executions.requested_by_user_id,\n executions.requested_by_service_account_id,\n valuations.status AS valuation_status,\n valuations.currency AS valuation_currency,\n valuations.amount_nanos::text AS valuation_amount_nanos\n FROM ai_model_call_usage AS usage\n JOIN executions\n ON executions.project_id = usage.project_id AND executions.id = usage.execution_id\n LEFT JOIN ai_model_call_valuations AS valuations\n ON valuations.project_id = usage.project_id\n AND valuations.usage_record_id = usage.id\n WHERE usage.project_id = ${policy.projectId}\n AND usage.occurred_at >= ${period.start}\n AND usage.occurred_at < ${period.end}\n AND (\n ${subject.type} = 'project'\n OR (\n ${subject.type} = 'group'\n AND EXISTS (\n SELECT 1 FROM ai_model_call_usage_groups AS usage_groups\n WHERE usage_groups.project_id = usage.project_id\n AND usage_groups.usage_record_id = usage.id\n AND usage_groups.group_id = ${subject.id}\n )\n )\n OR (${subject.type} = 'user' AND executions.requested_by_user_id = ${subject.id})\n OR (\n ${subject.type} = 'serviceAccount'\n AND executions.requested_by_service_account_id = ${subject.id}\n )\n )\n ORDER BY usage.occurred_at, usage.id\n `\n return rows.map((row) => accountingEntryFromRow(row, policy.subject))\n }\n\n private async requireAccountingEntry(\n sql: PgStoreClient,\n projectId: string,\n usageRecordId: string\n ): Promise<AiLimitAccountingEntry> {\n const [row] = await sql<AiLimitAccountingRow[]>`\n SELECT usage.project_id, usage.id AS usage_record_id, usage.execution_id,\n usage.attempt, usage.call_id, usage.occurred_at,\n usage.total_tokens::text AS total_tokens,\n executions.requested_by_user_id,\n executions.requested_by_service_account_id,\n valuations.status AS valuation_status,\n valuations.currency AS valuation_currency,\n valuations.amount_nanos::text AS valuation_amount_nanos\n FROM ai_model_call_usage AS usage\n JOIN executions\n ON executions.project_id = usage.project_id AND executions.id = usage.execution_id\n LEFT JOIN ai_model_call_valuations AS valuations\n ON valuations.project_id = usage.project_id\n AND valuations.usage_record_id = usage.id\n WHERE usage.project_id = ${projectId} AND usage.id = ${usageRecordId}\n `\n if (row) {\n const groups = await sql<{ group_id: string }[]>`\n SELECT group_id FROM ai_model_call_usage_groups\n WHERE project_id = ${projectId} AND usage_record_id = ${usageRecordId}\n ORDER BY group_id\n `\n return accountingEntryFromRow(\n row,\n undefined,\n groups.map((group) => group.group_id)\n )\n }\n throw new AiLimitStorageError(\n \"missing_usage_record\",\n `[SixbPg] AI usage record '${usageRecordId}' does not exist in project '${projectId}'.`\n )\n }\n\n private async assertExecutionExists(\n sql: PgStoreClient,\n projectId: string,\n executionId: string\n ): Promise<void> {\n const [row] = await sql<{ exists: boolean }[]>`\n SELECT EXISTS (\n SELECT 1 FROM executions WHERE project_id = ${projectId} AND id = ${executionId}\n ) AS exists\n `\n if (row?.exists) return\n throw new AiLimitStorageError(\n \"missing_execution\",\n `[SixbPg] AI limit execution '${executionId}' does not exist in project '${projectId}'.`\n )\n }\n}\n\ninterface AiLimitPolicyRow {\n readonly project_id: string\n readonly id: string\n readonly subject_type: AiLimitSubject[\"type\"]\n readonly subject_id: string\n readonly meter: AiLimitQuantity[\"meter\"]\n readonly currency: string\n readonly limit_amount: string\n readonly period_kind: \"calendarMonth\"\n readonly enabled: boolean\n readonly created_at: Date | string\n readonly updated_at: Date | string\n}\n\ninterface AiLimitPeriodStateRow {\n readonly actual_amount: string\n readonly reserved_amount: string\n readonly unknown_amount: string\n readonly accounting_status: \"complete\" | \"unavailable\"\n}\n\ninterface AiLimitActualStateRow {\n readonly meter: AiLimitQuantity[\"meter\"]\n readonly currency: string\n readonly actual_amount: string\n readonly accounting_status: \"complete\" | \"unavailable\"\n}\n\ninterface AiLimitAccountingRow {\n readonly project_id: string\n readonly usage_record_id: string\n readonly execution_id: string\n readonly attempt: number | string\n readonly call_id: string\n readonly occurred_at: Date | string\n readonly total_tokens: string | null\n readonly requested_by_user_id: string | null\n readonly requested_by_service_account_id: string | null\n readonly valuation_status: \"rated\" | \"unpriceable\" | null\n readonly valuation_currency: string | null\n readonly valuation_amount_nanos: string | null\n}\n\ninterface AiModelCallReservationRow {\n readonly project_id: string\n readonly execution_id: string\n readonly attempt: number | string\n readonly call_id: string\n readonly buckets: readonly AiLimitReservationBucket[] | string\n readonly request_key: string\n readonly period_start: Date | string\n readonly period_end: Date | string\n readonly state: AiModelCallReservation[\"state\"]\n readonly usage_record_id: string | null\n readonly reserved_at: Date | string\n readonly updated_at: Date | string\n}\n\nfunction policyFromRow(row: AiLimitPolicyRow): AiLimitPolicy {\n return {\n id: row.id,\n projectId: row.project_id,\n subject: aiLimitSubjectFromParts(row.subject_type, row.subject_id),\n limit: aiLimitQuantityFromAmount({\n meter: row.meter,\n currency: row.currency,\n amount: BigInt(row.limit_amount),\n }),\n period: row.period_kind,\n enabled: row.enabled,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n }\n}\n\nfunction policyStatus(\n policy: AiLimitPolicy,\n period: AiLimitPeriod,\n row: AiLimitPeriodStateRow,\n existingGroups?: ReadonlySet<string>\n): AiLimitPolicyStatus {\n const limit = normalizeAiLimitAmount(policy.limit)\n const actual = BigInt(row.actual_amount)\n const reserved = BigInt(row.reserved_amount)\n const unknown = BigInt(row.unknown_amount)\n const consumed = actual + reserved + unknown\n const quantity = (amount: bigint) => aiLimitQuantityFromAmount({ ...limit, amount })\n return {\n policy,\n period: structuredClone(period),\n consumption: {\n actual: quantity(actual),\n reserved: quantity(reserved),\n unknown: quantity(unknown),\n remaining: quantity(limit.amount > consumed ? limit.amount - consumed : 0n),\n },\n accountingStatus: row.accounting_status,\n exhausted: consumed >= limit.amount,\n orphaned:\n policy.subject.type === \"group\" &&\n existingGroups !== undefined &&\n !existingGroups.has(policy.subject.id),\n }\n}\n\nfunction accountingEntryFromRow(\n row: AiLimitAccountingRow,\n subject?: AiLimitSubject,\n requesterGroupIds = subject?.type === \"group\" ? [subject.id] : []\n): AiLimitAccountingEntry {\n const totalTokens = row.total_tokens === null ? undefined : Number(row.total_tokens)\n const requester = row.requested_by_user_id\n ? ({ type: \"user\", id: row.requested_by_user_id } as const)\n : row.requested_by_service_account_id\n ? ({ type: \"serviceAccount\", id: row.requested_by_service_account_id } as const)\n : undefined\n return {\n projectId: row.project_id,\n usageRecordId: row.usage_record_id,\n executionId: row.execution_id,\n attempt: Number(row.attempt),\n callId: row.call_id,\n occurredAt: new Date(row.occurred_at),\n ...(totalTokens !== undefined && Number.isSafeInteger(totalTokens) ? { totalTokens } : {}),\n requesterGroupIds,\n ...(requester ? { requester } : {}),\n ...(row.valuation_status === \"rated\" &&\n row.valuation_currency !== null &&\n row.valuation_amount_nanos !== null\n ? {\n valuation: {\n status: \"rated\" as const,\n money: {\n currency: row.valuation_currency,\n amountNanos: row.valuation_amount_nanos,\n },\n },\n }\n : row.valuation_status === \"unpriceable\"\n ? { valuation: { status: \"unavailable\" as const } }\n : {}),\n }\n}\n\nfunction reservationFromRow(row: AiModelCallReservationRow): AiModelCallReservation {\n const buckets = jsonValue<readonly AiLimitReservationBucket[]>(row.buckets)\n return {\n projectId: row.project_id,\n executionId: row.execution_id,\n attempt: Number(row.attempt),\n callId: row.call_id,\n buckets: buckets.map((bucket) => ({\n subject: structuredClone(bucket.subject),\n estimate: normalizeAiLimitQuantities([bucket.estimate], \"stored bucket\")[0]!,\n })),\n requestKey: row.request_key,\n period: {\n kind: \"calendarMonth\",\n start: new Date(row.period_start),\n end: new Date(row.period_end),\n resetAt: new Date(row.period_end),\n },\n state: row.state,\n ...(row.usage_record_id === null ? {} : { usageRecordId: row.usage_record_id }),\n reservedAt: new Date(row.reserved_at),\n updatedAt: new Date(row.updated_at),\n }\n}\n\nfunction jsonValue<T>(value: T | string): T {\n return typeof value === \"string\" ? (JSON.parse(value) as T) : value\n}\n\nfunction assertSameDimension(previous: AiLimitQuantity, next: AiLimitQuantity): void {\n if (\n aiLimitAmountKey(normalizeAiLimitAmount(previous)) !==\n aiLimitAmountKey(normalizeAiLimitAmount(next))\n ) {\n throw new TypeError(\"[Sixb] AI limit policy meter and cost currency are immutable.\")\n }\n}\n\nfunction validatePolicyIdentity(input: GetAiLimitPolicyInput): void {\n assertNonBlank(input.projectId, \"projectId\")\n assertNonBlank(input.id, \"policy id\")\n}\n\nfunction duplicatePolicy(policy: AiLimitPolicy): AiLimitStorageError {\n return new AiLimitStorageError(\n \"duplicate_policy\",\n `[SixbPg] An AI limit policy already exists for policy ID or subject-meter dimension '${policy.id}'.`\n )\n}\n\nfunction missingReservation(input: {\n readonly executionId: string\n readonly attempt: number\n readonly callId: string\n}): AiLimitStorageError {\n return new AiLimitStorageError(\n \"missing_reservation\",\n `[SixbPg] AI model-call reservation '${input.callId}' does not exist for execution '${input.executionId}' attempt ${input.attempt}.`\n )\n}\n\nfunction reconciliationConflict(callId: string): AiLimitStorageError {\n return new AiLimitStorageError(\n \"reconciliation_conflict\",\n `[SixbPg] AI model-call reservation '${callId}' was reconciled with a different usage record.`\n )\n}\n\nfunction invalidState(reservation: AiModelCallReservation, operation: string): AiLimitStorageError {\n return new AiLimitStorageError(\n \"invalid_reservation_state\",\n `[SixbPg] Cannot ${operation} AI model-call reservation '${reservation.callId}' in state '${reservation.state}'.`\n )\n}\n",
60
+ "import { assertAiUsageExecutionId, normalizeAiModelCallRecord } from \"@sixb/core/internal/storage\"\nimport { isModelReasoning, normalizeModelProviderIds } from \"@sixb/core/models\"\nimport type { ReadonlyJsonObject } from \"@sixb/core/storage\"\nimport {\n type AiModelCallUsageInput,\n type AiModelCallUsageRecord,\n type AiUsageExecutionSummary,\n type AiUsageStorage,\n AiUsageStorageError,\n aggregateAiModelCallUsage,\n type GetLatestAiModelCallForExecutionInput,\n type RecordAiModelCallInput,\n type RecordAiModelCallResult,\n type SummarizeAiUsageExecutionInput,\n type SummarizeAiUsageExecutionsInput,\n} from \"@sixb/core/storage\"\nimport type { SQLClient } from \"./pg-client\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\n/** PostgreSQL-backed append-only model-call usage ledger. */\nexport class PgAiUsageStorage implements AiUsageStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async recordModelCall(input: RecordAiModelCallInput): Promise<RecordAiModelCallResult> {\n const record = normalizeAiModelCallRecord(input)\n return runPgTransaction(this.sql, async (tx) => {\n const existing = await this.findByIdempotencyKey(tx, record)\n if (existing) return { record: existing, created: false }\n await this.assertExecutionExists(tx, record.projectId, record.executionId)\n\n const inserted = await tx<{ id: string }[]>`\n INSERT INTO ai_model_call_usage (\n project_id,\n id,\n execution_id,\n attempt,\n call_id,\n provider_id,\n provider_ids,\n requested_model_id,\n model_kind,\n requested_reasoning,\n response_model_id,\n response_id,\n input_tokens,\n output_tokens,\n total_tokens,\n uncached_input_tokens,\n cache_read_input_tokens,\n cache_write_input_tokens,\n text_output_tokens,\n reasoning_output_tokens,\n audio_duration_ms,\n reporting_status,\n raw_usage,\n occurred_at,\n recorded_at\n ) VALUES (\n ${record.projectId},\n ${record.id},\n ${record.executionId},\n ${record.attempt},\n ${record.callId},\n ${record.providerId},\n ${record.providerIds === undefined ? null : JSON.stringify(record.providerIds)}::jsonb,\n ${record.requestedModelId},\n ${record.modelKind ?? null},\n ${\n record.requestedReasoning === undefined\n ? null\n : JSON.stringify(record.requestedReasoning)\n }::text::jsonb,\n ${record.responseModelId ?? null},\n ${record.responseId},\n ${record.usage.inputTokens ?? null},\n ${record.usage.outputTokens ?? null},\n ${record.usage.totalTokens ?? null},\n ${record.usage.uncachedInputTokens ?? null},\n ${record.usage.cacheReadInputTokens ?? null},\n ${record.usage.cacheWriteInputTokens ?? null},\n ${record.usage.textOutputTokens ?? null},\n ${record.usage.reasoningOutputTokens ?? null},\n ${record.usage.audioDurationMs ?? null},\n ${record.usage.reportingStatus},\n ${record.rawUsage === undefined ? null : JSON.stringify(record.rawUsage)}::text::jsonb,\n ${record.occurredAt},\n ${record.recordedAt}\n )\n ON CONFLICT DO NOTHING\n RETURNING id\n `\n\n if (inserted.length === 0) {\n const concurrent = await this.findByIdempotencyKey(tx, record)\n if (concurrent) return { record: concurrent, created: false }\n throw new AiUsageStorageError(\n \"duplicate_id\",\n `[SixbPg] AI usage record '${record.id}' already exists for project '${record.projectId}'.`\n )\n }\n\n for (const groupId of record.requesterGroupIds) {\n await tx`\n INSERT INTO ai_model_call_usage_groups (\n project_id, usage_record_id, group_id, occurred_at\n ) VALUES (\n ${record.projectId}, ${record.id}, ${groupId}, ${record.occurredAt}\n )\n `\n }\n\n return { record: await this.requireById(tx, record.projectId, record.id), created: true }\n })\n }\n\n async summarizeExecution(\n input: SummarizeAiUsageExecutionInput\n ): Promise<AiUsageExecutionSummary> {\n const [summary] = await this.summarizeExecutions({\n projectId: input.projectId,\n executionIds: [input.executionId],\n })\n return summary!\n }\n\n async getLatestForExecution(\n input: GetLatestAiModelCallForExecutionInput\n ): Promise<AiModelCallUsageRecord | null> {\n assertNonBlankProjectId(input.projectId)\n assertAiUsageExecutionId(input.executionId)\n const [row] = await this.sql<AiUsageRow[]>`\n SELECT * FROM ai_model_call_usage\n WHERE project_id = ${input.projectId} AND execution_id = ${input.executionId}\n ORDER BY occurred_at DESC, id DESC\n LIMIT 1\n `\n return row ? this.rowToRecord(this.sql, row) : null\n }\n\n async summarizeExecutions(\n input: SummarizeAiUsageExecutionsInput\n ): Promise<readonly AiUsageExecutionSummary[]> {\n assertNonBlankProjectId(input.projectId)\n for (const executionId of input.executionIds) assertAiUsageExecutionId(executionId)\n if (input.executionIds.length === 0) return []\n\n const rows = await this.executionRows(this.sql, input)\n return aggregateExecutionRows(input.executionIds, rows)\n }\n\n private async findByIdempotencyKey(\n sql: PgStoreClient,\n record: Pick<\n AiModelCallUsageRecord,\n \"projectId\" | \"executionId\" | \"attempt\" | \"callId\" | \"responseId\"\n >\n ): Promise<AiModelCallUsageRecord | null> {\n const rows = await sql<AiUsageRow[]>`\n SELECT * FROM ai_model_call_usage\n WHERE project_id = ${record.projectId}\n AND execution_id = ${record.executionId}\n AND attempt = ${record.attempt}\n AND call_id = ${record.callId}\n AND response_id = ${record.responseId}\n `\n return rows[0] ? this.rowToRecord(sql, rows[0]) : null\n }\n\n private async requireById(\n sql: SQLClient,\n projectId: string,\n id: string\n ): Promise<AiModelCallUsageRecord> {\n const [row] = await sql<AiUsageRow[]>`\n SELECT * FROM ai_model_call_usage WHERE project_id = ${projectId} AND id = ${id}\n `\n if (!row) throw new Error(`[SixbPg] AI usage record '${id}' disappeared after insert.`)\n return this.rowToRecord(sql, row)\n }\n\n private async rowToRecord(sql: PgStoreClient, row: AiUsageRow): Promise<AiModelCallUsageRecord> {\n const groupRows = await sql<Array<{ group_id: string }>>`\n SELECT group_id FROM ai_model_call_usage_groups\n WHERE project_id = ${row.project_id} AND usage_record_id = ${row.id}\n ORDER BY group_id\n `\n\n return {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n attempt: Number(row.attempt),\n callId: row.call_id,\n requesterGroupIds: groupRows.map((group) => group.group_id),\n providerId: row.provider_id,\n ...(row.provider_ids === null\n ? {}\n : {\n providerIds: normalizeModelProviderIds(\n typeof row.provider_ids === \"string\" ? JSON.parse(row.provider_ids) : row.provider_ids\n ),\n }),\n requestedModelId: row.requested_model_id,\n ...(row.model_kind === null ? {} : { modelKind: row.model_kind }),\n ...(row.requested_reasoning === null\n ? {}\n : { requestedReasoning: requestedReasoningFromRow(row.requested_reasoning) }),\n ...(row.response_model_id === null ? {} : { responseModelId: row.response_model_id }),\n responseId: row.response_id,\n usage: {\n ...usageFromRow(row),\n ...(row.total_tokens === null ? {} : { totalTokens: Number(row.total_tokens) }),\n reportingStatus: row.reporting_status,\n },\n ...(row.raw_usage === null ? {} : { rawUsage: rawUsageFromRow(row.raw_usage) }),\n occurredAt: new Date(row.occurred_at),\n recordedAt: new Date(row.recorded_at),\n }\n }\n\n private executionRows(\n sql: PgStoreClient,\n input: SummarizeAiUsageExecutionsInput\n ): Promise<AiUsageRow[]> {\n const executionIds = [...new Set(input.executionIds)]\n\n return sql<AiUsageRow[]>`\n WITH requested(execution_id) AS (\n SELECT * FROM unnest(${sql.array(executionIds)}::text[])\n )\n SELECT usage.* FROM requested\n JOIN ai_model_call_usage AS usage\n ON usage.project_id = ${input.projectId}\n AND usage.execution_id = requested.execution_id\n `\n }\n\n private async assertExecutionExists(\n sql: PgStoreClient,\n projectId: string,\n executionId: string\n ): Promise<void> {\n const [execution] = await sql<{ exists: boolean }[]>`\n SELECT EXISTS (\n SELECT 1 FROM executions WHERE project_id = ${projectId} AND id = ${executionId}\n ) AS exists\n `\n if (execution?.exists) return\n throw new AiUsageStorageError(\n \"missing_execution\",\n `[SixbPg] AI usage execution '${executionId}' does not exist in project '${projectId}'.`\n )\n }\n}\n\ninterface AiUsageRow {\n readonly project_id: string\n readonly id: string\n readonly execution_id: string\n readonly attempt: number | string\n readonly call_id: string\n readonly provider_id: string\n readonly provider_ids: Record<string, unknown> | string | null\n readonly requested_model_id: string\n readonly model_kind: AiModelCallUsageRecord[\"modelKind\"] | null\n readonly requested_reasoning: string | Record<string, unknown> | null\n readonly response_model_id: string | null\n readonly response_id: string\n readonly input_tokens: number | string | null\n readonly output_tokens: number | string | null\n readonly total_tokens: number | string | null\n readonly uncached_input_tokens: number | string | null\n readonly cache_read_input_tokens: number | string | null\n readonly cache_write_input_tokens: number | string | null\n readonly text_output_tokens: number | string | null\n readonly reasoning_output_tokens: number | string | null\n readonly audio_duration_ms: number | string | null\n readonly reporting_status: AiModelCallUsageRecord[\"usage\"][\"reportingStatus\"]\n readonly raw_usage: ReadonlyJsonObject | string | null\n readonly occurred_at: Date | string\n readonly recorded_at: Date | string\n}\n\nfunction aggregateExecutionRows(\n executionIds: readonly string[],\n rows: readonly AiUsageRow[]\n): readonly AiUsageExecutionSummary[] {\n const usageByExecutionId = new Map<string, AiModelCallUsageInput[]>()\n for (const executionId of executionIds) usageByExecutionId.set(executionId, [])\n for (const row of rows) {\n usageByExecutionId.get(row.execution_id)?.push(usageFromRow(row))\n }\n return executionIds.map((executionId) => {\n const usages = usageByExecutionId.get(executionId) ?? []\n return {\n modelCallCount: usages.length,\n usage: aggregateAiModelCallUsage(usages),\n }\n })\n}\n\nfunction usageFromRow(row: AiUsageRow): AiModelCallUsageInput {\n return {\n ...(row.input_tokens === null ? {} : { inputTokens: Number(row.input_tokens) }),\n ...(row.output_tokens === null ? {} : { outputTokens: Number(row.output_tokens) }),\n ...(row.uncached_input_tokens === null\n ? {}\n : { uncachedInputTokens: Number(row.uncached_input_tokens) }),\n ...(row.cache_read_input_tokens === null\n ? {}\n : { cacheReadInputTokens: Number(row.cache_read_input_tokens) }),\n ...(row.cache_write_input_tokens === null\n ? {}\n : { cacheWriteInputTokens: Number(row.cache_write_input_tokens) }),\n ...(row.text_output_tokens === null\n ? {}\n : { textOutputTokens: Number(row.text_output_tokens) }),\n ...(row.reasoning_output_tokens === null\n ? {}\n : { reasoningOutputTokens: Number(row.reasoning_output_tokens) }),\n ...(row.audio_duration_ms === null ? {} : { audioDurationMs: Number(row.audio_duration_ms) }),\n }\n}\n\nfunction rawUsageFromRow(value: Exclude<AiUsageRow[\"raw_usage\"], null>): ReadonlyJsonObject {\n return typeof value === \"string\" ? (JSON.parse(value) as ReadonlyJsonObject) : value\n}\n\nexport function requestedReasoningFromRow(\n value: Exclude<AiUsageRow[\"requested_reasoning\"], null>\n): AiModelCallUsageRecord[\"requestedReasoning\"] {\n const parsed: unknown =\n typeof value === \"string\" && (value.startsWith('\"') || value.startsWith(\"{\"))\n ? JSON.parse(value)\n : value\n if (!isModelReasoning(parsed)) {\n throw new Error(\"[SixbPg] Stored AI usage requested reasoning is invalid.\")\n }\n return parsed\n}\n\nfunction assertNonBlankProjectId(projectId: string): void {\n if (typeof projectId !== \"string\" || projectId.trim().length === 0) {\n throw new TypeError(\"[Sixb] AI usage projectId must be nonblank.\")\n }\n}\n",
61
+ "import {\n type AiLimitAccountingEntry,\n AiLimitOperationLock,\n aiLimitAmountKey,\n aiLimitMeterApplies,\n aiLimitQuantityFromAmount,\n aiLimitReservationBuckets,\n aiLimitReservationRequestKey,\n aiLimitReservationRequestMatches,\n aiLimitSubjectFromParts,\n aiLimitSubjectKey,\n aiLimitSubjectParts,\n aiLimitSubjectsFromAccountingEntry,\n assertAiLimitAccountingMatchesReservation,\n assertNonBlank,\n cloneValidDate,\n type NormalizedAiLimitAmount,\n normalizeAiLimitAmount,\n normalizeAiLimitQuantities,\n normalizeAiModelCallReservationIdentity,\n normalizeCreateAiLimitPolicy,\n normalizeReserveAiModelCall,\n normalizeUpdateAiLimitPolicy,\n resolveAiLimitActual,\n} from \"@sixb/core/internal/ai-limit-storage-provider\"\nimport type {\n AiLimitPeriod,\n AiLimitPolicy,\n AiLimitPolicyStatus,\n AiLimitQuantity,\n AiLimitReservationBucket,\n AiLimitStorage,\n AiLimitSubject,\n AiModelCallReservation,\n CreateAiLimitPolicyInput,\n DeleteAiLimitPolicyInput,\n GetAiLimitPolicyInput,\n ListAiLimitPoliciesInput,\n ListAiLimitPolicyStatusesInput,\n MarkAiModelCallReservationUnknownInput,\n ReconcileAiModelCallInput,\n RecordAiModelCallLimitActualsInput,\n ReserveAiModelCallInput,\n ReserveAiModelCallResult,\n UpdateAiLimitPolicyInput,\n} from \"@sixb/core/storage\"\nimport { AiLimitStorageError, aiLimitCalendarMonth } from \"@sixb/core/storage\"\nimport type { SQLClient } from \"./pg-client\"\nimport { lockAdvisoryKeys, type PgStoreClient, runPgTransaction } from \"./transactions\"\n\n/** PostgreSQL-backed editable AI limits and atomic model-call reservations. */\nexport class PgAiLimitStorage implements AiLimitStorage {\n private readonly operations = new AiLimitOperationLock()\n\n constructor(private readonly sql: PgStoreClient) {}\n\n /** @internal Keep queued work inside the lifetime of the owning SQL transaction. */\n settleOperations(): Promise<void> {\n return this.operations.settle()\n }\n\n async createPolicy(input: CreateAiLimitPolicyInput): Promise<AiLimitPolicy> {\n const policy = normalizeCreateAiLimitPolicy(input)\n return this.withProjectLock(policy.projectId, async (tx) => {\n const subject = aiLimitSubjectParts(policy.subject)\n const limit = normalizeAiLimitAmount(policy.limit)\n const inserted = await tx<{ id: string }[]>`\n INSERT INTO ai_usage_limits (\n project_id, id, subject_type, subject_id, meter, currency, limit_amount,\n period_kind, enabled, created_at, updated_at\n ) VALUES (\n ${policy.projectId}, ${policy.id}, ${subject.type}, ${subject.id}, ${limit.meter},\n ${limit.currency}, ${limit.amount.toString()}, ${policy.period}, ${policy.enabled},\n ${policy.createdAt}, ${policy.updatedAt}\n )\n ON CONFLICT DO NOTHING\n RETURNING id\n `\n if (inserted.length === 0) throw duplicatePolicy(policy)\n return this.requirePolicy(tx, policy.projectId, policy.id)\n })\n }\n\n async updatePolicy(input: UpdateAiLimitPolicyInput): Promise<AiLimitPolicy> {\n const update = normalizeUpdateAiLimitPolicy(input)\n return this.withProjectLock(update.projectId, async (tx) => {\n const existing = await this.requirePolicy(tx, update.projectId, update.id)\n if (update.limit !== undefined) assertSameDimension(existing.limit, update.limit)\n const limit = normalizeAiLimitAmount(update.limit ?? existing.limit)\n await tx`\n UPDATE ai_usage_limits\n SET limit_amount = ${limit.amount.toString()},\n enabled = ${update.enabled ?? existing.enabled},\n updated_at = ${update.updatedAt}\n WHERE project_id = ${update.projectId} AND id = ${update.id}\n `\n return this.requirePolicy(tx, update.projectId, update.id)\n })\n }\n\n async deletePolicy(input: DeleteAiLimitPolicyInput): Promise<boolean> {\n validatePolicyIdentity(input)\n return this.withProjectLock(input.projectId, async (tx) => {\n const deleted = await tx<{ id: string }[]>`\n DELETE FROM ai_usage_limits\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING id\n `\n return deleted.length > 0\n })\n }\n\n async getPolicy(input: GetAiLimitPolicyInput): Promise<AiLimitPolicy | null> {\n validatePolicyIdentity(input)\n const [row] = await this.sql<AiLimitPolicyRow[]>`\n SELECT * FROM ai_usage_limits\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n return row ? policyFromRow(row) : null\n }\n\n async listPolicies(input: ListAiLimitPoliciesInput): Promise<readonly AiLimitPolicy[]> {\n assertNonBlank(input.projectId, \"projectId\")\n return (await this.policyRows(this.sql, input.projectId, input.includeDisabled ?? false)).map(\n policyFromRow\n )\n }\n\n async listPolicyStatuses(\n input: ListAiLimitPolicyStatusesInput\n ): Promise<readonly AiLimitPolicyStatus[]> {\n assertNonBlank(input.projectId, \"projectId\")\n const period = aiLimitCalendarMonth(input.at ?? new Date())\n const existingGroups =\n input.existingGroupIds === undefined ? undefined : new Set(input.existingGroupIds)\n return this.withProjectLock(input.projectId, async (tx) => {\n const rows = await this.policyRows(tx, input.projectId, input.includeDisabled ?? false)\n return Promise.all(\n rows.map((row) => this.statusForPolicy(tx, policyFromRow(row), period, existingGroups))\n )\n })\n }\n\n async reserveModelCall(input: ReserveAiModelCallInput): Promise<ReserveAiModelCallResult> {\n const request = normalizeReserveAiModelCall(input)\n return this.withProjectLock(request.identity.projectId, async (tx) => {\n const existing = await this.findReservation(tx, request.identity)\n if (existing) {\n if (!aiLimitReservationRequestMatches(existing, request)) {\n throw new AiLimitStorageError(\n \"reservation_conflict\",\n `[SixbPg] AI model-call reservation '${input.callId}' was replayed with different subjects, estimates, or period.`\n )\n }\n if (existing.state !== \"active\") {\n return { status: \"terminal\", reservation: existing, created: false }\n }\n return { status: \"reserved\", reservation: existing, created: false }\n }\n await this.assertExecutionExists(tx, request.identity.projectId, request.identity.executionId)\n\n const subjectKeys = new Set(request.subjects.map(aiLimitSubjectKey))\n const estimates = new Map(\n request.estimates.map((quantity) => {\n const amount = normalizeAiLimitAmount(quantity)\n return [aiLimitAmountKey(amount), amount] as const\n })\n )\n const enabledPolicies = (await this.policyRows(tx, request.identity.projectId, false)).map(\n policyFromRow\n )\n const exhaustedPolicies: AiLimitPolicyStatus[] = []\n const unavailablePolicies: AiLimitPolicyStatus[] = []\n const unavailableReasons = new Set<\"missingEstimate\" | \"incompleteAccounting\">()\n for (const policy of enabledPolicies) {\n if (\n !subjectKeys.has(aiLimitSubjectKey(policy.subject)) ||\n !aiLimitMeterApplies(policy.limit.meter, request.modelKind)\n ) {\n continue\n }\n const limit = normalizeAiLimitAmount(policy.limit)\n const estimate = estimates.get(aiLimitAmountKey(limit))\n const status = await this.statusForPolicy(tx, policy, request.period)\n if (!estimate || status.accountingStatus === \"unavailable\") {\n unavailablePolicies.push(status)\n if (!estimate) unavailableReasons.add(\"missingEstimate\")\n if (status.accountingStatus === \"unavailable\") {\n unavailableReasons.add(\"incompleteAccounting\")\n }\n continue\n }\n const consumed =\n normalizeAiLimitAmount(status.consumption.actual).amount +\n normalizeAiLimitAmount(status.consumption.reserved).amount +\n normalizeAiLimitAmount(status.consumption.unknown).amount\n if (consumed + estimate.amount > limit.amount) exhaustedPolicies.push(status)\n }\n if (unavailablePolicies.length > 0) {\n unavailablePolicies.sort((left, right) => left.policy.id.localeCompare(right.policy.id))\n return {\n status: \"unavailable\",\n unavailablePolicies,\n reasons: [...unavailableReasons].sort(),\n }\n }\n if (exhaustedPolicies.length > 0) {\n exhaustedPolicies.sort((left, right) => left.policy.id.localeCompare(right.policy.id))\n return {\n status: \"denied\",\n exhaustedPolicies,\n resetAt: new Date(\n Math.min(...exhaustedPolicies.map((status) => status.period.resetAt.getTime()))\n ),\n }\n }\n\n const buckets = aiLimitReservationBuckets(\n enabledPolicies,\n request.subjects,\n request.estimates,\n request.modelKind\n )\n if (buckets.length === 0) return { status: \"notRequired\" }\n for (const bucket of buckets) {\n const amount = normalizeAiLimitAmount(bucket.estimate)\n await this.changeCounters(\n tx,\n request.identity.projectId,\n bucket.subject,\n amount,\n request.period,\n { reserved: amount.amount },\n request.reservedAt\n )\n }\n const reservation: AiModelCallReservation = {\n ...request.identity,\n buckets,\n requestKey: aiLimitReservationRequestKey(request),\n period: request.period,\n state: \"active\",\n reservedAt: request.reservedAt,\n updatedAt: new Date(request.reservedAt),\n }\n await this.insertReservation(tx, reservation)\n return { status: \"reserved\", reservation: structuredClone(reservation), created: true }\n })\n }\n\n async recordModelCallActuals(input: RecordAiModelCallLimitActualsInput): Promise<void> {\n assertNonBlank(input.projectId, \"projectId\")\n assertNonBlank(input.usageRecordId, \"usageRecordId\")\n const recordedAt = cloneValidDate(input.recordedAt ?? new Date(), \"recordedAt\")\n await this.withProjectLock(input.projectId, async (tx) => {\n const entry = await this.requireAccountingEntry(tx, input.projectId, input.usageRecordId)\n const period = aiLimitCalendarMonth(entry.occurredAt)\n for (const subjectValue of aiLimitSubjectsFromAccountingEntry(entry)) {\n const subject = aiLimitSubjectParts(subjectValue)\n const rows = await tx<AiLimitActualStateRow[]>`\n SELECT meter, currency, actual_amount, accounting_status\n FROM ai_usage_limit_periods\n WHERE project_id = ${input.projectId}\n AND subject_type = ${subject.type}\n AND subject_id = ${subject.id}\n AND period_start = ${period.start}\n FOR UPDATE\n `\n for (const row of rows) {\n const actual = resolveAiLimitActual([entry], row)\n await tx`\n UPDATE ai_usage_limit_periods\n SET actual_amount = ${(BigInt(row.actual_amount) + actual.amount).toString()},\n accounting_status = ${\n row.accounting_status === \"unavailable\" ||\n actual.accountingStatus === \"unavailable\"\n ? \"unavailable\"\n : \"complete\"\n },\n updated_at = ${recordedAt}\n WHERE project_id = ${input.projectId}\n AND subject_type = ${subject.type}\n AND subject_id = ${subject.id}\n AND meter = ${row.meter}\n AND currency = ${row.currency}\n AND period_start = ${period.start}\n `\n }\n }\n })\n }\n\n async reconcileModelCall(input: ReconcileAiModelCallInput): Promise<AiModelCallReservation> {\n const identity = normalizeAiModelCallReservationIdentity(input)\n assertNonBlank(input.usageRecordId, \"usageRecordId\")\n const reconciledAt = cloneValidDate(input.reconciledAt ?? new Date(), \"reconciledAt\")\n return this.withProjectLock(identity.projectId, async (tx) => {\n const reservation = await this.findReservation(tx, identity)\n if (!reservation) throw missingReservation(identity)\n if (reservation.state === \"reconciled\") {\n if (reservation.usageRecordId === input.usageRecordId) {\n return reservation\n }\n throw reconciliationConflict(identity.callId)\n }\n const accounting = await this.requireAccountingEntry(\n tx,\n identity.projectId,\n input.usageRecordId\n )\n assertAiLimitAccountingMatchesReservation(reservation, accounting)\n await this.reconcileEstimateCounters(tx, reservation, accounting, reconciledAt)\n const reconciled: AiModelCallReservation = {\n ...reservation,\n state: \"reconciled\",\n usageRecordId: input.usageRecordId,\n updatedAt: reconciledAt,\n }\n await this.updateReservation(tx, reconciled)\n return structuredClone(reconciled)\n })\n }\n\n async markReservationUnknown(\n input: MarkAiModelCallReservationUnknownInput\n ): Promise<AiModelCallReservation> {\n const identity = normalizeAiModelCallReservationIdentity(input)\n const markedAt = cloneValidDate(input.markedAt ?? new Date(), \"markedAt\")\n return this.withProjectLock(identity.projectId, async (tx) => {\n const reservation = await this.findReservation(tx, identity)\n if (!reservation) throw missingReservation(identity)\n if (reservation.state === \"unknown\") return reservation\n if (reservation.state !== \"active\") throw invalidState(reservation, \"mark unknown\")\n await this.moveEstimateCounters(tx, reservation, { reserved: -1n, unknown: 1n }, markedAt)\n const unknown = { ...reservation, state: \"unknown\" as const, updatedAt: markedAt }\n await this.updateReservation(tx, unknown)\n return structuredClone(unknown)\n })\n }\n\n private async withProjectLock<T>(\n projectId: string,\n run: (tx: SQLClient) => Promise<T>\n ): Promise<T> {\n return runPgTransaction(this.sql, async (tx) => {\n const operation = async () => {\n await lockAdvisoryKeys(tx, [`ai-limit:${projectId}`])\n return run(tx)\n }\n // Advisory locks are reentrant within one transaction. Serialize calls sharing this\n // transaction's store locally; independent root transactions retain their concurrency.\n return tx === this.sql ? this.operations.run(operation) : operation()\n })\n }\n\n private policyRows(\n sql: PgStoreClient,\n projectId: string,\n includeDisabled: boolean\n ): Promise<AiLimitPolicyRow[]> {\n return sql<AiLimitPolicyRow[]>`\n SELECT * FROM ai_usage_limits\n WHERE project_id = ${projectId} AND (${includeDisabled} OR enabled)\n ORDER BY id\n `\n }\n\n private async requirePolicy(\n sql: PgStoreClient,\n projectId: string,\n id: string\n ): Promise<AiLimitPolicy> {\n const [row] = await sql<AiLimitPolicyRow[]>`\n SELECT * FROM ai_usage_limits WHERE project_id = ${projectId} AND id = ${id}\n `\n if (row) return policyFromRow(row)\n throw new AiLimitStorageError(\n \"missing_policy\",\n `[SixbPg] AI limit policy '${id}' does not exist in project '${projectId}'.`\n )\n }\n\n private async statusForPolicy(\n sql: PgStoreClient,\n policy: AiLimitPolicy,\n period: AiLimitPeriod,\n existingGroups?: ReadonlySet<string>\n ): Promise<AiLimitPolicyStatus> {\n const subject = aiLimitSubjectParts(policy.subject)\n const limit = normalizeAiLimitAmount(policy.limit)\n let [row] = await sql<AiLimitPeriodStateRow[]>`\n SELECT actual_amount, reserved_amount, unknown_amount, accounting_status\n FROM ai_usage_limit_periods\n WHERE project_id = ${policy.projectId}\n AND subject_type = ${subject.type}\n AND subject_id = ${subject.id}\n AND meter = ${limit.meter}\n AND currency = ${limit.currency}\n AND period_start = ${period.start}\n `\n // Re-read incomplete accounting under the project lock; retain in-flight estimates.\n if (!row || row.accounting_status === \"unavailable\") {\n const actual = resolveAiLimitActual(await this.accountingEntries(sql, policy, period), limit)\n const [inserted] = await sql<AiLimitPeriodStateRow[]>`\n INSERT INTO ai_usage_limit_periods (\n project_id, subject_type, subject_id, meter, currency, period_start, period_end,\n actual_amount, reserved_amount, unknown_amount, accounting_status, updated_at\n ) VALUES (\n ${policy.projectId}, ${subject.type}, ${subject.id}, ${limit.meter}, ${limit.currency},\n ${period.start}, ${period.end}, ${actual.amount.toString()}, 0, 0,\n ${actual.accountingStatus}, ${new Date()}\n )\n ON CONFLICT (project_id, subject_type, subject_id, meter, currency, period_start)\n DO UPDATE SET\n actual_amount = excluded.actual_amount,\n accounting_status = excluded.accounting_status,\n updated_at = excluded.updated_at\n RETURNING actual_amount, reserved_amount, unknown_amount, accounting_status\n `\n row = inserted\n }\n if (!row) throw new Error(\"[SixbPg] Failed to initialize AI limit period state.\")\n return policyStatus(policy, period, row, existingGroups)\n }\n\n private async changeCounters(\n sql: PgStoreClient,\n projectId: string,\n subjectValue: AiLimitSubject,\n amount: NormalizedAiLimitAmount,\n period: AiLimitPeriod,\n changes: { readonly reserved?: bigint; readonly unknown?: bigint },\n updatedAt: Date\n ): Promise<void> {\n const subject = aiLimitSubjectParts(subjectValue)\n const [row] = await sql<AiLimitPeriodStateRow[]>`\n SELECT actual_amount, reserved_amount, unknown_amount, accounting_status\n FROM ai_usage_limit_periods\n WHERE project_id = ${projectId}\n AND subject_type = ${subject.type}\n AND subject_id = ${subject.id}\n AND meter = ${amount.meter}\n AND currency = ${amount.currency}\n AND period_start = ${period.start}\n FOR UPDATE\n `\n const reserved = BigInt(row?.reserved_amount ?? \"0\") + (changes.reserved ?? 0n)\n const unknown = BigInt(row?.unknown_amount ?? \"0\") + (changes.unknown ?? 0n)\n if (reserved < 0n || unknown < 0n) {\n throw new Error(\"[SixbPg] AI limit period counter became negative.\")\n }\n await sql`\n INSERT INTO ai_usage_limit_periods (\n project_id, subject_type, subject_id, meter, currency, period_start, period_end,\n actual_amount, reserved_amount, unknown_amount, accounting_status, updated_at\n ) VALUES (\n ${projectId}, ${subject.type}, ${subject.id}, ${amount.meter}, ${amount.currency},\n ${period.start}, ${period.end}, ${row?.actual_amount ?? \"0\"}, ${reserved.toString()},\n ${unknown.toString()}, ${row?.accounting_status ?? \"complete\"}, ${updatedAt}\n )\n ON CONFLICT (project_id, subject_type, subject_id, meter, currency, period_start)\n DO UPDATE SET\n period_end = excluded.period_end,\n actual_amount = excluded.actual_amount,\n reserved_amount = excluded.reserved_amount,\n unknown_amount = excluded.unknown_amount,\n accounting_status = excluded.accounting_status,\n updated_at = excluded.updated_at\n `\n }\n\n private async moveEstimateCounters(\n sql: PgStoreClient,\n reservation: AiModelCallReservation,\n directions: { readonly reserved?: bigint; readonly unknown?: bigint },\n updatedAt: Date\n ): Promise<void> {\n for (const bucket of reservation.buckets) {\n const amount = normalizeAiLimitAmount(bucket.estimate)\n await this.changeCounters(\n sql,\n reservation.projectId,\n bucket.subject,\n amount,\n reservation.period,\n {\n ...(directions.reserved === undefined\n ? {}\n : { reserved: directions.reserved * amount.amount }),\n ...(directions.unknown === undefined\n ? {}\n : { unknown: directions.unknown * amount.amount }),\n },\n updatedAt\n )\n }\n }\n\n private async reconcileEstimateCounters(\n sql: PgStoreClient,\n reservation: AiModelCallReservation,\n entry: AiLimitAccountingEntry,\n updatedAt: Date\n ): Promise<void> {\n for (const bucket of reservation.buckets) {\n const amount = normalizeAiLimitAmount(bucket.estimate)\n const actual = resolveAiLimitActual([entry], amount)\n if (actual.accountingStatus === \"complete\") {\n await this.changeCounters(\n sql,\n reservation.projectId,\n bucket.subject,\n amount,\n reservation.period,\n reservation.state === \"active\"\n ? { reserved: -amount.amount }\n : { unknown: -amount.amount },\n updatedAt\n )\n } else if (reservation.state === \"active\") {\n await this.changeCounters(\n sql,\n reservation.projectId,\n bucket.subject,\n amount,\n reservation.period,\n { reserved: -amount.amount, unknown: amount.amount },\n updatedAt\n )\n }\n }\n }\n\n private async insertReservation(\n sql: PgStoreClient,\n reservation: AiModelCallReservation\n ): Promise<void> {\n await sql`\n INSERT INTO ai_model_call_reservations (\n project_id, execution_id, attempt, call_id, buckets, request_key,\n period_start, period_end, state, usage_record_id, reserved_at, updated_at\n ) VALUES (\n ${reservation.projectId}, ${reservation.executionId}, ${reservation.attempt},\n ${reservation.callId}, ${JSON.stringify(reservation.buckets)}::text::jsonb,\n ${reservation.requestKey}, ${reservation.period.start},\n ${reservation.period.end}, ${reservation.state}, ${reservation.usageRecordId ?? null},\n ${reservation.reservedAt}, ${reservation.updatedAt}\n )\n `\n }\n\n private async updateReservation(\n sql: PgStoreClient,\n reservation: AiModelCallReservation\n ): Promise<void> {\n await sql`\n UPDATE ai_model_call_reservations\n SET state = ${reservation.state},\n usage_record_id = ${reservation.usageRecordId ?? null},\n updated_at = ${reservation.updatedAt}\n WHERE project_id = ${reservation.projectId}\n AND execution_id = ${reservation.executionId}\n AND attempt = ${reservation.attempt}\n AND call_id = ${reservation.callId}\n `\n }\n\n private async findReservation(\n sql: PgStoreClient,\n input: {\n readonly projectId: string\n readonly executionId: string\n readonly attempt: number\n readonly callId: string\n }\n ): Promise<AiModelCallReservation | null> {\n const [row] = await sql<AiModelCallReservationRow[]>`\n SELECT * FROM ai_model_call_reservations\n WHERE project_id = ${input.projectId}\n AND execution_id = ${input.executionId}\n AND attempt = ${input.attempt}\n AND call_id = ${input.callId}\n `\n return row ? reservationFromRow(row) : null\n }\n\n private async accountingEntries(\n sql: PgStoreClient,\n policy: AiLimitPolicy,\n period: AiLimitPeriod\n ): Promise<readonly AiLimitAccountingEntry[]> {\n const subject = aiLimitSubjectParts(policy.subject)\n const rows = await sql<AiLimitAccountingRow[]>`\n SELECT usage.project_id, usage.id AS usage_record_id, usage.execution_id,\n usage.attempt, usage.call_id, usage.occurred_at,\n usage.total_tokens::text AS total_tokens,\n usage.model_kind,\n executions.requested_by_user_id,\n executions.requested_by_service_account_id,\n valuations.status AS valuation_status,\n valuations.currency AS valuation_currency,\n valuations.amount_nanos::text AS valuation_amount_nanos\n FROM ai_model_call_usage AS usage\n JOIN executions\n ON executions.project_id = usage.project_id AND executions.id = usage.execution_id\n LEFT JOIN ai_model_call_valuations AS valuations\n ON valuations.project_id = usage.project_id\n AND valuations.usage_record_id = usage.id\n WHERE usage.project_id = ${policy.projectId}\n AND usage.occurred_at >= ${period.start}\n AND usage.occurred_at < ${period.end}\n AND (\n ${subject.type} = 'project'\n OR (\n ${subject.type} = 'group'\n AND EXISTS (\n SELECT 1 FROM ai_model_call_usage_groups AS usage_groups\n WHERE usage_groups.project_id = usage.project_id\n AND usage_groups.usage_record_id = usage.id\n AND usage_groups.group_id = ${subject.id}\n )\n )\n OR (${subject.type} = 'user' AND executions.requested_by_user_id = ${subject.id})\n OR (\n ${subject.type} = 'serviceAccount'\n AND executions.requested_by_service_account_id = ${subject.id}\n )\n )\n ORDER BY usage.occurred_at, usage.id\n `\n return rows.map((row) => accountingEntryFromRow(row, policy.subject))\n }\n\n private async requireAccountingEntry(\n sql: PgStoreClient,\n projectId: string,\n usageRecordId: string\n ): Promise<AiLimitAccountingEntry> {\n const [row] = await sql<AiLimitAccountingRow[]>`\n SELECT usage.project_id, usage.id AS usage_record_id, usage.execution_id,\n usage.attempt, usage.call_id, usage.occurred_at,\n usage.total_tokens::text AS total_tokens,\n usage.model_kind,\n executions.requested_by_user_id,\n executions.requested_by_service_account_id,\n valuations.status AS valuation_status,\n valuations.currency AS valuation_currency,\n valuations.amount_nanos::text AS valuation_amount_nanos\n FROM ai_model_call_usage AS usage\n JOIN executions\n ON executions.project_id = usage.project_id AND executions.id = usage.execution_id\n LEFT JOIN ai_model_call_valuations AS valuations\n ON valuations.project_id = usage.project_id\n AND valuations.usage_record_id = usage.id\n WHERE usage.project_id = ${projectId} AND usage.id = ${usageRecordId}\n `\n if (row) {\n const groups = await sql<{ group_id: string }[]>`\n SELECT group_id FROM ai_model_call_usage_groups\n WHERE project_id = ${projectId} AND usage_record_id = ${usageRecordId}\n ORDER BY group_id\n `\n return accountingEntryFromRow(\n row,\n undefined,\n groups.map((group) => group.group_id)\n )\n }\n throw new AiLimitStorageError(\n \"missing_usage_record\",\n `[SixbPg] AI usage record '${usageRecordId}' does not exist in project '${projectId}'.`\n )\n }\n\n private async assertExecutionExists(\n sql: PgStoreClient,\n projectId: string,\n executionId: string\n ): Promise<void> {\n const [row] = await sql<{ exists: boolean }[]>`\n SELECT EXISTS (\n SELECT 1 FROM executions WHERE project_id = ${projectId} AND id = ${executionId}\n ) AS exists\n `\n if (row?.exists) return\n throw new AiLimitStorageError(\n \"missing_execution\",\n `[SixbPg] AI limit execution '${executionId}' does not exist in project '${projectId}'.`\n )\n }\n}\n\ninterface AiLimitPolicyRow {\n readonly project_id: string\n readonly id: string\n readonly subject_type: AiLimitSubject[\"type\"]\n readonly subject_id: string\n readonly meter: AiLimitQuantity[\"meter\"]\n readonly currency: string\n readonly limit_amount: string\n readonly period_kind: \"calendarMonth\"\n readonly enabled: boolean\n readonly created_at: Date | string\n readonly updated_at: Date | string\n}\n\ninterface AiLimitPeriodStateRow {\n readonly actual_amount: string\n readonly reserved_amount: string\n readonly unknown_amount: string\n readonly accounting_status: \"complete\" | \"unavailable\"\n}\n\ninterface AiLimitActualStateRow {\n readonly meter: AiLimitQuantity[\"meter\"]\n readonly currency: string\n readonly actual_amount: string\n readonly accounting_status: \"complete\" | \"unavailable\"\n}\n\ninterface AiLimitAccountingRow {\n readonly project_id: string\n readonly usage_record_id: string\n readonly execution_id: string\n readonly attempt: number | string\n readonly call_id: string\n readonly occurred_at: Date | string\n readonly total_tokens: string | null\n readonly model_kind: AiLimitAccountingEntry[\"modelKind\"] | null\n readonly requested_by_user_id: string | null\n readonly requested_by_service_account_id: string | null\n readonly valuation_status: \"rated\" | \"unpriceable\" | null\n readonly valuation_currency: string | null\n readonly valuation_amount_nanos: string | null\n}\n\ninterface AiModelCallReservationRow {\n readonly project_id: string\n readonly execution_id: string\n readonly attempt: number | string\n readonly call_id: string\n readonly buckets: readonly AiLimitReservationBucket[] | string\n readonly request_key: string\n readonly period_start: Date | string\n readonly period_end: Date | string\n readonly state: AiModelCallReservation[\"state\"]\n readonly usage_record_id: string | null\n readonly reserved_at: Date | string\n readonly updated_at: Date | string\n}\n\nfunction policyFromRow(row: AiLimitPolicyRow): AiLimitPolicy {\n return {\n id: row.id,\n projectId: row.project_id,\n subject: aiLimitSubjectFromParts(row.subject_type, row.subject_id),\n limit: aiLimitQuantityFromAmount({\n meter: row.meter,\n currency: row.currency,\n amount: BigInt(row.limit_amount),\n }),\n period: row.period_kind,\n enabled: row.enabled,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n }\n}\n\nfunction policyStatus(\n policy: AiLimitPolicy,\n period: AiLimitPeriod,\n row: AiLimitPeriodStateRow,\n existingGroups?: ReadonlySet<string>\n): AiLimitPolicyStatus {\n const limit = normalizeAiLimitAmount(policy.limit)\n const actual = BigInt(row.actual_amount)\n const reserved = BigInt(row.reserved_amount)\n const unknown = BigInt(row.unknown_amount)\n const consumed = actual + reserved + unknown\n const quantity = (amount: bigint) => aiLimitQuantityFromAmount({ ...limit, amount })\n return {\n policy,\n period: structuredClone(period),\n consumption: {\n actual: quantity(actual),\n reserved: quantity(reserved),\n unknown: quantity(unknown),\n remaining: quantity(limit.amount > consumed ? limit.amount - consumed : 0n),\n },\n accountingStatus: row.accounting_status,\n exhausted: consumed >= limit.amount,\n orphaned:\n policy.subject.type === \"group\" &&\n existingGroups !== undefined &&\n !existingGroups.has(policy.subject.id),\n }\n}\n\nfunction accountingEntryFromRow(\n row: AiLimitAccountingRow,\n subject?: AiLimitSubject,\n requesterGroupIds = subject?.type === \"group\" ? [subject.id] : []\n): AiLimitAccountingEntry {\n const totalTokens = row.total_tokens === null ? undefined : Number(row.total_tokens)\n const requester = row.requested_by_user_id\n ? ({ type: \"user\", id: row.requested_by_user_id } as const)\n : row.requested_by_service_account_id\n ? ({ type: \"serviceAccount\", id: row.requested_by_service_account_id } as const)\n : undefined\n return {\n projectId: row.project_id,\n usageRecordId: row.usage_record_id,\n executionId: row.execution_id,\n attempt: Number(row.attempt),\n callId: row.call_id,\n occurredAt: new Date(row.occurred_at),\n ...(row.model_kind === null ? {} : { modelKind: row.model_kind }),\n ...(totalTokens !== undefined && Number.isSafeInteger(totalTokens) ? { totalTokens } : {}),\n requesterGroupIds,\n ...(requester ? { requester } : {}),\n ...(row.valuation_status === \"rated\" &&\n row.valuation_currency !== null &&\n row.valuation_amount_nanos !== null\n ? {\n valuation: {\n status: \"rated\" as const,\n money: {\n currency: row.valuation_currency,\n amountNanos: row.valuation_amount_nanos,\n },\n },\n }\n : row.valuation_status === \"unpriceable\"\n ? { valuation: { status: \"unavailable\" as const } }\n : {}),\n }\n}\n\nfunction reservationFromRow(row: AiModelCallReservationRow): AiModelCallReservation {\n const buckets = jsonValue<readonly AiLimitReservationBucket[]>(row.buckets)\n return {\n projectId: row.project_id,\n executionId: row.execution_id,\n attempt: Number(row.attempt),\n callId: row.call_id,\n buckets: buckets.map((bucket) => ({\n subject: structuredClone(bucket.subject),\n estimate: normalizeAiLimitQuantities([bucket.estimate], \"stored bucket\")[0]!,\n })),\n requestKey: row.request_key,\n period: {\n kind: \"calendarMonth\",\n start: new Date(row.period_start),\n end: new Date(row.period_end),\n resetAt: new Date(row.period_end),\n },\n state: row.state,\n ...(row.usage_record_id === null ? {} : { usageRecordId: row.usage_record_id }),\n reservedAt: new Date(row.reserved_at),\n updatedAt: new Date(row.updated_at),\n }\n}\n\nfunction jsonValue<T>(value: T | string): T {\n return typeof value === \"string\" ? (JSON.parse(value) as T) : value\n}\n\nfunction assertSameDimension(previous: AiLimitQuantity, next: AiLimitQuantity): void {\n if (\n aiLimitAmountKey(normalizeAiLimitAmount(previous)) !==\n aiLimitAmountKey(normalizeAiLimitAmount(next))\n ) {\n throw new TypeError(\"[Sixb] AI limit policy meter and cost currency are immutable.\")\n }\n}\n\nfunction validatePolicyIdentity(input: GetAiLimitPolicyInput): void {\n assertNonBlank(input.projectId, \"projectId\")\n assertNonBlank(input.id, \"policy id\")\n}\n\nfunction duplicatePolicy(policy: AiLimitPolicy): AiLimitStorageError {\n return new AiLimitStorageError(\n \"duplicate_policy\",\n `[SixbPg] An AI limit policy already exists for policy ID or subject-meter dimension '${policy.id}'.`\n )\n}\n\nfunction missingReservation(input: {\n readonly executionId: string\n readonly attempt: number\n readonly callId: string\n}): AiLimitStorageError {\n return new AiLimitStorageError(\n \"missing_reservation\",\n `[SixbPg] AI model-call reservation '${input.callId}' does not exist for execution '${input.executionId}' attempt ${input.attempt}.`\n )\n}\n\nfunction reconciliationConflict(callId: string): AiLimitStorageError {\n return new AiLimitStorageError(\n \"reconciliation_conflict\",\n `[SixbPg] AI model-call reservation '${callId}' was reconciled with a different usage record.`\n )\n}\n\nfunction invalidState(reservation: AiModelCallReservation, operation: string): AiLimitStorageError {\n return new AiLimitStorageError(\n \"invalid_reservation_state\",\n `[SixbPg] Cannot ${operation} AI model-call reservation '${reservation.callId}' in state '${reservation.state}'.`\n )\n}\n",
55
62
  "import { isIP } from \"node:net\"\nimport { connect as connectTls, type TLSSocket } from \"node:tls\"\nimport postgres from \"postgres\"\nimport { pgErrorCode } from \"./storage-errors\"\n\n// Data-type policy (porsager defaults, deliberately not overridden):\n// - `timestamptz` -> JS `Date`. Row mappers normalize via `toIsoString(Date | string)`.\n// - `bigint` -> string (porsager avoids `Number` precision loss). The only bigint values\n// read here are `COUNT(*)` results, which fit safely in `Number`, so callers use\n// `Number(...)`. We do NOT register `postgres.BigInt` — it would break those `Number()`\n// conversions and JSON serialization.\n// - `numeric`/`decimal` -> string. The schema has no such columns; revisit if one is added.\n// - `jsonb` -> parsed JS value (objects/arrays/scalars), same as before.\n\n/**\n * Connection handle backing every Postgres storage adapter.\n *\n * This is the porsager `postgres` pool — not Bun's built-in SQL. bun:sql's pool orphaned\n * connections under request bursts (a query whose client disconnected mid-flight left its\n * connection checked out but never returned), so the pool drained to zero usable slots and\n * the whole API hung until a restart. porsager's pool reclaims connections reliably, which\n * is the actual fix for that wedge.\n *\n * Queries declare their row type per call (`` sql<RowType[]>`...` ``) rather than via an open\n * generic, so results are typed without `as` casts.\n */\nexport type SQL = postgres.Sql<Record<string, never>>\n\n/**\n * A query runner that may be the pool or an open transaction. Adapters that run the same\n * statement on either should accept this rather than {@link SQL} (only the pool exposes\n * `begin`/`reserve`/`end`).\n */\nexport type SQLClient = postgres.ISql<Record<string, never>>\n\n/** One pool connection held outside the pool until `release()` — see `withReservedPgConnection`. */\nexport type ReservedSQL = postgres.ReservedSql<Record<string, never>>\n\n/**\n * A value accepted as a positional parameter by {@link SQLClient.unsafe}. Dynamically built\n * parameter arrays (from the query-IR compiler / run-list helpers) are cast to this since\n * their element types can't be inferred statically.\n */\nexport type SqlParameter = postgres.ParameterOrJSON<never>\n\nexport interface CreatePgClientOptions {\n readonly connectionString?: string\n readonly host?: string\n readonly port?: number\n readonly database?: string\n readonly user?: string\n readonly password?: string\n /** Maximum pooled connections. */\n readonly max: number\n /** Schema pinned via `search_path` on every connection. */\n readonly schemaName: string\n /** Close idle connections after this many ms (frees slots back to the server). Default 30s. */\n readonly idleTimeoutMillis?: number\n /** Per-connection `statement_timeout` (ms). Unset = no timeout. */\n readonly statementTimeoutMillis?: number\n /** Per-connection `idle_in_transaction_session_timeout` (ms). Unset = no timeout. */\n readonly idleInTransactionSessionTimeoutMillis?: number\n /** Seconds to wait when establishing a connection. Default 10. */\n readonly connectTimeoutMillis?: number\n /**\n * Whether porsager creates server-side prepared statements (its default; faster against a\n * direct Postgres connection). Keep `true` for a direct connection. Behind a transaction-mode\n * pooler, prepared statements are supported by PgBouncer >= 1.21 (Oct 2023) when\n * `max_prepared_statements > 0`; set `false` only for an older PgBouncer or when that setting\n * is 0. (The blanket incompatibility in porsager#93 predates PgBouncer 1.21.)\n */\n readonly prepare?: boolean\n readonly ssl?: boolean | \"require\" | \"prefer\"\n}\n\nconst DEFAULT_IDLE_TIMEOUT_SECONDS = 30\nconst DEFAULT_CONNECT_TIMEOUT_SECONDS = 10\n\n/** Build a configured porsager `postgres` pool. */\nexport function createPgClient(options: CreatePgClientOptions): SQL {\n // GUCs applied to every connection at startup.\n const connection: Record<string, string | number | boolean> = {\n search_path: options.schemaName,\n }\n if (options.statementTimeoutMillis !== undefined) {\n connection.statement_timeout = options.statementTimeoutMillis\n }\n if (options.idleInTransactionSessionTimeoutMillis !== undefined) {\n connection.idle_in_transaction_session_timeout = options.idleInTransactionSessionTimeoutMillis\n }\n\n const idleTimeout =\n options.idleTimeoutMillis !== undefined\n ? Math.max(1, Math.round(options.idleTimeoutMillis / 1000))\n : DEFAULT_IDLE_TIMEOUT_SECONDS\n\n const connectTimeout =\n options.connectTimeoutMillis !== undefined\n ? Math.max(1, Math.round(options.connectTimeoutMillis / 1000))\n : DEFAULT_CONNECT_TIMEOUT_SECONDS\n\n const base = {\n max: options.max,\n // `idle_timeout` is important on managed Postgres (e.g. DigitalOcean), which closes idle\n // server-side connections — without it porsager can hand out a dead socket (porsager#179).\n idle_timeout: idleTimeout,\n connect_timeout: connectTimeout,\n // `max_lifetime` is intentionally left at porsager's default (a random 45–90 min): it\n // cycles connections to avoid server-side memory bloat from long-lived prepared\n // statements and plays nicely with managed databases. Disabling it is discouraged.\n connection,\n // Match the previous (bun:sql) behavior of not surfacing routine PostgreSQL NOTICEs.\n onnotice: () => {},\n ...(options.prepare !== undefined ? { prepare: options.prepare } : {}),\n ...tlsOptions(options),\n }\n\n if (options.connectionString) {\n return assertDirectTlsTarget(postgres(options.connectionString, base), base)\n }\n\n return postgres({\n ...base,\n host: options.host ?? \"localhost\",\n port: options.port ?? 5432,\n ...(options.database !== undefined ? { database: options.database } : {}),\n ...(options.user !== undefined ? { username: options.user } : {}),\n ...(options.password !== undefined ? { password: options.password } : {}),\n })\n}\n\n/**\n * What the server's certificate is checked against when TLS is opened directly: nothing\n * (`require`), the trusted CAs (`verify-ca`), or the CAs and the host name (`verify-full`).\n */\ntype DirectTlsVerification = \"none\" | \"ca\" | \"full\"\n\n// `sslnegotiation=direct` is read from the connection string, as libpq reads it. Without it,\n// porsager negotiates TLS the classic way: an SSLRequest on a plain TCP socket, then an upgrade of\n// that socket with `tls.connect({ socket })`. Bun 1.4.0–1.4.2 keeps every byte received on such an\n// upgraded socket in memory for good, so a process that reads a lot grows until it is killed.\n// Opening the TLS connection ourselves with `tls.connect({ host, port })` avoids that path, and\n// saves the SSLRequest round trip on every connection.\nfunction tlsOptions(options: CreatePgClientOptions): Record<string, unknown> {\n const verification = directTlsVerification(options)\n if (verification === null) {\n return options.ssl ? { ssl: options.ssl } : {}\n }\n // porsager must not negotiate TLS again on the socket we hand it; explicit options also\n // override the `sslmode` it would otherwise read from the connection string.\n return { ssl: false, sslnegotiation: null, socket: directTlsSocket(verification) }\n}\n\nfunction directTlsVerification(options: CreatePgClientOptions): DirectTlsVerification | null {\n const params = connectionStringParams(options.connectionString)\n if (params.get(\"sslnegotiation\") !== \"direct\") {\n return null\n }\n\n const sslmode =\n options.ssl === true\n ? \"verify-full\"\n : options.ssl ||\n (params.get(\"sslrootcert\") === \"system\"\n ? \"verify-full\"\n : (params.get(\"sslmode\") ?? params.get(\"ssl\")))\n switch (sslmode) {\n case \"require\":\n return \"none\"\n case \"verify-ca\":\n return \"ca\"\n case \"verify-full\":\n case \"true\":\n return \"full\"\n default:\n throw new Error(\n `[SixbPg] sslnegotiation=direct requires sslmode=require, verify-ca or verify-full, got ${\n sslmode ? `\"${sslmode}\"` : \"no sslmode\"\n }: a direct TLS connection has no plaintext fallback.`\n )\n }\n}\n\nfunction connectionStringParams(connectionString: string | undefined): URLSearchParams {\n return new URLSearchParams(connectionString?.split(\"?\")[1] ?? \"\")\n}\n\n/**\n * porsager's `socket` factory, called for every connection. It must return at once and never\n * throw: a factory that fails leaves its pool slot stuck in porsager's connecting state for good,\n * and one that returns an already-dead socket stalls the slot's next attempt (postgres.js 3.4.9).\n * Failures are reported by the socket instead, through the `error` and `close` events porsager\n * handles for its own sockets, and its connect timeout covers the handshake.\n */\nfunction directTlsSocket(\n verification: DirectTlsVerification\n): (options: postgres.ParsedOptions) => TLSSocket {\n let reportedRefusal = false\n\n return ({ host: [host = \"localhost\"], port: [port = 5432] }) => {\n const socket = connectTls({\n host,\n port,\n servername: isIP(host) ? undefined : host,\n // PostgreSQL 17+ accepts a direct TLS connection only for this ALPN protocol.\n ALPNProtocols: [\"postgresql\"],\n rejectUnauthorized: verification !== \"none\",\n ...(verification === \"ca\" ? { checkServerIdentity: () => undefined } : {}),\n })\n\n let reachedServer = false\n let secured = false\n socket.once(\"connect\", () => {\n reachedServer = true\n })\n socket.once(\"secureConnect\", () => {\n secured = true\n if (socket.alpnProtocol !== \"postgresql\") {\n socket.destroy(\n new Error(\n `[SixbPg] ${host}:${port} accepted TLS without selecting the \"postgresql\" protocol` +\n \" (ALPN), so it is not a PostgreSQL server accepting sslnegotiation=direct.\"\n )\n )\n }\n })\n // A server that expects an SSLRequest reads the TLS hello as a malformed startup packet and\n // closes the connection, which porsager reports as a bare reset. Say what it means, once.\n socket.once(\"error\", (error: Error) => {\n if (reportedRefusal || !reachedServer || secured) return\n if (![\"ECONNRESET\", \"EPIPE\", \"ERR_SOCKET_CLOSED\"].includes(pgErrorCode(error) ?? \"\")) return\n reportedRefusal = true\n console.error(\n `[SixbPg] ${host}:${port} closed the connection during a direct TLS handshake` +\n \" (sslnegotiation=direct). Direct TLS needs PostgreSQL 17 or later, reached without a\" +\n \" proxy or pooler that expects an SSLRequest; remove sslnegotiation=direct otherwise.\"\n )\n })\n return socket\n }\n}\n\nfunction assertDirectTlsTarget(sql: SQL, options: Record<string, unknown>): SQL {\n if (!(\"socket\" in options)) {\n return sql\n }\n if (sql.options.host.length !== 1 || sql.options.path) {\n throw new Error(\n \"[SixbPg] sslnegotiation=direct supports one TCP host:port in the connection string, not\" +\n \" several hosts or a Unix socket path.\"\n )\n }\n return sql\n}\n",
56
- "import {\n type ExecutionStorageRow,\n executionRecordFromStorageRow,\n executionRecordToStorageRow,\n prepareExecutionRecord,\n} from \"@sixb/core/internal/execution-storage\"\nimport type {\n CreateExecutionInput,\n ExecutionRecord,\n ExecutionStorage,\n ShareSessionStorage,\n} from \"@sixb/core/storage\"\nimport { ExecutionStorageError } from \"@sixb/core/storage\"\nimport type { PgAuthStorage } from \"./auth-storage\"\nimport { isUniqueViolation } from \"./storage-errors\"\nimport type { PgStoreClient } from \"./transactions\"\n\nexport class PgExecutionStorage implements ExecutionStorage {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly auth: PgAuthStorage,\n private readonly shareSessions: Pick<ShareSessionStorage, \"getById\">\n ) {}\n\n async create(input: CreateExecutionInput): Promise<ExecutionRecord> {\n const record = await prepareExecutionRecord(input, {\n auth: this.auth,\n getExecution: (params) => this.getById(params),\n getShareSession: (params) => this.shareSessions.getById(params),\n })\n const row = executionRecordToStorageRow(record)\n\n try {\n const [created] = await this.sql<PgExecutionRow[]>`\n INSERT INTO executions (\n project_id,\n id,\n executor_kind,\n executor_id,\n source_kind,\n source_id,\n requested_by_user_id,\n requested_by_service_account_id,\n requester_group_ids,\n correlation_id,\n parent_execution_id,\n authority_kind,\n authority_user_id,\n authority_service_account_id,\n authority_session_id,\n authority_access_token_id,\n authority_primitive_kind,\n authority_primitive_id,\n authority_kernel_operation,\n authority_delegation_kind,\n authority_delegation_id,\n authority_delegation_session_id,\n created_at\n ) VALUES (\n ${row.projectId},\n ${row.id},\n ${row.executorKind},\n ${row.executorId},\n ${row.sourceKind},\n ${row.sourceId},\n ${row.requestedByUserId},\n ${row.requestedByServiceAccountId},\n ${JSON.stringify(row.requesterGroupIds)}::text::jsonb,\n ${row.correlationId},\n ${row.parentExecutionId},\n ${row.authorityKind},\n ${row.authorityUserId},\n ${row.authorityServiceAccountId},\n ${row.authoritySessionId},\n ${row.authorityAccessTokenId},\n ${row.authorityPrimitiveKind},\n ${row.authorityPrimitiveId},\n ${row.authorityKernelOperation},\n ${row.authorityDelegationKind},\n ${row.authorityDelegationId},\n ${row.authorityDelegationSessionId},\n ${row.createdAt}\n )\n RETURNING *\n `\n\n if (!created) {\n throw new Error(\"[SixbPg] Execution insert returned no row.\")\n }\n return executionRecordFromStorageRow(toStorageRow(created))\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new ExecutionStorageError(\n \"duplicate_execution\",\n `[SixbPg] Execution '${record.id}' already exists in project '${record.projectId}'.`,\n { cause: error }\n )\n }\n throw error\n }\n }\n\n async getById(params: {\n readonly projectId: string\n readonly id: string\n }): Promise<ExecutionRecord | null> {\n const [row] = await this.sql<PgExecutionRow[]>`\n SELECT *\n FROM executions\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n return row ? executionRecordFromStorageRow(toStorageRow(row)) : null\n }\n}\n\nfunction toStorageRow(row: PgExecutionRow): ExecutionStorageRow {\n return {\n projectId: row.project_id,\n id: row.id,\n executorKind: row.executor_kind,\n executorId: row.executor_id,\n sourceKind: row.source_kind,\n sourceId: row.source_id,\n requestedByUserId: row.requested_by_user_id,\n requestedByServiceAccountId: row.requested_by_service_account_id,\n requesterGroupIds: row.requester_group_ids,\n correlationId: row.correlation_id,\n parentExecutionId: row.parent_execution_id,\n authorityKind: row.authority_kind,\n authorityUserId: row.authority_user_id,\n authorityServiceAccountId: row.authority_service_account_id,\n authoritySessionId: row.authority_session_id,\n authorityAccessTokenId: row.authority_access_token_id,\n authorityPrimitiveKind: row.authority_primitive_kind,\n authorityPrimitiveId: row.authority_primitive_id,\n authorityKernelOperation: row.authority_kernel_operation,\n authorityDelegationKind: row.authority_delegation_kind,\n authorityDelegationId: row.authority_delegation_id,\n authorityDelegationSessionId: row.authority_delegation_session_id,\n createdAt: new Date(row.created_at),\n }\n}\n\ninterface PgExecutionRow {\n readonly project_id: string\n readonly id: string\n readonly executor_kind: ExecutionStorageRow[\"executorKind\"]\n readonly executor_id: string\n readonly source_kind: ExecutionStorageRow[\"sourceKind\"]\n readonly source_id: string\n readonly requested_by_user_id: string | null\n readonly requested_by_service_account_id: string | null\n readonly requester_group_ids: string[]\n readonly correlation_id: string\n readonly parent_execution_id: string | null\n readonly authority_kind: ExecutionStorageRow[\"authorityKind\"]\n readonly authority_user_id: string | null\n readonly authority_service_account_id: string | null\n readonly authority_session_id: string | null\n readonly authority_access_token_id: string | null\n readonly authority_primitive_kind: ExecutionStorageRow[\"authorityPrimitiveKind\"]\n readonly authority_primitive_id: string | null\n readonly authority_kernel_operation: ExecutionStorageRow[\"authorityKernelOperation\"]\n readonly authority_delegation_kind: ExecutionStorageRow[\"authorityDelegationKind\"]\n readonly authority_delegation_id: string | null\n readonly authority_delegation_session_id: string | null\n readonly created_at: Date | string\n}\n",
63
+ "import { parseFileDownloadGrantRow } from \"@sixb/core/internal/storage\"\nimport type {\n DeleteExpiredFileDownloadGrantsInput,\n FileDownloadGrantRecord,\n FileDownloadGrantStorage,\n FindFileDownloadGrantInput,\n RevokeFileDownloadGrantInput,\n} from \"@sixb/core/storage\"\nimport type { PgStoreClient } from \"./transactions\"\n\nexport class PgFileDownloadGrantStorage implements FileDownloadGrantStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async create(record: FileDownloadGrantRecord): Promise<void> {\n await this.sql`\n INSERT INTO file_download_grants (\n project_id, id, token_hash, file, execution_id, created_at, expires_at\n ) VALUES (\n ${record.projectId}, ${record.id}, ${record.tokenHash},\n ${JSON.stringify(record.file)}::text::jsonb, ${record.executionId},\n ${record.createdAt}, ${record.expiresAt}\n )\n `\n }\n\n async findByTokenHash(\n input: FindFileDownloadGrantInput\n ): Promise<FileDownloadGrantRecord | null> {\n const [row] = await this.sql<PgFileDownloadGrantRow[]>`\n SELECT * FROM file_download_grants\n WHERE project_id = ${input.projectId} AND token_hash = ${input.tokenHash}\n `\n return row ? grantFromRow(row) : null\n }\n\n async revoke(input: RevokeFileDownloadGrantInput): Promise<FileDownloadGrantRecord | null> {\n const [row] = await this.sql<PgFileDownloadGrantRow[]>`\n UPDATE file_download_grants\n SET revoked_at = COALESCE(revoked_at, ${input.revokedAt})\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n return row ? grantFromRow(row) : null\n }\n\n async deleteExpired(input: DeleteExpiredFileDownloadGrantsInput): Promise<number> {\n const rows = await this.sql`\n DELETE FROM file_download_grants\n WHERE project_id = ${input.projectId} AND id IN (\n SELECT id FROM file_download_grants\n WHERE project_id = ${input.projectId} AND expires_at < ${input.expiredBefore}\n ORDER BY expires_at\n LIMIT ${input.limit}\n )\n RETURNING id\n `\n return rows.length\n }\n}\n\ninterface PgFileDownloadGrantRow {\n readonly [column: string]: unknown\n}\n\nfunction grantFromRow(row: PgFileDownloadGrantRow): FileDownloadGrantRecord {\n return parseFileDownloadGrantRow({\n id: row.id,\n projectId: row.project_id,\n tokenHash: row.token_hash,\n file: row.file,\n executionId: row.execution_id,\n createdAt: row.created_at,\n expiresAt: row.expires_at,\n revokedAt: row.revoked_at,\n })\n}\n",
57
64
  "import {\n DurableFileUploadSessions,\n type FileUploadSessionPersistence,\n type FileUploadSessionPersistenceBackend,\n fileUploadSessionReapAt,\n parseFileUploadSessionRow,\n} from \"@sixb/core/internal/file-upload-session-storage-provider\"\nimport type { FileUploadSession, ListAbandonedFileUploadSessionsInput } from \"@sixb/core/storage\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport class PgFileUploadSessionStorage extends DurableFileUploadSessions {\n constructor(sql: PgStoreClient) {\n super(new PgFileUploadSessionBackend(sql))\n }\n}\n\nclass PgFileUploadSessionBackend implements FileUploadSessionPersistenceBackend {\n constructor(private readonly sql: PgStoreClient) {}\n\n read<T>(run: (persistence: FileUploadSessionPersistence) => Promise<T>): Promise<T> {\n return run(new PgFileUploadSessionPersistence(this.sql, false))\n }\n\n transaction<T>(run: (persistence: FileUploadSessionPersistence) => Promise<T>): Promise<T> {\n return runPgTransaction(this.sql, (tx) => run(new PgFileUploadSessionPersistence(tx, true)))\n }\n}\n\nclass PgFileUploadSessionPersistence implements FileUploadSessionPersistence {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly locking: boolean\n ) {}\n\n async now(): Promise<Date> {\n const [row] = await this.sql<{ readonly now: Date }[]>`SELECT clock_timestamp() AS now`\n if (!row) throw new Error(\"[SixbPg] Database clock returned no row.\")\n return new Date(row.now)\n }\n\n async insert(session: FileUploadSession): Promise<boolean> {\n // A unique violation would abort the surrounding transaction; report the conflict instead.\n const rows = await this.sql`\n INSERT INTO file_upload_sessions (\n id, project_id, owner_principal_type, owner_principal_id, strategy, status, file_name,\n media_type, logical_path, expected_size_bytes, expected_digest, provider_upload,\n signed_parts, file_ref, created_at, expires_at, completed_at, aborted_at, reap_at\n ) VALUES (\n ${session.id}, ${session.projectId}, ${session.principal.type}, ${session.principal.id},\n ${session.strategy}, ${session.status}, ${session.fileName ?? null}, ${session.mediaType ?? null},\n ${session.logicalPath ?? null}, ${session.expectedSizeBytes ?? null},\n ${session.expectedDigest ?? null}, ${jsonText(session.providerUpload)}::text::jsonb,\n ${JSON.stringify(session.signedParts)}::text::jsonb, ${jsonText(session.fileRef)}::text::jsonb,\n ${session.createdAt}, ${session.expiresAt}, ${session.completedAt ?? null},\n ${session.abortedAt ?? null}, ${fileUploadSessionReapAt(session)}\n )\n ON CONFLICT (id) DO NOTHING\n RETURNING id\n `\n return rows.length === 1\n }\n\n async get(uploadId: string): Promise<FileUploadSession | null> {\n const [row] = this.locking\n ? await this.sql<PgFileUploadSessionRow[]>`\n SELECT * FROM file_upload_sessions WHERE id = ${uploadId} FOR UPDATE\n `\n : await this.sql<PgFileUploadSessionRow[]>`\n SELECT * FROM file_upload_sessions WHERE id = ${uploadId}\n `\n return row ? sessionFromRow(row) : null\n }\n\n async update(session: FileUploadSession): Promise<void> {\n await this.sql`\n UPDATE file_upload_sessions\n SET status = ${session.status},\n provider_upload = ${jsonText(session.providerUpload)}::text::jsonb,\n signed_parts = ${JSON.stringify(session.signedParts)}::text::jsonb,\n file_ref = ${jsonText(session.fileRef)}::text::jsonb,\n created_at = ${session.createdAt},\n expires_at = ${session.expiresAt},\n completed_at = ${session.completedAt ?? null},\n aborted_at = ${session.abortedAt ?? null},\n reap_at = ${fileUploadSessionReapAt(session)}\n WHERE id = ${session.id}\n `\n }\n\n async listAbandoned(\n input: ListAbandonedFileUploadSessionsInput\n ): Promise<readonly FileUploadSession[]> {\n const rows = await this.sql<PgFileUploadSessionRow[]>`\n SELECT * FROM file_upload_sessions\n WHERE project_id = ${input.projectId} AND status = 'pending'\n AND provider_upload IS NOT NULL AND expires_at <= ${input.now}\n ORDER BY expires_at, id COLLATE \"C\"\n LIMIT ${input.limit}\n `\n return rows.map(sessionFromRow)\n }\n\n async deleteReapable(now: Date): Promise<number> {\n const rows = await this.sql`\n DELETE FROM file_upload_sessions\n WHERE reap_at IS NOT NULL AND reap_at <= ${now}\n RETURNING id\n `\n return rows.length\n }\n}\n\ninterface PgFileUploadSessionRow {\n readonly [column: string]: unknown\n}\n\nfunction sessionFromRow(row: PgFileUploadSessionRow): FileUploadSession {\n return parseFileUploadSessionRow({\n id: row.id,\n projectId: row.project_id,\n ownerPrincipalType: row.owner_principal_type,\n ownerPrincipalId: row.owner_principal_id,\n strategy: row.strategy,\n status: row.status,\n fileName: row.file_name,\n mediaType: row.media_type,\n logicalPath: row.logical_path,\n expectedSizeBytes: row.expected_size_bytes,\n expectedDigest: row.expected_digest,\n providerUpload: row.provider_upload,\n signedParts: row.signed_parts,\n fileRef: row.file_ref,\n createdAt: row.created_at,\n expiresAt: row.expires_at,\n completedAt: row.completed_at,\n abortedAt: row.aborted_at,\n })\n}\n\n/** JSON text for a nullable jsonb column; always bind with the `::text::jsonb` double cast. */\nfunction jsonText(value: object | undefined): string | null {\n return value === undefined ? null : JSON.stringify(value)\n}\n",
58
65
  "import type { JsonValue } from \"@sixb/core\"\nimport { parseSixbFailure, serializeSixbFailure } from \"@sixb/core/internal/errors\"\nimport { assertPipelineRunExecution } from \"@sixb/core/internal/pipeline-run-storage-provider\"\nimport { canRequeuePipelineRunAfterEnqueueFailure } from \"@sixb/core/internal/storage\"\nimport type { DatasetVersionRef } from \"@sixb/core/lake-storage\"\nimport type {\n ExecutionStorage,\n FinishPipelineRunInput,\n FinishPipelineStepRunInput,\n ListLatestPipelineRunsInput,\n ListLatestPipelineRunsResult,\n ListPipelineRunsInput,\n ListPipelineRunsResult,\n ListPipelineStepRunsInput,\n ListPipelineStepRunsResult,\n PipelineRunRecord,\n PipelineRunStorage,\n PipelineStepRunRecord,\n QueuePipelineRunInput,\n StartPipelineRunInput,\n StartPipelineStepRunInput,\n} from \"@sixb/core/storage\"\nimport { PIPELINE_RUN_FAILURE_CODES, PipelineRunError } from \"@sixb/core/storage\"\nimport { queryLatestRunsByOwnerId } from \"./latest-run-query\"\nimport type { SqlParameter } from \"./pg-client\"\nimport { appendRunListFilters, hasEmptyStatuses, queryRunList } from \"./run-list-query\"\nimport { isUniqueViolation } from \"./storage-errors\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport class PgPipelineRunStorage implements PipelineRunStorage {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly executions: ExecutionStorage\n ) {}\n\n async queue(input: QueuePipelineRunInput): Promise<PipelineRunRecord> {\n await assertPipelineRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n pipelineId: input.pipelineId,\n })\n try {\n const [row] = await this.sql<PipelineRunDatabaseRow[]>`\n INSERT INTO pipeline_runs (\n project_id,\n id,\n execution_id,\n pipeline_id,\n status,\n queued_at,\n started_at\n ) VALUES (\n ${input.projectId},\n ${input.id},\n ${input.executionId},\n ${input.pipelineId},\n ${\"queued\"},\n ${input.queuedAt ?? new Date()},\n ${null}\n )\n RETURNING *\n `\n\n return rowToPipelineRunRecord(row)\n } catch (error) {\n if (isUniqueViolation(error)) {\n return this.requeueAfterEnqueueFailure(input)\n }\n\n throw error\n }\n }\n\n private async requeueAfterEnqueueFailure(\n input: QueuePipelineRunInput\n ): Promise<PipelineRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<PipelineRunDatabaseRow[]>`\n SELECT * FROM pipeline_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (\n !existing ||\n !canRequeuePipelineRunAfterEnqueueFailure(rowToPipelineRunRecord(existing), input)\n ) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const [updated] = await tx<PipelineRunDatabaseRow[]>`\n UPDATE pipeline_runs\n SET status = ${\"queued\"}, queued_at = ${input.queuedAt ?? new Date()},\n started_at = ${null}, finished_at = ${null}, output_dataset_id = ${null},\n output_version_id = ${null}, error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n return rowToPipelineRunRecord(updated)\n })\n }\n\n async start(input: StartPipelineRunInput): Promise<PipelineRunRecord> {\n const [updated] = await this.sql<PipelineRunDatabaseRow[]>`\n UPDATE pipeline_runs\n SET status = ${\"running\"}, started_at = ${input.startedAt ?? new Date()},\n error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id} AND status = ${\"queued\"}\n RETURNING *\n `\n if (updated) return rowToPipelineRunRecord(updated)\n\n const existing = await this.getById({ projectId: input.projectId, id: input.id })\n if (!existing) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n throw new PipelineRunError(\n `[SixbPg] Pipeline run '${input.id}' cannot start from status '${existing.status}'.`\n )\n }\n\n async finish(input: FinishPipelineRunInput): Promise<PipelineRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<PipelineRunDatabaseRow[]>`\n SELECT * FROM pipeline_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n\n if (!existing) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n const enqueueFailure =\n input.status === \"failed\" && input.error.code === \"queue.enqueue_failed\"\n if (\n (enqueueFailure && existing.status !== \"queued\") ||\n (!enqueueFailure && existing.status !== \"running\")\n ) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline run '${input.id}' cannot finish from status '${existing.status}'.`\n )\n }\n\n const [updated] =\n input.status === \"succeeded\"\n ? await tx<PipelineRunDatabaseRow[]>`\n UPDATE pipeline_runs\n SET\n status = ${input.status},\n finished_at = ${input.finishedAt ?? new Date()},\n output_dataset_id = ${input.output?.datasetId ?? null},\n output_version_id = ${input.output?.versionId ?? null},\n error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n : await tx<PipelineRunDatabaseRow[]>`\n UPDATE pipeline_runs\n SET\n status = ${input.status},\n finished_at = ${input.finishedAt ?? new Date()},\n output_dataset_id = ${null},\n output_version_id = ${null},\n error = ${input.error === undefined ? null : serializeSixbFailure(input.error, PIPELINE_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n return rowToPipelineRunRecord(updated)\n })\n }\n\n async startStep(input: StartPipelineStepRunInput): Promise<PipelineStepRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [pipelineRun] = await tx<PipelineRunDatabaseRow[]>`\n SELECT * FROM pipeline_runs\n WHERE project_id = ${input.projectId} AND id = ${input.pipelineRunId}\n `\n\n if (!pipelineRun) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline run '${input.pipelineRunId}' not found for project '${input.projectId}'.`\n )\n }\n\n if (pipelineRun.status !== \"running\") {\n throw new PipelineRunError(\n `[SixbPg] Pipeline run '${input.pipelineRunId}' for project '${input.projectId}' is already terminal.`\n )\n }\n\n if (pipelineRun.pipeline_id !== input.pipelineId) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline step run '${input.id}' pipeline '${input.pipelineId}' does not match pipeline run '${input.pipelineRunId}' pipeline '${pipelineRun.pipeline_id}'.`\n )\n }\n\n try {\n const [row] = await tx<PipelineStepRunDatabaseRow[]>`\n INSERT INTO pipeline_step_runs (\n project_id,\n id,\n pipeline_run_id,\n pipeline_id,\n step_id,\n dataset_id,\n mode,\n status,\n started_at,\n inputs\n ) VALUES (\n ${input.projectId},\n ${input.id},\n ${input.pipelineRunId},\n ${input.pipelineId},\n ${input.stepId},\n ${input.datasetId},\n ${input.mode},\n ${\"running\"},\n ${input.startedAt ?? new Date()},\n ${JSON.stringify(input.inputs)}::text::jsonb\n )\n RETURNING *\n `\n\n return rowToPipelineStepRunRecord(row)\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline step run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n throw error\n }\n })\n }\n\n async finishStep(input: FinishPipelineStepRunInput): Promise<PipelineStepRunRecord> {\n assertOptionalNonNegativeInteger(input.rowsWritten, \"rowsWritten\")\n\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<PipelineStepRunDatabaseRow[]>`\n SELECT * FROM pipeline_step_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n\n if (!existing) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline step run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n if (existing.status !== \"running\") {\n throw new PipelineRunError(\n `[SixbPg] Pipeline step run '${input.id}' for project '${input.projectId}' is already terminal.`\n )\n }\n\n if (input.status === \"succeeded\" && input.output.datasetId !== existing.dataset_id) {\n throw new PipelineRunError(\n `[SixbPg] Pipeline step run '${input.id}' output dataset '${input.output.datasetId}' does not match '${existing.dataset_id}'.`\n )\n }\n\n const [updated] =\n input.status === \"succeeded\"\n ? await tx<PipelineStepRunDatabaseRow[]>`\n UPDATE pipeline_step_runs\n SET\n status = ${input.status},\n finished_at = ${input.finishedAt ?? new Date()},\n output_version_id = ${input.output.versionId},\n rows_written = ${input.rowsWritten ?? existing.rows_written ?? null},\n error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n : await tx<PipelineStepRunDatabaseRow[]>`\n UPDATE pipeline_step_runs\n SET\n status = ${input.status},\n finished_at = ${input.finishedAt ?? new Date()},\n output_version_id = ${null},\n rows_written = ${input.rowsWritten ?? existing.rows_written ?? null},\n error = ${input.error === undefined ? null : serializeSixbFailure(input.error, PIPELINE_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n\n return rowToPipelineStepRunRecord(updated)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<PipelineRunRecord | null> {\n const [row] = await this.sql<PipelineRunDatabaseRow[]>`\n SELECT * FROM pipeline_runs\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n\n return row ? rowToPipelineRunRecord(row) : null\n }\n\n async list(input: ListPipelineRunsInput): Promise<ListPipelineRunsResult> {\n if (hasEmptyStatuses(input) || input.pipelineIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.pipelineId) {\n whereClauses.push(`pipeline_id = $${index++}`)\n params.push(input.pipelineId)\n }\n\n if (input.pipelineIds) {\n const placeholders = input.pipelineIds.map(() => `$${index++}`).join(\", \")\n whereClauses.push(`pipeline_id IN (${placeholders})`)\n params.push(...input.pipelineIds)\n }\n\n index = appendRunListFilters(\n whereClauses,\n params,\n index,\n input,\n \"COALESCE(started_at, queued_at)\"\n )\n\n const { rows, total, hasMore } = await queryRunList<PipelineRunDatabaseRow>({\n sql: this.sql,\n tableName: \"pipeline_runs\",\n whereClauses,\n params,\n nextIndex: index,\n order: input.order,\n limit: input.limit,\n offset: input.offset,\n })\n const runs = rows.map(rowToPipelineRunRecord)\n\n return {\n runs,\n hasMore,\n total,\n }\n }\n\n async listLatestByPipelineIds(\n input: ListLatestPipelineRunsInput\n ): Promise<ListLatestPipelineRunsResult> {\n const rows = await queryLatestRunsByOwnerId<PipelineRunDatabaseRow>({\n sql: this.sql,\n tableName: \"pipeline_runs\",\n ownerColumn: \"pipeline_id\",\n ownerIds: input.pipelineIds,\n projectId: input.projectId,\n ownerIdFor: (row) => row.pipeline_id,\n })\n\n return {\n runs: rows.map(rowToPipelineRunRecord),\n }\n }\n\n async listSteps(input: ListPipelineStepRunsInput): Promise<ListPipelineStepRunsResult> {\n if (hasEmptyStatuses(input)) {\n return {\n steps: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.pipelineRunId) {\n whereClauses.push(`pipeline_run_id = $${index++}`)\n params.push(input.pipelineRunId)\n }\n\n if (input.pipelineId) {\n whereClauses.push(`pipeline_id = $${index++}`)\n params.push(input.pipelineId)\n }\n\n if (input.stepId) {\n whereClauses.push(`step_id = $${index++}`)\n params.push(input.stepId)\n }\n\n if (input.datasetId) {\n whereClauses.push(`dataset_id = $${index++}`)\n params.push(input.datasetId)\n }\n\n index = appendRunListFilters(whereClauses, params, index, input)\n\n const { rows, total, hasMore } = await queryRunList<PipelineStepRunDatabaseRow>({\n sql: this.sql,\n tableName: \"pipeline_step_runs\",\n whereClauses,\n params,\n nextIndex: index,\n order: input.order,\n limit: input.limit,\n offset: input.offset,\n })\n const steps = rows.map(rowToPipelineStepRunRecord)\n\n return {\n steps,\n hasMore,\n total,\n }\n }\n}\n\nfunction rowToPipelineRunRecord(row: PipelineRunDatabaseRow): PipelineRunRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n pipelineId: row.pipeline_id,\n status: row.status,\n queuedAt: new Date(row.queued_at),\n startedAt: row.started_at ? new Date(row.started_at) : undefined,\n finishedAt: row.finished_at ? new Date(row.finished_at) : undefined,\n output:\n row.output_dataset_id && row.output_version_id\n ? {\n datasetId: row.output_dataset_id,\n versionId: row.output_version_id,\n }\n : undefined,\n error: row.error === null ? undefined : parseSixbFailure(row.error, PIPELINE_RUN_FAILURE_CODES),\n }\n}\n\nfunction rowToPipelineStepRunRecord(row: PipelineStepRunDatabaseRow): PipelineStepRunRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n pipelineRunId: row.pipeline_run_id,\n pipelineId: row.pipeline_id,\n stepId: row.step_id,\n datasetId: row.dataset_id,\n mode: row.mode,\n status: row.status,\n startedAt: new Date(row.started_at),\n finishedAt: row.finished_at ? new Date(row.finished_at) : undefined,\n inputs: parseDatasetVersionRefs(row.inputs),\n output: row.output_version_id\n ? {\n datasetId: row.dataset_id,\n versionId: row.output_version_id,\n }\n : undefined,\n rowsWritten: row.rows_written != null ? Number(row.rows_written) : undefined,\n error: row.error === null ? undefined : parseSixbFailure(row.error, PIPELINE_RUN_FAILURE_CODES),\n }\n}\n\nfunction parseDatasetVersionRefs(\n value: readonly DatasetVersionRef[] | string\n): readonly DatasetVersionRef[] {\n return typeof value === \"string\" ? (JSON.parse(value) as readonly DatasetVersionRef[]) : value\n}\n\nfunction assertOptionalNonNegativeInteger(value: number | undefined, fieldName: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new PipelineRunError(`[SixbPg] Pipeline run ${fieldName} must be a non-negative integer.`)\n }\n}\n\ninterface PipelineRunDatabaseRow {\n project_id: string\n id: string\n execution_id: string\n pipeline_id: string\n status: PipelineRunRecord[\"status\"]\n queued_at: Date | string\n started_at: Date | string | null\n finished_at: Date | string | null\n output_dataset_id: string | null\n output_version_id: string | null\n error: JsonValue | null\n}\n\ninterface PipelineStepRunDatabaseRow {\n project_id: string\n id: string\n pipeline_run_id: string\n pipeline_id: string\n step_id: string\n dataset_id: string\n mode: PipelineStepRunRecord[\"mode\"]\n status: PipelineStepRunRecord[\"status\"]\n started_at: Date | string\n finished_at: Date | string | null\n inputs: readonly DatasetVersionRef[] | string\n output_version_id: string | null\n rows_written: number | string | null\n error: JsonValue | null\n}\n",
59
66
  "import type { SQLClient, SqlParameter } from \"./pg-client\"\n\ntype PgLatestRunTarget =\n | { readonly tableName: \"pipeline_runs\"; readonly ownerColumn: \"pipeline_id\" }\n | { readonly tableName: \"projection_runs\"; readonly ownerColumn: \"projection_id\" }\n | { readonly tableName: \"sync_runs\"; readonly ownerColumn: \"sync_id\" }\n | { readonly tableName: \"workflow_runs\"; readonly ownerColumn: \"workflow_id\" }\n\ntype PgLatestRunSelectList = \"*\" | \"*, checkpoint IS NOT NULL AS checkpoint_present\"\n\nexport async function queryLatestRunsByOwnerId<TRow>(\n input: {\n readonly sql: SQLClient\n readonly ownerIds: readonly string[]\n readonly projectId: string\n readonly ownerIdFor: (row: TRow) => string\n readonly selectList?: PgLatestRunSelectList\n /** A status that never counts as the latest run, such as a run made stale by a newer one. */\n readonly excludedStatus?: string\n } & PgLatestRunTarget\n): Promise<readonly TRow[]> {\n const ownerIds = [...new Set(input.ownerIds)]\n if (ownerIds.length === 0) {\n return []\n }\n\n const placeholders = ownerIds.map((_, index) => `$${index + 2}`).join(\", \")\n const parameters: SqlParameter[] = [input.projectId, ...ownerIds]\n let statusFilter = \"\"\n if (input.excludedStatus !== undefined) {\n parameters.push(input.excludedStatus)\n statusFilter = ` AND status <> $${parameters.length}`\n }\n const orderColumn =\n input.tableName === \"sync_runs\" ||\n input.tableName === \"pipeline_runs\" ||\n input.tableName === \"projection_runs\"\n ? \"COALESCE(started_at, queued_at)\"\n : \"started_at\"\n const rows = await input.sql.unsafe<TRow[]>(\n `\n SELECT DISTINCT ON (${input.ownerColumn}) ${input.selectList ?? \"*\"}\n FROM ${input.tableName}\n WHERE project_id = $1 AND ${input.ownerColumn} IN (${placeholders})${statusFilter}\n ORDER BY ${input.ownerColumn}, ${orderColumn} DESC, id DESC\n `,\n parameters\n )\n\n const latestByOwnerId = new Map(rows.map((row) => [input.ownerIdFor(row), row]))\n\n return ownerIds.flatMap((ownerId) => {\n const row = latestByOwnerId.get(ownerId)\n return row ? [row] : []\n })\n}\n",
60
- "import { randomUUID } from \"node:crypto\"\nimport type { JsonValue } from \"@sixb/core\"\nimport { serializeSixbFailure } from \"@sixb/core/internal/errors\"\nimport {\n advanceProjectionTelemetry,\n assertGenericProgressDoesNotAdvanceTelemetry,\n assertProjectionMissingTarget,\n assertProjectionRunAttempt,\n assertProjectionRunDurableExecution,\n assertProjectionRunListWindow,\n assertProjectionRunNonEmpty,\n assertProjectionRunQueueInput,\n assertProjectionRunRunning,\n assertProjectionRunStartInput,\n canRequeueProjectionRunAfterEnqueueFailure,\n createProjectionRunClaim,\n createProjectionRunRecord,\n failProjectionRunEnqueue,\n immutableDatasetVersionConflict,\n mergeProjectionRunProgress,\n type PersistedProjectionRunRecord,\n parseProjectionAttemptFailure,\n planProjectionRunFinish,\n planProjectionRunReclaim,\n projectionRunNotFound,\n publicProjectionRunRecord,\n requireTelemetryProjectionRun,\n restoreProjectionRun,\n type StoredProjectionRunRecord,\n SUPERSEDING_PROJECTION_RUN_STATUSES,\n staleProjectionRunExecution,\n} from \"@sixb/core/internal/projection-run-storage-provider\"\nimport type {\n AdvanceProjectionTelemetryCheckpointInput,\n ExecutionStorage,\n FailProjectionRunEnqueueInput,\n FindSupersedingProjectionRunInput,\n FinishProjectionRunInput,\n ListLatestProjectionRunsInput,\n ListLatestProjectionRunsResult,\n ListProjectionRunsInput,\n ListProjectionRunsResult,\n LockProjectionRunForMaterializationInput,\n ProjectionKind,\n ProjectionRunClaim,\n ProjectionRunRecord,\n ProjectionRunStatus,\n ProjectionRunStorage,\n QueueProjectionRunInput,\n RecordProjectionAttemptFailureInput,\n RecordProjectionMissingTargetInput,\n StartOrReclaimProjectionRunInput,\n TelemetryProjectionRunRecord,\n UpdateProjectionRunInput,\n} from \"@sixb/core/storage\"\nimport { PROJECTION_RUN_FAILURE_CODES, ProjectionRunError } from \"@sixb/core/storage\"\nimport { queryLatestRunsByOwnerId } from \"./latest-run-query\"\nimport type { SQLClient, SqlParameter } from \"./pg-client\"\nimport { lockAdvisoryKeys, type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport class PgProjectionRunStorage implements ProjectionRunStorage {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly executions: ExecutionStorage\n ) {}\n\n async queue(input: QueueProjectionRunInput): Promise<ProjectionRunRecord> {\n assertProjectionRunQueueInput(input)\n await assertProjectionRunDurableExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n projectionId: input.identity.projectionId,\n datasetId: input.identity.datasetVersion.datasetId,\n datasetVersionId: input.identity.datasetVersion.versionId,\n })\n\n return runPgTransaction(this.sql, async (tx) => {\n await lockAdvisoryKeys(tx, [\n projectionRunLockKey(input.projectId, input.id),\n datasetVersionLockKey(\n input.projectId,\n input.identity.datasetVersion.datasetId,\n input.identity.datasetVersion.versionId\n ),\n ])\n await assertDatasetVersionIsImmutable(tx, input)\n const [existingRow] = await tx<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (existingRow) {\n if (\n !canRequeueProjectionRunAfterEnqueueFailure(rowToProjectionRunRecord(existingRow), input)\n ) {\n throw duplicateProjectionRun(input)\n }\n const [requeued] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET status = ${\"queued\"}, queued_at = ${input.queuedAt ?? new Date()},\n started_at = ${null}, finished_at = ${null}, attempt = ${0}, execution_token = ${null},\n next_batch_ordinal = ${input.fixedBatchSize === undefined ? null : 0},\n next_row_offset = ${input.fixedBatchSize === undefined ? null : 0},\n input_exhausted = ${input.fixedBatchSize === undefined ? null : false},\n missing_target_object_type_id = ${null}, missing_target_object_id = ${null},\n missing_target_batch_ordinal = ${null}, missing_target_first_seen_at = ${null},\n source_rows_read = ${0}, source_rows_skipped = ${0}, source_changes_read = ${null}, error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n AND status = ${\"failed\"} AND error->>'code' = ${\"queue.enqueue_failed\"}\n RETURNING *\n `\n if (!requeued) throw duplicateProjectionRun(input)\n return rowToProjectionRunRecord(requeued)\n }\n\n const record = createProjectionRunRecord(input)\n const checkpoint = record.telemetryCheckpoint\n const [inserted] = await tx<DatabaseRow[]>`\n INSERT INTO projection_runs (\n project_id, id, execution_id, projection_id, projection_kind,\n materialization_protocol, dataset_id, dataset_version_id,\n dataset_version_created_at, ontology_revision, projection_revision, ownership_hash,\n object_type_id, source_object_type_id, target_object_type_id, status, queued_at,\n started_at, finished_at, attempt, execution_token, fixed_batch_size,\n next_batch_ordinal, next_row_offset, input_exhausted, source_rows_read,\n source_rows_skipped\n ) VALUES (\n ${record.projectId}, ${record.id}, ${record.executionId},\n ${record.identity.projectionId}, ${record.identity.projectionKind},\n ${record.identity.protocol}, ${record.identity.datasetVersion.datasetId},\n ${record.identity.datasetVersion.versionId}, ${record.identity.datasetVersion.createdAt},\n ${record.identity.ontologyRevision}, ${record.identity.projectionRevision},\n ${record.identity.ownershipHash},\n ${\"objectTypeId\" in record.target ? record.target.objectTypeId : null},\n ${\"sourceObjectTypeId\" in record.target ? record.target.sourceObjectTypeId : null},\n ${\"sourceObjectTypeId\" in record.target ? record.target.targetObjectTypeId : null},\n ${\"queued\"}, ${record.queuedAt}, ${null}, ${null}, ${0}, ${null},\n ${checkpoint?.fixedBatchSize ?? null}, ${checkpoint?.nextBatchOrdinal ?? null},\n ${checkpoint?.nextRowOffset ?? null}, ${checkpoint?.inputExhausted ?? null}, ${0}, ${0}\n )\n RETURNING *\n `\n return rowToProjectionRunRecord(inserted)\n })\n }\n\n async startOrReclaim(input: StartOrReclaimProjectionRunInput): Promise<ProjectionRunClaim> {\n assertProjectionRunStartInput(input)\n\n return runPgTransaction(this.sql, async (tx) => {\n await lockAdvisoryKeys(tx, [projectionRunLockKey(input.projectId, input.id)])\n const [existingRow] = await tx<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (!existingRow) throw projectionRunNotFound(input.projectId, input.id)\n const existing = restoreProjectionRunRow(existingRow)\n const { attempt } = planProjectionRunReclaim(existing, input)\n const executionToken = createFreshExecutionToken(existing.executionToken)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET status = ${\"running\"}, started_at = COALESCE(started_at, ${input.startedAt ?? new Date()}),\n finished_at = ${null}, attempt = ${attempt}, execution_token = ${executionToken}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n AND (\n (status = ${\"queued\"} AND execution_token IS NULL)\n OR (status = ${\"running\"} AND execution_token = ${existing.executionToken ?? null})\n )\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return projectionRunClaim(updated)\n })\n }\n\n async failEnqueue(input: FailProjectionRunEnqueueInput): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existingRow] = await tx<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (!existingRow) throw projectionRunNotFound(input.projectId, input.id)\n const failed = failProjectionRunEnqueue(restoreProjectionRunRow(existingRow), input)\n if (!failed.error) {\n throw new ProjectionRunError(`[SixbPg] Projection run '${input.id}' has no failure.`)\n }\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET status = ${\"failed\"}, finished_at = ${failed.finishedAt ?? new Date()},\n error = ${serializeSixbFailure(failed.error, PROJECTION_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id} AND status = ${\"queued\"}\n RETURNING *\n `\n if (!updated) throw duplicateProjectionRun(input)\n return rowToProjectionRunRecord(updated)\n })\n }\n\n async lockForMaterialization(\n input: LockProjectionRunForMaterializationInput\n ): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const row = await requireMaterializationExecution(tx, input)\n return rowToProjectionRunRecord(row)\n })\n }\n\n async update(input: UpdateProjectionRunInput): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const existing = restoreProjectionRunRow(existingRow)\n assertGenericProgressDoesNotAdvanceTelemetry(existing, input.progress)\n const progress = mergeProjectionRunProgress(existing.progress, input.progress)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET\n source_rows_read = ${progress.sourceRowsRead},\n source_rows_skipped = ${progress.sourceRowsSkipped},\n source_changes_read = ${progress.sourceChangesRead ?? null}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToProjectionRunRecord(updated)\n })\n }\n\n async recordAttemptFailure(\n input: RecordProjectionAttemptFailureInput\n ): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const error = parseProjectionAttemptFailure(restoreProjectionRunRow(existingRow), input.error)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET error = ${serializeSixbFailure(error, PROJECTION_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToProjectionRunRecord(updated)\n })\n }\n\n async finish(input: FinishProjectionRunInput): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const existing = restoreProjectionRunRow(existingRow)\n const plan = planProjectionRunFinish(existing, input)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET\n status = ${input.status},\n finished_at = ${plan.finishedAt},\n execution_token = ${null},\n source_rows_read = ${plan.progress.sourceRowsRead},\n source_rows_skipped = ${plan.progress.sourceRowsSkipped},\n source_changes_read = ${plan.progress.sourceChangesRead ?? null},\n input_exhausted = ${plan.inputExhausted ?? existingRow.input_exhausted},\n error = ${plan.error === undefined ? null : serializeSixbFailure(plan.error, PROJECTION_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToProjectionRunRecord(updated)\n })\n }\n\n async advanceTelemetryCheckpoint(\n input: AdvanceProjectionTelemetryCheckpointInput\n ): Promise<TelemetryProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const advance = advanceProjectionTelemetry(restoreProjectionRunRow(existingRow), input)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET\n next_batch_ordinal = ${advance.checkpoint.nextBatchOrdinal},\n next_row_offset = ${advance.checkpoint.nextRowOffset},\n input_exhausted = ${advance.checkpoint.inputExhausted},\n source_rows_read = ${advance.progress.sourceRowsRead},\n source_rows_skipped = ${advance.progress.sourceRowsSkipped},\n missing_target_object_type_id = ${null},\n missing_target_object_id = ${null},\n missing_target_batch_ordinal = ${null},\n missing_target_first_seen_at = ${null}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n AND next_batch_ordinal = ${input.batchOrdinal}\n AND input_exhausted = ${false}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToTelemetryProjectionRunRecord(updated)\n })\n }\n\n async recordMissingTarget(\n input: RecordProjectionMissingTargetInput\n ): Promise<TelemetryProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const existing = requireTelemetryProjectionRun(restoreProjectionRunRow(existingRow))\n const missingTarget = assertProjectionMissingTarget(existing, input.missingTarget)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET\n missing_target_object_type_id = ${missingTarget.objectTypeId},\n missing_target_object_id = ${missingTarget.objectId},\n missing_target_batch_ordinal = ${missingTarget.batchOrdinal},\n missing_target_first_seen_at = ${missingTarget.firstSeenAt}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n AND next_batch_ordinal = ${missingTarget.batchOrdinal}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToTelemetryProjectionRunRecord(updated)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<ProjectionRunRecord | null> {\n const [row] = await this.sql<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n\n return row ? rowToProjectionRunRecord(row) : null\n }\n\n async list(input: ListProjectionRunsInput): Promise<ListProjectionRunsResult> {\n assertProjectionRunNonEmpty(input.projectId, \"projectId\")\n\n if (input.statuses && input.statuses.length === 0) {\n return { runs: [], hasMore: false, total: 0 }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.projectionId) {\n whereClauses.push(`projection_id = $${index++}`)\n params.push(input.projectionId)\n }\n if (input.projectionKind) {\n whereClauses.push(`projection_kind = $${index++}`)\n params.push(input.projectionKind)\n }\n if (input.datasetId) {\n whereClauses.push(`dataset_id = $${index++}`)\n params.push(input.datasetId)\n }\n if (input.datasetVersionId) {\n whereClauses.push(`dataset_version_id = $${index++}`)\n params.push(input.datasetVersionId)\n }\n\n if (input.objectTypeIds) {\n if (input.objectTypeIds.length === 0) {\n return { runs: [], hasMore: false, total: 0 }\n }\n const placeholders = input.objectTypeIds.map(() => `$${index++}`)\n const list = placeholders.join(\", \")\n const sourceList = input.objectTypeIds.map(() => `$${index++}`).join(\", \")\n const targetList = input.objectTypeIds.map(() => `$${index++}`).join(\", \")\n whereClauses.push(\n `(object_type_id IN (${list})` +\n ` OR (source_object_type_id IN (${sourceList})` +\n ` AND target_object_type_id IN (${targetList})))`\n )\n params.push(...input.objectTypeIds, ...input.objectTypeIds, ...input.objectTypeIds)\n }\n\n if (input.statuses) {\n const placeholders = input.statuses.map(() => `$${index++}`)\n whereClauses.push(`status IN (${placeholders.join(\", \")})`)\n params.push(...input.statuses)\n }\n if (input.startedAfter) {\n whereClauses.push(`COALESCE(started_at, queued_at) >= $${index++}`)\n params.push(input.startedAfter)\n }\n if (input.startedBefore) {\n whereClauses.push(`COALESCE(started_at, queued_at) <= $${index++}`)\n params.push(input.startedBefore)\n }\n\n const where = `WHERE ${whereClauses.join(\" AND \")}`\n const order = input.order === \"asc\" ? \"ASC\" : \"DESC\"\n const offset = input.offset ?? 0\n assertProjectionRunListWindow(input.limit, \"limit\")\n assertProjectionRunListWindow(offset, \"offset\")\n\n const [totalRow] = await this.sql.unsafe<{ count: string | number }[]>(\n `SELECT COUNT(*)::bigint AS count FROM projection_runs ${where}`,\n params\n )\n\n const queryParams = [...params]\n let query = `\n SELECT * FROM projection_runs\n ${where}\n ORDER BY COALESCE(started_at, queued_at) ${order}, id ${order}\n `\n if (input.limit !== undefined) {\n query += ` LIMIT $${index++} OFFSET $${index++}`\n queryParams.push(input.limit, offset)\n } else if (offset > 0) {\n query += ` OFFSET $${index++}`\n queryParams.push(offset)\n }\n\n const rows = await this.sql.unsafe<DatabaseRow[]>(query, queryParams)\n const total = Number(totalRow?.count ?? 0)\n const runs = rows.map(rowToProjectionRunRecord)\n return { runs, hasMore: offset + runs.length < total, total }\n }\n\n async findSupersedingRun(\n input: FindSupersedingProjectionRunInput\n ): Promise<ProjectionRunRecord | null> {\n const [run] = await this.sql<\n Pick<\n DatabaseRow,\n \"projection_id\" | \"materialization_protocol\" | \"dataset_version_created_at\"\n >[]\n >`\n SELECT projection_id, materialization_protocol, dataset_version_created_at\n FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n if (!run) throw projectionRunNotFound(input.projectId, input.id)\n if (run.materialization_protocol !== \"replacement\") return null\n // Canonical UTC ISO timestamps order as text, but only under a binary collation: a\n // linguistic one may weigh their punctuation differently.\n const [newer] = await this.sql<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${input.projectId}\n AND projection_id = ${run.projection_id}\n AND materialization_protocol = ${\"replacement\"}\n AND status = ANY(${this.sql.array([...SUPERSEDING_PROJECTION_RUN_STATUSES])}::text[])\n AND dataset_version_created_at COLLATE \"C\" > ${run.dataset_version_created_at} COLLATE \"C\"\n ORDER BY dataset_version_created_at COLLATE \"C\" DESC, id DESC\n LIMIT 1\n `\n return newer ? rowToProjectionRunRecord(newer) : null\n }\n\n async listLatestByProjectionIds(\n input: ListLatestProjectionRunsInput\n ): Promise<ListLatestProjectionRunsResult> {\n const rows = await queryLatestRunsByOwnerId<DatabaseRow>({\n sql: this.sql,\n tableName: \"projection_runs\",\n ownerColumn: \"projection_id\",\n ownerIds: input.projectionIds,\n projectId: input.projectId,\n ownerIdFor: (row) => row.projection_id,\n excludedStatus: \"superseded\",\n })\n\n return { runs: rows.map(rowToProjectionRunRecord) }\n }\n}\n\nasync function requireMaterializationExecution(\n sql: SQLClient,\n input: LockProjectionRunForMaterializationInput\n): Promise<DatabaseRow> {\n const row = await requireRunning(sql, input.projectId, input.id)\n assertProjectionRunAttempt(restoreProjectionRunRow(row), input)\n return row\n}\n\nasync function requireRunning(sql: SQLClient, projectId: string, id: string): Promise<DatabaseRow> {\n assertProjectionRunNonEmpty(projectId, \"projectId\")\n assertProjectionRunNonEmpty(id, \"id\")\n\n const [row] = await sql<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${projectId} AND id = ${id}\n FOR UPDATE\n `\n if (!row) throw projectionRunNotFound(projectId, id)\n assertProjectionRunRunning(restoreProjectionRunRow(row))\n return row\n}\n\nasync function assertDatasetVersionIsImmutable(\n sql: SQLClient,\n input: QueueProjectionRunInput\n): Promise<void> {\n const [conflict] = await sql<{ readonly id: string }[]>`\n SELECT id FROM projection_runs\n WHERE project_id = ${input.projectId}\n AND id <> ${input.id}\n AND dataset_id = ${input.identity.datasetVersion.datasetId}\n AND dataset_version_id = ${input.identity.datasetVersion.versionId}\n AND dataset_version_created_at <> ${input.identity.datasetVersion.createdAt}\n LIMIT 1\n `\n if (conflict) throw immutableDatasetVersionConflict(input.identity)\n}\n\nfunction createFreshExecutionToken(previous: string | undefined): string {\n let token = randomUUID()\n while (token === previous) token = randomUUID()\n return token\n}\n\nfunction projectionRunLockKey(projectId: string, id: string): string {\n return `projection-run:${JSON.stringify([projectId, id])}`\n}\n\nfunction datasetVersionLockKey(projectId: string, datasetId: string, versionId: string): string {\n return `projection-dataset-version:${JSON.stringify([projectId, datasetId, versionId])}`\n}\n\nfunction rowToProjectionRunRecord(row: DatabaseRow): ProjectionRunRecord {\n return publicProjectionRunRecord(restoreProjectionRunRow(row))\n}\n\nfunction projectionRunClaim(row: DatabaseRow): ProjectionRunClaim {\n return createProjectionRunClaim(restoreProjectionRunRow(row))\n}\n\nfunction rowToTelemetryProjectionRunRecord(row: DatabaseRow): TelemetryProjectionRunRecord {\n return requireTelemetryProjectionRun(rowToProjectionRunRecord(row))\n}\n\nfunction restoreProjectionRunRow(row: DatabaseRow): StoredProjectionRunRecord {\n const persisted: PersistedProjectionRunRecord = {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n projectionId: row.projection_id,\n projectionKind: row.projection_kind,\n protocol: row.materialization_protocol ?? undefined,\n datasetId: row.dataset_id,\n datasetVersionId: row.dataset_version_id,\n datasetVersionCreatedAt: row.dataset_version_created_at ?? undefined,\n ontologyRevision: row.ontology_revision ?? undefined,\n projectionRevision: row.projection_revision ?? undefined,\n ownershipHash: row.ownership_hash ?? undefined,\n objectTypeId: row.object_type_id ?? undefined,\n sourceObjectTypeId: row.source_object_type_id ?? undefined,\n targetObjectTypeId: row.target_object_type_id ?? undefined,\n status: row.status,\n queuedAt: new Date(row.queued_at),\n startedAt: row.started_at ? new Date(row.started_at) : undefined,\n finishedAt: row.finished_at ? new Date(row.finished_at) : undefined,\n attempt: databaseSafeInteger(row.attempt, \"attempt\"),\n executionToken: row.execution_token ?? undefined,\n fixedBatchSize: optionalDatabaseSafeInteger(row.fixed_batch_size, \"fixedBatchSize\"),\n nextBatchOrdinal: optionalDatabaseSafeInteger(row.next_batch_ordinal, \"nextBatchOrdinal\"),\n nextRowOffset: optionalDatabaseSafeInteger(row.next_row_offset, \"nextRowOffset\"),\n inputExhausted: row.input_exhausted ?? undefined,\n missingTargetObjectTypeId: row.missing_target_object_type_id ?? undefined,\n missingTargetObjectId: row.missing_target_object_id ?? undefined,\n missingTargetBatchOrdinal: optionalDatabaseSafeInteger(\n row.missing_target_batch_ordinal,\n \"missingTargetBatchOrdinal\"\n ),\n missingTargetFirstSeenAt: row.missing_target_first_seen_at\n ? new Date(row.missing_target_first_seen_at)\n : undefined,\n progress: {\n sourceRowsRead: databaseSafeInteger(row.source_rows_read, \"sourceRowsRead\"),\n sourceRowsSkipped: databaseSafeInteger(row.source_rows_skipped, \"sourceRowsSkipped\"),\n ...(row.source_changes_read == null\n ? {}\n : { sourceChangesRead: databaseSafeInteger(row.source_changes_read, \"sourceChangesRead\") }),\n },\n error: row.error ?? undefined,\n }\n return restoreProjectionRun(persisted)\n}\n\nfunction optionalDatabaseSafeInteger(\n value: number | string | null,\n fieldName: string\n): number | undefined {\n return value === null ? undefined : databaseSafeInteger(value, fieldName)\n}\n\nfunction databaseSafeInteger(value: number | string | null, fieldName: string): number {\n const result = Number(value)\n if (!Number.isSafeInteger(result) || result < 0) {\n throw new ProjectionRunError(\n `[SixbPg] Projection run persisted ${fieldName} is not a non-negative safe integer.`\n )\n }\n return result\n}\n\ninterface DatabaseRow {\n project_id: string\n id: string\n execution_id: string\n projection_id: string\n projection_kind: ProjectionKind\n dataset_id: string\n dataset_version_id: string\n object_type_id: string | null\n source_object_type_id: string | null\n target_object_type_id: string | null\n status: ProjectionRunStatus\n queued_at: Date | string\n started_at: Date | string | null\n finished_at: Date | string | null\n attempt: number | string\n execution_token: string | null\n materialization_protocol: \"replacement\" | \"telemetry\" | null\n dataset_version_created_at: string | null\n ontology_revision: string | null\n projection_revision: string | null\n ownership_hash: string | null\n fixed_batch_size: number | string | null\n next_batch_ordinal: number | string | null\n next_row_offset: number | string | null\n input_exhausted: boolean | null\n missing_target_object_type_id: string | null\n missing_target_object_id: string | null\n missing_target_batch_ordinal: number | string | null\n missing_target_first_seen_at: Date | string | null\n source_rows_read: number | string\n source_rows_skipped: number | string\n source_changes_read: number | string | null\n error: JsonValue | null\n}\n\nfunction duplicateProjectionRun(input: { readonly projectId: string; readonly id: string }) {\n return new ProjectionRunError(\n `[SixbPg] Projection run '${input.id}' already exists for project '${input.projectId}'.`\n )\n}\n",
61
- "import type { RuleEventSubject } from \"@sixb/core\"\nimport type {\n ListActiveRuleStatesInput,\n ListActiveRuleStatesResult,\n ListRuleStatesReconciliationPageInput,\n ListRuleStatesReconciliationPageResult,\n RuleStateRecord,\n RuleStateTransitionEvent,\n RulesStorage,\n StoredRuleResolvedEvent,\n StoredRuleTriggeredEvent,\n} from \"@sixb/core/storage\"\nimport type { SqlParameter } from \"./pg-client\"\nimport type { PgStoreClient } from \"./transactions\"\n\nexport class PgRulesStorage implements RulesStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async getActive(params: {\n projectId: string\n ruleId: string\n subject: RuleEventSubject\n }): Promise<RuleStateRecord | null> {\n const [row] = await this.sql<RuleStateRow[]>`\n SELECT\n project_id,\n rule_id,\n subject_kind,\n object_type_id,\n primary_id,\n triggered_at\n FROM rule_states\n WHERE project_id = ${params.projectId}\n AND rule_id = ${params.ruleId}\n AND subject_kind = ${params.subject.kind}\n AND object_type_id = ${params.subject.objectTypeId}\n AND primary_id = ${params.subject.primaryId}\n `\n\n return row ? rowToRuleStateRecord(row) : null\n }\n\n async getActiveBatch(params: {\n projectId: string\n items: readonly {\n readonly ruleId: string\n readonly subject: RuleEventSubject\n }[]\n }): Promise<readonly RuleStateRecord[]> {\n if (params.items.length === 0) return []\n const requested = JSON.stringify(\n params.items.map((item) => ({\n rule_id: item.ruleId,\n subject_kind: item.subject.kind,\n object_type_id: item.subject.objectTypeId,\n primary_id: item.subject.primaryId,\n }))\n )\n const rows = await this.sql<RuleStateRow[]>`\n WITH requested AS (\n SELECT *\n FROM jsonb_to_recordset(${requested}::text::jsonb) AS identity(\n rule_id text,\n subject_kind text,\n object_type_id text,\n primary_id text\n )\n )\n SELECT project_id, rule_id, subject_kind, object_type_id, primary_id, triggered_at\n FROM rule_states AS states\n JOIN requested USING (rule_id, subject_kind, object_type_id, primary_id)\n WHERE states.project_id = ${params.projectId}\n `\n return rows.map(rowToRuleStateRecord)\n }\n\n async listActive(input: ListActiveRuleStatesInput): Promise<ListActiveRuleStatesResult> {\n if (input.objectTypeIds?.length === 0) {\n return { states: [], hasMore: false, total: 0 }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.ruleId) {\n whereClauses.push(`rule_id = $${index++}`)\n params.push(input.ruleId)\n }\n\n if (input.objectTypeId) {\n whereClauses.push(`object_type_id = $${index++}`)\n params.push(input.objectTypeId)\n }\n\n if (input.objectTypeIds) {\n const placeholders = input.objectTypeIds.map(() => `$${index++}`)\n whereClauses.push(`object_type_id IN (${placeholders.join(\", \")})`)\n params.push(...input.objectTypeIds)\n }\n\n if (input.primaryId) {\n whereClauses.push(`primary_id = $${index++}`)\n params.push(input.primaryId)\n }\n\n const where = `WHERE ${whereClauses.join(\" AND \")}`\n const order = input.order === \"asc\" ? \"ASC\" : \"DESC\"\n const offset = input.offset ?? 0\n\n const [totalRow] = await this.sql.unsafe<{ count: string | number }[]>(\n `SELECT COUNT(*)::bigint AS count FROM rule_states ${where}`,\n params\n )\n\n const queryParams = [...params]\n let query = `\n SELECT\n project_id,\n rule_id,\n subject_kind,\n object_type_id,\n primary_id,\n triggered_at\n FROM rule_states\n ${where}\n ORDER BY triggered_at ${order}, rule_id ${order}, object_type_id ${order}, primary_id ${order}\n `\n\n if (input.limit !== undefined) {\n query += ` LIMIT $${index++} OFFSET $${index++}`\n queryParams.push(input.limit, offset)\n } else if (offset > 0) {\n query += ` OFFSET $${index++}`\n queryParams.push(offset)\n }\n\n const rows = await this.sql.unsafe<RuleStateRow[]>(query, queryParams)\n const total = Number(totalRow?.count ?? 0)\n const states = rows.map(rowToRuleStateRecord)\n\n return {\n states,\n hasMore: offset + states.length < total,\n total,\n }\n }\n\n async listReconciliationPage(\n input: ListRuleStatesReconciliationPageInput\n ): Promise<ListRuleStatesReconciliationPageResult> {\n assertPositiveLimit(input.limit)\n const params: SqlParameter[] = [input.projectId]\n const cursor = input.after ? \"AND (rule_id, object_type_id, primary_id) > ($2, $3, $4)\" : \"\"\n if (input.after) {\n params.push(input.after.ruleId, input.after.objectTypeId, input.after.primaryId)\n }\n params.push(input.limit + 1)\n const limitParameter = `$${params.length}`\n const rows = await this.sql.unsafe<RuleStateRow[]>(\n `\n SELECT project_id, rule_id, subject_kind, object_type_id, primary_id, triggered_at\n FROM rule_states\n WHERE project_id = $1 AND subject_kind = 'object' ${cursor}\n ORDER BY rule_id ASC, object_type_id ASC, primary_id ASC\n LIMIT ${limitParameter}\n `,\n params\n )\n return reconciliationPage(rows, input.limit)\n }\n\n async applyTriggered(event: StoredRuleTriggeredEvent): Promise<void> {\n await this.sql`\n INSERT INTO rule_states (\n project_id,\n rule_id,\n subject_kind,\n object_type_id,\n primary_id,\n triggered_at\n ) VALUES (\n ${event.projectId},\n ${event.payload.ruleId},\n ${event.payload.subject.kind},\n ${event.payload.subject.objectTypeId},\n ${event.payload.subject.primaryId},\n ${event.payload.triggeredAt}\n )\n ON CONFLICT (project_id, rule_id, subject_kind, object_type_id, primary_id)\n DO UPDATE SET triggered_at = excluded.triggered_at\n `\n }\n\n async applyResolved(event: StoredRuleResolvedEvent): Promise<void> {\n await this.sql`\n DELETE FROM rule_states\n WHERE project_id = ${event.projectId}\n AND rule_id = ${event.payload.ruleId}\n AND subject_kind = ${event.payload.subject.kind}\n AND object_type_id = ${event.payload.subject.objectTypeId}\n AND primary_id = ${event.payload.subject.primaryId}\n `\n }\n\n async applyTransitions(events: readonly RuleStateTransitionEvent[]): Promise<void> {\n if (events.length === 0) return\n const rows = JSON.stringify(events.map(transitionRow))\n await this.sql`\n WITH transitions AS MATERIALIZED (\n SELECT *\n FROM jsonb_to_recordset(${rows}::text::jsonb) AS transition(\n type text,\n project_id text,\n rule_id text,\n subject_kind text,\n object_type_id text,\n primary_id text,\n transition_at timestamptz\n )\n ), upserted AS (\n INSERT INTO rule_states (\n project_id, rule_id, subject_kind, object_type_id, primary_id, triggered_at\n )\n SELECT project_id, rule_id, subject_kind, object_type_id, primary_id, transition_at\n FROM transitions\n WHERE type = 'rule.triggered'\n ON CONFLICT (project_id, rule_id, subject_kind, object_type_id, primary_id)\n DO UPDATE SET triggered_at = excluded.triggered_at\n RETURNING 1\n )\n DELETE FROM rule_states AS states\n USING transitions\n WHERE transitions.type = 'rule.resolved'\n AND states.project_id = transitions.project_id\n AND states.rule_id = transitions.rule_id\n AND states.subject_kind = transitions.subject_kind\n AND states.object_type_id = transitions.object_type_id\n AND states.primary_id = transitions.primary_id\n `\n }\n}\n\nfunction transitionRow(event: RuleStateTransitionEvent) {\n return {\n type: event.type,\n project_id: event.projectId,\n rule_id: event.payload.ruleId,\n subject_kind: event.payload.subject.kind,\n object_type_id: event.payload.subject.objectTypeId,\n primary_id: event.payload.subject.primaryId,\n transition_at:\n event.type === \"rule.triggered\" ? event.payload.triggeredAt : event.payload.resolvedAt,\n }\n}\n\nfunction reconciliationPage(\n rows: readonly RuleStateRow[],\n limit: number\n): ListRuleStatesReconciliationPageResult {\n const hasMore = rows.length > limit\n const states = rows.slice(0, limit).map(rowToRuleStateRecord)\n const last = states.at(-1)\n return {\n states,\n ...(hasMore && last\n ? {\n next: {\n ruleId: last.ruleId,\n objectTypeId: last.subject.objectTypeId,\n primaryId: last.subject.primaryId,\n },\n }\n : {}),\n }\n}\n\nfunction assertPositiveLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Rules reconciliation page limit must be a positive safe integer.\")\n }\n}\n\ninterface RuleStateRow {\n readonly project_id: string\n readonly rule_id: string\n readonly subject_kind: RuleEventSubject[\"kind\"]\n readonly object_type_id: string\n readonly primary_id: string\n readonly triggered_at: Date | string\n}\n\nfunction rowToRuleStateRecord(row: RuleStateRow): RuleStateRecord {\n return {\n projectId: row.project_id,\n ruleId: row.rule_id,\n subject: {\n kind: row.subject_kind,\n objectTypeId: row.object_type_id,\n primaryId: row.primary_id,\n },\n triggeredAt: toIsoString(row.triggered_at),\n }\n}\n\nfunction toIsoString(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n",
67
+ "import { randomUUID } from \"node:crypto\"\nimport type { JsonValue } from \"@sixb/core\"\nimport { serializeSixbFailure } from \"@sixb/core/internal/errors\"\nimport {\n advanceProjectionTelemetry,\n assertGenericProgressDoesNotAdvanceTelemetry,\n assertProjectionMissingTarget,\n assertProjectionRunAttempt,\n assertProjectionRunDurableExecution,\n assertProjectionRunListWindow,\n assertProjectionRunNonEmpty,\n assertProjectionRunQueueInput,\n assertProjectionRunRunning,\n assertProjectionRunStartInput,\n canRequeueProjectionRunAfterEnqueueFailure,\n createProjectionRunClaim,\n createProjectionRunRecord,\n failProjectionRunEnqueue,\n immutableDatasetVersionConflict,\n mergeProjectionRunProgress,\n type PersistedProjectionRunRecord,\n parseProjectionAttemptFailure,\n planProjectionRunFinish,\n planProjectionRunReclaim,\n projectionRunNotFound,\n publicProjectionRunRecord,\n requireTelemetryProjectionRun,\n restoreProjectionRun,\n type StoredProjectionRunRecord,\n SUPERSEDING_PROJECTION_RUN_STATUSES,\n staleProjectionRunExecution,\n} from \"@sixb/core/internal/projection-run-storage-provider\"\nimport type {\n AdvanceProjectionTelemetryCheckpointInput,\n ExecutionStorage,\n FailProjectionRunEnqueueInput,\n FindSupersedingProjectionRunInput,\n FinishProjectionRunInput,\n ListLatestProjectionRunsInput,\n ListLatestProjectionRunsResult,\n ListProjectionRunsInput,\n ListProjectionRunsResult,\n LockProjectionRunForMaterializationInput,\n ProjectionKind,\n ProjectionRunClaim,\n ProjectionRunRecord,\n ProjectionRunStatus,\n ProjectionRunStorage,\n QueueProjectionRunInput,\n RecordProjectionAttemptFailureInput,\n RecordProjectionMissingTargetInput,\n StartOrReclaimProjectionRunInput,\n TelemetryProjectionRunRecord,\n UpdateProjectionRunInput,\n} from \"@sixb/core/storage\"\nimport { PROJECTION_RUN_FAILURE_CODES, ProjectionRunError } from \"@sixb/core/storage\"\nimport { queryLatestRunsByOwnerId } from \"./latest-run-query\"\nimport type { SQLClient, SqlParameter } from \"./pg-client\"\nimport { lockAdvisoryKeys, type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport class PgProjectionRunStorage implements ProjectionRunStorage {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly executions: ExecutionStorage\n ) {}\n\n async queue(input: QueueProjectionRunInput): Promise<ProjectionRunRecord> {\n assertProjectionRunQueueInput(input)\n await assertProjectionRunDurableExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n projectionId: input.identity.projectionId,\n datasetId: input.identity.datasetVersion.datasetId,\n datasetVersionId: input.identity.datasetVersion.versionId,\n })\n\n return runPgTransaction(this.sql, async (tx) => {\n await lockAdvisoryKeys(tx, [\n projectionRunLockKey(input.projectId, input.id),\n datasetVersionLockKey(\n input.projectId,\n input.identity.datasetVersion.datasetId,\n input.identity.datasetVersion.versionId\n ),\n ])\n await assertDatasetVersionIsImmutable(tx, input)\n const [existingRow] = await tx<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (existingRow) {\n if (\n !canRequeueProjectionRunAfterEnqueueFailure(rowToProjectionRunRecord(existingRow), input)\n ) {\n throw duplicateProjectionRun(input)\n }\n const [requeued] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET status = ${\"queued\"}, queued_at = ${input.queuedAt ?? new Date()},\n started_at = ${null}, finished_at = ${null}, attempt = ${0}, execution_token = ${null},\n next_batch_ordinal = ${input.fixedBatchSize === undefined ? null : 0},\n next_row_offset = ${input.fixedBatchSize === undefined ? null : 0},\n input_exhausted = ${input.fixedBatchSize === undefined ? null : false},\n missing_target_object_type_id = ${null}, missing_target_object_id = ${null},\n missing_target_batch_ordinal = ${null}, missing_target_first_seen_at = ${null},\n source_rows_read = ${0}, source_rows_skipped = ${0}, source_changes_read = ${null}, error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n AND status = ${\"failed\"} AND error->>'code' = ${\"queue.enqueue_failed\"}\n RETURNING *\n `\n if (!requeued) throw duplicateProjectionRun(input)\n return rowToProjectionRunRecord(requeued)\n }\n\n const record = createProjectionRunRecord(input)\n const checkpoint = record.telemetryCheckpoint\n const [inserted] = await tx<DatabaseRow[]>`\n INSERT INTO projection_runs (\n project_id, id, execution_id, projection_id, projection_kind,\n materialization_protocol, dataset_id, dataset_version_id,\n dataset_version_created_at, ontology_revision, projection_revision, ownership_hash,\n object_type_id, source_object_type_id, target_object_type_id, status, queued_at,\n started_at, finished_at, attempt, execution_token, fixed_batch_size,\n next_batch_ordinal, next_row_offset, input_exhausted, source_rows_read,\n source_rows_skipped\n ) VALUES (\n ${record.projectId}, ${record.id}, ${record.executionId},\n ${record.identity.projectionId}, ${record.identity.projectionKind},\n ${record.identity.protocol}, ${record.identity.datasetVersion.datasetId},\n ${record.identity.datasetVersion.versionId}, ${record.identity.datasetVersion.createdAt},\n ${record.identity.ontologyRevision}, ${record.identity.projectionRevision},\n ${record.identity.ownershipHash},\n ${\"objectTypeId\" in record.target ? record.target.objectTypeId : null},\n ${\"sourceObjectTypeId\" in record.target ? record.target.sourceObjectTypeId : null},\n ${\"sourceObjectTypeId\" in record.target ? record.target.targetObjectTypeId : null},\n ${\"queued\"}, ${record.queuedAt}, ${null}, ${null}, ${0}, ${null},\n ${checkpoint?.fixedBatchSize ?? null}, ${checkpoint?.nextBatchOrdinal ?? null},\n ${checkpoint?.nextRowOffset ?? null}, ${checkpoint?.inputExhausted ?? null}, ${0}, ${0}\n )\n RETURNING *\n `\n return rowToProjectionRunRecord(inserted)\n })\n }\n\n async startOrReclaim(input: StartOrReclaimProjectionRunInput): Promise<ProjectionRunClaim> {\n assertProjectionRunStartInput(input)\n\n return runPgTransaction(this.sql, async (tx) => {\n await lockAdvisoryKeys(tx, [projectionRunLockKey(input.projectId, input.id)])\n const [existingRow] = await tx<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (!existingRow) throw projectionRunNotFound(input.projectId, input.id)\n const existing = restoreProjectionRunRow(existingRow)\n const { attempt } = planProjectionRunReclaim(existing, input)\n const executionToken = createFreshExecutionToken(existing.executionToken)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET status = ${\"running\"}, started_at = COALESCE(started_at, ${input.startedAt ?? new Date()}),\n finished_at = ${null}, attempt = ${attempt}, execution_token = ${executionToken}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n AND (\n (status = ${\"queued\"} AND execution_token IS NULL)\n OR (status = ${\"running\"} AND execution_token = ${existing.executionToken ?? null})\n )\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return projectionRunClaim(updated)\n })\n }\n\n async failEnqueue(input: FailProjectionRunEnqueueInput): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existingRow] = await tx<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (!existingRow) throw projectionRunNotFound(input.projectId, input.id)\n const failed = failProjectionRunEnqueue(restoreProjectionRunRow(existingRow), input)\n if (!failed.error) {\n throw new ProjectionRunError(`[SixbPg] Projection run '${input.id}' has no failure.`)\n }\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET status = ${\"failed\"}, finished_at = ${failed.finishedAt ?? new Date()},\n error = ${serializeSixbFailure(failed.error, PROJECTION_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id} AND status = ${\"queued\"}\n RETURNING *\n `\n if (!updated) throw duplicateProjectionRun(input)\n return rowToProjectionRunRecord(updated)\n })\n }\n\n async lockForMaterialization(\n input: LockProjectionRunForMaterializationInput\n ): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const row = await requireMaterializationExecution(tx, input)\n return rowToProjectionRunRecord(row)\n })\n }\n\n async update(input: UpdateProjectionRunInput): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const existing = restoreProjectionRunRow(existingRow)\n assertGenericProgressDoesNotAdvanceTelemetry(existing, input.progress)\n const progress = mergeProjectionRunProgress(existing.progress, input.progress)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET\n source_rows_read = ${progress.sourceRowsRead},\n source_rows_skipped = ${progress.sourceRowsSkipped},\n source_changes_read = ${progress.sourceChangesRead ?? null}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToProjectionRunRecord(updated)\n })\n }\n\n async recordAttemptFailure(\n input: RecordProjectionAttemptFailureInput\n ): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const error = parseProjectionAttemptFailure(restoreProjectionRunRow(existingRow), input.error)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET error = ${serializeSixbFailure(error, PROJECTION_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToProjectionRunRecord(updated)\n })\n }\n\n async finish(input: FinishProjectionRunInput): Promise<ProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const existing = restoreProjectionRunRow(existingRow)\n const plan = planProjectionRunFinish(existing, input)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET\n status = ${input.status},\n finished_at = ${plan.finishedAt},\n execution_token = ${null},\n source_rows_read = ${plan.progress.sourceRowsRead},\n source_rows_skipped = ${plan.progress.sourceRowsSkipped},\n source_changes_read = ${plan.progress.sourceChangesRead ?? null},\n input_exhausted = ${plan.inputExhausted ?? existingRow.input_exhausted},\n error = ${plan.error === undefined ? null : serializeSixbFailure(plan.error, PROJECTION_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToProjectionRunRecord(updated)\n })\n }\n\n async advanceTelemetryCheckpoint(\n input: AdvanceProjectionTelemetryCheckpointInput\n ): Promise<TelemetryProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const advance = advanceProjectionTelemetry(restoreProjectionRunRow(existingRow), input)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET\n next_batch_ordinal = ${advance.checkpoint.nextBatchOrdinal},\n next_row_offset = ${advance.checkpoint.nextRowOffset},\n input_exhausted = ${advance.checkpoint.inputExhausted},\n source_rows_read = ${advance.progress.sourceRowsRead},\n source_rows_skipped = ${advance.progress.sourceRowsSkipped},\n missing_target_object_type_id = ${null},\n missing_target_object_id = ${null},\n missing_target_batch_ordinal = ${null},\n missing_target_first_seen_at = ${null}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n AND next_batch_ordinal = ${input.batchOrdinal}\n AND input_exhausted = ${false}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToTelemetryProjectionRunRecord(updated)\n })\n }\n\n async recordMissingTarget(\n input: RecordProjectionMissingTargetInput\n ): Promise<TelemetryProjectionRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const existingRow = await requireMaterializationExecution(tx, input)\n const existing = requireTelemetryProjectionRun(restoreProjectionRunRow(existingRow))\n const missingTarget = assertProjectionMissingTarget(existing, input.missingTarget)\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE projection_runs\n SET\n missing_target_object_type_id = ${missingTarget.objectTypeId},\n missing_target_object_id = ${missingTarget.objectId},\n missing_target_batch_ordinal = ${missingTarget.batchOrdinal},\n missing_target_first_seen_at = ${missingTarget.firstSeenAt}\n WHERE project_id = ${input.projectId}\n AND id = ${input.id}\n AND status = ${\"running\"}\n AND execution_token = ${input.executionToken}\n AND next_batch_ordinal = ${missingTarget.batchOrdinal}\n RETURNING *\n `\n if (!updated) throw staleProjectionRunExecution(input.id)\n return rowToTelemetryProjectionRunRecord(updated)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<ProjectionRunRecord | null> {\n const [row] = await this.sql<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n\n return row ? rowToProjectionRunRecord(row) : null\n }\n\n async list(input: ListProjectionRunsInput): Promise<ListProjectionRunsResult> {\n assertProjectionRunNonEmpty(input.projectId, \"projectId\")\n\n if (input.statuses?.length === 0 || input.errorCodes?.length === 0) {\n return { runs: [], hasMore: false, total: 0 }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.projectionId) {\n whereClauses.push(`projection_id = $${index++}`)\n params.push(input.projectionId)\n }\n if (input.projectionKind) {\n whereClauses.push(`projection_kind = $${index++}`)\n params.push(input.projectionKind)\n }\n if (input.datasetId) {\n whereClauses.push(`dataset_id = $${index++}`)\n params.push(input.datasetId)\n }\n if (input.datasetVersionId) {\n whereClauses.push(`dataset_version_id = $${index++}`)\n params.push(input.datasetVersionId)\n }\n\n if (input.objectTypeIds) {\n if (input.objectTypeIds.length === 0) {\n return { runs: [], hasMore: false, total: 0 }\n }\n const placeholders = input.objectTypeIds.map(() => `$${index++}`)\n const list = placeholders.join(\", \")\n const sourceList = input.objectTypeIds.map(() => `$${index++}`).join(\", \")\n const targetList = input.objectTypeIds.map(() => `$${index++}`).join(\", \")\n whereClauses.push(\n `(object_type_id IN (${list})` +\n ` OR (source_object_type_id IN (${sourceList})` +\n ` AND target_object_type_id IN (${targetList})))`\n )\n params.push(...input.objectTypeIds, ...input.objectTypeIds, ...input.objectTypeIds)\n }\n\n if (input.statuses) {\n const placeholders = input.statuses.map(() => `$${index++}`)\n whereClauses.push(`status IN (${placeholders.join(\", \")})`)\n params.push(...input.statuses)\n }\n if (input.errorCodes) {\n const placeholders = input.errorCodes.map(() => `$${index++}`)\n whereClauses.push(`error->>'code' IN (${placeholders.join(\", \")})`)\n params.push(...input.errorCodes)\n }\n if (input.startedAfter) {\n whereClauses.push(`COALESCE(started_at, queued_at) >= $${index++}`)\n params.push(input.startedAfter)\n }\n if (input.startedBefore) {\n whereClauses.push(`COALESCE(started_at, queued_at) <= $${index++}`)\n params.push(input.startedBefore)\n }\n\n const where = `WHERE ${whereClauses.join(\" AND \")}`\n const order = input.order === \"asc\" ? \"ASC\" : \"DESC\"\n const offset = input.offset ?? 0\n assertProjectionRunListWindow(input.limit, \"limit\")\n assertProjectionRunListWindow(offset, \"offset\")\n\n const [totalRow] = await this.sql.unsafe<{ count: string | number }[]>(\n `SELECT COUNT(*)::bigint AS count FROM projection_runs ${where}`,\n params\n )\n\n const queryParams = [...params]\n let query = `\n SELECT * FROM projection_runs\n ${where}\n ORDER BY COALESCE(started_at, queued_at) ${order}, id ${order}\n `\n if (input.limit !== undefined) {\n query += ` LIMIT $${index++} OFFSET $${index++}`\n queryParams.push(input.limit, offset)\n } else if (offset > 0) {\n query += ` OFFSET $${index++}`\n queryParams.push(offset)\n }\n\n const rows = await this.sql.unsafe<DatabaseRow[]>(query, queryParams)\n const total = Number(totalRow?.count ?? 0)\n const runs = rows.map(rowToProjectionRunRecord)\n return { runs, hasMore: offset + runs.length < total, total }\n }\n\n async findSupersedingRun(\n input: FindSupersedingProjectionRunInput\n ): Promise<ProjectionRunRecord | null> {\n const [run] = await this.sql<\n Pick<\n DatabaseRow,\n \"projection_id\" | \"materialization_protocol\" | \"dataset_version_created_at\"\n >[]\n >`\n SELECT projection_id, materialization_protocol, dataset_version_created_at\n FROM projection_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n if (!run) throw projectionRunNotFound(input.projectId, input.id)\n if (run.materialization_protocol !== \"replacement\") return null\n // Canonical UTC ISO timestamps order as text, but only under a binary collation: a\n // linguistic one may weigh their punctuation differently.\n const [newer] = await this.sql<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${input.projectId}\n AND projection_id = ${run.projection_id}\n AND materialization_protocol = ${\"replacement\"}\n AND status = ANY(${this.sql.array([...SUPERSEDING_PROJECTION_RUN_STATUSES])}::text[])\n AND dataset_version_created_at COLLATE \"C\" > ${run.dataset_version_created_at} COLLATE \"C\"\n ORDER BY dataset_version_created_at COLLATE \"C\" DESC, id DESC\n LIMIT 1\n `\n return newer ? rowToProjectionRunRecord(newer) : null\n }\n\n async listLatestByProjectionIds(\n input: ListLatestProjectionRunsInput\n ): Promise<ListLatestProjectionRunsResult> {\n const rows = await queryLatestRunsByOwnerId<DatabaseRow>({\n sql: this.sql,\n tableName: \"projection_runs\",\n ownerColumn: \"projection_id\",\n ownerIds: input.projectionIds,\n projectId: input.projectId,\n ownerIdFor: (row) => row.projection_id,\n excludedStatus: \"superseded\",\n })\n\n return { runs: rows.map(rowToProjectionRunRecord) }\n }\n}\n\nasync function requireMaterializationExecution(\n sql: SQLClient,\n input: LockProjectionRunForMaterializationInput\n): Promise<DatabaseRow> {\n const row = await requireRunning(sql, input.projectId, input.id)\n assertProjectionRunAttempt(restoreProjectionRunRow(row), input)\n return row\n}\n\nasync function requireRunning(sql: SQLClient, projectId: string, id: string): Promise<DatabaseRow> {\n assertProjectionRunNonEmpty(projectId, \"projectId\")\n assertProjectionRunNonEmpty(id, \"id\")\n\n const [row] = await sql<DatabaseRow[]>`\n SELECT * FROM projection_runs\n WHERE project_id = ${projectId} AND id = ${id}\n FOR UPDATE\n `\n if (!row) throw projectionRunNotFound(projectId, id)\n assertProjectionRunRunning(restoreProjectionRunRow(row))\n return row\n}\n\nasync function assertDatasetVersionIsImmutable(\n sql: SQLClient,\n input: QueueProjectionRunInput\n): Promise<void> {\n const [conflict] = await sql<{ readonly id: string }[]>`\n SELECT id FROM projection_runs\n WHERE project_id = ${input.projectId}\n AND id <> ${input.id}\n AND dataset_id = ${input.identity.datasetVersion.datasetId}\n AND dataset_version_id = ${input.identity.datasetVersion.versionId}\n AND dataset_version_created_at <> ${input.identity.datasetVersion.createdAt}\n LIMIT 1\n `\n if (conflict) throw immutableDatasetVersionConflict(input.identity)\n}\n\nfunction createFreshExecutionToken(previous: string | undefined): string {\n let token = randomUUID()\n while (token === previous) token = randomUUID()\n return token\n}\n\nfunction projectionRunLockKey(projectId: string, id: string): string {\n return `projection-run:${JSON.stringify([projectId, id])}`\n}\n\nfunction datasetVersionLockKey(projectId: string, datasetId: string, versionId: string): string {\n return `projection-dataset-version:${JSON.stringify([projectId, datasetId, versionId])}`\n}\n\nfunction rowToProjectionRunRecord(row: DatabaseRow): ProjectionRunRecord {\n return publicProjectionRunRecord(restoreProjectionRunRow(row))\n}\n\nfunction projectionRunClaim(row: DatabaseRow): ProjectionRunClaim {\n return createProjectionRunClaim(restoreProjectionRunRow(row))\n}\n\nfunction rowToTelemetryProjectionRunRecord(row: DatabaseRow): TelemetryProjectionRunRecord {\n return requireTelemetryProjectionRun(rowToProjectionRunRecord(row))\n}\n\nfunction restoreProjectionRunRow(row: DatabaseRow): StoredProjectionRunRecord {\n const persisted: PersistedProjectionRunRecord = {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n projectionId: row.projection_id,\n projectionKind: row.projection_kind,\n protocol: row.materialization_protocol ?? undefined,\n datasetId: row.dataset_id,\n datasetVersionId: row.dataset_version_id,\n datasetVersionCreatedAt: row.dataset_version_created_at ?? undefined,\n ontologyRevision: row.ontology_revision ?? undefined,\n projectionRevision: row.projection_revision ?? undefined,\n ownershipHash: row.ownership_hash ?? undefined,\n objectTypeId: row.object_type_id ?? undefined,\n sourceObjectTypeId: row.source_object_type_id ?? undefined,\n targetObjectTypeId: row.target_object_type_id ?? undefined,\n status: row.status,\n queuedAt: new Date(row.queued_at),\n startedAt: row.started_at ? new Date(row.started_at) : undefined,\n finishedAt: row.finished_at ? new Date(row.finished_at) : undefined,\n attempt: databaseSafeInteger(row.attempt, \"attempt\"),\n executionToken: row.execution_token ?? undefined,\n fixedBatchSize: optionalDatabaseSafeInteger(row.fixed_batch_size, \"fixedBatchSize\"),\n nextBatchOrdinal: optionalDatabaseSafeInteger(row.next_batch_ordinal, \"nextBatchOrdinal\"),\n nextRowOffset: optionalDatabaseSafeInteger(row.next_row_offset, \"nextRowOffset\"),\n inputExhausted: row.input_exhausted ?? undefined,\n missingTargetObjectTypeId: row.missing_target_object_type_id ?? undefined,\n missingTargetObjectId: row.missing_target_object_id ?? undefined,\n missingTargetBatchOrdinal: optionalDatabaseSafeInteger(\n row.missing_target_batch_ordinal,\n \"missingTargetBatchOrdinal\"\n ),\n missingTargetFirstSeenAt: row.missing_target_first_seen_at\n ? new Date(row.missing_target_first_seen_at)\n : undefined,\n progress: {\n sourceRowsRead: databaseSafeInteger(row.source_rows_read, \"sourceRowsRead\"),\n sourceRowsSkipped: databaseSafeInteger(row.source_rows_skipped, \"sourceRowsSkipped\"),\n ...(row.source_changes_read == null\n ? {}\n : { sourceChangesRead: databaseSafeInteger(row.source_changes_read, \"sourceChangesRead\") }),\n },\n error: row.error ?? undefined,\n }\n return restoreProjectionRun(persisted)\n}\n\nfunction optionalDatabaseSafeInteger(\n value: number | string | null,\n fieldName: string\n): number | undefined {\n return value === null ? undefined : databaseSafeInteger(value, fieldName)\n}\n\nfunction databaseSafeInteger(value: number | string | null, fieldName: string): number {\n const result = Number(value)\n if (!Number.isSafeInteger(result) || result < 0) {\n throw new ProjectionRunError(\n `[SixbPg] Projection run persisted ${fieldName} is not a non-negative safe integer.`\n )\n }\n return result\n}\n\ninterface DatabaseRow {\n project_id: string\n id: string\n execution_id: string\n projection_id: string\n projection_kind: ProjectionKind\n dataset_id: string\n dataset_version_id: string\n object_type_id: string | null\n source_object_type_id: string | null\n target_object_type_id: string | null\n status: ProjectionRunStatus\n queued_at: Date | string\n started_at: Date | string | null\n finished_at: Date | string | null\n attempt: number | string\n execution_token: string | null\n materialization_protocol: \"replacement\" | \"telemetry\" | null\n dataset_version_created_at: string | null\n ontology_revision: string | null\n projection_revision: string | null\n ownership_hash: string | null\n fixed_batch_size: number | string | null\n next_batch_ordinal: number | string | null\n next_row_offset: number | string | null\n input_exhausted: boolean | null\n missing_target_object_type_id: string | null\n missing_target_object_id: string | null\n missing_target_batch_ordinal: number | string | null\n missing_target_first_seen_at: Date | string | null\n source_rows_read: number | string\n source_rows_skipped: number | string\n source_changes_read: number | string | null\n error: JsonValue | null\n}\n\nfunction duplicateProjectionRun(input: { readonly projectId: string; readonly id: string }) {\n return new ProjectionRunError(\n `[SixbPg] Projection run '${input.id}' already exists for project '${input.projectId}'.`\n )\n}\n",
68
+ "import type { RuleEventSubject } from \"@sixb/core\"\nimport type {\n ListActiveRuleStatesInput,\n ListActiveRuleStatesResult,\n ListRuleStatesReconciliationPageInput,\n ListRuleStatesReconciliationPageResult,\n RuleStateRecord,\n RuleStateTransitionEvent,\n RulesStorage,\n StoredRuleResolvedEvent,\n StoredRuleTriggeredEvent,\n} from \"@sixb/core/storage\"\nimport type { SqlParameter } from \"./pg-client\"\nimport type { PgStoreClient } from \"./transactions\"\n\nexport class PgRulesStorage implements RulesStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async getActive(params: {\n projectId: string\n ruleId: string\n subject: RuleEventSubject\n }): Promise<RuleStateRecord | null> {\n const [row] = await this.sql<RuleStateRow[]>`\n SELECT\n project_id,\n rule_id,\n subject_kind,\n object_type_id,\n primary_id,\n triggered_at\n FROM rule_states\n WHERE project_id = ${params.projectId}\n AND rule_id = ${params.ruleId}\n AND subject_kind = ${params.subject.kind}\n AND object_type_id = ${params.subject.objectTypeId}\n AND primary_id = ${params.subject.primaryId}\n `\n\n return row ? rowToRuleStateRecord(row) : null\n }\n\n async getActiveBatch(params: {\n projectId: string\n items: readonly {\n readonly ruleId: string\n readonly subject: RuleEventSubject\n }[]\n }): Promise<readonly RuleStateRecord[]> {\n if (params.items.length === 0) return []\n const requested = JSON.stringify(\n params.items.map((item) => ({\n rule_id: item.ruleId,\n subject_kind: item.subject.kind,\n object_type_id: item.subject.objectTypeId,\n primary_id: item.subject.primaryId,\n }))\n )\n const rows = await this.sql<RuleStateRow[]>`\n WITH requested AS (\n SELECT *\n FROM jsonb_to_recordset(${requested}::text::jsonb) AS identity(\n rule_id text,\n subject_kind text,\n object_type_id text,\n primary_id text\n )\n )\n SELECT project_id, rule_id, subject_kind, object_type_id, primary_id, triggered_at\n FROM rule_states AS states\n JOIN requested USING (rule_id, subject_kind, object_type_id, primary_id)\n WHERE states.project_id = ${params.projectId}\n `\n return rows.map(rowToRuleStateRecord)\n }\n\n async listActive(input: ListActiveRuleStatesInput): Promise<ListActiveRuleStatesResult> {\n if (input.objectTypeIds?.length === 0) {\n return { states: [], hasMore: false, total: 0 }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.ruleId) {\n whereClauses.push(`rule_id = $${index++}`)\n params.push(input.ruleId)\n }\n\n if (input.objectTypeId) {\n whereClauses.push(`object_type_id = $${index++}`)\n params.push(input.objectTypeId)\n }\n\n if (input.objectTypeIds) {\n const placeholders = input.objectTypeIds.map(() => `$${index++}`)\n whereClauses.push(`object_type_id IN (${placeholders.join(\", \")})`)\n params.push(...input.objectTypeIds)\n }\n\n if (input.primaryId) {\n whereClauses.push(`primary_id = $${index++}`)\n params.push(input.primaryId)\n }\n\n const where = `WHERE ${whereClauses.join(\" AND \")}`\n const order = input.order === \"asc\" ? \"ASC\" : \"DESC\"\n const offset = input.offset ?? 0\n\n const [totalRow] = await this.sql.unsafe<{ count: string | number }[]>(\n `SELECT COUNT(*)::bigint AS count FROM rule_states ${where}`,\n params\n )\n\n const queryParams = [...params]\n let query = `\n SELECT\n project_id,\n rule_id,\n subject_kind,\n object_type_id,\n primary_id,\n triggered_at\n FROM rule_states\n ${where}\n ORDER BY triggered_at ${order}, rule_id ${order}, object_type_id ${order}, primary_id ${order}\n `\n\n if (input.limit !== undefined) {\n query += ` LIMIT $${index++} OFFSET $${index++}`\n queryParams.push(input.limit, offset)\n } else if (offset > 0) {\n query += ` OFFSET $${index++}`\n queryParams.push(offset)\n }\n\n const rows = await this.sql.unsafe<RuleStateRow[]>(query, queryParams)\n const total = Number(totalRow?.count ?? 0)\n const states = rows.map(rowToRuleStateRecord)\n\n return {\n states,\n hasMore: offset + states.length < total,\n total,\n }\n }\n\n async listReconciliationPage(\n input: ListRuleStatesReconciliationPageInput\n ): Promise<ListRuleStatesReconciliationPageResult> {\n assertPositiveLimit(input.limit)\n const params: SqlParameter[] = [input.projectId]\n // The cursor follows the primary key column for column, so the index scan starts at the\n // cursor instead of at the cursor's rule. `subject_kind` is always 'object' (CHECK).\n const cursor = input.after\n ? \"AND (rule_id, subject_kind, object_type_id, primary_id) > ($2, 'object', $3, $4)\"\n : \"\"\n if (input.after) {\n params.push(input.after.ruleId, input.after.objectTypeId, input.after.primaryId)\n }\n params.push(input.limit + 1)\n const limitParameter = `$${params.length}`\n const rows = await this.sql.unsafe<RuleStateRow[]>(\n `\n SELECT project_id, rule_id, subject_kind, object_type_id, primary_id, triggered_at\n FROM rule_states\n WHERE project_id = $1 ${cursor}\n ORDER BY rule_id ASC, subject_kind ASC, object_type_id ASC, primary_id ASC\n LIMIT ${limitParameter}\n `,\n params\n )\n return reconciliationPage(rows, input.limit)\n }\n\n async applyTriggered(event: StoredRuleTriggeredEvent): Promise<void> {\n await this.sql`\n INSERT INTO rule_states (\n project_id,\n rule_id,\n subject_kind,\n object_type_id,\n primary_id,\n triggered_at\n ) VALUES (\n ${event.projectId},\n ${event.payload.ruleId},\n ${event.payload.subject.kind},\n ${event.payload.subject.objectTypeId},\n ${event.payload.subject.primaryId},\n ${event.payload.triggeredAt}\n )\n ON CONFLICT (project_id, rule_id, subject_kind, object_type_id, primary_id)\n DO UPDATE SET triggered_at = excluded.triggered_at\n `\n }\n\n async applyResolved(event: StoredRuleResolvedEvent): Promise<void> {\n await this.sql`\n DELETE FROM rule_states\n WHERE project_id = ${event.projectId}\n AND rule_id = ${event.payload.ruleId}\n AND subject_kind = ${event.payload.subject.kind}\n AND object_type_id = ${event.payload.subject.objectTypeId}\n AND primary_id = ${event.payload.subject.primaryId}\n `\n }\n\n async applyTransitions(events: readonly RuleStateTransitionEvent[]): Promise<void> {\n if (events.length === 0) return\n const rows = JSON.stringify(events.map(transitionRow))\n await this.sql`\n WITH transitions AS MATERIALIZED (\n SELECT *\n FROM jsonb_to_recordset(${rows}::text::jsonb) AS transition(\n type text,\n project_id text,\n rule_id text,\n subject_kind text,\n object_type_id text,\n primary_id text,\n transition_at timestamptz\n )\n ), upserted AS (\n INSERT INTO rule_states (\n project_id, rule_id, subject_kind, object_type_id, primary_id, triggered_at\n )\n SELECT project_id, rule_id, subject_kind, object_type_id, primary_id, transition_at\n FROM transitions\n WHERE type = 'rule.triggered'\n ON CONFLICT (project_id, rule_id, subject_kind, object_type_id, primary_id)\n DO UPDATE SET triggered_at = excluded.triggered_at\n RETURNING 1\n )\n DELETE FROM rule_states AS states\n USING transitions\n WHERE transitions.type = 'rule.resolved'\n AND states.project_id = transitions.project_id\n AND states.rule_id = transitions.rule_id\n AND states.subject_kind = transitions.subject_kind\n AND states.object_type_id = transitions.object_type_id\n AND states.primary_id = transitions.primary_id\n `\n }\n}\n\nfunction transitionRow(event: RuleStateTransitionEvent) {\n return {\n type: event.type,\n project_id: event.projectId,\n rule_id: event.payload.ruleId,\n subject_kind: event.payload.subject.kind,\n object_type_id: event.payload.subject.objectTypeId,\n primary_id: event.payload.subject.primaryId,\n transition_at:\n event.type === \"rule.triggered\" ? event.payload.triggeredAt : event.payload.resolvedAt,\n }\n}\n\nfunction reconciliationPage(\n rows: readonly RuleStateRow[],\n limit: number\n): ListRuleStatesReconciliationPageResult {\n const hasMore = rows.length > limit\n const states = rows.slice(0, limit).map(rowToRuleStateRecord)\n const last = states.at(-1)\n return {\n states,\n ...(hasMore && last\n ? {\n next: {\n ruleId: last.ruleId,\n objectTypeId: last.subject.objectTypeId,\n primaryId: last.subject.primaryId,\n },\n }\n : {}),\n }\n}\n\nfunction assertPositiveLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Rules reconciliation page limit must be a positive safe integer.\")\n }\n}\n\ninterface RuleStateRow {\n readonly project_id: string\n readonly rule_id: string\n readonly subject_kind: RuleEventSubject[\"kind\"]\n readonly object_type_id: string\n readonly primary_id: string\n readonly triggered_at: Date | string\n}\n\nfunction rowToRuleStateRecord(row: RuleStateRow): RuleStateRecord {\n return {\n projectId: row.project_id,\n ruleId: row.rule_id,\n subject: {\n kind: row.subject_kind,\n objectTypeId: row.object_type_id,\n primaryId: row.primary_id,\n },\n triggeredAt: toIsoString(row.triggered_at),\n }\n}\n\nfunction toIsoString(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString()\n}\n",
62
69
  "import type { JsonValue } from \"@sixb/core\"\nimport { parseSixbFailure, serializeSixbFailure } from \"@sixb/core/internal/errors\"\nimport { canRequeueSyncRunAfterEnqueueFailure } from \"@sixb/core/internal/storage\"\nimport { assertSyncRunExecution } from \"@sixb/core/internal/sync-run-storage-provider\"\nimport type {\n ExecutionStorage,\n FinishSyncRunInput,\n ListLatestSyncRunsInput,\n ListLatestSyncRunsResult,\n ListSyncRunsInput,\n ListSyncRunsResult,\n QueueSyncRunInput,\n StartSyncRunInput,\n SyncRunRecord,\n SyncRunStorage,\n} from \"@sixb/core/storage\"\nimport { SYNC_RUN_FAILURE_CODES, SyncRunError } from \"@sixb/core/storage\"\nimport { queryLatestRunsByOwnerId } from \"./latest-run-query\"\nimport type { SqlParameter } from \"./pg-client\"\nimport { appendRunListFilters, hasEmptyStatuses, queryRunList } from \"./run-list-query\"\nimport { isUniqueViolation } from \"./storage-errors\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport class PgSyncRunStorage implements SyncRunStorage {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly executions: ExecutionStorage\n ) {}\n\n async queue(input: QueueSyncRunInput): Promise<SyncRunRecord> {\n await assertSyncRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n syncId: input.syncId,\n })\n try {\n const [row] = await this.sql<DatabaseRow[]>`\n INSERT INTO sync_runs (\n project_id,\n id,\n execution_id,\n sync_id,\n dataset_id,\n mode,\n status,\n queued_at,\n started_at,\n expected_latest_version_id,\n commit_message\n ) VALUES (\n ${input.projectId},\n ${input.id},\n ${input.executionId},\n ${input.syncId},\n ${input.datasetId},\n ${input.mode},\n ${\"queued\"},\n ${input.queuedAt ?? new Date()},\n ${null},\n ${input.expectedLatestVersionId ?? null},\n ${input.commitMessage ?? null}\n )\n RETURNING *, checkpoint IS NOT NULL AS checkpoint_present\n `\n\n return rowToSyncRunRecord(row)\n } catch (error) {\n if (isUniqueViolation(error)) {\n return this.requeueAfterEnqueueFailure(input)\n }\n\n throw error\n }\n }\n\n private async requeueAfterEnqueueFailure(input: QueueSyncRunInput): Promise<SyncRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<DatabaseRow[]>`\n SELECT *, checkpoint IS NOT NULL AS checkpoint_present FROM sync_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (!existing || !canRequeueSyncRunAfterEnqueueFailure(rowToSyncRunRecord(existing), input)) {\n throw new SyncRunError(\n `[SixbPg] Sync run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const [updated] = await tx<DatabaseRow[]>`\n UPDATE sync_runs\n SET status = ${\"queued\"}, queued_at = ${input.queuedAt ?? new Date()},\n started_at = ${null}, finished_at = ${null}, rows_read = ${null},\n output_version_id = ${null}, error = ${null}, checkpoint = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *, checkpoint IS NOT NULL AS checkpoint_present\n `\n return rowToSyncRunRecord(updated)\n })\n }\n\n async start(input: StartSyncRunInput): Promise<SyncRunRecord> {\n const [updated] = await this.sql<DatabaseRow[]>`\n UPDATE sync_runs\n SET status = ${\"running\"}, started_at = ${input.startedAt ?? new Date()},\n error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id} AND status = ${\"queued\"}\n RETURNING *, checkpoint IS NOT NULL AS checkpoint_present\n `\n if (updated) return rowToSyncRunRecord(updated)\n\n const existing = await this.getById({ projectId: input.projectId, id: input.id })\n if (!existing) {\n throw new SyncRunError(\n `[SixbPg] Sync run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n throw new SyncRunError(\n `[SixbPg] Sync run '${input.id}' cannot start from status '${existing.status}'.`\n )\n }\n\n async finish(input: FinishSyncRunInput): Promise<SyncRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<DatabaseRow[]>`\n SELECT *, checkpoint IS NOT NULL AS checkpoint_present FROM sync_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n `\n\n if (!existing) {\n throw new SyncRunError(\n `[SixbPg] Sync run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n const enqueueFailure =\n input.status === \"failed\" && input.error.code === \"queue.enqueue_failed\"\n if (\n (enqueueFailure && existing.status !== \"queued\") ||\n (!enqueueFailure && existing.status !== \"running\")\n ) {\n throw new SyncRunError(\n `[SixbPg] Sync run '${input.id}' cannot finish from status '${existing.status}'.`\n )\n }\n\n if (input.status === \"succeeded\") {\n if (input.output && input.output.datasetId !== existing.dataset_id) {\n throw new SyncRunError(\n `[SixbPg] Sync run '${input.id}' output dataset '${input.output.datasetId}' does not match '${existing.dataset_id}'.`\n )\n }\n if (!input.output && input.rowsRead !== 0 && existing.mode !== \"merge\") {\n throw new SyncRunError(\n `[SixbPg] Sync run '${input.id}' may omit its output with rows read only for an initial merge no-op.`\n )\n }\n }\n\n const [updated] =\n input.status === \"succeeded\"\n ? await tx<DatabaseRow[]>`\n UPDATE sync_runs\n SET\n status = ${input.status},\n finished_at = ${input.finishedAt ?? new Date()},\n rows_read = ${input.rowsRead},\n output_version_id = ${input.output?.versionId ?? null},\n error = ${null},\n checkpoint = ${serializeCheckpoint(input.checkpoint)}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *, checkpoint IS NOT NULL AS checkpoint_present\n `\n : await tx<DatabaseRow[]>`\n UPDATE sync_runs\n SET\n status = ${input.status},\n finished_at = ${input.finishedAt ?? new Date()},\n rows_read = ${input.rowsRead ?? existing.rows_read ?? null},\n output_version_id = ${null},\n error = ${input.error === undefined ? null : serializeSixbFailure(input.error, SYNC_RUN_FAILURE_CODES)}::text::jsonb,\n checkpoint = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *, checkpoint IS NOT NULL AS checkpoint_present\n `\n\n return rowToSyncRunRecord(updated)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<SyncRunRecord | null> {\n const [row] = await this.sql<DatabaseRow[]>`\n SELECT *, checkpoint IS NOT NULL AS checkpoint_present FROM sync_runs\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n\n return row ? rowToSyncRunRecord(row) : null\n }\n\n async list(input: ListSyncRunsInput): Promise<ListSyncRunsResult> {\n if (hasEmptyStatuses(input) || input.syncIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n\n if (input.syncId) {\n whereClauses.push(`sync_id = $${index++}`)\n params.push(input.syncId)\n }\n\n if (input.syncIds) {\n const placeholders = input.syncIds.map(() => `$${index++}`)\n whereClauses.push(`sync_id IN (${placeholders.join(\", \")})`)\n params.push(...input.syncIds)\n }\n\n if (input.datasetId) {\n whereClauses.push(`dataset_id = $${index++}`)\n params.push(input.datasetId)\n }\n\n index = appendRunListFilters(\n whereClauses,\n params,\n index,\n input,\n \"COALESCE(started_at, queued_at)\"\n )\n\n const { rows, total, hasMore } = await queryRunList<DatabaseRow>({\n sql: this.sql,\n tableName: \"sync_runs\",\n selectList: \"*, checkpoint IS NOT NULL AS checkpoint_present\",\n whereClauses,\n params,\n nextIndex: index,\n order: input.order,\n limit: input.limit,\n offset: input.offset,\n })\n\n return {\n runs: rows.map(rowToSyncRunRecord),\n hasMore,\n total,\n }\n }\n\n async listLatestBySyncIds(input: ListLatestSyncRunsInput): Promise<ListLatestSyncRunsResult> {\n const rows = await queryLatestRunsByOwnerId<DatabaseRow>({\n sql: this.sql,\n tableName: \"sync_runs\",\n ownerColumn: \"sync_id\",\n ownerIds: input.syncIds,\n projectId: input.projectId,\n ownerIdFor: (row) => row.sync_id,\n selectList: \"*, checkpoint IS NOT NULL AS checkpoint_present\",\n })\n\n return {\n runs: rows.map(rowToSyncRunRecord),\n }\n }\n}\n\nfunction serializeCheckpoint(checkpoint: JsonValue | undefined): string | null {\n return checkpoint !== undefined ? JSON.stringify(checkpoint) : null\n}\n\nfunction rowToSyncRunRecord(row: DatabaseRow): SyncRunRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n syncId: row.sync_id,\n datasetId: row.dataset_id,\n mode: row.mode,\n status: row.status,\n queuedAt: new Date(row.queued_at),\n startedAt: row.started_at ? new Date(row.started_at) : undefined,\n finishedAt: row.finished_at ? new Date(row.finished_at) : undefined,\n rowsRead: row.rows_read != null ? Number(row.rows_read) : undefined,\n output: row.output_version_id\n ? {\n datasetId: row.dataset_id,\n versionId: row.output_version_id,\n }\n : undefined,\n expectedLatestVersionId: row.expected_latest_version_id ?? undefined,\n commitMessage: row.commit_message ?? undefined,\n error: row.error === null ? undefined : parseSixbFailure(row.error, SYNC_RUN_FAILURE_CODES),\n checkpoint: hasCheckpoint(row) ? row.checkpoint : undefined,\n }\n}\n\nfunction hasCheckpoint(row: DatabaseRow): boolean {\n return (\n row.checkpoint_present === true ||\n row.checkpoint_present === 1 ||\n row.checkpoint_present === \"1\" ||\n row.checkpoint_present === \"t\" ||\n row.checkpoint_present === \"true\"\n )\n}\n\ninterface DatabaseRow {\n project_id: string\n id: string\n execution_id: string\n sync_id: string\n dataset_id: string\n mode: SyncRunRecord[\"mode\"]\n status: SyncRunRecord[\"status\"]\n queued_at: Date | string\n started_at: Date | string | null\n finished_at: Date | string | null\n rows_read: number | string | null\n output_version_id: string | null\n expected_latest_version_id: string | null\n commit_message: string | null\n error: JsonValue | null\n checkpoint: JsonValue | null\n checkpoint_present: boolean | number | string\n}\n",
63
70
  "import type {\n TimeseriesHistoryBatchInput,\n TimeseriesHistoryBatchResult,\n TimeseriesPoint,\n TimeseriesStorage,\n} from \"@sixb/core/storage\"\nimport type { SqlParameter } from \"./pg-client\"\nimport type { PgStoreClient } from \"./transactions\"\n\n/**\n * PostgreSQL-based TimeseriesStorage implementation.\n *\n * Stores time-series data with JSONB values and TIMESTAMPTZ timestamps\n * for efficient querying of history and latest values.\n *\n * Requires `search_path` to be set to the Sixb schema on the connection.\n */\nexport class PgTimeseriesStorage implements TimeseriesStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async getHistory(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n propertyId: string\n from?: Date\n to?: Date\n limit?: number\n order?: \"asc\" | \"desc\"\n }): Promise<readonly TimeseriesPoint[]> {\n const order = params.order ?? \"asc\"\n\n // Build WHERE conditions using conditional fragments\n const fromFilter = params.from ? this.sql`AND at >= ${params.from}` : this.sql``\n const toFilter = params.to ? this.sql`AND at <= ${params.to}` : this.sql``\n const limitFilter = params.limit !== undefined ? this.sql`LIMIT ${params.limit}` : this.sql``\n\n const rows = await this.sql<TimeseriesDatabaseRow[]>`\n SELECT * FROM timeseries\n WHERE project_id = ${params.projectId}\n AND object_type_id = ${params.objectTypeId}\n AND object_id = ${params.objectId}\n AND property_id = ${params.propertyId}\n ${fromFilter}\n ${toFilter}\n ORDER BY at ${order === \"asc\" ? this.sql`ASC` : this.sql`DESC`}\n ${limitFilter}\n `\n\n return rows.map((row) => rowToPoint(row))\n }\n\n async getHistoryBatch(\n input: TimeseriesHistoryBatchInput\n ): Promise<readonly TimeseriesHistoryBatchResult[]> {\n if (input.series.length === 0) {\n return []\n }\n\n const order = input.order === \"desc\" ? \"DESC\" : \"ASC\"\n const params: unknown[] = []\n let nextIndex = 1\n const values = input.series\n .map((series, seriesIndex) => {\n const placeholders = [\n `$${nextIndex++}`,\n `$${nextIndex++}`,\n `$${nextIndex++}`,\n `$${nextIndex++}`,\n ]\n params.push(seriesIndex, series.objectTypeId, series.objectId, series.propertyId)\n return `(${placeholders.join(\", \")})`\n })\n .join(\", \")\n\n const projectIdPlaceholder = `$${nextIndex++}`\n params.push(input.projectId)\n\n const whereClauses = [\"1 = 1\"]\n if (input.from) {\n whereClauses.push(`timeseries.at >= $${nextIndex++}`)\n params.push(input.from)\n }\n if (input.to) {\n whereClauses.push(`timeseries.at <= $${nextIndex++}`)\n params.push(input.to)\n }\n\n let query = `\n WITH requested(series_index, object_type_id, object_id, property_id) AS (\n VALUES ${values}\n ),\n ranked AS (\n SELECT\n requested.series_index,\n timeseries.*,\n ROW_NUMBER() OVER (\n PARTITION BY requested.series_index\n ORDER BY timeseries.at ${order}\n ) AS series_row_number\n FROM requested\n JOIN timeseries\n ON timeseries.project_id = ${projectIdPlaceholder}\n AND timeseries.object_type_id = requested.object_type_id\n AND timeseries.object_id = requested.object_id\n AND timeseries.property_id = requested.property_id\n WHERE ${whereClauses.join(\" AND \")}\n )\n SELECT * FROM ranked\n `\n\n if (input.limitPerSeries !== undefined) {\n query += ` WHERE series_row_number <= $${nextIndex++}`\n params.push(Math.max(0, input.limitPerSeries))\n }\n\n query += ` ORDER BY series_index ASC, at ${order}`\n\n const rows = await this.sql.unsafe<\n (TimeseriesDatabaseRow & {\n series_index: number | string\n series_row_number: number | string\n })[]\n >(query, params as SqlParameter[])\n const results = input.series.map((series) => ({\n ...series,\n points: [] as TimeseriesPoint[],\n }))\n\n for (const row of rows) {\n const result = results[Number(row.series_index)]\n if (result) {\n result.points.push(rowToPoint(row))\n }\n }\n\n return results\n }\n\n async getLatest(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n propertyId: string\n }): Promise<TimeseriesPoint | null> {\n const [row] = await this.sql<TimeseriesDatabaseRow[]>`\n SELECT * FROM timeseries_latest\n WHERE project_id = ${params.projectId}\n AND object_type_id = ${params.objectTypeId}\n AND object_id = ${params.objectId}\n AND property_id = ${params.propertyId}\n `\n\n return row ? rowToPoint(row) : null\n }\n}\n\nfunction rowToPoint(row: TimeseriesDatabaseRow): TimeseriesPoint {\n return {\n projectId: row.project_id,\n objectTypeId: row.object_type_id,\n objectId: row.object_id,\n propertyId: row.property_id,\n value: row.value,\n unit: row.unit ?? undefined,\n at: new Date(row.at),\n lastCommitId: row.last_commit_id,\n }\n}\n\ninterface TimeseriesDatabaseRow {\n project_id: string\n object_type_id: string\n object_id: string\n property_id: string\n value: unknown\n unit: string | null\n at: Date | string\n last_commit_id: string\n}\n",
64
71
  "import { parseSixbFailure, serializeSixbFailure } from \"@sixb/core/internal/errors\"\nimport { assertWebhookRunExecution } from \"@sixb/core/internal/webhook-run-storage-provider\"\nimport type {\n ExecutionStorage,\n FinishWebhookRunInput,\n GetWebhookRunByDeliveryInput,\n ListWebhookRunsInput,\n ListWebhookRunsResult,\n RestartWebhookRunInput,\n StartWebhookRunInput,\n WebhookRunRecord,\n WebhookRunStorage,\n} from \"@sixb/core/storage\"\nimport { canRetryWebhookRun, WEBHOOK_RUN_FAILURE_CODES, WebhookRunError } from \"@sixb/core/storage\"\nimport type { SqlParameter } from \"./pg-client\"\nimport { appendRunListFilters, hasEmptyStatuses, queryRunList } from \"./run-list-query\"\nimport { isUniqueViolation } from \"./storage-errors\"\nimport { type PgStoreClient, runPgTransaction } from \"./transactions\"\n\nexport class PgWebhookRunStorage implements WebhookRunStorage {\n constructor(\n private readonly sql: PgStoreClient,\n private readonly executions: ExecutionStorage\n ) {}\n\n async start(input: StartWebhookRunInput): Promise<WebhookRunRecord> {\n await assertWebhookRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n route: input.route,\n })\n try {\n const [row] = await this.sql<WebhookRunDatabaseRow[]>`\n INSERT INTO webhook_runs (\n project_id, id, execution_id, connector_id, webhook_id, status, method, route,\n started_at, request_body_bytes, request_body_sha256, idempotency_key\n ) VALUES (\n ${input.projectId}, ${input.id}, ${input.executionId}, ${input.connectorId},\n ${input.webhookId}, ${\"running\"}, ${input.method}, ${input.route},\n ${input.startedAt ?? new Date()}, ${input.requestBodyBytes},\n ${input.requestBodySha256}, ${input.idempotencyKey ?? null}\n )\n RETURNING *\n `\n return rowToWebhookRunRecord(row)\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new WebhookRunError(\n `[SixbPg] Webhook run '${input.id}' or delivery key already exists for project '${input.projectId}'.`,\n \"duplicate_run\"\n )\n }\n throw error\n }\n }\n\n async restart(input: RestartWebhookRunInput): Promise<WebhookRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<WebhookRunDatabaseRow[]>`\n SELECT * FROM webhook_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (!existing) {\n throw new WebhookRunError(\n `[SixbPg] Webhook run '${input.id}' not found for project '${input.projectId}'.`,\n \"not_found\"\n )\n }\n if (!canRetryWebhookRun(rowToWebhookRunRecord(existing))) {\n throw new WebhookRunError(\n `[SixbPg] Webhook run '${input.id}' cannot restart from status '${existing.status}'.`,\n \"invalid_transition\"\n )\n }\n\n const [updated] = await tx<WebhookRunDatabaseRow[]>`\n UPDATE webhook_runs\n SET status = ${\"running\"}, started_at = ${input.startedAt ?? new Date()},\n finished_at = ${null}, response_status = ${null}, error = ${null}\n WHERE project_id = ${input.projectId} AND id = ${input.id} AND status = ${\"failed\"}\n RETURNING *\n `\n if (!updated) {\n throw new WebhookRunError(\n `[SixbPg] Webhook run '${input.id}' changed while restarting.`,\n \"invalid_transition\"\n )\n }\n return rowToWebhookRunRecord(updated)\n })\n }\n\n async finish(input: FinishWebhookRunInput): Promise<WebhookRunRecord> {\n return runPgTransaction(this.sql, async (tx) => {\n const [existing] = await tx<WebhookRunDatabaseRow[]>`\n SELECT * FROM webhook_runs\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n FOR UPDATE\n `\n if (!existing) {\n throw new WebhookRunError(\n `[SixbPg] Webhook run '${input.id}' not found for project '${input.projectId}'.`,\n \"not_found\"\n )\n }\n if (existing.status !== \"running\") {\n throw new WebhookRunError(\n `[SixbPg] Webhook run '${input.id}' for project '${input.projectId}' is already terminal.`,\n \"invalid_transition\"\n )\n }\n\n const [updated] = await tx<WebhookRunDatabaseRow[]>`\n UPDATE webhook_runs\n SET status = ${input.status}, finished_at = ${input.finishedAt ?? new Date()},\n response_status = ${input.responseStatus ?? null},\n error = ${input.status === \"succeeded\" ? null : serializeSixbFailure(input.error, WEBHOOK_RUN_FAILURE_CODES)}::text::jsonb\n WHERE project_id = ${input.projectId} AND id = ${input.id}\n RETURNING *\n `\n return rowToWebhookRunRecord(updated)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<WebhookRunRecord | null> {\n const [row] = await this.sql<WebhookRunDatabaseRow[]>`\n SELECT * FROM webhook_runs\n WHERE project_id = ${params.projectId} AND id = ${params.id}\n `\n return row ? rowToWebhookRunRecord(row) : null\n }\n\n async getByDelivery(input: GetWebhookRunByDeliveryInput): Promise<WebhookRunRecord | null> {\n const [row] = await this.sql<WebhookRunDatabaseRow[]>`\n SELECT * FROM webhook_runs\n WHERE project_id = ${input.projectId}\n AND connector_id = ${input.connectorId}\n AND webhook_id = ${input.webhookId}\n AND idempotency_key = ${input.idempotencyKey}\n `\n return row ? rowToWebhookRunRecord(row) : null\n }\n\n async list(input: ListWebhookRunsInput): Promise<ListWebhookRunsResult> {\n if (hasEmptyStatuses(input)) return { runs: [], hasMore: false, total: 0 }\n\n const whereClauses = [\"project_id = $1\"]\n const params: SqlParameter[] = [input.projectId]\n let index = 2\n if (input.connectorId) {\n whereClauses.push(`connector_id = $${index++}`)\n params.push(input.connectorId)\n }\n if (input.webhookId) {\n whereClauses.push(`webhook_id = $${index++}`)\n params.push(input.webhookId)\n }\n if (input.idempotencyKey) {\n whereClauses.push(`idempotency_key = $${index++}`)\n params.push(input.idempotencyKey)\n }\n index = appendRunListFilters(whereClauses, params, index, input)\n\n const { rows, total, hasMore } = await queryRunList<WebhookRunDatabaseRow>({\n sql: this.sql,\n tableName: \"webhook_runs\",\n whereClauses,\n params,\n nextIndex: index,\n order: input.order,\n limit: input.limit,\n offset: input.offset,\n })\n return { runs: rows.map(rowToWebhookRunRecord), hasMore, total }\n }\n}\n\nfunction rowToWebhookRunRecord(row: WebhookRunDatabaseRow): WebhookRunRecord {\n return {\n id: row.id,\n projectId: row.project_id,\n executionId: row.execution_id,\n connectorId: row.connector_id,\n webhookId: row.webhook_id,\n status: row.status,\n method: row.method,\n route: row.route,\n startedAt: new Date(row.started_at),\n finishedAt: row.finished_at ? new Date(row.finished_at) : undefined,\n requestBodyBytes: Number(row.request_body_bytes),\n requestBodySha256: row.request_body_sha256,\n responseStatus: row.response_status != null ? Number(row.response_status) : undefined,\n idempotencyKey: row.idempotency_key ?? undefined,\n error: row.error === null ? undefined : parseSixbFailure(row.error, WEBHOOK_RUN_FAILURE_CODES),\n }\n}\n\ninterface WebhookRunDatabaseRow {\n readonly project_id: string\n readonly id: string\n readonly execution_id: string\n readonly connector_id: string\n readonly webhook_id: string\n readonly status: WebhookRunRecord[\"status\"]\n readonly method: string\n readonly route: string\n readonly started_at: Date | string\n readonly finished_at: Date | string | null\n readonly request_body_bytes: number | string\n readonly request_body_sha256: string\n readonly response_status: number | string | null\n readonly idempotency_key: string | null\n readonly error: unknown | null\n}\n",
@@ -68,7 +75,7 @@
68
75
  "import {\n normalizeGetShareSessionByIdInput,\n normalizeRenewShareSessionIfValidInput,\n normalizeRevokeShareSessionInput,\n normalizeShareSessionCreate,\n parseShareSessionRecord,\n} from \"@sixb/core/internal/share-session-storage-provider\"\nimport type {\n CreateShareSessionInput,\n GetShareSessionByIdInput,\n RenewShareSessionIfValidInput,\n RevokeShareSessionInput,\n ShareSessionRecord,\n ShareSessionStorage,\n} from \"@sixb/core/storage\"\nimport { ShareSessionStorageError } from \"@sixb/core/storage\"\nimport { isForeignKeyViolation, isUniqueViolation } from \"./storage-errors\"\nimport type { PgStoreClient } from \"./transactions\"\n\nexport class PgShareSessionStorage implements ShareSessionStorage {\n constructor(private readonly sql: PgStoreClient) {}\n\n async create(input: CreateShareSessionInput): Promise<ShareSessionRecord> {\n const record = normalizeShareSessionCreate(input)\n try {\n const [row] = await this.sql<PgShareSessionRow[]>`\n INSERT INTO share_sessions (\n project_id, id, grant_id, token_hash, created_at, expires_at, absolute_expires_at\n ) VALUES (\n ${record.projectId}, ${record.id}, ${record.grantId}, ${record.tokenHash},\n ${record.createdAt}, ${record.expiresAt}, ${record.absoluteExpiresAt}\n )\n RETURNING *\n `\n if (!row) throw invalidRecord(`Share session '${record.id}' disappeared after create.`)\n return recordFromRow(row)\n } catch (error) {\n if (isUniqueViolation(error)) {\n throw new ShareSessionStorageError(\n \"duplicate\",\n `[SixbPg] Share session '${record.id}' conflicts with an existing record.`,\n { cause: error }\n )\n }\n if (isForeignKeyViolation(error)) {\n throw new ShareSessionStorageError(\n \"invalid_input\",\n `[SixbPg] Share grant '${record.grantId}' does not exist in project '${record.projectId}'.`,\n { cause: error }\n )\n }\n throw error\n }\n }\n\n async getById(input: GetShareSessionByIdInput): Promise<ShareSessionRecord | null> {\n const normalized = normalizeGetShareSessionByIdInput(input)\n const [row] = await this.sql<PgShareSessionRow[]>`\n SELECT * FROM share_sessions\n WHERE project_id = ${normalized.projectId} AND id = ${normalized.id}\n `\n return row ? recordFromRow(row) : null\n }\n\n async renewIfValid(input: RenewShareSessionIfValidInput): Promise<ShareSessionRecord | null> {\n const normalized = normalizeRenewShareSessionIfValidInput(input)\n const [row] = await this.sql<PgShareSessionRow[]>`\n UPDATE share_sessions\n SET expires_at = LEAST(absolute_expires_at, GREATEST(expires_at, ${normalized.expiresAt}))\n WHERE project_id = ${normalized.projectId}\n AND id = ${normalized.id}\n AND grant_id = ${normalized.grantId}\n AND token_hash = ${normalized.tokenHash}\n AND revoked_at IS NULL\n AND created_at <= ${normalized.now}\n AND expires_at > ${normalized.now}\n AND absolute_expires_at > ${normalized.now}\n RETURNING *\n `\n return row ? recordFromRow(row) : null\n }\n\n async revoke(input: RevokeShareSessionInput): Promise<ShareSessionRecord | null> {\n const normalized = normalizeRevokeShareSessionInput(input)\n const current = await this.getById(normalized)\n if (!current || current.revokedAt) return current\n const revocation = normalizeRevokeShareSessionInput(normalized, current.createdAt)\n const [updated] = await this.sql<PgShareSessionRow[]>`\n UPDATE share_sessions\n SET revoked_at = ${revocation.revokedAt}\n WHERE project_id = ${revocation.projectId}\n AND id = ${revocation.id}\n AND revoked_at IS NULL\n RETURNING *\n `\n if (updated) return recordFromRow(updated)\n return this.getById({ projectId: revocation.projectId, id: revocation.id })\n }\n}\n\ninterface PgShareSessionRow {\n readonly project_id: unknown\n readonly id: unknown\n readonly grant_id: unknown\n readonly token_hash: unknown\n readonly created_at: unknown\n readonly expires_at: unknown\n readonly absolute_expires_at: unknown\n readonly revoked_at: unknown\n}\n\nfunction recordFromRow(row: PgShareSessionRow): ShareSessionRecord {\n return parseShareSessionRecord({\n projectId: row.project_id,\n id: row.id,\n grantId: row.grant_id,\n tokenHash: row.token_hash,\n createdAt: row.created_at,\n expiresAt: row.expires_at,\n absoluteExpiresAt: row.absolute_expires_at,\n ...(row.revoked_at === null ? {} : { revokedAt: row.revoked_at }),\n })\n}\n\nfunction invalidRecord(message: string, cause?: unknown): ShareSessionStorageError {\n return new ShareSessionStorageError(\"invalid_record\", `[SixbPg] ${message}`, { cause })\n}\n",
69
76
  "export interface PostgresStorageTestingAdapter {\n advanceConnectorConnectionTime(durationMs: number): void\n}\n\nconst adapters = new WeakMap<object, PostgresStorageTestingAdapter>()\n\nexport function registerPostgresStorageTestingAdapter(\n storage: object,\n advanceConnectorConnectionTime: (durationMs: number) => void\n): void {\n adapters.set(storage, { advanceConnectorConnectionTime })\n}\n\nexport function getPostgresStorageTestingAdapter(storage: object): PostgresStorageTestingAdapter {\n const adapter = adapters.get(storage)\n if (!adapter) throw new Error(\"[SixbPg] Storage testing adapter is unavailable.\")\n return adapter\n}\n"
70
77
  ],
71
- "mappings": "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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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",
72
- "debugId": "A45355377FBA88B464756E2164756E21",
78
+ "mappings": "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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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",
79
+ "debugId": "51821498ED16AC6B64756E2164756E21",
73
80
  "names": []
74
81
  }