@opengeni/db 1.3.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canonical-human-identities.js +3 -3
- package/dist/capability-reconciliation.js +2 -2
- package/dist/{chunk-7QWWTVYH.js → chunk-5ROHLEN6.js} +29 -4
- package/dist/chunk-5ROHLEN6.js.map +1 -0
- package/dist/{chunk-AQMH2ZEH.js → chunk-A4J7EECR.js} +2 -2
- package/dist/{chunk-VQX54TK3.js → chunk-B5C5SBSI.js} +3 -3
- package/dist/{chunk-OI6YZXTU.js → chunk-DKFEUGM4.js} +2 -2
- package/dist/{chunk-HYBQABBJ.js → chunk-HUKBIZGH.js} +2 -2
- package/dist/{chunk-LRSIODCQ.js → chunk-IT3EYY2C.js} +6 -4
- package/dist/{chunk-LRSIODCQ.js.map → chunk-IT3EYY2C.js.map} +1 -1
- package/dist/{chunk-DSNEIW5E.js → chunk-JL6TBB76.js} +2 -1
- package/dist/chunk-JL6TBB76.js.map +1 -0
- package/dist/{chunk-OEFNTGR3.js → chunk-JWBEE4CL.js} +4 -4
- package/dist/{chunk-BRVBLQAL.js → chunk-K5MTNKJU.js} +4 -4
- package/dist/{chunk-6UKNJ43T.js → chunk-NZ2SP55O.js} +2 -2
- package/dist/{chunk-3XHC5KC5.js → chunk-OKCBARX6.js} +2 -2
- package/dist/{chunk-PNWWNEDM.js → chunk-OV5AUIBA.js} +2 -2
- package/dist/{chunk-BID3CNN3.js → chunk-TODVDGMO.js} +36 -18
- package/dist/{chunk-BID3CNN3.js.map → chunk-TODVDGMO.js.map} +1 -1
- package/dist/{chunk-6S5T6FSP.js → chunk-W75DRYG3.js} +5 -5
- package/dist/{chunk-7S3O33NM.js → chunk-Y72DP3JF.js} +2 -2
- package/dist/codemode-approvals.d.ts +7 -1
- package/dist/connect-attempts.js +3 -3
- package/dist/connection-metadata.d.ts +416 -0
- package/dist/credit-balances.d.ts +25 -4
- package/dist/database.d.ts +7 -1
- package/dist/editable-artifact-durable-export.js +2 -2
- package/dist/editable-artifacts.js +3 -3
- package/dist/index.d.ts +51 -8
- package/dist/index.js +10826 -10129
- package/dist/index.js.map +1 -1
- package/dist/legacy-tool-action-reviews.d.ts +75 -0
- package/dist/managed-auth-session-sets.js +3 -3
- package/dist/mcp-operations.js +2 -2
- package/dist/modal-native-live-origin.d.ts +75 -0
- package/dist/organization-integration-policy.js +3 -3
- package/dist/organization-slack-bots.d.ts +1 -1
- package/dist/provision-roles.js +1 -1
- package/dist/retained-provider-commands.d.ts +21 -21
- package/dist/retained-provider-commands.js +6 -6
- package/dist/runtime-posture.d.ts +1 -1
- package/dist/sandbox-interaction-idle.d.ts +22 -0
- package/dist/schema.js +1 -1
- package/dist/session-background-commands.js +4 -4
- package/dist/session-command-output.js +5 -5
- package/dist/session-event-slices.js +3 -3
- package/dist/session-mcp-credential-rotation.js +5 -5
- package/dist/session-realtime-billing.d.ts +48 -0
- package/dist/session-realtime.d.ts +8 -2
- package/dist/session-tenancy.js +3 -3
- package/dist/video-generation.js +3 -3
- package/dist/voice-transcription-settlement.d.ts +36 -0
- package/dist/workspace-tool-defaults.js +4 -4
- package/drizzle/0623_voice_transcription_attribution.sql +128 -0
- package/drizzle/0624_azure_live_realtime_model.sql +30 -0
- package/drizzle/0625_transcription_billing_refusal_codes.sql +29 -0
- package/drizzle/0632_modal_native_live_origin.sql +239 -0
- package/package.json +7 -7
- package/src/codemode-approvals.ts +52 -22
- package/src/codemode-operations.ts +198 -181
- package/src/connection-metadata.ts +166 -0
- package/src/credit-balances.ts +58 -17
- package/src/database.ts +9 -0
- package/src/index.ts +540 -412
- package/src/insights-unified.ts +2 -1
- package/src/legacy-tool-action-reviews.ts +242 -0
- package/src/modal-native-live-origin.ts +148 -0
- package/src/organization-slack-bots.ts +1 -1
- package/src/provision-roles.ts +12 -0
- package/src/runtime-posture.ts +32 -3
- package/src/sandbox-interaction-idle.ts +91 -0
- package/src/schema.ts +1 -0
- package/src/session-realtime-billing.ts +135 -0
- package/src/session-realtime-ledger.ts +9 -4
- package/src/session-realtime.ts +20 -2
- package/src/tool-action-reviews.ts +129 -18
- package/src/transcription-recordings.ts +3 -1
- package/src/voice-transcription-settlement.ts +94 -0
- package/dist/chunk-7QWWTVYH.js.map +0 -1
- package/dist/chunk-DSNEIW5E.js.map +0 -1
- /package/dist/{chunk-AQMH2ZEH.js.map → chunk-A4J7EECR.js.map} +0 -0
- /package/dist/{chunk-VQX54TK3.js.map → chunk-B5C5SBSI.js.map} +0 -0
- /package/dist/{chunk-OI6YZXTU.js.map → chunk-DKFEUGM4.js.map} +0 -0
- /package/dist/{chunk-HYBQABBJ.js.map → chunk-HUKBIZGH.js.map} +0 -0
- /package/dist/{chunk-OEFNTGR3.js.map → chunk-JWBEE4CL.js.map} +0 -0
- /package/dist/{chunk-BRVBLQAL.js.map → chunk-K5MTNKJU.js.map} +0 -0
- /package/dist/{chunk-6UKNJ43T.js.map → chunk-NZ2SP55O.js.map} +0 -0
- /package/dist/{chunk-3XHC5KC5.js.map → chunk-OKCBARX6.js.map} +0 -0
- /package/dist/{chunk-PNWWNEDM.js.map → chunk-OV5AUIBA.js.map} +0 -0
- /package/dist/{chunk-6S5T6FSP.js.map → chunk-W75DRYG3.js.map} +0 -0
- /package/dist/{chunk-7S3O33NM.js.map → chunk-Y72DP3JF.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video-generation.ts","../src/usage-allowances.ts","../src/credit-debit-attribution.ts","../src/credit-balances.ts"],"sourcesContent":["import {\n GENERATED_VIDEO_MAX_BYTES,\n GeneratedVideoReceipt,\n GROK_IMAGINE_VIDEO_1_5_MODEL_ID,\n SEEDANCE_2_5_MODEL_ID,\n VideoGenerationPolicy,\n VideoGenerationOperationSummary,\n retainedGeneratedVideoReferenceFromFile,\n type GeneratedVideoFacts,\n type MediaGenerationResult,\n type VideoGenerationFundingSource,\n type VideoGenerationPolicy as VideoGenerationPolicyValue,\n} from \"@opengeni/contracts\";\nimport { and, eq, inArray, sql } from \"drizzle-orm\";\nimport type { Database } from \"./database\";\nimport { rawRows, withRlsContext, withWorkspaceRls } from \"./database\";\nimport * as schema from \"./schema\";\nimport { checkWorkspaceAllowance } from \"./usage-allowances\";\nimport { creditDebitAttributionForTurn } from \"./credit-debit-attribution\";\nimport { getSpendableCreditBalance } from \"./credit-balances\";\n\nexport const ACTIVE_VIDEO_GENERATION_STATUSES = [\n \"preparing\",\n \"prepared\",\n \"accepted\",\n \"submission_uncertain\",\n \"provider_started\",\n \"retaining\",\n] as const;\n\nexport type VideoGenerationOperation = typeof schema.videoGenerationOperations.$inferSelect;\nexport type VideoGenerationReference = typeof schema.videoGenerationReferences.$inferSelect;\nexport type GeneratedVideoArtifact = typeof schema.generatedVideoArtifacts.$inferSelect;\n\nexport type VideoGenerationOperationWithReferences = VideoGenerationOperation & {\n references: VideoGenerationReference[];\n};\n\nexport class VideoGenerationConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VideoGenerationConflictError\";\n }\n}\n\nexport class VideoGenerationCapacityError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VideoGenerationCapacityError\";\n }\n}\n\nexport class VideoGenerationCreditError extends Error {\n constructor(message = \"insufficient Opengeni credits\") {\n super(message);\n this.name = \"VideoGenerationCreditError\";\n }\n}\n\nexport async function getWorkspaceVideoGenerationPolicy(\n db: Database,\n workspaceId: string,\n): Promise<VideoGenerationPolicyValue> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [row] = await scopedDb\n .select()\n .from(schema.workspaceVideoGenerationPolicies)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, workspaceId))\n .limit(1);\n return policyFromRow(row);\n });\n}\n\nexport async function updateWorkspaceVideoGenerationPolicy(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n subjectId: string;\n expectedRevision: number;\n fundingSource: VideoGenerationFundingSource;\n enabledModelIds: string[];\n defaultModelId: string | null;\n },\n): Promise<VideoGenerationPolicyValue> {\n const requested = VideoGenerationPolicy.parse({\n schemaVersion: 1,\n revision: input.expectedRevision + 1,\n fundingSource: input.fundingSource,\n enabledModelIds: input.enabledModelIds,\n defaultModelId: input.defaultModelId,\n });\n assertSupportedModels(requested.enabledModelIds);\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n const [workspace] = await tx\n .select({ id: schema.workspaces.id })\n .from(schema.workspaces)\n .where(\n and(\n eq(schema.workspaces.id, input.workspaceId),\n eq(schema.workspaces.accountId, input.accountId),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (!workspace) throw new Error(\"Workspace not found\");\n const [current] = await tx\n .select()\n .from(schema.workspaceVideoGenerationPolicies)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, input.workspaceId))\n .for(\"update\")\n .limit(1);\n const currentRevision = current?.revision ?? 0;\n if (currentRevision !== input.expectedRevision) {\n throw new VideoGenerationConflictError(\"Video generation policy changed\");\n }\n const now = new Date();\n const values = {\n workspaceId: input.workspaceId,\n accountId: input.accountId,\n revision: currentRevision + 1,\n fundingSource: requested.fundingSource,\n enabledModelIds: [...requested.enabledModelIds],\n defaultModelId: requested.defaultModelId,\n updatedBySubjectId: input.subjectId.slice(0, 1_024),\n updatedAt: now,\n };\n const [row] = current\n ? await tx\n .update(schema.workspaceVideoGenerationPolicies)\n .set(values)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, input.workspaceId))\n .returning()\n : await tx.insert(schema.workspaceVideoGenerationPolicies).values(values).returning();\n if (!row) throw new Error(\"Video generation policy update was not persisted\");\n return policyFromRow(row);\n }),\n );\n}\n\nexport type AdmitVideoGenerationOperationInput = {\n id: string;\n accountId: string;\n workspaceId: string;\n sessionId: string;\n turnId: string;\n attemptId: string;\n toolCallId: string;\n admissionKey: string;\n requestDigest: string;\n promptDigest: string;\n requestEncrypted: string;\n modelId: string;\n sourceMode: string;\n capabilityRevision: string;\n policyRevision: number;\n fundingSource: VideoGenerationFundingSource;\n pricedCostMicros: number;\n connectionId: string | null;\n credentialVersion: number;\n credentialEncrypted: string;\n providerIdempotencyKey: string;\n expectedArtifactId: string;\n expectedFileId: string;\n reservedBytes?: number;\n workspaceQuotaBytes: number;\n maxConcurrentPerWorkspace: number;\n recoveryDeadlineAt: Date;\n references: Array<{\n ordinal: number;\n role: string;\n contentType: string;\n sizeBytes: number;\n sha256: string;\n stagingObjectKey: string;\n grantExpiresAt?: Date | null;\n cleanupAfter: Date;\n }>;\n};\n\nexport async function admitVideoGenerationOperation(\n db: Database,\n input: AdmitVideoGenerationOperationInput,\n): Promise<{ operation: VideoGenerationOperation; created: boolean }> {\n const reservedBytes = input.reservedBytes ?? GENERATED_VIDEO_MAX_BYTES;\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtextextended(${`video-generation:${input.admissionKey}`}, 0))`,\n );\n const [existing] = await tx\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.admissionKey, input.admissionKey),\n ),\n )\n .limit(1);\n if (existing) {\n assertAdmissionMatches(existing, input);\n return { operation: existing, created: false };\n }\n const [policy] = await tx\n .select()\n .from(schema.workspaceVideoGenerationPolicies)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, input.workspaceId))\n .for(\"update\")\n .limit(1);\n if (\n !policy ||\n policy.revision !== input.policyRevision ||\n policy.fundingSource !== input.fundingSource ||\n !policy.enabledModelIds.includes(input.modelId)\n ) {\n throw new VideoGenerationConflictError(\"Video generation capability changed\");\n }\n const active = await tx\n .select({ id: schema.videoGenerationOperations.id })\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n inArray(schema.videoGenerationOperations.status, [\n ...ACTIVE_VIDEO_GENERATION_STATUSES,\n ]),\n ),\n )\n .for(\"update\");\n if (active.length >= input.maxConcurrentPerWorkspace) {\n throw new VideoGenerationCapacityError(\"Workspace video generation limit reached\");\n }\n await tx\n .insert(schema.workspaceVideoGenerationQuotas)\n .values({\n workspaceId: input.workspaceId,\n accountId: input.accountId,\n })\n .onConflictDoNothing({\n target: schema.workspaceVideoGenerationQuotas.workspaceId,\n });\n const [quota] = await tx\n .select()\n .from(schema.workspaceVideoGenerationQuotas)\n .where(eq(schema.workspaceVideoGenerationQuotas.workspaceId, input.workspaceId))\n .for(\"update\")\n .limit(1);\n if (!quota) throw new Error(\"Video generation quota row disappeared\");\n if (quota.reservedBytes + quota.readyBytes + reservedBytes > input.workspaceQuotaBytes) {\n throw new VideoGenerationCapacityError(\"Workspace video storage quota reached\");\n }\n const [operation] = await tx\n .insert(schema.videoGenerationOperations)\n .values({\n id: input.id,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n turnId: input.turnId,\n attemptId: input.attemptId,\n toolCallId: input.toolCallId,\n admissionKey: input.admissionKey,\n requestDigest: input.requestDigest,\n promptDigest: input.promptDigest,\n requestEncrypted: input.requestEncrypted,\n modelId: input.modelId,\n sourceMode: input.sourceMode,\n capabilityRevision: input.capabilityRevision,\n fundingSource: input.fundingSource,\n pricedCostMicros: input.pricedCostMicros,\n creditState: input.pricedCostMicros > 0 ? \"debited\" : \"not_applicable\",\n connectionId: input.connectionId,\n credentialVersion: input.credentialVersion,\n credentialEncrypted: input.credentialEncrypted,\n providerIdempotencyKey: input.providerIdempotencyKey,\n expectedArtifactId: input.expectedArtifactId,\n expectedFileId: input.expectedFileId,\n reservedBytes,\n recoveryDeadlineAt: input.recoveryDeadlineAt,\n status: input.references.length === 0 ? \"prepared\" : \"preparing\",\n admissionOutputState: \"pending\",\n terminalUpdateState: \"ineligible\",\n })\n .returning();\n if (!operation) throw new Error(\"Video generation operation was not admitted\");\n if (input.pricedCostMicros > 0) {\n if (input.fundingSource !== \"opengeni_credits\" || input.connectionId !== null) {\n throw new Error(\"Only Opengeni-funded video operations may debit credits\");\n }\n await debitVideoGenerationCredits(tx, operation);\n }\n if (input.references.length > 0) {\n await tx.insert(schema.videoGenerationReferences).values(\n input.references.map((reference) => ({\n operationId: operation.id,\n workspaceId: input.workspaceId,\n accountId: input.accountId,\n grantExpiresAt: reference.grantExpiresAt ?? null,\n ...reference,\n })),\n );\n }\n await tx\n .update(schema.workspaceVideoGenerationQuotas)\n .set({\n reservedBytes: sql`${schema.workspaceVideoGenerationQuotas.reservedBytes} + ${reservedBytes}`,\n updatedAt: new Date(),\n })\n .where(eq(schema.workspaceVideoGenerationQuotas.workspaceId, input.workspaceId));\n return { operation, created: true };\n }),\n );\n}\n\n/** Persist a rotated provider token before it is used for another remote call. */\nexport async function rotateVideoGenerationCredential(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n requestDigest: string;\n expectedCredentialEncrypted: string;\n credentialEncrypted: string;\n },\n): Promise<VideoGenerationOperation> {\n const [row] = await db\n .update(schema.videoGenerationOperations)\n .set({\n credentialEncrypted: input.credentialEncrypted,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.videoGenerationOperations.accountId, input.accountId),\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n eq(schema.videoGenerationOperations.requestDigest, input.requestDigest),\n eq(schema.videoGenerationOperations.credentialEncrypted, input.expectedCredentialEncrypted),\n inArray(schema.videoGenerationOperations.status, [\n \"accepted\",\n \"submission_uncertain\",\n \"provider_started\",\n \"retaining\",\n ]),\n ),\n )\n .returning();\n if (!row) throw new VideoGenerationConflictError(\"Video provider credential changed\");\n return row;\n}\n\n/**\n * Seal a reference-bearing operation only after every immutable staging object\n * has been uploaded and independently verified by the worker. The source\n * sandbox path is intentionally not stored, so a failed preparation can only\n * be retried by the same logical tool call while its sandbox still exists.\n */\nexport async function markVideoGenerationPrepared(\n db: Database,\n input: OperationMutationInput,\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === \"prepared\") return operation;\n if (operation.status !== \"preparing\") throw invalidTransition(operation, \"prepared\");\n const references = await tx\n .select({\n stagingObjectKey: schema.videoGenerationReferences.stagingObjectKey,\n cleanedAt: schema.videoGenerationReferences.cleanedAt,\n })\n .from(schema.videoGenerationReferences)\n .where(eq(schema.videoGenerationReferences.operationId, operation.id));\n if (\n references.length === 0 ||\n references.some((reference) => !reference.stagingObjectKey || reference.cleanedAt)\n ) {\n throw new VideoGenerationConflictError(\"Video references are not sealed\");\n }\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({ status: \"prepared\", updatedAt: new Date() })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"seal video generation references\");\n });\n}\n\n/** Final authorization fence. Call only after the accepted function output is durable. */\nexport async function markVideoGenerationAccepted(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n requestDigest: string;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(\n db,\n input,\n async (tx, operation) =>\n await markVideoGenerationAcceptedInTransaction(tx, {\n workspaceId: input.workspaceId,\n operation,\n }),\n );\n}\n\n/**\n * Transactional half of acceptance. The pending function result and this\n * transition must commit together: the provider reconciler never observes an\n * accepted operation whose model-visible `accepted` receipt was lost.\n */\nexport async function markVideoGenerationAcceptedInTransaction(\n tx: Database,\n input: {\n workspaceId: string;\n operation: VideoGenerationOperation;\n toolCallId?: string;\n },\n): Promise<VideoGenerationOperation> {\n const operation = input.operation;\n if (input.toolCallId !== undefined && operation.toolCallId !== input.toolCallId) {\n throw new VideoGenerationConflictError(\"Video generation tool-call identity changed\");\n }\n if (operation.admissionOutputState === \"recorded\") return operation;\n if (operation.status !== \"prepared\") {\n throw new VideoGenerationConflictError(\"Video generation is no longer awaiting acceptance\");\n }\n const [policy] = await tx\n .select()\n .from(schema.workspaceVideoGenerationPolicies)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, input.workspaceId))\n .for(\"share\")\n .limit(1);\n const [connection] = operation.connectionId\n ? await tx\n .select({\n id: schema.connections.id,\n version: schema.connections.version,\n status: schema.connections.status,\n metadata: schema.connections.metadata,\n })\n .from(schema.connections)\n .where(\n and(\n eq(schema.connections.workspaceId, input.workspaceId),\n eq(schema.connections.id, operation.connectionId),\n ),\n )\n .for(\"share\")\n .limit(1)\n : [];\n const workspaceGatewayAuthorized =\n operation.fundingSource === \"workspace_gateway\" &&\n connection?.status === \"active\" &&\n connection.version === operation.credentialVersion &&\n connection.metadata.credentialRole === \"vercel_ai_gateway\";\n const managedAuthorized =\n operation.fundingSource === \"opengeni_credits\" &&\n operation.connectionId === null &&\n (operation.creditState === \"debited\" ||\n (operation.creditState === \"not_applicable\" && operation.pricedCostMicros === 0));\n const supergrokAuthorized =\n operation.fundingSource === \"supergrok_subscription\" &&\n operation.connectionId === null &&\n operation.credentialEncrypted !== null &&\n operation.pricedCostMicros === 0 &&\n operation.creditState === \"not_applicable\";\n if (\n !policy ||\n policy.fundingSource !== operation.fundingSource ||\n !policy.enabledModelIds.includes(operation.modelId) ||\n (!workspaceGatewayAuthorized && !managedAuthorized && !supergrokAuthorized)\n ) {\n throw new VideoGenerationConflictError(\"Video generation authorization changed\");\n }\n const now = new Date();\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"accepted\",\n admissionOutputState: \"recorded\",\n terminalUpdateState: \"pending\",\n nextReconcileAt: now,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"record video generation acceptance\");\n}\n\nexport async function cancelVideoGenerationBeforeSubmit(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n requestDigest: string;\n reason: string;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === \"cancelled_before_submit\") return operation;\n if (!inPreSubmitState(operation.status) || operation.providerRequestSentAt) {\n throw new VideoGenerationConflictError(\n \"Video generation may already have reached the provider\",\n );\n }\n const now = new Date();\n await releaseReservedQuota(tx, operation, false);\n const creditState = await refundVideoGenerationCredits(tx, operation, now);\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"cancelled_before_submit\",\n creditState,\n quotaState: \"released\",\n terminalAt: now,\n terminalUpdateState:\n operation.admissionOutputState === \"recorded\" ? \"pending\" : \"suppressed\",\n credentialEncrypted: null,\n requestEncrypted: null,\n boundedPublicReason: boundPublicReason(input.reason),\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n if (!updated) throw new Error(\"Video generation cancellation was not recorded\");\n return updated;\n });\n}\n\n/**\n * Turn-interruption half of pre-submit cancellation. It runs under the same\n * session/turn transaction that closes unresolved tool calls, so an accepted\n * receipt can never race a cancellation of its operation.\n */\nexport async function cancelUnacceptedVideoGenerationsForToolCallsInTransaction(\n tx: Database,\n input: {\n workspaceId: string;\n sessionId: string;\n turnId: string;\n toolCallIds: readonly string[];\n reason: string;\n now: Date;\n },\n): Promise<string[]> {\n const toolCallIds = [...new Set(input.toolCallIds)];\n if (toolCallIds.length === 0) return [];\n const operations = await tx\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.sessionId, input.sessionId),\n eq(schema.videoGenerationOperations.turnId, input.turnId),\n inArray(schema.videoGenerationOperations.toolCallId, toolCallIds),\n eq(schema.videoGenerationOperations.admissionOutputState, \"pending\"),\n inArray(schema.videoGenerationOperations.status, [\"preparing\", \"prepared\"]),\n sql`${schema.videoGenerationOperations.providerRequestSentAt} is null`,\n ),\n )\n .orderBy(schema.videoGenerationOperations.id)\n .for(\"update\");\n const cancelled: string[] = [];\n for (const operation of operations) {\n await releaseReservedQuota(tx, operation, false);\n const creditState = await refundVideoGenerationCredits(tx, operation, input.now);\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"cancelled_before_submit\",\n creditState,\n quotaState: \"released\",\n terminalAt: input.now,\n terminalUpdateState: \"suppressed\",\n nextReconcileAt: input.now,\n providerRequestEncrypted: null,\n providerRequestExpiresAt: null,\n credentialEncrypted: null,\n requestEncrypted: null,\n privateDataEraseAfter: input.now,\n boundedPublicReason: boundPublicReason(input.reason),\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: input.now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning({ id: schema.videoGenerationOperations.id });\n if (!updated) throw new Error(\"Interrupted video generation was not cancelled\");\n await tx\n .update(schema.videoGenerationReferences)\n .set({ cleanupAfter: input.now })\n .where(eq(schema.videoGenerationReferences.operationId, operation.id));\n cancelled.push(updated.id);\n }\n return cancelled;\n}\n\nexport async function claimVideoGenerationOperations(\n db: Database,\n input: { owner: string; leaseSeconds: number; limit: number },\n): Promise<Array<{ operationId: string; accountId: string; workspaceId: string }>> {\n const rows = await rawRows<{\n operation_id: string;\n account_id: string;\n workspace_id: string;\n }>(\n db,\n sql`select * from opengeni_private.claim_video_generation_operations(\n ${input.owner}, ${input.leaseSeconds}, ${input.limit}\n )`,\n );\n return rows.map((row) => ({\n operationId: row.operation_id,\n accountId: row.account_id,\n workspaceId: row.workspace_id,\n }));\n}\n\nexport async function getVideoGenerationOperation(\n db: Database,\n workspaceId: string,\n operationId: string,\n): Promise<VideoGenerationOperationWithReferences | null> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [operation] = await scopedDb\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, workspaceId),\n eq(schema.videoGenerationOperations.id, operationId),\n ),\n )\n .limit(1);\n if (!operation) return null;\n const references = await scopedDb\n .select()\n .from(schema.videoGenerationReferences)\n .where(eq(schema.videoGenerationReferences.operationId, operationId))\n .orderBy(schema.videoGenerationReferences.ordinal);\n return { ...operation, references };\n });\n}\n\nexport async function markVideoGenerationSubmissionUncertain(\n db: Database,\n input: OperationMutationInput & { nextReconcileAt: Date; error: string },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status !== \"submission_uncertain\" || !operation.providerRequestEncrypted) {\n throw invalidTransition(operation, \"submission_uncertain\");\n }\n const now = new Date();\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"submission_uncertain\",\n providerRequestSentAt: operation.providerRequestSentAt ?? now,\n nextReconcileAt: input.nextReconcileAt,\n lastError: boundPrivateError(input.error),\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"record uncertain video submission\");\n });\n}\n\n/**\n * Freeze the exact provider start body before issuing the request. If the\n * worker disappears after this transaction, recovery replays the same body\n * and idempotency key rather than reminting URLs or changing request bytes.\n */\nexport async function markVideoGenerationSubmissionIntent(\n db: Database,\n input: OperationMutationInput & {\n encryptedProviderRequest: string;\n providerRequestExpiresAt: Date;\n nextReconcileAt: Date;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === \"submission_uncertain\") {\n if (!operation.providerRequestEncrypted || !operation.providerRequestExpiresAt) {\n throw new VideoGenerationConflictError(\"Video provider request is incomplete\");\n }\n return operation;\n }\n if (operation.status !== \"accepted\") {\n throw invalidTransition(operation, \"submission_uncertain\");\n }\n const now = new Date();\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"submission_uncertain\",\n providerRequestEncrypted: input.encryptedProviderRequest,\n providerRequestExpiresAt: input.providerRequestExpiresAt,\n nextReconcileAt: input.nextReconcileAt,\n lastError: null,\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n await tx\n .update(schema.videoGenerationReferences)\n .set({\n grantExpiresAt: input.providerRequestExpiresAt,\n cleanupAfter: new Date(\n Math.max(\n operation.recoveryDeadlineAt.getTime(),\n input.providerRequestExpiresAt.getTime(),\n ),\n ),\n })\n .where(eq(schema.videoGenerationReferences.operationId, operation.id));\n return requireRow(updated, \"record video provider submission intent\");\n });\n}\n\nexport async function markVideoGenerationProviderStarted(\n db: Database,\n input: OperationMutationInput & {\n providerJobId: string;\n nextReconcileAt: Date;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (\n operation.providerJobId === input.providerJobId &&\n operation.status === \"provider_started\"\n ) {\n return operation;\n }\n if (!inArrayValue(operation.status, [\"accepted\", \"submission_uncertain\"])) {\n throw invalidTransition(operation, \"provider_started\");\n }\n const now = new Date();\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"provider_started\",\n providerJobId: input.providerJobId.slice(0, 1_024),\n providerRequestEncrypted: null,\n providerRequestExpiresAt: null,\n providerRequestSentAt: operation.providerRequestSentAt ?? now,\n providerStartedAt: operation.providerStartedAt ?? now,\n nextReconcileAt: input.nextReconcileAt,\n lastError: null,\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"record video provider job\");\n });\n}\n\nexport async function rescheduleVideoGenerationOperation(\n db: Database,\n input: OperationMutationInput & {\n owner?: string;\n nextReconcileAt: Date;\n error?: string;\n },\n): Promise<boolean> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const [updated] = await scopedDb\n .update(schema.videoGenerationOperations)\n .set({\n nextReconcileAt: input.nextReconcileAt,\n ...(input.error ? { lastError: boundPrivateError(input.error) } : {}),\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n eq(schema.videoGenerationOperations.requestDigest, input.requestDigest),\n ...(input.owner\n ? [eq(schema.videoGenerationOperations.reconcileLeaseOwner, input.owner)]\n : []),\n ),\n )\n .returning({ id: schema.videoGenerationOperations.id });\n return updated !== undefined;\n },\n );\n}\n\nexport async function markVideoGenerationRetaining(\n db: Database,\n input: OperationMutationInput,\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === \"retaining\") return operation;\n if (operation.status !== \"provider_started\") throw invalidTransition(operation, \"retaining\");\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"retaining\",\n nextReconcileAt: new Date(),\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: new Date(),\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"begin video retention\");\n });\n}\n\nexport async function settleVideoGenerationFailure(\n db: Database,\n input: OperationMutationInput & {\n status: \"provider_failed\" | \"retention_failed\" | \"outcome_unknown\";\n publicReason: string;\n privateError?: string;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === input.status) return operation;\n const allowed =\n input.status === \"provider_failed\"\n ? [\"accepted\", \"submission_uncertain\", \"provider_started\"]\n : input.status === \"retention_failed\"\n ? [\"retaining\"]\n : [\"submission_uncertain\", \"provider_started\"];\n if (!inArrayValue(operation.status, allowed)) throw invalidTransition(operation, input.status);\n await releaseReservedQuota(tx, operation, false);\n const now = new Date();\n const creditState = await refundVideoGenerationCredits(tx, operation, now);\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: input.status,\n creditState,\n quotaState: \"released\",\n terminalAt: now,\n nextReconcileAt: null,\n terminalUpdateState:\n operation.admissionOutputState === \"recorded\" ? \"pending\" : \"suppressed\",\n providerRequestEncrypted: null,\n providerRequestExpiresAt: null,\n credentialEncrypted: null,\n requestEncrypted: null,\n boundedPublicReason: boundPublicReason(input.publicReason),\n lastError: input.privateError ? boundPrivateError(input.privateError) : null,\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n privateDataEraseAfter: now,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"settle failed video generation\");\n });\n}\n\nexport type SettleVideoGenerationReadyInput = OperationMutationInput & {\n fileId: string;\n bucket: string;\n objectKey: string;\n sizeBytes: number;\n sha256: string;\n facts: GeneratedVideoFacts;\n};\n\nexport async function settleVideoGenerationReady(\n db: Database,\n input: SettleVideoGenerationReadyInput,\n): Promise<{\n operation: VideoGenerationOperation;\n artifact: GeneratedVideoArtifact;\n}> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n const [operation] = await tx\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n eq(schema.videoGenerationOperations.requestDigest, input.requestDigest),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (!operation) throw new VideoGenerationConflictError(\"Video operation not found\");\n const [existingArtifact] = await tx\n .select()\n .from(schema.generatedVideoArtifacts)\n .where(eq(schema.generatedVideoArtifacts.operationId, operation.id))\n .limit(1);\n if (operation.status === \"completed\" && existingArtifact) {\n return { operation, artifact: existingArtifact };\n }\n if (operation.status !== \"retaining\") throw invalidTransition(operation, \"completed\");\n if (operation.expectedFileId !== input.fileId) {\n throw new VideoGenerationConflictError(\"Video File identity changed during settlement\");\n }\n if (operation.expectedArtifactId === operation.expectedFileId) {\n throw new Error(\"Video artifact and File identities must be distinct\");\n }\n // The durable provider operation owns this write, including when its\n // original session has since disappeared. Ordinary file reads stay scoped.\n await tx.execute(\n sql`SELECT set_config('opengeni.private_file_owner',${operation.privateFileOwnerSubjectId ?? \"\"},true)`,\n );\n const now = new Date();\n await tx.insert(schema.files).values({\n id: input.fileId,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n status: \"ready\",\n filename: `generated-video-${operation.expectedArtifactId}.mp4`,\n safeFilename: `generated-video-${operation.expectedArtifactId}.mp4`,\n contentType: \"video/mp4\",\n sizeBytes: input.sizeBytes,\n sha256: input.sha256,\n bucket: input.bucket,\n objectKey: input.objectKey,\n updatedAt: now,\n });\n const [artifact] = await tx\n .insert(schema.generatedVideoArtifacts)\n .values({\n id: operation.expectedArtifactId,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n primaryFileId: input.fileId,\n operationId: operation.id,\n sessionId: operation.sessionId,\n turnId: operation.turnId,\n attemptId: operation.attemptId,\n modelId: operation.modelId,\n sourceMode: operation.sourceMode,\n promptDigest: operation.promptDigest,\n contentType: \"video/mp4\",\n sizeBytes: input.sizeBytes,\n sha256: input.sha256,\n durationMillis: Math.round(input.facts.durationSeconds * 1_000),\n width: input.facts.width,\n height: input.facts.height,\n fpsMilli: Math.round(input.facts.fps * 1_000),\n videoCodec: input.facts.videoCodec,\n audioCodec: input.facts.audioCodec,\n hasAudio: input.facts.hasAudio,\n sandboxFilename: `generated-video-${operation.expectedArtifactId}.mp4`,\n readyAt: now,\n })\n .returning();\n if (!artifact) throw new Error(\"Generated video artifact was not persisted\");\n await tx\n .update(schema.workspaceVideoGenerationQuotas)\n .set({\n reservedBytes: sql`${schema.workspaceVideoGenerationQuotas.reservedBytes} - ${operation.reservedBytes}`,\n readyBytes: sql`${schema.workspaceVideoGenerationQuotas.readyBytes} + ${input.sizeBytes}`,\n updatedAt: now,\n })\n .where(eq(schema.workspaceVideoGenerationQuotas.workspaceId, input.workspaceId));\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"completed\",\n quotaState: \"ready\",\n terminalAt: now,\n nextReconcileAt: null,\n terminalUpdateState:\n operation.admissionOutputState === \"recorded\" ? \"pending\" : \"suppressed\",\n providerRequestEncrypted: null,\n providerRequestExpiresAt: null,\n credentialEncrypted: null,\n requestEncrypted: null,\n boundedPublicReason: null,\n lastError: null,\n privateDataEraseAfter: now,\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return {\n operation: requireRow(updated, \"settle ready video generation\"),\n artifact,\n };\n }),\n );\n}\n\nexport async function getGeneratedVideoArtifact(\n db: Database,\n workspaceId: string,\n artifactId: string,\n): Promise<{\n artifact: GeneratedVideoArtifact;\n file: typeof schema.files.$inferSelect;\n} | null> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [row] = await scopedDb\n .select({ artifact: schema.generatedVideoArtifacts, file: schema.files })\n .from(schema.generatedVideoArtifacts)\n .innerJoin(schema.files, eq(schema.files.id, schema.generatedVideoArtifacts.primaryFileId))\n .where(\n and(\n eq(schema.generatedVideoArtifacts.workspaceId, workspaceId),\n eq(schema.generatedVideoArtifacts.id, artifactId),\n ),\n )\n .limit(1);\n return row ?? null;\n });\n}\n\nexport async function listSessionGeneratedVideoArtifacts(\n db: Database,\n workspaceId: string,\n sessionId: string,\n): Promise<\n Array<{\n artifact: GeneratedVideoArtifact;\n file: typeof schema.files.$inferSelect;\n }>\n> {\n return await withWorkspaceRls(\n db,\n workspaceId,\n async (scopedDb) =>\n await scopedDb\n .select({\n artifact: schema.generatedVideoArtifacts,\n file: schema.files,\n })\n .from(schema.generatedVideoArtifacts)\n .innerJoin(schema.files, eq(schema.files.id, schema.generatedVideoArtifacts.primaryFileId))\n .where(\n and(\n eq(schema.generatedVideoArtifacts.workspaceId, workspaceId),\n eq(schema.generatedVideoArtifacts.sessionId, sessionId),\n sql`${schema.generatedVideoArtifacts.deletedAt} is null`,\n ),\n )\n .orderBy(schema.generatedVideoArtifacts.createdAt, schema.generatedVideoArtifacts.id),\n );\n}\n\n/**\n * Record one staging object as erased only after the object-store delete has\n * succeeded. Deleting first is safe because object deletion is idempotent; a\n * crash before this CAS simply repeats the same delete on recovery.\n */\nexport async function markVideoGenerationReferenceCleaned(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n ordinal: number;\n stagingObjectKey: string;\n },\n): Promise<boolean> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const [updated] = await scopedDb\n .update(schema.videoGenerationReferences)\n .set({\n stagingObjectKey: null,\n grantExpiresAt: null,\n cleanupAfter: null,\n cleanedAt: new Date(),\n })\n .where(\n and(\n eq(schema.videoGenerationReferences.workspaceId, input.workspaceId),\n eq(schema.videoGenerationReferences.operationId, input.operationId),\n eq(schema.videoGenerationReferences.ordinal, input.ordinal),\n eq(schema.videoGenerationReferences.stagingObjectKey, input.stagingObjectKey),\n ),\n )\n .returning({\n operationId: schema.videoGenerationReferences.operationId,\n });\n if (updated) return true;\n const [existing] = await scopedDb\n .select({ cleanedAt: schema.videoGenerationReferences.cleanedAt })\n .from(schema.videoGenerationReferences)\n .where(\n and(\n eq(schema.videoGenerationReferences.workspaceId, input.workspaceId),\n eq(schema.videoGenerationReferences.operationId, input.operationId),\n eq(schema.videoGenerationReferences.ordinal, input.ordinal),\n ),\n )\n .limit(1);\n return existing?.cleanedAt !== null && existing?.cleanedAt !== undefined;\n },\n );\n}\n\nexport async function markVideoGenerationTerminalUpdate(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n state: \"leased\" | \"delivered\" | \"suppressed\";\n updateId?: string;\n },\n): Promise<boolean> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n return await markVideoGenerationTerminalUpdateInTransaction(scopedDb, input);\n },\n );\n}\n\nexport async function markVideoGenerationTerminalUpdateInTransaction(\n tx: Database,\n input: {\n workspaceId: string;\n operationId: string;\n state: \"leased\" | \"delivered\" | \"suppressed\";\n updateId?: string;\n },\n): Promise<boolean> {\n const allowed =\n input.state === \"leased\"\n ? [\"pending\", \"leased\"]\n : input.state === \"delivered\"\n ? [\"leased\"]\n : [\"pending\", \"leased\"];\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n terminalUpdateState: input.state,\n terminalUpdateId: input.state === \"suppressed\" ? null : (input.updateId ?? null),\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n inArray(schema.videoGenerationOperations.terminalUpdateState, allowed),\n ...(input.state === \"delivered\" && input.updateId\n ? [eq(schema.videoGenerationOperations.terminalUpdateId, input.updateId)]\n : []),\n ),\n )\n .returning({ id: schema.videoGenerationOperations.id });\n return updated !== undefined;\n}\n\nexport function mediaGenerationResultForOperation(input: {\n operation: VideoGenerationOperation;\n readyReceipt?: Extract<MediaGenerationResult, { status: \"ready\" }>[\"receipt\"];\n}): MediaGenerationResult {\n if (input.operation.status === \"completed\" && input.readyReceipt) {\n return {\n type: \"media_generation_result\",\n schemaVersion: 1,\n status: \"ready\",\n operationId: input.operation.id,\n receipt: input.readyReceipt,\n };\n }\n const failureStatus = input.operation.status;\n if (\n !inArrayValue(failureStatus, [\n \"provider_failed\",\n \"retention_failed\",\n \"cancelled_before_submit\",\n \"outcome_unknown\",\n ])\n ) {\n throw new Error(\"Video generation operation is not terminal\");\n }\n return {\n type: \"media_generation_result\",\n schemaVersion: 1,\n status: failureStatus,\n operationId: input.operation.id,\n boundedPublicReason:\n input.operation.boundedPublicReason ?? \"Video generation did not complete.\",\n } as MediaGenerationResult;\n}\n\n/** Build the compact public/model terminal envelope from durable canonical rows. */\nexport async function mediaGenerationResultForStoredOperation(\n db: Database,\n operation: VideoGenerationOperation,\n): Promise<MediaGenerationResult> {\n if (operation.status !== \"completed\") {\n return mediaGenerationResultForOperation({ operation });\n }\n const retained = await getGeneratedVideoArtifact(\n db,\n operation.workspaceId,\n operation.expectedArtifactId,\n );\n if (!retained || retained.artifact.deletedAt) {\n throw new Error(\"Completed video generation lost its retained artifact\");\n }\n const artifact = retainedGeneratedVideoReferenceFromFile({\n id: retained.artifact.id,\n workspaceId: retained.artifact.workspaceId,\n status: retained.file.status,\n contentType: retained.file.contentType,\n sizeBytes: retained.file.sizeBytes,\n sha256: retained.file.sha256,\n updatedAt: retained.artifact.readyAt.toISOString(),\n width: retained.artifact.width,\n height: retained.artifact.height,\n });\n if (!artifact) throw new Error(\"Generated video receipt could not be constructed\");\n const receipt = GeneratedVideoReceipt.parse({\n type: \"generated_video\",\n schemaVersion: 1,\n operationId: operation.id,\n artifact,\n video: {\n durationSeconds: retained.artifact.durationMillis / 1_000,\n width: retained.artifact.width,\n height: retained.artifact.height,\n fps: retained.artifact.fpsMilli / 1_000,\n hasAudio: retained.artifact.hasAudio,\n videoCodec: retained.artifact.videoCodec,\n audioCodec: retained.artifact.audioCodec,\n },\n sandboxPath: `/workspace/generated-videos/${retained.artifact.sandboxFilename}`,\n });\n return mediaGenerationResultForOperation({\n operation,\n readyReceipt: receipt,\n });\n}\n\nexport async function getVideoGenerationOperationSummary(\n db: Database,\n workspaceId: string,\n operationId: string,\n): Promise<import(\"@opengeni/contracts\").VideoGenerationOperationSummary | null> {\n const operation = await getVideoGenerationOperation(db, workspaceId, operationId);\n if (!operation) return null;\n if (operation.privateFileOwnerSubjectId) {\n const [context] = await withWorkspaceRls(db, workspaceId, (tx) =>\n rawRows<{ owner: string | null }>(\n tx,\n sql`SELECT nullif(current_setting('opengeni.private_file_owner',true),'') AS owner`,\n ),\n );\n if (context?.owner !== operation.privateFileOwnerSubjectId) return null;\n }\n const terminal = inArrayValue(operation.status, [\n \"completed\",\n \"provider_failed\",\n \"cancelled_before_submit\",\n \"outcome_unknown\",\n \"retention_failed\",\n ])\n ? await mediaGenerationResultForStoredOperation(db, operation)\n : null;\n return VideoGenerationOperationSummary.parse({\n schemaVersion: 1,\n operationId: operation.id,\n modelId: operation.modelId,\n status: operation.status === \"submission_uncertain\" ? \"accepted\" : operation.status,\n createdAt: operation.createdAt.toISOString(),\n updatedAt: operation.updatedAt.toISOString(),\n terminal,\n });\n}\n\ntype OperationMutationInput = {\n accountId: string;\n workspaceId: string;\n operationId: string;\n requestDigest: string;\n};\n\nasync function mutateOperation<T>(\n db: Database,\n input: OperationMutationInput,\n mutate: (tx: Database, operation: VideoGenerationOperation) => Promise<T>,\n): Promise<T> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (txRaw) => {\n const tx = txRaw as unknown as Database;\n const [operation] = await tx\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n eq(schema.videoGenerationOperations.requestDigest, input.requestDigest),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (!operation) throw new VideoGenerationConflictError(\"Video operation not found\");\n return await mutate(tx, operation);\n }),\n );\n}\n\nasync function releaseReservedQuota(\n tx: Database,\n operation: VideoGenerationOperation,\n ready: boolean,\n): Promise<void> {\n if (operation.quotaState !== \"reserved\") return;\n await tx\n .update(schema.workspaceVideoGenerationQuotas)\n .set({\n reservedBytes: sql`${schema.workspaceVideoGenerationQuotas.reservedBytes} - ${operation.reservedBytes}`,\n ...(ready\n ? {\n readyBytes: sql`${schema.workspaceVideoGenerationQuotas.readyBytes} + ${operation.reservedBytes}`,\n }\n : {}),\n updatedAt: new Date(),\n })\n .where(eq(schema.workspaceVideoGenerationQuotas.workspaceId, operation.workspaceId));\n}\n\nasync function debitVideoGenerationCredits(\n tx: Database,\n operation: VideoGenerationOperation,\n): Promise<void> {\n if (operation.pricedCostMicros <= 0 || operation.fundingSource !== \"opengeni_credits\") {\n throw new Error(\"Managed video credit debit has an invalid funding binding\");\n }\n if (!operation.turnId) {\n throw new VideoGenerationCreditError(\"Paid video initiating turn is unavailable\");\n }\n // Model settlement locks the account before the ledger trigger's workspace\n // allowance fence. Preserve that order during prepaid media admission.\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${operation.accountId}))`);\n const attribution = await creditDebitAttributionForTurn(tx, {\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n turnId: operation.turnId,\n });\n const refusal = await checkWorkspaceAllowance(tx, {\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n subjectId: attribution.kind === \"turn\" ? attribution.initiatingHumanSubjectId : null,\n });\n if (refusal) throw Object.assign(new VideoGenerationCreditError(refusal.message), refusal);\n const { balanceMicros } = await getSpendableCreditBalance(tx, operation.accountId);\n if (!Number.isSafeInteger(balanceMicros) || balanceMicros < operation.pricedCostMicros) {\n throw new VideoGenerationCreditError();\n }\n const now = new Date();\n const inserted = await tx\n .insert(schema.creditLedgerEntries)\n .values({\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n type: \"video_generation_debit\",\n amountMicros: -operation.pricedCostMicros,\n sourceType: \"video_generation_operation\",\n sourceId: operation.id,\n idempotencyKey: `credit:video_generation_debit:${operation.id}`,\n metadata: {\n turnId: operation.turnId,\n modelId: operation.modelId,\n sourceMode: operation.sourceMode,\n pricedCostMicros: operation.pricedCostMicros,\n },\n occurredAt: now,\n })\n .onConflictDoNothing({ target: schema.creditLedgerEntries.idempotencyKey })\n .returning({ id: schema.creditLedgerEntries.id });\n if (inserted.length !== 1) {\n throw new VideoGenerationConflictError(\"Video generation credit debit already exists\");\n }\n await tx\n .insert(schema.usageEvents)\n .values({\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n eventType: \"video_generation.cost\",\n quantity: operation.pricedCostMicros,\n unit: \"usd_micros\",\n sourceResourceType: \"video_generation_operation\",\n sourceResourceId: operation.id,\n sessionId: operation.sessionId,\n turnId: operation.turnId,\n turnAttemptId: operation.attemptId,\n idempotencyKey: `usage:video_generation.cost:${operation.id}`,\n occurredAt: now,\n })\n .onConflictDoNothing({ target: schema.usageEvents.idempotencyKey });\n}\n\nasync function refundVideoGenerationCredits(\n tx: Database,\n operation: VideoGenerationOperation,\n now: Date,\n): Promise<VideoGenerationOperation[\"creditState\"]> {\n if (operation.creditState !== \"debited\") return operation.creditState;\n if (operation.fundingSource !== \"opengeni_credits\" || operation.pricedCostMicros <= 0) {\n throw new Error(\"Video generation credit refund has an invalid funding binding\");\n }\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${operation.accountId}))`);\n const inserted = await tx\n .insert(schema.creditLedgerEntries)\n .values({\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n type: \"video_generation_refund\",\n amountMicros: operation.pricedCostMicros,\n sourceType: \"video_generation_operation\",\n sourceId: operation.id,\n idempotencyKey: `credit:video_generation_refund:${operation.id}`,\n metadata: {\n turnId: operation.turnId,\n modelId: operation.modelId,\n sourceMode: operation.sourceMode,\n pricedCostMicros: operation.pricedCostMicros,\n },\n occurredAt: now,\n })\n .onConflictDoNothing({ target: schema.creditLedgerEntries.idempotencyKey })\n .returning({ id: schema.creditLedgerEntries.id });\n if (inserted.length !== 1) {\n throw new VideoGenerationConflictError(\"Video generation credit refund already exists\");\n }\n await tx\n .insert(schema.usageEvents)\n .values({\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n eventType: \"video_generation.refund\",\n quantity: operation.pricedCostMicros,\n unit: \"usd_micros\",\n sourceResourceType: \"video_generation_operation\",\n sourceResourceId: operation.id,\n sessionId: operation.sessionId,\n turnId: operation.turnId,\n turnAttemptId: operation.attemptId,\n idempotencyKey: `usage:video_generation.refund:${operation.id}`,\n occurredAt: now,\n })\n .onConflictDoNothing({ target: schema.usageEvents.idempotencyKey });\n return \"refunded\";\n}\n\nfunction policyFromRow(\n row: typeof schema.workspaceVideoGenerationPolicies.$inferSelect | undefined,\n): VideoGenerationPolicyValue {\n return VideoGenerationPolicy.parse(\n row\n ? {\n schemaVersion: 1,\n revision: row.revision,\n fundingSource: row.fundingSource,\n enabledModelIds: row.enabledModelIds,\n defaultModelId: row.defaultModelId,\n }\n : {\n schemaVersion: 1,\n revision: 0,\n fundingSource: \"workspace_gateway\",\n enabledModelIds: [],\n defaultModelId: null,\n },\n );\n}\n\nfunction assertSupportedModels(modelIds: readonly string[]): void {\n for (const modelId of modelIds) {\n if (modelId !== SEEDANCE_2_5_MODEL_ID && modelId !== GROK_IMAGINE_VIDEO_1_5_MODEL_ID) {\n throw new Error(`Unknown video generation model: ${modelId}`);\n }\n }\n}\n\nfunction assertAdmissionMatches(\n operation: VideoGenerationOperation,\n input: AdmitVideoGenerationOperationInput,\n): void {\n if (\n operation.requestDigest !== input.requestDigest ||\n operation.toolCallId !== input.toolCallId ||\n operation.sessionId !== input.sessionId ||\n operation.turnId !== input.turnId ||\n operation.fundingSource !== input.fundingSource ||\n operation.pricedCostMicros !== input.pricedCostMicros\n ) {\n throw new VideoGenerationConflictError(\n \"Video generation admission key was reused with different arguments\",\n );\n }\n}\n\nfunction inPreSubmitState(status: string): boolean {\n return inArrayValue(status, [\"preparing\", \"prepared\", \"accepted\"]);\n}\n\nfunction inArrayValue<T extends string>(value: string, candidates: readonly T[]): value is T {\n return (candidates as readonly string[]).includes(value);\n}\n\nfunction invalidTransition(operation: VideoGenerationOperation, target: string): Error {\n return new VideoGenerationConflictError(\n `Invalid video generation transition ${operation.status} -> ${target}`,\n );\n}\n\nfunction requireRow<T>(value: T | undefined, action: string): T {\n if (!value) throw new Error(`Failed to ${action}`);\n return value;\n}\n\nfunction boundPublicReason(value: string): string {\n const normalized = value.replace(/\\s+/gu, \" \").trim();\n return (normalized || \"Video generation did not complete.\").slice(0, 1_000);\n}\n\nfunction boundPrivateError(value: string): string {\n return value.replace(/\\s+/gu, \" \").trim().slice(0, 4_096);\n}\n","import { sql } from \"drizzle-orm\";\nimport { rawRows, setSubjectRlsContext, withRlsContext, type Database } from \"./database\";\nimport { currentCreditDebitAttribution } from \"./credit-debit-attribution\";\n\n/** All amounts are integer USD micros, never dollars or floating-point credits. */\nexport type MemberAllowanceRule = { share: number } | { credits: number } | null;\nexport type WorkspaceAllowanceConfig = {\n includedCredits: number;\n period: \"monthly\" | \"none\";\n anchorDay?: number;\n memberDefault?: \"none\" | \"equal_share\" | Exclude<MemberAllowanceRule, null>;\n thresholds?: { workspace?: number[]; member?: number[] };\n};\nexport type WorkspaceAllowance = WorkspaceAllowanceConfig & { version: number };\nexport type WorkspaceAllowanceState = { version: number; config: WorkspaceAllowance | null };\nexport type AllowanceStatus = \"ok\" | \"warning\" | \"exhausted\";\nexport type AllowanceUsage = {\n limit: number | null;\n used: number;\n remaining: number | null;\n fraction: number | null;\n status: AllowanceStatus;\n resetsAt: string | null;\n};\nexport type MemberAllowance = {\n subjectId: string;\n rule: MemberAllowanceRule;\n version: number;\n};\nexport type WorkspaceUsage = {\n period: { start: string | null; end: string | null };\n workspace: AllowanceUsage & { includedCredits: number; grantsRemaining: number };\n members: (AllowanceUsage &\n MemberAllowance & {\n externalIdentity: { source: string; externalId: string } | null;\n })[];\n nextCursor: string | null;\n};\nexport type AllowanceExhausted = {\n code: \"allowance_exhausted\";\n scope: \"workspace\" | \"member\";\n resetsAt: string | null;\n subjectId?: string;\n message: string;\n};\ntype Scope = { accountId: string; workspaceId: string };\ntype Actor = { actorSubjectId: string; actorType?: string | undefined };\n\nexport class UsageAllowanceVersionConflictError extends Error {\n constructor() {\n super(\"Usage allowance version conflict\");\n this.name = \"UsageAllowanceVersionConflictError\";\n }\n}\n\nfunction amount(value: number, name: string, positive = false): void {\n if (!Number.isSafeInteger(value) || value < (positive ? 1 : 0)) {\n throw new Error(\n `${name} must be ${positive ? \"a positive\" : \"a non-negative\"} safe integer in USD micros`,\n );\n }\n}\n\nexport function validateMemberAllowanceRule(rule: MemberAllowanceRule): void {\n if (rule === null) return;\n if (\"credits\" in rule) {\n if (Object.keys(rule).length !== 1)\n throw new Error(\"Member rule must have only credits or share\");\n amount(rule.credits, \"credits\");\n } else if (\"share\" in rule) {\n if (Object.keys(rule).length !== 1 || !Number.isFinite(rule.share) || rule.share < 0) {\n throw new Error(\"share must be a finite non-negative number\");\n }\n } else {\n throw new Error(\"Member rule must have credits or share\");\n }\n}\n\nexport function validateWorkspaceAllowanceConfig(config: WorkspaceAllowanceConfig): void {\n amount(config.includedCredits, \"includedCredits\");\n if (config.period !== \"monthly\" && config.period !== \"none\")\n throw new Error(\"Invalid allowance period\");\n if (\n config.anchorDay !== undefined &&\n (!Number.isInteger(config.anchorDay) || config.anchorDay < 1 || config.anchorDay > 31)\n ) {\n throw new Error(\"anchorDay must be an integer from 1 to 31\");\n }\n if (\n config.memberDefault !== undefined &&\n config.memberDefault !== \"none\" &&\n config.memberDefault !== \"equal_share\"\n ) {\n validateMemberAllowanceRule(config.memberDefault);\n }\n for (const list of [config.thresholds?.workspace, config.thresholds?.member]) {\n if (\n list !== undefined &&\n (list.length > 16 ||\n list.some((threshold) => !Number.isFinite(threshold) || threshold <= 0 || threshold > 1))\n ) {\n throw new Error(\n \"thresholds must contain at most 16 fractions greater than zero and at most one\",\n );\n }\n }\n}\n\nasync function command<T>(db: Database, input: Scope & Record<string, unknown>): Promise<T> {\n if (\n [\"set\", \"clear\", \"member\", \"grant\"].includes(String(input.action)) &&\n currentCreditDebitAttribution().kind === \"turn\"\n ) {\n // This context is installed by the authenticated request boundary, not\n // supplied in the allowance command. Agent attempts cannot substitute\n // human-looking actor labels to author allowance policy.\n throw new Error(\"Agent attempts cannot change usage allowances\");\n }\n try {\n const mutation = [\"set\", \"clear\", \"member\", \"grant\"].includes(String(input.action));\n return await withRlsContext(\n db,\n input,\n async (scoped) => {\n if (mutation) {\n // The organization lifecycle can hold this fence while waiting for\n // exclusive tenancy. Never acquire shared tenancy ahead of it.\n await scoped.execute(sql`select pg_advisory_xact_lock(\n hashtextextended(${`organization-membership:${input.accountId}`},0))`);\n await scoped.execute(sql`select pg_advisory_xact_lock_shared(\n hashtextextended(${`session-tenancy:${input.workspaceId}`},0))`);\n }\n if (typeof input.actorSubjectId === \"string\")\n await setSubjectRlsContext(scoped, input.actorSubjectId);\n const [row] = await rawRows<{ result: T }>(\n scoped,\n sql`select usage_allowance_command(${JSON.stringify(input)}::jsonb) as result`,\n );\n if (!row) throw new Error(\"Usage allowance command returned no result\");\n return row.result;\n },\n undefined,\n mutation ? \"none\" : \"shared\",\n );\n } catch (error) {\n const cause = error as { code?: string; cause?: { code?: string } };\n if ((cause.code ?? cause.cause?.code) === \"40001\")\n throw new UsageAllowanceVersionConflictError();\n throw error;\n }\n}\n\nfunction actor(input: Actor): Actor & { actorType: string } {\n return { actorSubjectId: input.actorSubjectId, actorType: input.actorType ?? \"subject\" };\n}\nfunction version(value: number): void {\n amount(value, \"expectedVersion\");\n}\n\nexport async function getWorkspaceAllowance(\n db: Database,\n input: Scope,\n): Promise<WorkspaceAllowance | null> {\n return await command(db, { ...input, action: \"get\" });\n}\n\n/** Includes the lifecycle revision even when no configuration exists. */\nexport async function getWorkspaceAllowanceState(\n db: Database,\n input: Scope,\n): Promise<WorkspaceAllowanceState> {\n return await command(db, { ...input, action: \"state\" });\n}\n\nexport async function setWorkspaceAllowance(\n db: Database,\n input: Scope & Actor & WorkspaceAllowanceConfig & { expectedVersion: number },\n): Promise<WorkspaceAllowance> {\n const { accountId, workspaceId, expectedVersion, actorSubjectId, actorType } = input;\n const config: WorkspaceAllowanceConfig = {\n includedCredits: input.includedCredits,\n period: input.period,\n ...(input.anchorDay === undefined ? {} : { anchorDay: input.anchorDay }),\n ...(input.memberDefault === undefined ? {} : { memberDefault: input.memberDefault }),\n ...(input.thresholds === undefined ? {} : { thresholds: input.thresholds }),\n };\n version(expectedVersion);\n validateWorkspaceAllowanceConfig(config);\n return await command(db, {\n accountId,\n workspaceId,\n expectedVersion,\n ...actor({ actorSubjectId, actorType }),\n action: \"set\",\n config,\n });\n}\n\nexport async function clearWorkspaceAllowance(\n db: Database,\n input: Scope & Actor & { expectedVersion: number; operationId?: string },\n): Promise<{ version: number }> {\n version(input.expectedVersion);\n if (input.expectedVersion === 0) throw new UsageAllowanceVersionConflictError();\n if (\n input.operationId !== undefined &&\n (!input.operationId.trim() || new TextEncoder().encode(input.operationId).length > 256)\n )\n throw new Error(\"operationId must be non-empty and at most 256 bytes\");\n return await command(db, { ...input, ...actor(input), action: \"clear\" });\n}\n\nexport async function grantWorkspaceCredits(\n db: Database,\n input: Scope & Actor & { operationId: string; credits: number; expiresAt?: string | null },\n): Promise<{ operationId: string; credits: number; remaining: number; expiresAt: string | null }> {\n amount(input.credits, \"credits\", true);\n if (!input.operationId.trim() || new TextEncoder().encode(input.operationId).length > 256) {\n throw new Error(\"operationId must be non-empty and at most 256 bytes\");\n }\n if (input.expiresAt != null && !Number.isFinite(Date.parse(input.expiresAt)))\n throw new Error(\"Invalid grant expiresAt\");\n return await command(db, {\n ...input,\n ...actor(input),\n expiresAt: input.expiresAt ?? null,\n action: \"grant\",\n });\n}\n\nexport async function setMemberAllowance(\n db: Database,\n input: Scope &\n Actor & { rule: MemberAllowanceRule; expectedVersion: number } & (\n | { subjectId: string; externalIdentity?: never }\n | { externalIdentity: { source: string; externalId: string }; subjectId?: never }\n ),\n): Promise<MemberAllowance> {\n version(input.expectedVersion);\n validateMemberAllowanceRule(input.rule);\n return await command(db, { ...input, ...actor(input), action: \"member\" });\n}\n\ntype RawUsage = {\n config: WorkspaceAllowanceConfig | null;\n period: WorkspaceUsage[\"period\"];\n used: number;\n includedUsed: number;\n grantsUsed: number;\n grantsRemaining: number;\n memberCount: number;\n members: (MemberAllowance & {\n used: number;\n externalIdentity: { source: string; externalId: string } | null;\n })[];\n};\n\nexport function allowanceUsage(\n limit: number | null,\n used: number,\n resetsAt: string | null,\n thresholds = [0.8, 1],\n): AllowanceUsage {\n const fraction = limit === null ? null : limit === 0 ? 1 : used / limit;\n const remaining = limit === null ? null : Math.max(0, limit - used);\n return {\n limit,\n used,\n remaining,\n fraction,\n status:\n remaining === 0\n ? \"exhausted\"\n : fraction !== null && thresholds.some((t) => fraction >= t)\n ? \"warning\"\n : \"ok\",\n resetsAt,\n };\n}\n\nexport async function getWorkspaceUsage(\n db: Database,\n input: Scope & {\n period?: \"current\" | string;\n limit?: number;\n cursor?: string | null;\n subjectId?: string;\n },\n): Promise<WorkspaceUsage> {\n if (\n input.period !== undefined &&\n input.period !== \"current\" &&\n !/^\\d{4}-(0[1-9]|1[0-2])$/.test(input.period)\n ) {\n throw new Error(\"period must be current or YYYY-MM\");\n }\n const pageSize = Math.min(500, Math.max(1, Math.trunc(input.limit ?? 100)));\n const raw = await command<RawUsage>(db, { ...input, limit: pageSize, action: \"usage\" });\n return projectUsage(raw, pageSize);\n}\n\nfunction projectUsage(raw: RawUsage, pageSize: number): WorkspaceUsage {\n const config = raw.config;\n const pool = config\n ? config.includedCredits + Number(raw.grantsUsed) + Number(raw.grantsRemaining)\n : null;\n const memberPool = config ? config.includedCredits + Number(raw.grantsRemaining) : null;\n const resetsAt = config ? raw.period.end : null;\n const members = raw.members.slice(0, pageSize).map((member) => {\n let rule = member.rule;\n if (rule === null) {\n const fallback = config?.memberDefault ?? \"none\";\n rule =\n fallback === \"none\"\n ? null\n : fallback === \"equal_share\"\n ? { share: raw.memberCount > 0 ? 1 / Number(raw.memberCount) : 0 }\n : fallback;\n }\n const limit =\n rule === null\n ? null\n : \"credits\" in rule\n ? rule.credits\n : memberPool === null\n ? null\n : Math.min(Number.MAX_SAFE_INTEGER, Math.floor(memberPool * rule.share));\n return {\n ...member,\n rule: member.rule,\n ...allowanceUsage(limit, Number(member.used), resetsAt, config?.thresholds?.member),\n };\n });\n return {\n period: config ? raw.period : { start: null, end: null },\n workspace: {\n ...allowanceUsage(pool, Number(raw.used), resetsAt, config?.thresholds?.workspace),\n includedCredits: config?.includedCredits ?? 0,\n grantsRemaining: Number(raw.grantsRemaining),\n },\n members,\n nextCursor: raw.members.length > pageSize ? members.at(-1)!.subjectId : null,\n };\n}\n\nexport async function checkWorkspaceAllowance(\n db: Database,\n input: Scope & { subjectId?: string | null },\n): Promise<AllowanceExhausted | null> {\n const raw = await command<RawUsage>(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n ...(input.subjectId ? { subjectId: input.subjectId } : {}),\n limit: 1,\n action: \"check\",\n });\n const usage = projectUsage(raw, 1);\n if (usage.workspace.status === \"exhausted\") {\n return {\n code: \"allowance_exhausted\",\n scope: \"workspace\",\n resetsAt: usage.workspace.resetsAt,\n message: \"The workspace usage allowance is exhausted.\",\n };\n }\n const member = input.subjectId\n ? usage.members.find((row) => row.subjectId === input.subjectId)\n : null;\n if (member?.status === \"exhausted\") {\n return {\n code: \"allowance_exhausted\",\n scope: \"member\",\n subjectId: member.subjectId,\n resetsAt: member.resetsAt,\n message: \"The member usage allowance is exhausted.\",\n };\n }\n return null;\n}\n\n/** Bounded periodic work, independent of reads/admission and webhook delivery. */\nexport async function maintainWorkspaceAllowances(\n db: Database,\n input: { limit?: number; memberLimit?: number } = {},\n): Promise<number> {\n const [row] = await rawRows<{ processed: number }>(\n db,\n sql`select maintain_usage_allowances(${input.limit ?? 20}::integer,${input.memberLimit ?? 100}::integer) as processed`,\n );\n return Number(row?.processed ?? 0);\n}\n","import { z } from \"zod\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { sql } from \"drizzle-orm\";\nimport { rawRows, withRlsContext, type Database } from \"./database\";\n\nconst creditDebitAttributionContext = new AsyncLocalStorage<CreditDebitAttribution>();\n\nexport function currentCreditDebitAttribution(): CreditDebitAttribution {\n return creditDebitAttributionContext.getStore() ?? { kind: \"unknown\" };\n}\n\n/** Scope trusted HTTP/MCP admission facts across nested sandbox calls. */\nexport function withCreditDebitAttribution<T>(\n attribution: CreditDebitAttribution,\n fn: () => Promise<T>,\n): Promise<T> {\n return creditDebitAttributionContext.run(\n Object.freeze(CreditDebitAttribution.parse(attribution)),\n fn,\n );\n}\n\n/** Read one immutable turn, rejecting a missing receipt rather than service. */\nexport async function creditDebitAttributionForTurn(\n db: Database,\n input: { accountId: string; workspaceId: string; turnId: string },\n): Promise<CreditDebitAttribution> {\n return withRlsContext(db, input, async (tx) => {\n const [turn] = await rawRows<{ initiatingHumanSubjectId: string | null }>(\n tx,\n sql`SELECT initiating_human_subject_id AS \"initiatingHumanSubjectId\"\n FROM session_turns WHERE account_id=${input.accountId}::uuid\n AND workspace_id=${input.workspaceId}::uuid AND id=${input.turnId}::uuid`,\n );\n if (!turn) throw new Error(\"Paid credit debit initiating turn is unavailable\");\n return CreditDebitAttribution.parse({\n kind: \"turn\",\n turnId: input.turnId,\n initiatingHumanSubjectId: turn.initiatingHumanSubjectId,\n });\n });\n}\n\n/**\n * Trusted admission facts, not an access grant. Unknown is deliberately\n * distinct from pure service: old jobs/leases cannot prove a human initiator.\n */\nexport const CreditDebitAttribution = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"turn\"),\n turnId: z.uuid(),\n initiatingHumanSubjectId: z.string().min(1).max(1024).nullable(),\n }),\n z.object({\n kind: z.literal(\"human\"),\n initiatingHumanSubjectId: z.string().min(1).max(1024),\n }),\n z.object({ kind: z.literal(\"service\") }),\n z.object({ kind: z.literal(\"unknown\") }),\n]);\nexport type CreditDebitAttribution = z.infer<typeof CreditDebitAttribution>;\n\nexport function creditDebitAttributionMetadata(\n attribution: CreditDebitAttribution,\n): Record<string, string> {\n switch (attribution.kind) {\n case \"turn\":\n return {\n turnId: attribution.turnId,\n ...(attribution.initiatingHumanSubjectId\n ? { initiatingHumanSubjectId: attribution.initiatingHumanSubjectId }\n : {}),\n };\n case \"human\":\n return { initiatingHumanSubjectId: attribution.initiatingHumanSubjectId };\n case \"service\":\n return {};\n case \"unknown\":\n throw new Error(\"Paid credit debit has no frozen initiating attribution\");\n }\n}\n","import type { BillingBalance, PromotionalCreditBalance } from \"@opengeni/contracts\";\nimport { sql } from \"drizzle-orm\";\nimport type { Database } from \"./database\";\nimport { rawRows, withAccountRls } from \"./database\";\nimport * as schema from \"./schema\";\n\n/** Read totals and grant remainders from one database snapshot. */\ntype CreditBalanceSnapshot = BillingBalance & { creditPolicyRevision?: number };\n\nexport async function getBillingBalance(\n db: Database,\n accountId: string,\n policyRevision?: number,\n): Promise<CreditBalanceSnapshot> {\n return await withAccountRls(db, accountId, async (tx) => {\n const [row] = await rawRows<{\n balance: string;\n grants: PromotionalCreditBalance[];\n revision: number;\n }>(\n tx,\n sql`\n with current_policy as (\n select revision, policy from opengeni_private.credit_promotion_policy_revisions\n where (${policyRevision ?? null}::bigint is null or revision <= ${policyRevision ?? null}::bigint)\n order by revision desc limit 1\n )\n select\n coalesce((select revision from current_policy), 0)::int as revision,\n (select coalesce(sum(amount_micros), 0)::text\n from ${schema.creditLedgerEntries} where account_id = ${accountId}) as balance,\n coalesce((select jsonb_agg(jsonb_build_object(\n 'grantId', g.id,\n 'label', coalesce(g.metadata->>'creditOfferLabel', 'Promotional credits'),\n 'eligibleModelIds', coalesce(\n (select coalesce(\n case when g.source_type = 'verified_signup_trial' then policy->'signupModelIds'\n else policy->'offers'->(g.metadata->>'creditOfferId')->'eligibleModelIds' end,\n policy->'defaultModelIds'\n ) from current_policy), to_jsonb(g.eligible_model_ids)),\n 'remainingMicros', g.amount_micros - coalesce(used.amount, 0)\n ) order by g.created_at, g.id)\n from ${schema.creditLedgerEntries} g\n left join (\n select grant_entry_id, sum(amount_micros) as amount\n from ${schema.creditDebitAllocations} where account_id = ${accountId}\n group by grant_entry_id\n ) used on used.grant_entry_id = g.id\n where g.account_id = ${accountId} and g.eligible_model_ids is not null\n and g.amount_micros > coalesce(used.amount, 0)\n ), '[]'::jsonb) as grants\n `,\n );\n const balanceMicros = Number(row?.balance ?? 0);\n const promotionalCredits = row?.grants ?? [];\n return {\n accountId,\n creditPolicyRevision: row?.revision ?? 0,\n balanceMicros,\n generalBalanceMicros:\n balanceMicros - promotionalCredits.reduce((sum, grant) => sum + grant.remainingMicros, 0),\n promotionalCredits,\n currency: \"usd\",\n updatedAt: new Date().toISOString(),\n };\n });\n}\n\n/** Missing model means a non-model resource, which can only use general credits. */\nexport function spendableCreditMicros(balance: BillingBalance, modelId?: string): number {\n return (\n Math.max(0, balance.generalBalanceMicros ?? balance.balanceMicros) +\n (balance.promotionalCredits ?? []).reduce(\n (sum, grant) =>\n sum + (modelId && grant.eligibleModelIds.includes(modelId) ? grant.remainingMicros : 0),\n 0,\n )\n );\n}\n\nexport async function getSpendableCreditBalance(\n db: Database,\n accountId: string,\n modelId?: string,\n policyRevision?: number,\n): Promise<CreditBalanceSnapshot> {\n const balance = await getBillingBalance(db, accountId, policyRevision);\n return { ...balance, balanceMicros: spendableCreditMicros(balance, modelId) };\n}\n\nexport function planCreditDebit(\n balance: BillingBalance,\n requestedMicros: number,\n modelId?: string,\n) {\n if (!Number.isSafeInteger(requestedMicros) || requestedMicros <= 0) {\n throw new Error(\"credit debit requires a positive, safe integer micro amount\");\n }\n const debitedMicros = Math.min(requestedMicros, spendableCreditMicros(balance, modelId));\n let remaining = debitedMicros;\n const allocations: { grantEntryId: string; amountMicros: number }[] = [];\n for (const grant of balance.promotionalCredits ?? []) {\n if (!remaining || !modelId || !grant.eligibleModelIds.includes(modelId)) continue;\n const amountMicros = Math.min(remaining, grant.remainingMicros);\n allocations.push({ grantEntryId: grant.grantId, amountMicros });\n remaining -= amountMicros;\n }\n return { debitedMicros, allocations };\n}\n"],"mappings":"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","names":["sql","sql","sql","sql","sql","sql"]}
|
|
1
|
+
{"version":3,"sources":["../src/video-generation.ts","../src/usage-allowances.ts","../src/credit-debit-attribution.ts","../src/credit-balances.ts"],"sourcesContent":["import {\n GENERATED_VIDEO_MAX_BYTES,\n GeneratedVideoReceipt,\n GROK_IMAGINE_VIDEO_1_5_MODEL_ID,\n SEEDANCE_2_5_MODEL_ID,\n VideoGenerationPolicy,\n VideoGenerationOperationSummary,\n retainedGeneratedVideoReferenceFromFile,\n type GeneratedVideoFacts,\n type MediaGenerationResult,\n type VideoGenerationFundingSource,\n type VideoGenerationPolicy as VideoGenerationPolicyValue,\n} from \"@opengeni/contracts\";\nimport { and, eq, inArray, sql } from \"drizzle-orm\";\nimport type { Database } from \"./database\";\nimport { rawRows, withRlsContext, withWorkspaceRls } from \"./database\";\nimport * as schema from \"./schema\";\nimport { checkWorkspaceAllowance } from \"./usage-allowances\";\nimport { creditDebitAttributionForTurn } from \"./credit-debit-attribution\";\nimport { getSpendableCreditBalance } from \"./credit-balances\";\n\nexport const ACTIVE_VIDEO_GENERATION_STATUSES = [\n \"preparing\",\n \"prepared\",\n \"accepted\",\n \"submission_uncertain\",\n \"provider_started\",\n \"retaining\",\n] as const;\n\nexport type VideoGenerationOperation = typeof schema.videoGenerationOperations.$inferSelect;\nexport type VideoGenerationReference = typeof schema.videoGenerationReferences.$inferSelect;\nexport type GeneratedVideoArtifact = typeof schema.generatedVideoArtifacts.$inferSelect;\n\nexport type VideoGenerationOperationWithReferences = VideoGenerationOperation & {\n references: VideoGenerationReference[];\n};\n\nexport class VideoGenerationConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VideoGenerationConflictError\";\n }\n}\n\nexport class VideoGenerationCapacityError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VideoGenerationCapacityError\";\n }\n}\n\nexport class VideoGenerationCreditError extends Error {\n constructor(message = \"insufficient Opengeni credits\") {\n super(message);\n this.name = \"VideoGenerationCreditError\";\n }\n}\n\nexport async function getWorkspaceVideoGenerationPolicy(\n db: Database,\n workspaceId: string,\n): Promise<VideoGenerationPolicyValue> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [row] = await scopedDb\n .select()\n .from(schema.workspaceVideoGenerationPolicies)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, workspaceId))\n .limit(1);\n return policyFromRow(row);\n });\n}\n\nexport async function updateWorkspaceVideoGenerationPolicy(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n subjectId: string;\n expectedRevision: number;\n fundingSource: VideoGenerationFundingSource;\n enabledModelIds: string[];\n defaultModelId: string | null;\n },\n): Promise<VideoGenerationPolicyValue> {\n const requested = VideoGenerationPolicy.parse({\n schemaVersion: 1,\n revision: input.expectedRevision + 1,\n fundingSource: input.fundingSource,\n enabledModelIds: input.enabledModelIds,\n defaultModelId: input.defaultModelId,\n });\n assertSupportedModels(requested.enabledModelIds);\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n const [workspace] = await tx\n .select({ id: schema.workspaces.id })\n .from(schema.workspaces)\n .where(\n and(\n eq(schema.workspaces.id, input.workspaceId),\n eq(schema.workspaces.accountId, input.accountId),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (!workspace) throw new Error(\"Workspace not found\");\n const [current] = await tx\n .select()\n .from(schema.workspaceVideoGenerationPolicies)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, input.workspaceId))\n .for(\"update\")\n .limit(1);\n const currentRevision = current?.revision ?? 0;\n if (currentRevision !== input.expectedRevision) {\n throw new VideoGenerationConflictError(\"Video generation policy changed\");\n }\n const now = new Date();\n const values = {\n workspaceId: input.workspaceId,\n accountId: input.accountId,\n revision: currentRevision + 1,\n fundingSource: requested.fundingSource,\n enabledModelIds: [...requested.enabledModelIds],\n defaultModelId: requested.defaultModelId,\n updatedBySubjectId: input.subjectId.slice(0, 1_024),\n updatedAt: now,\n };\n const [row] = current\n ? await tx\n .update(schema.workspaceVideoGenerationPolicies)\n .set(values)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, input.workspaceId))\n .returning()\n : await tx.insert(schema.workspaceVideoGenerationPolicies).values(values).returning();\n if (!row) throw new Error(\"Video generation policy update was not persisted\");\n return policyFromRow(row);\n }),\n );\n}\n\nexport type AdmitVideoGenerationOperationInput = {\n id: string;\n accountId: string;\n workspaceId: string;\n sessionId: string;\n turnId: string;\n attemptId: string;\n toolCallId: string;\n admissionKey: string;\n requestDigest: string;\n promptDigest: string;\n requestEncrypted: string;\n modelId: string;\n sourceMode: string;\n capabilityRevision: string;\n policyRevision: number;\n fundingSource: VideoGenerationFundingSource;\n pricedCostMicros: number;\n connectionId: string | null;\n credentialVersion: number;\n credentialEncrypted: string;\n providerIdempotencyKey: string;\n expectedArtifactId: string;\n expectedFileId: string;\n reservedBytes?: number;\n workspaceQuotaBytes: number;\n maxConcurrentPerWorkspace: number;\n recoveryDeadlineAt: Date;\n references: Array<{\n ordinal: number;\n role: string;\n contentType: string;\n sizeBytes: number;\n sha256: string;\n stagingObjectKey: string;\n grantExpiresAt?: Date | null;\n cleanupAfter: Date;\n }>;\n};\n\nexport async function admitVideoGenerationOperation(\n db: Database,\n input: AdmitVideoGenerationOperationInput,\n): Promise<{ operation: VideoGenerationOperation; created: boolean }> {\n const reservedBytes = input.reservedBytes ?? GENERATED_VIDEO_MAX_BYTES;\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtextextended(${`video-generation:${input.admissionKey}`}, 0))`,\n );\n const [existing] = await tx\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.admissionKey, input.admissionKey),\n ),\n )\n .limit(1);\n if (existing) {\n assertAdmissionMatches(existing, input);\n return { operation: existing, created: false };\n }\n const [policy] = await tx\n .select()\n .from(schema.workspaceVideoGenerationPolicies)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, input.workspaceId))\n .for(\"update\")\n .limit(1);\n if (\n !policy ||\n policy.revision !== input.policyRevision ||\n policy.fundingSource !== input.fundingSource ||\n !policy.enabledModelIds.includes(input.modelId)\n ) {\n throw new VideoGenerationConflictError(\"Video generation capability changed\");\n }\n const active = await tx\n .select({ id: schema.videoGenerationOperations.id })\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n inArray(schema.videoGenerationOperations.status, [\n ...ACTIVE_VIDEO_GENERATION_STATUSES,\n ]),\n ),\n )\n .for(\"update\");\n if (active.length >= input.maxConcurrentPerWorkspace) {\n throw new VideoGenerationCapacityError(\"Workspace video generation limit reached\");\n }\n await tx\n .insert(schema.workspaceVideoGenerationQuotas)\n .values({\n workspaceId: input.workspaceId,\n accountId: input.accountId,\n })\n .onConflictDoNothing({\n target: schema.workspaceVideoGenerationQuotas.workspaceId,\n });\n const [quota] = await tx\n .select()\n .from(schema.workspaceVideoGenerationQuotas)\n .where(eq(schema.workspaceVideoGenerationQuotas.workspaceId, input.workspaceId))\n .for(\"update\")\n .limit(1);\n if (!quota) throw new Error(\"Video generation quota row disappeared\");\n if (quota.reservedBytes + quota.readyBytes + reservedBytes > input.workspaceQuotaBytes) {\n throw new VideoGenerationCapacityError(\"Workspace video storage quota reached\");\n }\n const [operation] = await tx\n .insert(schema.videoGenerationOperations)\n .values({\n id: input.id,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.sessionId,\n turnId: input.turnId,\n attemptId: input.attemptId,\n toolCallId: input.toolCallId,\n admissionKey: input.admissionKey,\n requestDigest: input.requestDigest,\n promptDigest: input.promptDigest,\n requestEncrypted: input.requestEncrypted,\n modelId: input.modelId,\n sourceMode: input.sourceMode,\n capabilityRevision: input.capabilityRevision,\n fundingSource: input.fundingSource,\n pricedCostMicros: input.pricedCostMicros,\n creditState: input.pricedCostMicros > 0 ? \"debited\" : \"not_applicable\",\n connectionId: input.connectionId,\n credentialVersion: input.credentialVersion,\n credentialEncrypted: input.credentialEncrypted,\n providerIdempotencyKey: input.providerIdempotencyKey,\n expectedArtifactId: input.expectedArtifactId,\n expectedFileId: input.expectedFileId,\n reservedBytes,\n recoveryDeadlineAt: input.recoveryDeadlineAt,\n status: input.references.length === 0 ? \"prepared\" : \"preparing\",\n admissionOutputState: \"pending\",\n terminalUpdateState: \"ineligible\",\n })\n .returning();\n if (!operation) throw new Error(\"Video generation operation was not admitted\");\n if (input.pricedCostMicros > 0) {\n if (input.fundingSource !== \"opengeni_credits\" || input.connectionId !== null) {\n throw new Error(\"Only Opengeni-funded video operations may debit credits\");\n }\n await debitVideoGenerationCredits(tx, operation);\n }\n if (input.references.length > 0) {\n await tx.insert(schema.videoGenerationReferences).values(\n input.references.map((reference) => ({\n operationId: operation.id,\n workspaceId: input.workspaceId,\n accountId: input.accountId,\n grantExpiresAt: reference.grantExpiresAt ?? null,\n ...reference,\n })),\n );\n }\n await tx\n .update(schema.workspaceVideoGenerationQuotas)\n .set({\n reservedBytes: sql`${schema.workspaceVideoGenerationQuotas.reservedBytes} + ${reservedBytes}`,\n updatedAt: new Date(),\n })\n .where(eq(schema.workspaceVideoGenerationQuotas.workspaceId, input.workspaceId));\n return { operation, created: true };\n }),\n );\n}\n\n/** Persist a rotated provider token before it is used for another remote call. */\nexport async function rotateVideoGenerationCredential(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n requestDigest: string;\n expectedCredentialEncrypted: string;\n credentialEncrypted: string;\n },\n): Promise<VideoGenerationOperation> {\n const [row] = await db\n .update(schema.videoGenerationOperations)\n .set({\n credentialEncrypted: input.credentialEncrypted,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.videoGenerationOperations.accountId, input.accountId),\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n eq(schema.videoGenerationOperations.requestDigest, input.requestDigest),\n eq(schema.videoGenerationOperations.credentialEncrypted, input.expectedCredentialEncrypted),\n inArray(schema.videoGenerationOperations.status, [\n \"accepted\",\n \"submission_uncertain\",\n \"provider_started\",\n \"retaining\",\n ]),\n ),\n )\n .returning();\n if (!row) throw new VideoGenerationConflictError(\"Video provider credential changed\");\n return row;\n}\n\n/**\n * Seal a reference-bearing operation only after every immutable staging object\n * has been uploaded and independently verified by the worker. The source\n * sandbox path is intentionally not stored, so a failed preparation can only\n * be retried by the same logical tool call while its sandbox still exists.\n */\nexport async function markVideoGenerationPrepared(\n db: Database,\n input: OperationMutationInput,\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === \"prepared\") return operation;\n if (operation.status !== \"preparing\") throw invalidTransition(operation, \"prepared\");\n const references = await tx\n .select({\n stagingObjectKey: schema.videoGenerationReferences.stagingObjectKey,\n cleanedAt: schema.videoGenerationReferences.cleanedAt,\n })\n .from(schema.videoGenerationReferences)\n .where(eq(schema.videoGenerationReferences.operationId, operation.id));\n if (\n references.length === 0 ||\n references.some((reference) => !reference.stagingObjectKey || reference.cleanedAt)\n ) {\n throw new VideoGenerationConflictError(\"Video references are not sealed\");\n }\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({ status: \"prepared\", updatedAt: new Date() })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"seal video generation references\");\n });\n}\n\n/** Final authorization fence. Call only after the accepted function output is durable. */\nexport async function markVideoGenerationAccepted(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n requestDigest: string;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(\n db,\n input,\n async (tx, operation) =>\n await markVideoGenerationAcceptedInTransaction(tx, {\n workspaceId: input.workspaceId,\n operation,\n }),\n );\n}\n\n/**\n * Transactional half of acceptance. The pending function result and this\n * transition must commit together: the provider reconciler never observes an\n * accepted operation whose model-visible `accepted` receipt was lost.\n */\nexport async function markVideoGenerationAcceptedInTransaction(\n tx: Database,\n input: {\n workspaceId: string;\n operation: VideoGenerationOperation;\n toolCallId?: string;\n },\n): Promise<VideoGenerationOperation> {\n const operation = input.operation;\n if (input.toolCallId !== undefined && operation.toolCallId !== input.toolCallId) {\n throw new VideoGenerationConflictError(\"Video generation tool-call identity changed\");\n }\n if (operation.admissionOutputState === \"recorded\") return operation;\n if (operation.status !== \"prepared\") {\n throw new VideoGenerationConflictError(\"Video generation is no longer awaiting acceptance\");\n }\n const [policy] = await tx\n .select()\n .from(schema.workspaceVideoGenerationPolicies)\n .where(eq(schema.workspaceVideoGenerationPolicies.workspaceId, input.workspaceId))\n .for(\"share\")\n .limit(1);\n const [connection] = operation.connectionId\n ? await tx\n .select({\n id: schema.connections.id,\n version: schema.connections.version,\n status: schema.connections.status,\n metadata: schema.connections.metadata,\n })\n .from(schema.connections)\n .where(\n and(\n eq(schema.connections.workspaceId, input.workspaceId),\n eq(schema.connections.id, operation.connectionId),\n ),\n )\n .for(\"share\")\n .limit(1)\n : [];\n const workspaceGatewayAuthorized =\n operation.fundingSource === \"workspace_gateway\" &&\n connection?.status === \"active\" &&\n connection.version === operation.credentialVersion &&\n connection.metadata.credentialRole === \"vercel_ai_gateway\";\n const managedAuthorized =\n operation.fundingSource === \"opengeni_credits\" &&\n operation.connectionId === null &&\n (operation.creditState === \"debited\" ||\n (operation.creditState === \"not_applicable\" && operation.pricedCostMicros === 0));\n const supergrokAuthorized =\n operation.fundingSource === \"supergrok_subscription\" &&\n operation.connectionId === null &&\n operation.credentialEncrypted !== null &&\n operation.pricedCostMicros === 0 &&\n operation.creditState === \"not_applicable\";\n if (\n !policy ||\n policy.fundingSource !== operation.fundingSource ||\n !policy.enabledModelIds.includes(operation.modelId) ||\n (!workspaceGatewayAuthorized && !managedAuthorized && !supergrokAuthorized)\n ) {\n throw new VideoGenerationConflictError(\"Video generation authorization changed\");\n }\n const now = new Date();\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"accepted\",\n admissionOutputState: \"recorded\",\n terminalUpdateState: \"pending\",\n nextReconcileAt: now,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"record video generation acceptance\");\n}\n\nexport async function cancelVideoGenerationBeforeSubmit(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n requestDigest: string;\n reason: string;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === \"cancelled_before_submit\") return operation;\n if (!inPreSubmitState(operation.status) || operation.providerRequestSentAt) {\n throw new VideoGenerationConflictError(\n \"Video generation may already have reached the provider\",\n );\n }\n const now = new Date();\n await releaseReservedQuota(tx, operation, false);\n const creditState = await refundVideoGenerationCredits(tx, operation, now);\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"cancelled_before_submit\",\n creditState,\n quotaState: \"released\",\n terminalAt: now,\n terminalUpdateState:\n operation.admissionOutputState === \"recorded\" ? \"pending\" : \"suppressed\",\n credentialEncrypted: null,\n requestEncrypted: null,\n boundedPublicReason: boundPublicReason(input.reason),\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n if (!updated) throw new Error(\"Video generation cancellation was not recorded\");\n return updated;\n });\n}\n\n/**\n * Turn-interruption half of pre-submit cancellation. It runs under the same\n * session/turn transaction that closes unresolved tool calls, so an accepted\n * receipt can never race a cancellation of its operation.\n */\nexport async function cancelUnacceptedVideoGenerationsForToolCallsInTransaction(\n tx: Database,\n input: {\n workspaceId: string;\n sessionId: string;\n turnId: string;\n toolCallIds: readonly string[];\n reason: string;\n now: Date;\n },\n): Promise<string[]> {\n const toolCallIds = [...new Set(input.toolCallIds)];\n if (toolCallIds.length === 0) return [];\n const operations = await tx\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.sessionId, input.sessionId),\n eq(schema.videoGenerationOperations.turnId, input.turnId),\n inArray(schema.videoGenerationOperations.toolCallId, toolCallIds),\n eq(schema.videoGenerationOperations.admissionOutputState, \"pending\"),\n inArray(schema.videoGenerationOperations.status, [\"preparing\", \"prepared\"]),\n sql`${schema.videoGenerationOperations.providerRequestSentAt} is null`,\n ),\n )\n .orderBy(schema.videoGenerationOperations.id)\n .for(\"update\");\n const cancelled: string[] = [];\n for (const operation of operations) {\n await releaseReservedQuota(tx, operation, false);\n const creditState = await refundVideoGenerationCredits(tx, operation, input.now);\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"cancelled_before_submit\",\n creditState,\n quotaState: \"released\",\n terminalAt: input.now,\n terminalUpdateState: \"suppressed\",\n nextReconcileAt: input.now,\n providerRequestEncrypted: null,\n providerRequestExpiresAt: null,\n credentialEncrypted: null,\n requestEncrypted: null,\n privateDataEraseAfter: input.now,\n boundedPublicReason: boundPublicReason(input.reason),\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: input.now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning({ id: schema.videoGenerationOperations.id });\n if (!updated) throw new Error(\"Interrupted video generation was not cancelled\");\n await tx\n .update(schema.videoGenerationReferences)\n .set({ cleanupAfter: input.now })\n .where(eq(schema.videoGenerationReferences.operationId, operation.id));\n cancelled.push(updated.id);\n }\n return cancelled;\n}\n\nexport async function claimVideoGenerationOperations(\n db: Database,\n input: { owner: string; leaseSeconds: number; limit: number },\n): Promise<Array<{ operationId: string; accountId: string; workspaceId: string }>> {\n const rows = await rawRows<{\n operation_id: string;\n account_id: string;\n workspace_id: string;\n }>(\n db,\n sql`select * from opengeni_private.claim_video_generation_operations(\n ${input.owner}, ${input.leaseSeconds}, ${input.limit}\n )`,\n );\n return rows.map((row) => ({\n operationId: row.operation_id,\n accountId: row.account_id,\n workspaceId: row.workspace_id,\n }));\n}\n\nexport async function getVideoGenerationOperation(\n db: Database,\n workspaceId: string,\n operationId: string,\n): Promise<VideoGenerationOperationWithReferences | null> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [operation] = await scopedDb\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, workspaceId),\n eq(schema.videoGenerationOperations.id, operationId),\n ),\n )\n .limit(1);\n if (!operation) return null;\n const references = await scopedDb\n .select()\n .from(schema.videoGenerationReferences)\n .where(eq(schema.videoGenerationReferences.operationId, operationId))\n .orderBy(schema.videoGenerationReferences.ordinal);\n return { ...operation, references };\n });\n}\n\nexport async function markVideoGenerationSubmissionUncertain(\n db: Database,\n input: OperationMutationInput & { nextReconcileAt: Date; error: string },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status !== \"submission_uncertain\" || !operation.providerRequestEncrypted) {\n throw invalidTransition(operation, \"submission_uncertain\");\n }\n const now = new Date();\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"submission_uncertain\",\n providerRequestSentAt: operation.providerRequestSentAt ?? now,\n nextReconcileAt: input.nextReconcileAt,\n lastError: boundPrivateError(input.error),\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"record uncertain video submission\");\n });\n}\n\n/**\n * Freeze the exact provider start body before issuing the request. If the\n * worker disappears after this transaction, recovery replays the same body\n * and idempotency key rather than reminting URLs or changing request bytes.\n */\nexport async function markVideoGenerationSubmissionIntent(\n db: Database,\n input: OperationMutationInput & {\n encryptedProviderRequest: string;\n providerRequestExpiresAt: Date;\n nextReconcileAt: Date;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === \"submission_uncertain\") {\n if (!operation.providerRequestEncrypted || !operation.providerRequestExpiresAt) {\n throw new VideoGenerationConflictError(\"Video provider request is incomplete\");\n }\n return operation;\n }\n if (operation.status !== \"accepted\") {\n throw invalidTransition(operation, \"submission_uncertain\");\n }\n const now = new Date();\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"submission_uncertain\",\n providerRequestEncrypted: input.encryptedProviderRequest,\n providerRequestExpiresAt: input.providerRequestExpiresAt,\n nextReconcileAt: input.nextReconcileAt,\n lastError: null,\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n await tx\n .update(schema.videoGenerationReferences)\n .set({\n grantExpiresAt: input.providerRequestExpiresAt,\n cleanupAfter: new Date(\n Math.max(\n operation.recoveryDeadlineAt.getTime(),\n input.providerRequestExpiresAt.getTime(),\n ),\n ),\n })\n .where(eq(schema.videoGenerationReferences.operationId, operation.id));\n return requireRow(updated, \"record video provider submission intent\");\n });\n}\n\nexport async function markVideoGenerationProviderStarted(\n db: Database,\n input: OperationMutationInput & {\n providerJobId: string;\n nextReconcileAt: Date;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (\n operation.providerJobId === input.providerJobId &&\n operation.status === \"provider_started\"\n ) {\n return operation;\n }\n if (!inArrayValue(operation.status, [\"accepted\", \"submission_uncertain\"])) {\n throw invalidTransition(operation, \"provider_started\");\n }\n const now = new Date();\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"provider_started\",\n providerJobId: input.providerJobId.slice(0, 1_024),\n providerRequestEncrypted: null,\n providerRequestExpiresAt: null,\n providerRequestSentAt: operation.providerRequestSentAt ?? now,\n providerStartedAt: operation.providerStartedAt ?? now,\n nextReconcileAt: input.nextReconcileAt,\n lastError: null,\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"record video provider job\");\n });\n}\n\nexport async function rescheduleVideoGenerationOperation(\n db: Database,\n input: OperationMutationInput & {\n owner?: string;\n nextReconcileAt: Date;\n error?: string;\n },\n): Promise<boolean> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const [updated] = await scopedDb\n .update(schema.videoGenerationOperations)\n .set({\n nextReconcileAt: input.nextReconcileAt,\n ...(input.error ? { lastError: boundPrivateError(input.error) } : {}),\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n eq(schema.videoGenerationOperations.requestDigest, input.requestDigest),\n ...(input.owner\n ? [eq(schema.videoGenerationOperations.reconcileLeaseOwner, input.owner)]\n : []),\n ),\n )\n .returning({ id: schema.videoGenerationOperations.id });\n return updated !== undefined;\n },\n );\n}\n\nexport async function markVideoGenerationRetaining(\n db: Database,\n input: OperationMutationInput,\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === \"retaining\") return operation;\n if (operation.status !== \"provider_started\") throw invalidTransition(operation, \"retaining\");\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"retaining\",\n nextReconcileAt: new Date(),\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: new Date(),\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"begin video retention\");\n });\n}\n\nexport async function settleVideoGenerationFailure(\n db: Database,\n input: OperationMutationInput & {\n status: \"provider_failed\" | \"retention_failed\" | \"outcome_unknown\";\n publicReason: string;\n privateError?: string;\n },\n): Promise<VideoGenerationOperation> {\n return await mutateOperation(db, input, async (tx, operation) => {\n if (operation.status === input.status) return operation;\n const allowed =\n input.status === \"provider_failed\"\n ? [\"accepted\", \"submission_uncertain\", \"provider_started\"]\n : input.status === \"retention_failed\"\n ? [\"retaining\"]\n : [\"submission_uncertain\", \"provider_started\"];\n if (!inArrayValue(operation.status, allowed)) throw invalidTransition(operation, input.status);\n await releaseReservedQuota(tx, operation, false);\n const now = new Date();\n const creditState = await refundVideoGenerationCredits(tx, operation, now);\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: input.status,\n creditState,\n quotaState: \"released\",\n terminalAt: now,\n nextReconcileAt: null,\n terminalUpdateState:\n operation.admissionOutputState === \"recorded\" ? \"pending\" : \"suppressed\",\n providerRequestEncrypted: null,\n providerRequestExpiresAt: null,\n credentialEncrypted: null,\n requestEncrypted: null,\n boundedPublicReason: boundPublicReason(input.publicReason),\n lastError: input.privateError ? boundPrivateError(input.privateError) : null,\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n privateDataEraseAfter: now,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return requireRow(updated, \"settle failed video generation\");\n });\n}\n\nexport type SettleVideoGenerationReadyInput = OperationMutationInput & {\n fileId: string;\n bucket: string;\n objectKey: string;\n sizeBytes: number;\n sha256: string;\n facts: GeneratedVideoFacts;\n};\n\nexport async function settleVideoGenerationReady(\n db: Database,\n input: SettleVideoGenerationReadyInput,\n): Promise<{\n operation: VideoGenerationOperation;\n artifact: GeneratedVideoArtifact;\n}> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n const [operation] = await tx\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n eq(schema.videoGenerationOperations.requestDigest, input.requestDigest),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (!operation) throw new VideoGenerationConflictError(\"Video operation not found\");\n const [existingArtifact] = await tx\n .select()\n .from(schema.generatedVideoArtifacts)\n .where(eq(schema.generatedVideoArtifacts.operationId, operation.id))\n .limit(1);\n if (operation.status === \"completed\" && existingArtifact) {\n return { operation, artifact: existingArtifact };\n }\n if (operation.status !== \"retaining\") throw invalidTransition(operation, \"completed\");\n if (operation.expectedFileId !== input.fileId) {\n throw new VideoGenerationConflictError(\"Video File identity changed during settlement\");\n }\n if (operation.expectedArtifactId === operation.expectedFileId) {\n throw new Error(\"Video artifact and File identities must be distinct\");\n }\n // The durable provider operation owns this write, including when its\n // original session has since disappeared. Ordinary file reads stay scoped.\n await tx.execute(\n sql`SELECT set_config('opengeni.private_file_owner',${operation.privateFileOwnerSubjectId ?? \"\"},true)`,\n );\n const now = new Date();\n await tx.insert(schema.files).values({\n id: input.fileId,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n status: \"ready\",\n filename: `generated-video-${operation.expectedArtifactId}.mp4`,\n safeFilename: `generated-video-${operation.expectedArtifactId}.mp4`,\n contentType: \"video/mp4\",\n sizeBytes: input.sizeBytes,\n sha256: input.sha256,\n bucket: input.bucket,\n objectKey: input.objectKey,\n updatedAt: now,\n });\n const [artifact] = await tx\n .insert(schema.generatedVideoArtifacts)\n .values({\n id: operation.expectedArtifactId,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n primaryFileId: input.fileId,\n operationId: operation.id,\n sessionId: operation.sessionId,\n turnId: operation.turnId,\n attemptId: operation.attemptId,\n modelId: operation.modelId,\n sourceMode: operation.sourceMode,\n promptDigest: operation.promptDigest,\n contentType: \"video/mp4\",\n sizeBytes: input.sizeBytes,\n sha256: input.sha256,\n durationMillis: Math.round(input.facts.durationSeconds * 1_000),\n width: input.facts.width,\n height: input.facts.height,\n fpsMilli: Math.round(input.facts.fps * 1_000),\n videoCodec: input.facts.videoCodec,\n audioCodec: input.facts.audioCodec,\n hasAudio: input.facts.hasAudio,\n sandboxFilename: `generated-video-${operation.expectedArtifactId}.mp4`,\n readyAt: now,\n })\n .returning();\n if (!artifact) throw new Error(\"Generated video artifact was not persisted\");\n await tx\n .update(schema.workspaceVideoGenerationQuotas)\n .set({\n reservedBytes: sql`${schema.workspaceVideoGenerationQuotas.reservedBytes} - ${operation.reservedBytes}`,\n readyBytes: sql`${schema.workspaceVideoGenerationQuotas.readyBytes} + ${input.sizeBytes}`,\n updatedAt: now,\n })\n .where(eq(schema.workspaceVideoGenerationQuotas.workspaceId, input.workspaceId));\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n status: \"completed\",\n quotaState: \"ready\",\n terminalAt: now,\n nextReconcileAt: null,\n terminalUpdateState:\n operation.admissionOutputState === \"recorded\" ? \"pending\" : \"suppressed\",\n providerRequestEncrypted: null,\n providerRequestExpiresAt: null,\n credentialEncrypted: null,\n requestEncrypted: null,\n boundedPublicReason: null,\n lastError: null,\n privateDataEraseAfter: now,\n reconcileLeaseOwner: null,\n reconcileLeaseExpiresAt: null,\n updatedAt: now,\n })\n .where(eq(schema.videoGenerationOperations.id, operation.id))\n .returning();\n return {\n operation: requireRow(updated, \"settle ready video generation\"),\n artifact,\n };\n }),\n );\n}\n\nexport async function getGeneratedVideoArtifact(\n db: Database,\n workspaceId: string,\n artifactId: string,\n): Promise<{\n artifact: GeneratedVideoArtifact;\n file: typeof schema.files.$inferSelect;\n} | null> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [row] = await scopedDb\n .select({ artifact: schema.generatedVideoArtifacts, file: schema.files })\n .from(schema.generatedVideoArtifacts)\n .innerJoin(schema.files, eq(schema.files.id, schema.generatedVideoArtifacts.primaryFileId))\n .where(\n and(\n eq(schema.generatedVideoArtifacts.workspaceId, workspaceId),\n eq(schema.generatedVideoArtifacts.id, artifactId),\n ),\n )\n .limit(1);\n return row ?? null;\n });\n}\n\nexport async function listSessionGeneratedVideoArtifacts(\n db: Database,\n workspaceId: string,\n sessionId: string,\n): Promise<\n Array<{\n artifact: GeneratedVideoArtifact;\n file: typeof schema.files.$inferSelect;\n }>\n> {\n return await withWorkspaceRls(\n db,\n workspaceId,\n async (scopedDb) =>\n await scopedDb\n .select({\n artifact: schema.generatedVideoArtifacts,\n file: schema.files,\n })\n .from(schema.generatedVideoArtifacts)\n .innerJoin(schema.files, eq(schema.files.id, schema.generatedVideoArtifacts.primaryFileId))\n .where(\n and(\n eq(schema.generatedVideoArtifacts.workspaceId, workspaceId),\n eq(schema.generatedVideoArtifacts.sessionId, sessionId),\n sql`${schema.generatedVideoArtifacts.deletedAt} is null`,\n ),\n )\n .orderBy(schema.generatedVideoArtifacts.createdAt, schema.generatedVideoArtifacts.id),\n );\n}\n\n/**\n * Record one staging object as erased only after the object-store delete has\n * succeeded. Deleting first is safe because object deletion is idempotent; a\n * crash before this CAS simply repeats the same delete on recovery.\n */\nexport async function markVideoGenerationReferenceCleaned(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n ordinal: number;\n stagingObjectKey: string;\n },\n): Promise<boolean> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const [updated] = await scopedDb\n .update(schema.videoGenerationReferences)\n .set({\n stagingObjectKey: null,\n grantExpiresAt: null,\n cleanupAfter: null,\n cleanedAt: new Date(),\n })\n .where(\n and(\n eq(schema.videoGenerationReferences.workspaceId, input.workspaceId),\n eq(schema.videoGenerationReferences.operationId, input.operationId),\n eq(schema.videoGenerationReferences.ordinal, input.ordinal),\n eq(schema.videoGenerationReferences.stagingObjectKey, input.stagingObjectKey),\n ),\n )\n .returning({\n operationId: schema.videoGenerationReferences.operationId,\n });\n if (updated) return true;\n const [existing] = await scopedDb\n .select({ cleanedAt: schema.videoGenerationReferences.cleanedAt })\n .from(schema.videoGenerationReferences)\n .where(\n and(\n eq(schema.videoGenerationReferences.workspaceId, input.workspaceId),\n eq(schema.videoGenerationReferences.operationId, input.operationId),\n eq(schema.videoGenerationReferences.ordinal, input.ordinal),\n ),\n )\n .limit(1);\n return existing?.cleanedAt !== null && existing?.cleanedAt !== undefined;\n },\n );\n}\n\nexport async function markVideoGenerationTerminalUpdate(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n operationId: string;\n state: \"leased\" | \"delivered\" | \"suppressed\";\n updateId?: string;\n },\n): Promise<boolean> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n return await markVideoGenerationTerminalUpdateInTransaction(scopedDb, input);\n },\n );\n}\n\nexport async function markVideoGenerationTerminalUpdateInTransaction(\n tx: Database,\n input: {\n workspaceId: string;\n operationId: string;\n state: \"leased\" | \"delivered\" | \"suppressed\";\n updateId?: string;\n },\n): Promise<boolean> {\n const allowed =\n input.state === \"leased\"\n ? [\"pending\", \"leased\"]\n : input.state === \"delivered\"\n ? [\"leased\"]\n : [\"pending\", \"leased\"];\n const [updated] = await tx\n .update(schema.videoGenerationOperations)\n .set({\n terminalUpdateState: input.state,\n terminalUpdateId: input.state === \"suppressed\" ? null : (input.updateId ?? null),\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n inArray(schema.videoGenerationOperations.terminalUpdateState, allowed),\n ...(input.state === \"delivered\" && input.updateId\n ? [eq(schema.videoGenerationOperations.terminalUpdateId, input.updateId)]\n : []),\n ),\n )\n .returning({ id: schema.videoGenerationOperations.id });\n return updated !== undefined;\n}\n\nexport function mediaGenerationResultForOperation(input: {\n operation: VideoGenerationOperation;\n readyReceipt?: Extract<MediaGenerationResult, { status: \"ready\" }>[\"receipt\"];\n}): MediaGenerationResult {\n if (input.operation.status === \"completed\" && input.readyReceipt) {\n return {\n type: \"media_generation_result\",\n schemaVersion: 1,\n status: \"ready\",\n operationId: input.operation.id,\n receipt: input.readyReceipt,\n };\n }\n const failureStatus = input.operation.status;\n if (\n !inArrayValue(failureStatus, [\n \"provider_failed\",\n \"retention_failed\",\n \"cancelled_before_submit\",\n \"outcome_unknown\",\n ])\n ) {\n throw new Error(\"Video generation operation is not terminal\");\n }\n return {\n type: \"media_generation_result\",\n schemaVersion: 1,\n status: failureStatus,\n operationId: input.operation.id,\n boundedPublicReason:\n input.operation.boundedPublicReason ?? \"Video generation did not complete.\",\n } as MediaGenerationResult;\n}\n\n/** Build the compact public/model terminal envelope from durable canonical rows. */\nexport async function mediaGenerationResultForStoredOperation(\n db: Database,\n operation: VideoGenerationOperation,\n): Promise<MediaGenerationResult> {\n if (operation.status !== \"completed\") {\n return mediaGenerationResultForOperation({ operation });\n }\n const retained = await getGeneratedVideoArtifact(\n db,\n operation.workspaceId,\n operation.expectedArtifactId,\n );\n if (!retained || retained.artifact.deletedAt) {\n throw new Error(\"Completed video generation lost its retained artifact\");\n }\n const artifact = retainedGeneratedVideoReferenceFromFile({\n id: retained.artifact.id,\n workspaceId: retained.artifact.workspaceId,\n status: retained.file.status,\n contentType: retained.file.contentType,\n sizeBytes: retained.file.sizeBytes,\n sha256: retained.file.sha256,\n updatedAt: retained.artifact.readyAt.toISOString(),\n width: retained.artifact.width,\n height: retained.artifact.height,\n });\n if (!artifact) throw new Error(\"Generated video receipt could not be constructed\");\n const receipt = GeneratedVideoReceipt.parse({\n type: \"generated_video\",\n schemaVersion: 1,\n operationId: operation.id,\n artifact,\n video: {\n durationSeconds: retained.artifact.durationMillis / 1_000,\n width: retained.artifact.width,\n height: retained.artifact.height,\n fps: retained.artifact.fpsMilli / 1_000,\n hasAudio: retained.artifact.hasAudio,\n videoCodec: retained.artifact.videoCodec,\n audioCodec: retained.artifact.audioCodec,\n },\n sandboxPath: `/workspace/generated-videos/${retained.artifact.sandboxFilename}`,\n });\n return mediaGenerationResultForOperation({\n operation,\n readyReceipt: receipt,\n });\n}\n\nexport async function getVideoGenerationOperationSummary(\n db: Database,\n workspaceId: string,\n operationId: string,\n): Promise<import(\"@opengeni/contracts\").VideoGenerationOperationSummary | null> {\n const operation = await getVideoGenerationOperation(db, workspaceId, operationId);\n if (!operation) return null;\n if (operation.privateFileOwnerSubjectId) {\n const [context] = await withWorkspaceRls(db, workspaceId, (tx) =>\n rawRows<{ owner: string | null }>(\n tx,\n sql`SELECT nullif(current_setting('opengeni.private_file_owner',true),'') AS owner`,\n ),\n );\n if (context?.owner !== operation.privateFileOwnerSubjectId) return null;\n }\n const terminal = inArrayValue(operation.status, [\n \"completed\",\n \"provider_failed\",\n \"cancelled_before_submit\",\n \"outcome_unknown\",\n \"retention_failed\",\n ])\n ? await mediaGenerationResultForStoredOperation(db, operation)\n : null;\n return VideoGenerationOperationSummary.parse({\n schemaVersion: 1,\n operationId: operation.id,\n modelId: operation.modelId,\n status: operation.status === \"submission_uncertain\" ? \"accepted\" : operation.status,\n createdAt: operation.createdAt.toISOString(),\n updatedAt: operation.updatedAt.toISOString(),\n terminal,\n });\n}\n\ntype OperationMutationInput = {\n accountId: string;\n workspaceId: string;\n operationId: string;\n requestDigest: string;\n};\n\nasync function mutateOperation<T>(\n db: Database,\n input: OperationMutationInput,\n mutate: (tx: Database, operation: VideoGenerationOperation) => Promise<T>,\n): Promise<T> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (txRaw) => {\n const tx = txRaw as unknown as Database;\n const [operation] = await tx\n .select()\n .from(schema.videoGenerationOperations)\n .where(\n and(\n eq(schema.videoGenerationOperations.workspaceId, input.workspaceId),\n eq(schema.videoGenerationOperations.id, input.operationId),\n eq(schema.videoGenerationOperations.requestDigest, input.requestDigest),\n ),\n )\n .for(\"update\")\n .limit(1);\n if (!operation) throw new VideoGenerationConflictError(\"Video operation not found\");\n return await mutate(tx, operation);\n }),\n );\n}\n\nasync function releaseReservedQuota(\n tx: Database,\n operation: VideoGenerationOperation,\n ready: boolean,\n): Promise<void> {\n if (operation.quotaState !== \"reserved\") return;\n await tx\n .update(schema.workspaceVideoGenerationQuotas)\n .set({\n reservedBytes: sql`${schema.workspaceVideoGenerationQuotas.reservedBytes} - ${operation.reservedBytes}`,\n ...(ready\n ? {\n readyBytes: sql`${schema.workspaceVideoGenerationQuotas.readyBytes} + ${operation.reservedBytes}`,\n }\n : {}),\n updatedAt: new Date(),\n })\n .where(eq(schema.workspaceVideoGenerationQuotas.workspaceId, operation.workspaceId));\n}\n\nasync function debitVideoGenerationCredits(\n tx: Database,\n operation: VideoGenerationOperation,\n): Promise<void> {\n if (operation.pricedCostMicros <= 0 || operation.fundingSource !== \"opengeni_credits\") {\n throw new Error(\"Managed video credit debit has an invalid funding binding\");\n }\n if (!operation.turnId) {\n throw new VideoGenerationCreditError(\"Paid video initiating turn is unavailable\");\n }\n // Model settlement locks the account before the ledger trigger's workspace\n // allowance fence. Preserve that order during prepaid media admission.\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${operation.accountId}))`);\n const attribution = await creditDebitAttributionForTurn(tx, {\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n turnId: operation.turnId,\n });\n const refusal = await checkWorkspaceAllowance(tx, {\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n subjectId: attribution.kind === \"turn\" ? attribution.initiatingHumanSubjectId : null,\n });\n if (refusal) throw Object.assign(new VideoGenerationCreditError(refusal.message), refusal);\n const { balanceMicros } = await getSpendableCreditBalance(tx, operation.accountId);\n if (!Number.isSafeInteger(balanceMicros) || balanceMicros < operation.pricedCostMicros) {\n throw new VideoGenerationCreditError();\n }\n const now = new Date();\n const inserted = await tx\n .insert(schema.creditLedgerEntries)\n .values({\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n type: \"video_generation_debit\",\n amountMicros: -operation.pricedCostMicros,\n sourceType: \"video_generation_operation\",\n sourceId: operation.id,\n idempotencyKey: `credit:video_generation_debit:${operation.id}`,\n metadata: {\n turnId: operation.turnId,\n modelId: operation.modelId,\n sourceMode: operation.sourceMode,\n pricedCostMicros: operation.pricedCostMicros,\n },\n occurredAt: now,\n })\n .onConflictDoNothing({ target: schema.creditLedgerEntries.idempotencyKey })\n .returning({ id: schema.creditLedgerEntries.id });\n if (inserted.length !== 1) {\n throw new VideoGenerationConflictError(\"Video generation credit debit already exists\");\n }\n await tx\n .insert(schema.usageEvents)\n .values({\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n eventType: \"video_generation.cost\",\n quantity: operation.pricedCostMicros,\n unit: \"usd_micros\",\n sourceResourceType: \"video_generation_operation\",\n sourceResourceId: operation.id,\n sessionId: operation.sessionId,\n turnId: operation.turnId,\n turnAttemptId: operation.attemptId,\n idempotencyKey: `usage:video_generation.cost:${operation.id}`,\n occurredAt: now,\n })\n .onConflictDoNothing({ target: schema.usageEvents.idempotencyKey });\n}\n\nasync function refundVideoGenerationCredits(\n tx: Database,\n operation: VideoGenerationOperation,\n now: Date,\n): Promise<VideoGenerationOperation[\"creditState\"]> {\n if (operation.creditState !== \"debited\") return operation.creditState;\n if (operation.fundingSource !== \"opengeni_credits\" || operation.pricedCostMicros <= 0) {\n throw new Error(\"Video generation credit refund has an invalid funding binding\");\n }\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${operation.accountId}))`);\n const inserted = await tx\n .insert(schema.creditLedgerEntries)\n .values({\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n type: \"video_generation_refund\",\n amountMicros: operation.pricedCostMicros,\n sourceType: \"video_generation_operation\",\n sourceId: operation.id,\n idempotencyKey: `credit:video_generation_refund:${operation.id}`,\n metadata: {\n turnId: operation.turnId,\n modelId: operation.modelId,\n sourceMode: operation.sourceMode,\n pricedCostMicros: operation.pricedCostMicros,\n },\n occurredAt: now,\n })\n .onConflictDoNothing({ target: schema.creditLedgerEntries.idempotencyKey })\n .returning({ id: schema.creditLedgerEntries.id });\n if (inserted.length !== 1) {\n throw new VideoGenerationConflictError(\"Video generation credit refund already exists\");\n }\n await tx\n .insert(schema.usageEvents)\n .values({\n accountId: operation.accountId,\n workspaceId: operation.workspaceId,\n eventType: \"video_generation.refund\",\n quantity: operation.pricedCostMicros,\n unit: \"usd_micros\",\n sourceResourceType: \"video_generation_operation\",\n sourceResourceId: operation.id,\n sessionId: operation.sessionId,\n turnId: operation.turnId,\n turnAttemptId: operation.attemptId,\n idempotencyKey: `usage:video_generation.refund:${operation.id}`,\n occurredAt: now,\n })\n .onConflictDoNothing({ target: schema.usageEvents.idempotencyKey });\n return \"refunded\";\n}\n\nfunction policyFromRow(\n row: typeof schema.workspaceVideoGenerationPolicies.$inferSelect | undefined,\n): VideoGenerationPolicyValue {\n return VideoGenerationPolicy.parse(\n row\n ? {\n schemaVersion: 1,\n revision: row.revision,\n fundingSource: row.fundingSource,\n enabledModelIds: row.enabledModelIds,\n defaultModelId: row.defaultModelId,\n }\n : {\n schemaVersion: 1,\n revision: 0,\n fundingSource: \"workspace_gateway\",\n enabledModelIds: [],\n defaultModelId: null,\n },\n );\n}\n\nfunction assertSupportedModels(modelIds: readonly string[]): void {\n for (const modelId of modelIds) {\n if (modelId !== SEEDANCE_2_5_MODEL_ID && modelId !== GROK_IMAGINE_VIDEO_1_5_MODEL_ID) {\n throw new Error(`Unknown video generation model: ${modelId}`);\n }\n }\n}\n\nfunction assertAdmissionMatches(\n operation: VideoGenerationOperation,\n input: AdmitVideoGenerationOperationInput,\n): void {\n if (\n operation.requestDigest !== input.requestDigest ||\n operation.toolCallId !== input.toolCallId ||\n operation.sessionId !== input.sessionId ||\n operation.turnId !== input.turnId ||\n operation.fundingSource !== input.fundingSource ||\n operation.pricedCostMicros !== input.pricedCostMicros\n ) {\n throw new VideoGenerationConflictError(\n \"Video generation admission key was reused with different arguments\",\n );\n }\n}\n\nfunction inPreSubmitState(status: string): boolean {\n return inArrayValue(status, [\"preparing\", \"prepared\", \"accepted\"]);\n}\n\nfunction inArrayValue<T extends string>(value: string, candidates: readonly T[]): value is T {\n return (candidates as readonly string[]).includes(value);\n}\n\nfunction invalidTransition(operation: VideoGenerationOperation, target: string): Error {\n return new VideoGenerationConflictError(\n `Invalid video generation transition ${operation.status} -> ${target}`,\n );\n}\n\nfunction requireRow<T>(value: T | undefined, action: string): T {\n if (!value) throw new Error(`Failed to ${action}`);\n return value;\n}\n\nfunction boundPublicReason(value: string): string {\n const normalized = value.replace(/\\s+/gu, \" \").trim();\n return (normalized || \"Video generation did not complete.\").slice(0, 1_000);\n}\n\nfunction boundPrivateError(value: string): string {\n return value.replace(/\\s+/gu, \" \").trim().slice(0, 4_096);\n}\n","import { sql } from \"drizzle-orm\";\nimport { rawRows, setSubjectRlsContext, withRlsContext, type Database } from \"./database\";\nimport { currentCreditDebitAttribution } from \"./credit-debit-attribution\";\n\n/** All amounts are integer USD micros, never dollars or floating-point credits. */\nexport type MemberAllowanceRule = { share: number } | { credits: number } | null;\nexport type WorkspaceAllowanceConfig = {\n includedCredits: number;\n period: \"monthly\" | \"none\";\n anchorDay?: number;\n memberDefault?: \"none\" | \"equal_share\" | Exclude<MemberAllowanceRule, null>;\n thresholds?: { workspace?: number[]; member?: number[] };\n};\nexport type WorkspaceAllowance = WorkspaceAllowanceConfig & { version: number };\nexport type WorkspaceAllowanceState = { version: number; config: WorkspaceAllowance | null };\nexport type AllowanceStatus = \"ok\" | \"warning\" | \"exhausted\";\nexport type AllowanceUsage = {\n limit: number | null;\n used: number;\n remaining: number | null;\n fraction: number | null;\n status: AllowanceStatus;\n resetsAt: string | null;\n};\nexport type MemberAllowance = {\n subjectId: string;\n rule: MemberAllowanceRule;\n version: number;\n};\nexport type WorkspaceUsage = {\n period: { start: string | null; end: string | null };\n workspace: AllowanceUsage & { includedCredits: number; grantsRemaining: number };\n members: (AllowanceUsage &\n MemberAllowance & {\n externalIdentity: { source: string; externalId: string } | null;\n })[];\n nextCursor: string | null;\n};\nexport type AllowanceExhausted = {\n code: \"allowance_exhausted\";\n scope: \"workspace\" | \"member\";\n resetsAt: string | null;\n subjectId?: string;\n message: string;\n};\ntype Scope = { accountId: string; workspaceId: string };\ntype Actor = { actorSubjectId: string; actorType?: string | undefined };\n\nexport class UsageAllowanceVersionConflictError extends Error {\n constructor() {\n super(\"Usage allowance version conflict\");\n this.name = \"UsageAllowanceVersionConflictError\";\n }\n}\n\nfunction amount(value: number, name: string, positive = false): void {\n if (!Number.isSafeInteger(value) || value < (positive ? 1 : 0)) {\n throw new Error(\n `${name} must be ${positive ? \"a positive\" : \"a non-negative\"} safe integer in USD micros`,\n );\n }\n}\n\nexport function validateMemberAllowanceRule(rule: MemberAllowanceRule): void {\n if (rule === null) return;\n if (\"credits\" in rule) {\n if (Object.keys(rule).length !== 1)\n throw new Error(\"Member rule must have only credits or share\");\n amount(rule.credits, \"credits\");\n } else if (\"share\" in rule) {\n if (Object.keys(rule).length !== 1 || !Number.isFinite(rule.share) || rule.share < 0) {\n throw new Error(\"share must be a finite non-negative number\");\n }\n } else {\n throw new Error(\"Member rule must have credits or share\");\n }\n}\n\nexport function validateWorkspaceAllowanceConfig(config: WorkspaceAllowanceConfig): void {\n amount(config.includedCredits, \"includedCredits\");\n if (config.period !== \"monthly\" && config.period !== \"none\")\n throw new Error(\"Invalid allowance period\");\n if (\n config.anchorDay !== undefined &&\n (!Number.isInteger(config.anchorDay) || config.anchorDay < 1 || config.anchorDay > 31)\n ) {\n throw new Error(\"anchorDay must be an integer from 1 to 31\");\n }\n if (\n config.memberDefault !== undefined &&\n config.memberDefault !== \"none\" &&\n config.memberDefault !== \"equal_share\"\n ) {\n validateMemberAllowanceRule(config.memberDefault);\n }\n for (const list of [config.thresholds?.workspace, config.thresholds?.member]) {\n if (\n list !== undefined &&\n (list.length > 16 ||\n list.some((threshold) => !Number.isFinite(threshold) || threshold <= 0 || threshold > 1))\n ) {\n throw new Error(\n \"thresholds must contain at most 16 fractions greater than zero and at most one\",\n );\n }\n }\n}\n\nasync function command<T>(db: Database, input: Scope & Record<string, unknown>): Promise<T> {\n if (\n [\"set\", \"clear\", \"member\", \"grant\"].includes(String(input.action)) &&\n currentCreditDebitAttribution().kind === \"turn\"\n ) {\n // This context is installed by the authenticated request boundary, not\n // supplied in the allowance command. Agent attempts cannot substitute\n // human-looking actor labels to author allowance policy.\n throw new Error(\"Agent attempts cannot change usage allowances\");\n }\n try {\n const mutation = [\"set\", \"clear\", \"member\", \"grant\"].includes(String(input.action));\n return await withRlsContext(\n db,\n input,\n async (scoped) => {\n if (mutation) {\n // The organization lifecycle can hold this fence while waiting for\n // exclusive tenancy. Never acquire shared tenancy ahead of it.\n await scoped.execute(sql`select pg_advisory_xact_lock(\n hashtextextended(${`organization-membership:${input.accountId}`},0))`);\n await scoped.execute(sql`select pg_advisory_xact_lock_shared(\n hashtextextended(${`session-tenancy:${input.workspaceId}`},0))`);\n }\n if (typeof input.actorSubjectId === \"string\")\n await setSubjectRlsContext(scoped, input.actorSubjectId);\n const [row] = await rawRows<{ result: T }>(\n scoped,\n sql`select usage_allowance_command(${JSON.stringify(input)}::jsonb) as result`,\n );\n if (!row) throw new Error(\"Usage allowance command returned no result\");\n return row.result;\n },\n undefined,\n mutation ? \"none\" : \"shared\",\n );\n } catch (error) {\n const cause = error as { code?: string; cause?: { code?: string } };\n if ((cause.code ?? cause.cause?.code) === \"40001\")\n throw new UsageAllowanceVersionConflictError();\n throw error;\n }\n}\n\nfunction actor(input: Actor): Actor & { actorType: string } {\n return { actorSubjectId: input.actorSubjectId, actorType: input.actorType ?? \"subject\" };\n}\nfunction version(value: number): void {\n amount(value, \"expectedVersion\");\n}\n\nexport async function getWorkspaceAllowance(\n db: Database,\n input: Scope,\n): Promise<WorkspaceAllowance | null> {\n return await command(db, { ...input, action: \"get\" });\n}\n\n/** Includes the lifecycle revision even when no configuration exists. */\nexport async function getWorkspaceAllowanceState(\n db: Database,\n input: Scope,\n): Promise<WorkspaceAllowanceState> {\n return await command(db, { ...input, action: \"state\" });\n}\n\nexport async function setWorkspaceAllowance(\n db: Database,\n input: Scope & Actor & WorkspaceAllowanceConfig & { expectedVersion: number },\n): Promise<WorkspaceAllowance> {\n const { accountId, workspaceId, expectedVersion, actorSubjectId, actorType } = input;\n const config: WorkspaceAllowanceConfig = {\n includedCredits: input.includedCredits,\n period: input.period,\n ...(input.anchorDay === undefined ? {} : { anchorDay: input.anchorDay }),\n ...(input.memberDefault === undefined ? {} : { memberDefault: input.memberDefault }),\n ...(input.thresholds === undefined ? {} : { thresholds: input.thresholds }),\n };\n version(expectedVersion);\n validateWorkspaceAllowanceConfig(config);\n return await command(db, {\n accountId,\n workspaceId,\n expectedVersion,\n ...actor({ actorSubjectId, actorType }),\n action: \"set\",\n config,\n });\n}\n\nexport async function clearWorkspaceAllowance(\n db: Database,\n input: Scope & Actor & { expectedVersion: number; operationId?: string },\n): Promise<{ version: number }> {\n version(input.expectedVersion);\n if (input.expectedVersion === 0) throw new UsageAllowanceVersionConflictError();\n if (\n input.operationId !== undefined &&\n (!input.operationId.trim() || new TextEncoder().encode(input.operationId).length > 256)\n )\n throw new Error(\"operationId must be non-empty and at most 256 bytes\");\n return await command(db, { ...input, ...actor(input), action: \"clear\" });\n}\n\nexport async function grantWorkspaceCredits(\n db: Database,\n input: Scope & Actor & { operationId: string; credits: number; expiresAt?: string | null },\n): Promise<{ operationId: string; credits: number; remaining: number; expiresAt: string | null }> {\n amount(input.credits, \"credits\", true);\n if (!input.operationId.trim() || new TextEncoder().encode(input.operationId).length > 256) {\n throw new Error(\"operationId must be non-empty and at most 256 bytes\");\n }\n if (input.expiresAt != null && !Number.isFinite(Date.parse(input.expiresAt)))\n throw new Error(\"Invalid grant expiresAt\");\n return await command(db, {\n ...input,\n ...actor(input),\n expiresAt: input.expiresAt ?? null,\n action: \"grant\",\n });\n}\n\nexport async function setMemberAllowance(\n db: Database,\n input: Scope &\n Actor & { rule: MemberAllowanceRule; expectedVersion: number } & (\n | { subjectId: string; externalIdentity?: never }\n | { externalIdentity: { source: string; externalId: string }; subjectId?: never }\n ),\n): Promise<MemberAllowance> {\n version(input.expectedVersion);\n validateMemberAllowanceRule(input.rule);\n return await command(db, { ...input, ...actor(input), action: \"member\" });\n}\n\ntype RawUsage = {\n config: WorkspaceAllowanceConfig | null;\n period: WorkspaceUsage[\"period\"];\n used: number;\n includedUsed: number;\n grantsUsed: number;\n grantsRemaining: number;\n memberCount: number;\n members: (MemberAllowance & {\n used: number;\n externalIdentity: { source: string; externalId: string } | null;\n })[];\n};\n\nexport function allowanceUsage(\n limit: number | null,\n used: number,\n resetsAt: string | null,\n thresholds = [0.8, 1],\n): AllowanceUsage {\n const fraction = limit === null ? null : limit === 0 ? 1 : used / limit;\n const remaining = limit === null ? null : Math.max(0, limit - used);\n return {\n limit,\n used,\n remaining,\n fraction,\n status:\n remaining === 0\n ? \"exhausted\"\n : fraction !== null && thresholds.some((t) => fraction >= t)\n ? \"warning\"\n : \"ok\",\n resetsAt,\n };\n}\n\nexport async function getWorkspaceUsage(\n db: Database,\n input: Scope & {\n period?: \"current\" | string;\n limit?: number;\n cursor?: string | null;\n subjectId?: string;\n },\n): Promise<WorkspaceUsage> {\n if (\n input.period !== undefined &&\n input.period !== \"current\" &&\n !/^\\d{4}-(0[1-9]|1[0-2])$/.test(input.period)\n ) {\n throw new Error(\"period must be current or YYYY-MM\");\n }\n const pageSize = Math.min(500, Math.max(1, Math.trunc(input.limit ?? 100)));\n const raw = await command<RawUsage>(db, { ...input, limit: pageSize, action: \"usage\" });\n return projectUsage(raw, pageSize);\n}\n\nfunction projectUsage(raw: RawUsage, pageSize: number): WorkspaceUsage {\n const config = raw.config;\n const pool = config\n ? config.includedCredits + Number(raw.grantsUsed) + Number(raw.grantsRemaining)\n : null;\n const memberPool = config ? config.includedCredits + Number(raw.grantsRemaining) : null;\n const resetsAt = config ? raw.period.end : null;\n const members = raw.members.slice(0, pageSize).map((member) => {\n let rule = member.rule;\n if (rule === null) {\n const fallback = config?.memberDefault ?? \"none\";\n rule =\n fallback === \"none\"\n ? null\n : fallback === \"equal_share\"\n ? { share: raw.memberCount > 0 ? 1 / Number(raw.memberCount) : 0 }\n : fallback;\n }\n const limit =\n rule === null\n ? null\n : \"credits\" in rule\n ? rule.credits\n : memberPool === null\n ? null\n : Math.min(Number.MAX_SAFE_INTEGER, Math.floor(memberPool * rule.share));\n return {\n ...member,\n rule: member.rule,\n ...allowanceUsage(limit, Number(member.used), resetsAt, config?.thresholds?.member),\n };\n });\n return {\n period: config ? raw.period : { start: null, end: null },\n workspace: {\n ...allowanceUsage(pool, Number(raw.used), resetsAt, config?.thresholds?.workspace),\n includedCredits: config?.includedCredits ?? 0,\n grantsRemaining: Number(raw.grantsRemaining),\n },\n members,\n nextCursor: raw.members.length > pageSize ? members.at(-1)!.subjectId : null,\n };\n}\n\nexport async function checkWorkspaceAllowance(\n db: Database,\n input: Scope & { subjectId?: string | null },\n): Promise<AllowanceExhausted | null> {\n const raw = await command<RawUsage>(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n ...(input.subjectId ? { subjectId: input.subjectId } : {}),\n limit: 1,\n action: \"check\",\n });\n const usage = projectUsage(raw, 1);\n if (usage.workspace.status === \"exhausted\") {\n return {\n code: \"allowance_exhausted\",\n scope: \"workspace\",\n resetsAt: usage.workspace.resetsAt,\n message: \"The workspace usage allowance is exhausted.\",\n };\n }\n const member = input.subjectId\n ? usage.members.find((row) => row.subjectId === input.subjectId)\n : null;\n if (member?.status === \"exhausted\") {\n return {\n code: \"allowance_exhausted\",\n scope: \"member\",\n subjectId: member.subjectId,\n resetsAt: member.resetsAt,\n message: \"The member usage allowance is exhausted.\",\n };\n }\n return null;\n}\n\n/** Bounded periodic work, independent of reads/admission and webhook delivery. */\nexport async function maintainWorkspaceAllowances(\n db: Database,\n input: { limit?: number; memberLimit?: number } = {},\n): Promise<number> {\n const [row] = await rawRows<{ processed: number }>(\n db,\n sql`select maintain_usage_allowances(${input.limit ?? 20}::integer,${input.memberLimit ?? 100}::integer) as processed`,\n );\n return Number(row?.processed ?? 0);\n}\n","import { z } from \"zod\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { sql } from \"drizzle-orm\";\nimport { rawRows, withRlsContext, type Database } from \"./database\";\n\nconst creditDebitAttributionContext = new AsyncLocalStorage<CreditDebitAttribution>();\n\nexport function currentCreditDebitAttribution(): CreditDebitAttribution {\n return creditDebitAttributionContext.getStore() ?? { kind: \"unknown\" };\n}\n\n/** Scope trusted HTTP/MCP admission facts across nested sandbox calls. */\nexport function withCreditDebitAttribution<T>(\n attribution: CreditDebitAttribution,\n fn: () => Promise<T>,\n): Promise<T> {\n return creditDebitAttributionContext.run(\n Object.freeze(CreditDebitAttribution.parse(attribution)),\n fn,\n );\n}\n\n/** Read one immutable turn, rejecting a missing receipt rather than service. */\nexport async function creditDebitAttributionForTurn(\n db: Database,\n input: { accountId: string; workspaceId: string; turnId: string },\n): Promise<CreditDebitAttribution> {\n return withRlsContext(db, input, async (tx) => {\n const [turn] = await rawRows<{ initiatingHumanSubjectId: string | null }>(\n tx,\n sql`SELECT initiating_human_subject_id AS \"initiatingHumanSubjectId\"\n FROM session_turns WHERE account_id=${input.accountId}::uuid\n AND workspace_id=${input.workspaceId}::uuid AND id=${input.turnId}::uuid`,\n );\n if (!turn) throw new Error(\"Paid credit debit initiating turn is unavailable\");\n return CreditDebitAttribution.parse({\n kind: \"turn\",\n turnId: input.turnId,\n initiatingHumanSubjectId: turn.initiatingHumanSubjectId,\n });\n });\n}\n\n/**\n * Trusted admission facts, not an access grant. Unknown is deliberately\n * distinct from pure service: old jobs/leases cannot prove a human initiator.\n */\nexport const CreditDebitAttribution = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"turn\"),\n turnId: z.uuid(),\n initiatingHumanSubjectId: z.string().min(1).max(1024).nullable(),\n }),\n z.object({\n kind: z.literal(\"human\"),\n initiatingHumanSubjectId: z.string().min(1).max(1024),\n }),\n z.object({ kind: z.literal(\"service\") }),\n z.object({ kind: z.literal(\"unknown\") }),\n]);\nexport type CreditDebitAttribution = z.infer<typeof CreditDebitAttribution>;\n\nexport function creditDebitAttributionMetadata(\n attribution: CreditDebitAttribution,\n): Record<string, string> {\n switch (attribution.kind) {\n case \"turn\":\n return {\n turnId: attribution.turnId,\n ...(attribution.initiatingHumanSubjectId\n ? { initiatingHumanSubjectId: attribution.initiatingHumanSubjectId }\n : {}),\n };\n case \"human\":\n return { initiatingHumanSubjectId: attribution.initiatingHumanSubjectId };\n case \"service\":\n return {};\n case \"unknown\":\n throw new Error(\"Paid credit debit has no frozen initiating attribution\");\n }\n}\n","import type { BillingBalance, PromotionalCreditBalance } from \"@opengeni/contracts\";\nimport { sql } from \"drizzle-orm\";\nimport type { Database } from \"./database\";\nimport { rawRows, withAccountRls } from \"./database\";\nimport * as schema from \"./schema\";\n\n/** Read totals and grant remainders from one database snapshot. */\ntype CreditBalanceSnapshot = BillingBalance & { creditPolicyRevision?: number };\n\nexport async function getBillingBalance(\n db: Database,\n accountId: string,\n policyRevision?: number,\n): Promise<CreditBalanceSnapshot> {\n return await withAccountRls(db, accountId, async (tx) => {\n const [row] = await rawRows<{\n balance: string;\n grants: PromotionalCreditBalance[];\n revision: number;\n }>(\n tx,\n sql`\n with current_policy as (\n select revision, policy from opengeni_private.credit_promotion_policy_revisions\n where (${policyRevision ?? null}::bigint is null or revision <= ${policyRevision ?? null}::bigint)\n order by revision desc limit 1\n )\n select\n coalesce((select revision from current_policy), 0)::int as revision,\n (select coalesce(sum(amount_micros), 0)::text\n from ${schema.creditLedgerEntries} where account_id = ${accountId}) as balance,\n coalesce((select jsonb_agg(jsonb_build_object(\n 'grantId', g.id,\n 'label', coalesce(g.metadata->>'creditOfferLabel', 'Promotional credits'),\n 'eligibleModelIds', coalesce(\n (select coalesce(\n case when g.source_type = 'verified_signup_trial' then policy->'signupModelIds'\n else policy->'offers'->(g.metadata->>'creditOfferId')->'eligibleModelIds' end,\n policy->'defaultModelIds'\n ) from current_policy), to_jsonb(g.eligible_model_ids)),\n 'remainingMicros', g.amount_micros - coalesce(used.amount, 0),\n 'coversVoice', g.source_type = 'verified_signup_trial'\n ) order by g.created_at, g.id)\n from ${schema.creditLedgerEntries} g\n left join (\n select grant_entry_id, sum(amount_micros) as amount\n from ${schema.creditDebitAllocations} where account_id = ${accountId}\n group by grant_entry_id\n ) used on used.grant_entry_id = g.id\n where g.account_id = ${accountId} and g.eligible_model_ids is not null\n and g.amount_micros > coalesce(used.amount, 0)\n ), '[]'::jsonb) as grants\n `,\n );\n const balanceMicros = Number(row?.balance ?? 0);\n const promotionalCredits = row?.grants ?? [];\n return {\n accountId,\n creditPolicyRevision: row?.revision ?? 0,\n balanceMicros,\n generalBalanceMicros:\n balanceMicros - promotionalCredits.reduce((sum, grant) => sum + grant.remainingMicros, 0),\n promotionalCredits,\n currency: \"usd\",\n updatedAt: new Date().toISOString(),\n };\n });\n}\n\n/**\n * What a charge pays for. A canonical model ID uses grants scoped to that\n * model; {@link VOICE_CREDIT_USAGE} (dictation and live voice) uses grants\n * that cover voice, which are the verified-signup trial credits. Omitted means\n * a non-model resource, which can only use general credits.\n */\nexport type CreditUsage = string | { readonly kind: \"voice\" } | undefined;\n\n/** Deployment-funded dictation and live voice. */\nexport const VOICE_CREDIT_USAGE: { readonly kind: \"voice\" } = Object.freeze({ kind: \"voice\" });\n\nfunction grantCovers(grant: PromotionalCreditBalance, usage: CreditUsage): boolean {\n if (!usage) return false;\n if (typeof usage === \"string\") return grant.eligibleModelIds.includes(usage);\n return grant.coversVoice === true;\n}\n\nexport function spendableCreditMicros(balance: BillingBalance, usage?: CreditUsage): number {\n return (\n Math.max(0, balance.generalBalanceMicros ?? balance.balanceMicros) +\n (balance.promotionalCredits ?? []).reduce(\n (sum, grant) => sum + (grantCovers(grant, usage) ? grant.remainingMicros : 0),\n 0,\n )\n );\n}\n\nexport async function getSpendableCreditBalance(\n db: Database,\n accountId: string,\n usage?: CreditUsage,\n policyRevision?: number,\n): Promise<CreditBalanceSnapshot> {\n const balance = await getBillingBalance(db, accountId, policyRevision);\n return { ...balance, balanceMicros: spendableCreditMicros(balance, usage) };\n}\n\n/** Covering grants pay first, oldest first; the rest is general credit. */\nfunction allocateToCoveringGrants(\n balance: BillingBalance,\n amountMicros: number,\n usage: CreditUsage,\n) {\n let remaining = amountMicros;\n const allocations: { grantEntryId: string; amountMicros: number }[] = [];\n for (const grant of balance.promotionalCredits ?? []) {\n if (!remaining || !grantCovers(grant, usage) || grant.remainingMicros <= 0) continue;\n const allocated = Math.min(remaining, grant.remainingMicros);\n allocations.push({ grantEntryId: grant.grantId, amountMicros: allocated });\n remaining -= allocated;\n }\n return allocations;\n}\n\nexport function planCreditDebit(\n balance: BillingBalance,\n requestedMicros: number,\n usage?: CreditUsage,\n) {\n if (!Number.isSafeInteger(requestedMicros) || requestedMicros <= 0) {\n throw new Error(\"credit debit requires a positive, safe integer micro amount\");\n }\n const debitedMicros = Math.min(requestedMicros, spendableCreditMicros(balance, usage));\n return { debitedMicros, allocations: allocateToCoveringGrants(balance, debitedMicros, usage) };\n}\n\n/**\n * Allocations for an already-consumed charge of the full amount: covering\n * grants pay what they can and general credit takes the rest, possibly going\n * negative.\n */\nexport function planPostUseCreditAllocations(\n balance: BillingBalance,\n amountMicros: number,\n usage: CreditUsage,\n) {\n if (!Number.isSafeInteger(amountMicros) || amountMicros <= 0) {\n throw new Error(\"credit debit requires a positive, safe integer micro amount\");\n }\n return allocateToCoveringGrants(balance, amountMicros, usage);\n}\n"],"mappings":"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","names":["sql","sql","sql","sql","sql","sql"]}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
appendSessionCommandOutput
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-K5MTNKJU.js";
|
|
4
4
|
import {
|
|
5
5
|
lockSessionEventWriteRows
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JWBEE4CL.js";
|
|
7
7
|
import {
|
|
8
8
|
withRlsContext,
|
|
9
9
|
withSessionActivityRlsContext
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-IT3EYY2C.js";
|
|
11
11
|
import {
|
|
12
12
|
sandboxRetainedProcesses
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-JL6TBB76.js";
|
|
14
14
|
|
|
15
15
|
// src/retained-provider-commands.ts
|
|
16
16
|
import { and, eq, sql } from "drizzle-orm";
|
|
@@ -299,4 +299,4 @@ export {
|
|
|
299
299
|
retainedProcessCancellationRequested,
|
|
300
300
|
requestRetainedProcessDeadlineCancellation
|
|
301
301
|
};
|
|
302
|
-
//# sourceMappingURL=chunk-
|
|
302
|
+
//# sourceMappingURL=chunk-W75DRYG3.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
nestedPostgresSqlState,
|
|
3
3
|
rawRows
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-IT3EYY2C.js";
|
|
5
5
|
|
|
6
6
|
// src/managed-auth-session-sets.ts
|
|
7
7
|
import {
|
|
@@ -296,4 +296,4 @@ export {
|
|
|
296
296
|
reapManagedAuthIsolatedSessions,
|
|
297
297
|
reapExpiredManagedAuthSessionSets
|
|
298
298
|
};
|
|
299
|
-
//# sourceMappingURL=chunk-
|
|
299
|
+
//# sourceMappingURL=chunk-Y72DP3JF.js.map
|