@highstate/backend 0.19.1 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/chunk-b05q6fm2.js +37 -0
  2. package/dist/{chunk-V2NILDHS.js → chunk-gxjwa93h.js} +704 -604
  3. package/dist/{chunk-X2WG3WGL.js → chunk-vzdz6chj.js} +18 -15
  4. package/dist/highstate.manifest.json +4 -4
  5. package/dist/index.js +7350 -3514
  6. package/dist/library/package-resolution-worker.js +121 -10
  7. package/dist/library/worker/main.js +31 -17
  8. package/dist/shared/index.js +254 -4
  9. package/package.json +19 -20
  10. package/prisma/backend/_schema/object.prisma +12 -0
  11. package/prisma/backend/sqlite/migrations/20260222113554_add_object_tracking/migration.sql +7 -0
  12. package/prisma/project/artifact.prisma +3 -0
  13. package/prisma/project/entity.prisma +125 -0
  14. package/prisma/project/instance.prisma +6 -0
  15. package/prisma/project/migrations/20260301210131_add_entity_tracking/migration.sql +70 -0
  16. package/prisma/project/migrations/20260302212734_add_resource_hooks_flag/migration.sql +1 -0
  17. package/prisma/project/operation.prisma +3 -0
  18. package/src/artifact/factory.ts +3 -2
  19. package/src/business/artifact.test.ts +22 -2
  20. package/src/business/artifact.ts +7 -1
  21. package/src/business/entity-snapshot.test.ts +684 -0
  22. package/src/business/entity-snapshot.ts +904 -0
  23. package/src/business/evaluation.test.ts +56 -0
  24. package/src/business/evaluation.ts +102 -22
  25. package/src/business/global-search.test.ts +344 -0
  26. package/src/business/global-search.ts +902 -0
  27. package/src/business/index.ts +4 -0
  28. package/src/business/instance-lock.ts +58 -74
  29. package/src/business/instance-state.test.ts +15 -1
  30. package/src/business/instance-state.ts +37 -14
  31. package/src/business/object-ref-index.test.ts +140 -0
  32. package/src/business/object-ref-index.ts +193 -0
  33. package/src/business/operation.test.ts +15 -1
  34. package/src/business/operation.ts +4 -0
  35. package/src/business/project-model.ts +154 -13
  36. package/src/business/project-unlock.ts +25 -2
  37. package/src/business/project.ts +9 -0
  38. package/src/business/secret.test.ts +35 -2
  39. package/src/business/secret.ts +32 -9
  40. package/src/business/settings.ts +761 -0
  41. package/src/business/unit-output.test.ts +477 -0
  42. package/src/business/unit-output.ts +461 -0
  43. package/src/business/worker.ts +55 -4
  44. package/src/database/_generated/backend/postgresql/browser.ts +6 -0
  45. package/src/database/_generated/backend/postgresql/client.ts +6 -0
  46. package/src/database/_generated/backend/postgresql/internal/class.ts +23 -5
  47. package/src/database/_generated/backend/postgresql/internal/prismaNamespace.ts +89 -5
  48. package/src/database/_generated/backend/postgresql/internal/prismaNamespaceBrowser.ts +9 -0
  49. package/src/database/_generated/backend/postgresql/models/Object.ts +1076 -0
  50. package/src/database/_generated/backend/postgresql/models.ts +1 -0
  51. package/src/database/_generated/backend/sqlite/browser.ts +6 -0
  52. package/src/database/_generated/backend/sqlite/client.ts +6 -0
  53. package/src/database/_generated/backend/sqlite/internal/class.ts +23 -5
  54. package/src/database/_generated/backend/sqlite/internal/prismaNamespace.ts +89 -5
  55. package/src/database/_generated/backend/sqlite/internal/prismaNamespaceBrowser.ts +9 -0
  56. package/src/database/_generated/backend/sqlite/models/Object.ts +1074 -0
  57. package/src/database/_generated/backend/sqlite/models.ts +1 -0
  58. package/src/database/_generated/project/browser.ts +23 -0
  59. package/src/database/_generated/project/client.ts +23 -0
  60. package/src/database/_generated/project/commonInputTypes.ts +87 -53
  61. package/src/database/_generated/project/enums.ts +8 -0
  62. package/src/database/_generated/project/internal/class.ts +53 -5
  63. package/src/database/_generated/project/internal/prismaNamespace.ts +367 -13
  64. package/src/database/_generated/project/internal/prismaNamespaceBrowser.ts +48 -1
  65. package/src/database/_generated/project/models/Artifact.ts +199 -11
  66. package/src/database/_generated/project/models/Entity.ts +1274 -0
  67. package/src/database/_generated/project/models/EntitySnapshot.ts +2389 -0
  68. package/src/database/_generated/project/models/EntitySnapshotContent.ts +1260 -0
  69. package/src/database/_generated/project/models/EntitySnapshotReference.ts +1449 -0
  70. package/src/database/_generated/project/models/InstanceState.ts +361 -1
  71. package/src/database/_generated/project/models/Operation.ts +148 -3
  72. package/src/database/_generated/project/models/OperationLog.ts +0 -4
  73. package/src/database/_generated/project/models.ts +4 -0
  74. package/src/database/migration.ts +3 -0
  75. package/src/library/find-package-json.test.ts +77 -0
  76. package/src/library/find-package-json.ts +149 -0
  77. package/src/library/package-resolution-worker.ts +7 -3
  78. package/src/library/worker/evaluator.ts +7 -1
  79. package/src/orchestrator/manager.ts +7 -0
  80. package/src/orchestrator/operation-context.captured-outputs.test.ts +118 -0
  81. package/src/orchestrator/operation-context.ts +154 -16
  82. package/src/orchestrator/operation-plan.destroy.test.md +33 -12
  83. package/src/orchestrator/operation-plan.destroy.test.ts +140 -2
  84. package/src/orchestrator/operation-plan.fixtures.ts +2 -0
  85. package/src/orchestrator/operation-plan.md +4 -1
  86. package/src/orchestrator/operation-plan.ts +286 -92
  87. package/src/orchestrator/operation-plan.update.test.md +286 -11
  88. package/src/orchestrator/operation-plan.update.test.ts +656 -5
  89. package/src/orchestrator/operation-workset.ts +72 -22
  90. package/src/orchestrator/operation.cancel.test.ts +4 -0
  91. package/src/orchestrator/operation.composite.test.ts +341 -0
  92. package/src/orchestrator/operation.destroy.test.ts +4 -0
  93. package/src/orchestrator/operation.output-validation.failure.test.ts +124 -0
  94. package/src/orchestrator/operation.preview.test.ts +4 -0
  95. package/src/orchestrator/operation.refresh.test.ts +4 -0
  96. package/src/orchestrator/operation.test-utils.ts +52 -13
  97. package/src/orchestrator/operation.ts +230 -68
  98. package/src/orchestrator/operation.update.failure.test.ts +4 -0
  99. package/src/orchestrator/operation.update.skip.test.ts +196 -0
  100. package/src/orchestrator/operation.update.test.ts +4 -0
  101. package/src/orchestrator/plan-test-builder.ts +1 -0
  102. package/src/orchestrator/unit-input-values.test.ts +450 -0
  103. package/src/orchestrator/unit-input-values.ts +281 -0
  104. package/src/pubsub/manager.ts +3 -0
  105. package/src/runner/abstractions.ts +23 -54
  106. package/src/runner/factory.ts +3 -3
  107. package/src/runner/force-abort.ts +7 -2
  108. package/src/runner/local.ts +116 -87
  109. package/src/runner/pulumi.ts +3 -5
  110. package/src/services.ts +53 -2
  111. package/src/shared/models/prisma.ts +1 -0
  112. package/src/shared/models/project/entity.ts +121 -0
  113. package/src/shared/models/project/index.ts +1 -0
  114. package/src/shared/models/project/operation.ts +61 -3
  115. package/src/shared/models/project/state.ts +10 -0
  116. package/src/shared/models/project/worker.ts +7 -0
  117. package/src/shared/resolvers/effective-output-type.test.ts +494 -0
  118. package/src/shared/resolvers/effective-output-type.ts +162 -0
  119. package/src/shared/resolvers/index.ts +1 -0
  120. package/src/shared/resolvers/input.ts +59 -9
  121. package/src/shared/utils/index.ts +1 -0
  122. package/src/shared/utils/stable-json.ts +41 -0
  123. package/src/terminal/manager.ts +6 -0
  124. package/src/terminal/run.sh.ts +9 -4
  125. package/src/worker/manager.ts +97 -1
  126. package/LICENSE +0 -21
  127. package/dist/chunk-I7BWSAN6.js +0 -49
  128. package/dist/chunk-I7BWSAN6.js.map +0 -1
  129. package/dist/chunk-V2NILDHS.js.map +0 -1
  130. package/dist/chunk-X2WG3WGL.js.map +0 -1
  131. package/dist/index.js.map +0 -1
  132. package/dist/library/package-resolution-worker.js.map +0 -1
  133. package/dist/library/worker/main.js.map +0 -1
  134. package/dist/shared/index.js.map +0 -1
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/business/api-key.ts","../src/business/artifact.ts","../src/business/backend-unlock.ts","../src/business/instance-lock.ts","../src/database/_generated/backend/sqlite/internal/class.ts","../src/database/_generated/backend/sqlite/internal/prismaNamespace.ts","../src/database/_generated/backend/sqlite/client.ts","../src/database/migration.ts","../src/database/well-known.ts","../src/database/local/keyring.ts","../src/database/local/meta.ts","../src/database/local/backend.ts","../src/database/_generated/backend/postgresql/internal/class.ts","../src/database/_generated/backend/postgresql/internal/prismaNamespace.ts","../src/database/_generated/backend/postgresql/client.ts","../src/database/_generated/project/internal/class.ts","../src/database/_generated/project/internal/prismaNamespace.ts","../src/database/_generated/project/client.ts","../src/database/local/project.ts","../src/database/manager.ts","../src/database/factory.ts","../src/business/instance-state.ts","../src/business/operation.ts","../src/business/evaluation.ts","../src/project-model/errors.ts","../src/project-model/utils.ts","../src/project-model/backends/codebase.ts","../src/project-model/backends/database.ts","../src/project-model/factory.ts","../src/business/project.ts","../src/business/project-model.ts","../src/business/project-unlock.ts","../src/business/secret.ts","../src/business/settings.ts","../src/business/terminal-session.ts","../src/business/unit-extra.ts","../src/business/worker.ts","../src/artifact/encryption.ts","../src/artifact/local.ts","../src/artifact/factory.ts","../src/library/local.ts","../src/library/factory.ts","../src/lock/memory.ts","../src/lock/factory.ts","../src/lock/manager.ts","../src/pubsub/memory.ts","../src/pubsub/factory.ts","../src/pubsub/manager.ts","../src/runner/artifact-env.ts","../src/runner/force-abort.ts","../src/runner/pulumi.ts","../src/runner/local.ts","../src/runner/factory.ts","../src/terminal/run.sh.ts","../src/terminal/docker.ts","../src/terminal/factory.ts","../src/terminal/manager.ts","../src/worker/docker.ts","../src/worker/factory.ts","../src/worker/manager.ts","../src/config.ts","../src/orchestrator/operation-context.ts","../src/orchestrator/operation-plan.ts","../src/orchestrator/operation-workset.ts","../src/orchestrator/operation.ts","../src/orchestrator/manager.ts","../src/unlock/memory.ts","../src/services.ts"],"names":["createId","resolve","Buffer","runtime","runtime2","path","importMetaResolve","join","dirname","fileURLToPath","config","readFile","entry","z","randomBytes","masterKey","decodeBase64AsWasm","getPrismaClientClass","runtime4","runtime5","path2","PrismaClient","runtime7","DbNull","path3","PrismaLibSql","database","isNonNullish","parse","stringify","writeFile","mkdir","instanceModelSchema","hubModelSchema","getInstanceId","parseInstanceId","armor","Decrypter","Encrypter","isUnitModel","PrismaClientKnownRequestError","access","BetterLock","EventEmitter","on","createWriteStream","readdir","createReadStream","storedArtifact","command","mkdtemp","artifacts","unitArtifactId","rm","source","runScript","tmpdir","process","uuidv7","Readable","spawn","PassThrough","info","mapValues","i","instance"],"mappings":"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","file":"index.js","sourcesContent":["import type { Logger } from \"pino\"\nimport type { ApiKey, DatabaseManager } from \"../database\"\nimport { randomBytes } from \"node:crypto\"\nimport { createProjectLogger } from \"../common\"\nimport { AccessError } from \"../shared\"\n\nexport class ApiKeyService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Regenerates the token for an API key in a project.\n *\n * @param projectId The ID of the project containing the API key.\n * @param apiKeyId The ID of the API key to regenerate.\n */\n async regenerateToken(projectId: string, apiKeyId: string): Promise<ApiKey> {\n const logger = createProjectLogger(this.logger, projectId)\n const database = await this.database.forProject(projectId)\n\n const apiKey = await database.apiKey.update({\n where: { id: apiKeyId },\n data: {\n token: randomBytes(32).toString(\"hex\"),\n },\n })\n\n logger.info(`regenerated API key token with ID \"%s\",`, apiKeyId)\n\n return apiKey\n }\n\n /**\n * Retrieves an API key by its token for a specific project.\n *\n * @param projectId The ID of the project containing the API key.\n * @param token The token of the API key to retrieve.\n * @returns The ProjectApiKey object if found.\n * @throws AccessError if the token is not valid for the project.\n */\n async getApiKeyByToken(projectId: string, token: string): Promise<ApiKey> {\n const database = await this.database.forProject(projectId)\n const apiKey = await database.apiKey.findUnique({ where: { token } })\n\n if (!apiKey) {\n throw new AccessError(`API key token is not valid for project \"${projectId}\"`)\n }\n\n return apiKey\n }\n}\n","import type { CommonObjectMeta } from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type { ArtifactBackend } from \"../artifact\"\nimport type { Artifact, DatabaseManager, ProjectTransaction } from \"../database\"\nimport { createId } from \"@paralleldrive/cuid2\"\n\nexport const artifactChunkSize = 1024 * 1024 // 1 MB\n\n/**\n * The service which handles the storage, retrieval, and management of artifacts in the system.\n */\nexport class ArtifactService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly artifactBackend: ArtifactBackend,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Stores an artifact in the backend and allows caller to set up references.\n * If the artifact already exists, it does nothing.\n *\n * @param projectId The project ID to store the artifact under.\n * @param hash The SHA256 hash of the artifact content.\n * @param size The total size of the artifact in bytes.\n * @param meta The metadata for the artifact.\n * @param content An async iterable providing the artifact content in chunks.\n * @param track A callback to set up artifact references within the transaction.\n * @returns The model of the stored artifact.\n */\n async store(\n projectId: string,\n hash: string,\n size: number,\n meta: CommonObjectMeta,\n content: AsyncIterable<Uint8Array>,\n track: (tx: ProjectTransaction, artifact: Artifact) => Promise<void>,\n ): Promise<Artifact> {\n // check if artifact already exists by hash\n const database = await this.database.forProject(projectId)\n const existingArtifact = await database.artifact.findUnique({ where: { hash } })\n const artifactId = existingArtifact?.id ?? createId()\n\n // only upload to backend if file doesn't exist there\n if (!existingArtifact || !(await this.artifactBackend.exists(projectId, hash))) {\n if (existingArtifact) {\n this.logger.warn(\n `artifact with hash \"%s\" exists in database but not in the storage backend, re-uploading`,\n hash,\n )\n }\n\n await this.artifactBackend.store(projectId, artifactId, artifactChunkSize, content)\n }\n\n return await database.$transaction(async tx => {\n // create or update the main artifact record\n const artifact = await tx.artifact.upsert({\n where: { id: artifactId },\n create: { id: artifactId, hash, size, meta, chunkSize: artifactChunkSize },\n update: { meta },\n })\n\n // always allow caller to set up references\n await track(tx, artifact)\n\n this.logger.info(\n { projectId },\n `stored artifact with hash \"%s\" and ID \"%s\"`,\n hash,\n artifact.id,\n )\n\n return artifact\n })\n }\n\n /**\n * Removes artifacts with no references and cleans up backend storage.\n *\n * @param projectId The project ID to clean up artifacts for.\n */\n async collectGarbage(projectId: string): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n // find artifacts with no references using Prisma ORM\n const unreferencedArtifacts = await database.artifact.findMany({\n where: {\n AND: [\n { serviceAccounts: { none: {} } },\n { instances: { none: {} } },\n { terminals: { none: {} } },\n { pages: { none: {} } },\n ],\n },\n select: {\n id: true,\n hash: true,\n },\n })\n\n if (unreferencedArtifacts.length === 0) {\n this.logger.debug({ projectId }, \"no unreferenced artifacts found\")\n return\n }\n\n this.logger.info(\n { projectId, count: unreferencedArtifacts.length },\n \"collecting garbage artifacts\",\n )\n\n // delete unreferenced artifacts in transaction\n await database.$transaction(async tx => {\n await tx.artifact.deleteMany({\n where: {\n id: { in: unreferencedArtifacts.map(a => a.id) },\n },\n })\n })\n\n // clean up backend storage for deleted artifacts in foreground\n await Promise.all(\n unreferencedArtifacts.map(async artifact => {\n try {\n await this.artifactBackend.delete(projectId, artifact.hash)\n } catch (error: unknown) {\n this.logger.warn(\n { error, projectId, hash: artifact.hash },\n `failed to delete artifact from backend with hash \"%s\"`,\n artifact.hash,\n )\n }\n }),\n )\n\n this.logger.info(\n { projectId, deletedCount: unreferencedArtifacts.length },\n \"garbage collection completed\",\n )\n }\n\n /**\n * Gets artifact entities by their IDs.\n *\n * @param projectId The project ID to query artifacts from.\n * @param artifactIds The IDs of the artifacts to retrieve.\n * @returns Array of artifact models.\n */\n async getArtifactsByIds(projectId: string, artifactIds: string[]): Promise<Artifact[]> {\n const database = await this.database.forProject(projectId)\n\n return await database.artifact.findMany({\n where: {\n id: { in: artifactIds },\n },\n })\n }\n}\n","import type { Logger } from \"pino\"\nimport type { BackendUnlockMethod, DatabaseManager } from \"../database\"\nimport {\n type BackendUnlockMethodInput,\n BackendUnlockMethodNotFoundError,\n CannotDeleteLastBackendUnlockMethodError,\n} from \"../shared\"\n\nexport class BackendUnlockService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Lists backend unlock methods ordered by creation time.\n *\n * @returns The ordered unlock method collection.\n */\n async listUnlockMethods(): Promise<BackendUnlockMethod[]> {\n return await this.database.backend.backendUnlockMethod.findMany({\n orderBy: { createdAt: \"asc\" },\n })\n }\n\n /**\n * Stores a new unlock method and refreshes master-key recipients.\n *\n * @param input Unlock method payload gathered from the CLI or automation.\n * @returns The persisted unlock method.\n */\n async addUnlockMethod(input: BackendUnlockMethodInput): Promise<BackendUnlockMethod> {\n const record = await this.database.backend.backendUnlockMethod.create({ data: input })\n\n await this.reencryptBackendMasterKey()\n\n return record\n }\n\n /**\n * Removes an unlock method by identifier and rotates the encrypted master key.\n *\n * @param id Identifier of the unlock method to delete.\n */\n async deleteUnlockMethod(id: string): Promise<void> {\n const methods = await this.database.backend.backendUnlockMethod.findMany()\n const method = methods.find(m => m.id === id)\n if (!method) {\n throw new BackendUnlockMethodNotFoundError(id)\n }\n\n if (methods.length === 1) {\n throw new CannotDeleteLastBackendUnlockMethodError()\n }\n\n await this.database.backend.backendUnlockMethod.delete({ where: { id } })\n await this.reencryptBackendMasterKey()\n }\n\n private async reencryptBackendMasterKey(): Promise<void> {\n if (!this.database.isEncryptionEnabled) {\n return\n }\n\n const recipients = await this.database.backend.backendUnlockMethod.findMany({\n select: { recipient: true },\n })\n\n await this.database.updateBackendUnlockRecipients(recipients.map(method => method.recipient))\n\n this.logger.debug(\n { recipientCount: recipients.length },\n \"updated backend master key recipients\",\n )\n }\n}\n","import type { CommonObjectMeta } from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type { DatabaseManager, InstanceLock, ProjectTransaction } from \"../database\"\nimport type { PubSubManager } from \"../pubsub\"\nimport { createId } from \"@paralleldrive/cuid2\"\nimport { type InstanceLockEvent, InstanceLockLostError } from \"../shared\"\n\n/**\n * Service for managing instance locks within projects.\n * Handles atomic lock operations using database transactions.\n */\nexport class InstanceLockService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Attempts to acquire locks on the specified instances.\n * Uses database transactions to ensure atomicity.\n *\n * @param projectId The project ID containing the instances.\n * @param stateIds The instance state IDs to lock.\n * @param lockMeta The metadata for the locks.\n * @param action Optional async action to execute once locks are acquired in the same transaction with the locks.\n * @param allowPartialLock Whether to allow partial locking when some instances are already locked.\n * @param customToken Optional custom token to use instead of auto-generating one.\n * @returns A tuple containing the token and array of successfully locked state IDs.\n */\n async tryLockInstances(\n projectId: string,\n stateIds: string[],\n lockMeta: CommonObjectMeta,\n action?: (tx: ProjectTransaction, stateIds: string[]) => Promise<void>,\n allowPartialLock = false,\n customToken?: string,\n ): Promise<[token: string, lockedStateIds: string[]]> {\n if (stateIds.length === 0) {\n return [\"\", []]\n }\n\n // use custom token or generate a cuid token for this lock operation\n const token = customToken ?? createId()\n const database = await this.database.forProject(projectId)\n\n return await database.$transaction(async tx => {\n // check for existing locks on requested instances\n const existingLocks = await tx.instanceLock.findMany({\n where: { stateId: { in: stateIds } },\n select: { stateId: true },\n })\n\n const lockedStateIds = existingLocks.map(lock => lock.stateId)\n const availableStateIds = stateIds.filter(id => !lockedStateIds.includes(id))\n\n if (lockedStateIds.length > 0) {\n this.logger.debug(\n {\n projectId,\n conflictingInstances: lockedStateIds.length,\n totalRequested: stateIds.length,\n },\n \"found %s conflicting locks when attempting to lock %s instances\",\n lockedStateIds.length,\n stateIds.length,\n )\n\n if (!allowPartialLock) {\n return [\"\", []]\n }\n }\n\n if (availableStateIds.length === 0) {\n // when custom token is provided and no instances are locked, don't return the token\n // when allowPartialLock is true and no custom token, return a token for consistency\n return [allowPartialLock && !customToken ? token : \"\", []]\n }\n\n // create locks for available instances with the generated token\n const lockData: InstanceLock[] = availableStateIds.map(stateId => ({\n stateId,\n meta: lockMeta,\n token,\n acquiredAt: new Date(),\n }))\n\n await tx.instanceLock.createMany({ data: lockData })\n\n await action?.(tx, availableStateIds)\n\n this.logger.debug(\n { projectId, lockedCount: availableStateIds.length, token },\n \"locked %s instances\",\n availableStateIds.length,\n )\n\n // publish lock event\n await this.pubsubManager.publish([\"instance-lock\", projectId], {\n type: \"locked\",\n locks: lockData,\n })\n\n return [token, availableStateIds]\n })\n }\n\n /**\n * Checks if an instance is currently locked.\n *\n * @param projectId The project ID containing the instance.\n * @param stateId The instance state ID to check.\n * @returns True if the instance is locked, false otherwise.\n */\n async isInstanceLocked(projectId: string, stateId: string): Promise<boolean> {\n const database = await this.database.forProject(projectId)\n\n const lock = await database.instanceLock.findUnique({\n where: { stateId },\n })\n\n return lock !== null\n }\n\n /**\n * Removes locks from the specified instances using the provided token.\n * Executes an optional unlock action within the transaction if the lock is still valid.\n *\n * @param projectId The project ID containing the instances.\n * @param stateIds The instance state IDs to unlock.\n * @param token The token that was returned when the locks were created.\n * @param unlockAction Optional async action to execute within the unlock transaction if the lock is still valid.\n * @throws {InstanceLockLostError} When the lock with the given token is not found.\n */\n async unlockInstances(\n projectId: string,\n stateIds: string[],\n token: string,\n unlockAction?: (tx: ProjectTransaction) => Promise<void>,\n ): Promise<void> {\n if (stateIds.length === 0) {\n return\n }\n\n if (!token) {\n throw new Error(\"Token is required to unlock instances\")\n }\n\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n // verify that locks with the given token exist for all requested instances\n const existingLocks = await tx.instanceLock.findMany({\n where: {\n stateId: { in: stateIds },\n token: token,\n },\n select: { stateId: true },\n })\n\n const lockedStateIds = existingLocks.map(lock => lock.stateId)\n const missingLocks = stateIds.filter(id => !lockedStateIds.includes(id))\n\n if (missingLocks.length > 0) {\n throw new InstanceLockLostError(projectId, missingLocks, token)\n }\n\n // execute the optional unlock action if provided\n if (unlockAction) {\n await unlockAction(tx)\n }\n\n // remove the locks\n const { count } = await tx.instanceLock.deleteMany({\n where: {\n stateId: { in: stateIds },\n token: token,\n },\n })\n\n if (count > 0) {\n this.logger.debug(\n { projectId, unlockedCount: count, token },\n \"unlocked %s instances\",\n count,\n )\n\n // publish unlock event\n await this.pubsubManager.publish([\"instance-lock\", projectId], {\n type: \"unlocked\",\n stateIds: lockedStateIds,\n })\n }\n })\n }\n\n /**\n * Unconditionally removes locks from the specified instances.\n * This will remove locks regardless of their current state or ownership.\n *\n * @param projectId The project ID containing the instances.\n * @param stateIds The instance state IDs to unlock.\n */\n async unlockInstancesUnconditionally(projectId: string, stateIds: string[]): Promise<void> {\n if (stateIds.length === 0) {\n return\n }\n\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n const { count } = await tx.instanceLock.deleteMany({\n where: { stateId: { in: stateIds } },\n })\n\n if (count > 0) {\n this.logger.info({ projectId, unlockedCount: count }, \"unlocked %s instances\", count)\n\n // publish unlock event\n await this.pubsubManager.publish([\"instance-lock\", projectId], {\n type: \"unlocked\",\n stateIds,\n })\n }\n })\n }\n\n /**\n * Attempts to acquire locks on the specified instances with retry logic.\n * Subscribes to unlock events and retries lock acquisition until successful or aborted.\n *\n * @param projectId The project ID containing the instances.\n * @param stateIds The instance state IDs to lock.\n * @param lockMeta The metadata for the locks.\n * @param action Optional async action to execute when instances are locked.\n * @param allowPartialLock Whether to allow partial locking when some instances are already locked.\n * @param abortSignal Optional abort signal to interrupt lock operations.\n * @param eventWaitTime Optional time in milliseconds to wait for unlock events before retrying (default: 60000ms).\n * @param customToken Optional custom token to use instead of auto-generating one.\n * @returns A tuple containing the token and array of successfully locked state IDs.\n */\n async lockInstances(\n projectId: string,\n stateIds: string[],\n lockMeta: CommonObjectMeta,\n action?: (tx: ProjectTransaction, stateIds: string[]) => Promise<void>,\n allowPartialLock = false,\n abortSignal?: AbortSignal,\n eventWaitTime = 60000,\n customToken?: string,\n ): Promise<[token: string, lockedStateIds: string[]]> {\n if (stateIds.length === 0) {\n return [\"\", []]\n }\n\n // generate a single token for all locks\n const token = customToken ?? createId()\n\n // track which instances still need to be locked\n let remainingStateIds = [...stateIds]\n const lockedStateIds: string[] = []\n\n // create abort controller for managing event subscription\n const subscriptionController = new AbortController()\n\n // set up event subscription first before attempting any locks to reduce probability of missing events\n const eventIterable = await this.pubsubManager.subscribe(\n [\"instance-lock\", projectId],\n subscriptionController.signal,\n )\n\n try {\n while (remainingStateIds.length > 0) {\n if (abortSignal?.aborted) {\n throw new Error(\"Lock operation was aborted\")\n }\n\n this.logger.debug(\n {\n projectId,\n remainingCount: remainingStateIds.length,\n lockedCount: lockedStateIds.length,\n },\n \"attempting to lock %s remaining instances\",\n remainingStateIds.length,\n )\n\n // try to acquire locks on remaining instances using the same token\n const [_, newlyLockedStateIds] = await this.tryLockInstances(\n projectId,\n remainingStateIds,\n lockMeta,\n action,\n allowPartialLock,\n token,\n )\n\n if (newlyLockedStateIds.length === 0) {\n // no instances were locked, wait for unlock events\n this.logger.debug(\n { projectId, remainingCount: remainingStateIds.length },\n \"waiting for unlock events for %s remaining instances\",\n remainingStateIds.length,\n )\n\n await this.waitForUnlockEvent(\n projectId,\n remainingStateIds,\n eventIterable,\n abortSignal,\n eventWaitTime,\n )\n continue\n }\n\n // remove newly locked instances from remaining list\n remainingStateIds = remainingStateIds.filter(id => !newlyLockedStateIds.includes(id))\n lockedStateIds.push(...newlyLockedStateIds)\n\n // if partial locking is not allowed, we should have all instances by now\n if (!allowPartialLock && remainingStateIds.length > 0) {\n this.logger.error(\n { projectId, remaining: remainingStateIds.length },\n \"partial lock not allowed but %s instances remain unlocked\",\n remainingStateIds.length,\n )\n throw new Error(\"Failed to acquire all required locks\")\n }\n }\n\n return [token, lockedStateIds]\n } finally {\n // clean up event subscription\n subscriptionController.abort()\n }\n }\n\n /**\n * Waits for an unlock event that affects any of the specified state IDs,\n * or times out to trigger the next retry attempt.\n *\n * @param projectId The project ID to monitor for events.\n * @param stateIds The state IDs we're waiting to become available.\n * @param eventIterable The async iterable for event subscription.\n * @param abortSignal Optional abort signal to interrupt waiting.\n * @param eventWaitTime Time in milliseconds to wait before timing out and retrying.\n */\n private async waitForUnlockEvent(\n projectId: string,\n stateIds: string[],\n eventIterable: AsyncIterable<InstanceLockEvent>,\n abortSignal?: AbortSignal,\n eventWaitTime = 60000,\n ): Promise<void> {\n const eventController = new AbortController()\n\n // combine abort signals\n if (abortSignal?.aborted) {\n throw new Error(\"Lock operation was aborted\")\n }\n\n const abortHandler = () => eventController.abort()\n abortSignal?.addEventListener(\"abort\", abortHandler)\n\n try {\n await Promise.race([\n // timeout promise - triggers retry attempt, does not abort\n new Promise<void>(resolve => {\n setTimeout(() => {\n this.logger.debug(\n { projectId, eventWaitTime },\n \"unlock wait timed out after %s ms, will retry\",\n eventWaitTime,\n )\n resolve()\n }, eventWaitTime)\n }),\n\n // event listener promise\n this.listenForUnlockEvents(projectId, stateIds, eventIterable, eventController.signal),\n\n // abort promise - only this can interrupt the operation\n new Promise<void>((_, reject) => {\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", () => {\n reject(new Error(\"Lock operation was aborted\"))\n })\n }\n }),\n ])\n } finally {\n eventController.abort()\n abortSignal?.removeEventListener(\"abort\", abortHandler)\n }\n }\n\n /**\n * Listens for unlock events using async iteration.\n *\n * @param projectId The project ID to monitor for events.\n * @param stateIds The state IDs we're waiting to become available.\n * @param eventIterable The async iterable for event subscription.\n * @param signal Abort signal to stop listening.\n */\n private async listenForUnlockEvents(\n projectId: string,\n stateIds: string[],\n eventIterable: AsyncIterable<InstanceLockEvent>,\n signal: AbortSignal,\n ): Promise<void> {\n for await (const event of eventIterable) {\n if (signal.aborted) {\n break\n }\n if (event.type !== \"unlocked\") {\n continue // only interested in unlock events\n }\n\n const relevantUnlocks = event.stateIds.filter((id: string) => stateIds.includes(id))\n if (relevantUnlocks.length === 0) {\n continue // keep waiting for relevant unlocks\n }\n\n if (relevantUnlocks.length > 0) {\n this.logger.debug(\n { projectId, relevantUnlocks: relevantUnlocks.length },\n \"found relevant unlock event for %s instances\",\n relevantUnlocks.length,\n )\n return // this will resolve the promise and clean up the subscription\n }\n }\n }\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace.ts\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n \"previewFeatures\": [],\n \"clientVersion\": \"7.3.0\",\n \"engineVersion\": \"9d6ad21cbbceab97458517b147a6a09ff43aa735\",\n \"activeProvider\": \"sqlite\",\n \"inlineSchema\": \"model UserWorkspaceLayout {\\n /// The opaque ID of the user to which this layout belongs.\\n userId String @id\\n\\n /// The layout of the user workspace managed by the frontend.\\n ///\\n /// ![unknown]\\n layout Json\\n}\\n\\nmodel Library {\\n /// The CUIDv2 of the library.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the library managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The spec of the library.\\n ///\\n /// [LibrarySpec]\\n spec Json\\n\\n /// The projects using this library.\\n projects Project[]\\n}\\n\\nmodel Project {\\n /// The CUIDv2 of the project.\\n id String @id @default(cuid(2))\\n\\n /// Project meta managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The name of the project within the space.\\n name String\\n\\n /// The ID of the project space this project belongs to.\\n spaceId String\\n\\n /// The ID of the project model storage this project uses.\\n modelStorageId String\\n\\n /// The ID of the library used by this project.\\n libraryId String\\n\\n /// The ID of the Pulumi backend used by this project.\\n pulumiBackendId String\\n\\n /// Encrypted project master key in AGE format.\\n encryptedMasterKey String\\n\\n /// The unlock suite for this project.\\n ///\\n /// [ProjectUnlockSuite]\\n unlockSuite Json\\n\\n /// The current version of the project database.\\n /// This is used to determine if the project needs to be migrated.\\n databaseVersion Int\\n\\n /// The time when the project was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the project was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The project space this project belongs to.\\n space ProjectSpace @relation(fields: [spaceId], references: [id])\\n\\n /// The project model storage this project uses.\\n modelStorage ProjectModelStorage @relation(fields: [modelStorageId], references: [id])\\n\\n /// The library used by this project.\\n library Library @relation(fields: [libraryId], references: [id])\\n\\n /// The Pulumi backend used by this project.\\n pulumiBackend PulumiBackend @relation(fields: [pulumiBackendId], references: [id])\\n\\n @@unique([spaceId, name])\\n}\\n\\nmodel ProjectSpace {\\n /// The CUIDv2 of the project space.\\n id String @id @default(cuid(2))\\n\\n /// The name of the project space within the parent space.\\n ///\\n /// Will be null for the global project space.\\n name String?\\n\\n /// The ID of the parent project space, if any.\\n parentId String?\\n\\n /// The metadata of the project space managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The projects in this project space.\\n projects Project[]\\n\\n /// The parent project space, if any.\\n parent ProjectSpace? @relation(\\\"ProjectSpaceHierarchy\\\", fields: [parentId], references: [id])\\n\\n /// The child project spaces, if any.\\n children ProjectSpace[] @relation(\\\"ProjectSpaceHierarchy\\\")\\n\\n @@unique([parentId, name])\\n}\\n\\nmodel ProjectModelStorage {\\n /// The CUIDv2 of the project model storage.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the project model storage managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The specification of the project model storage.\\n ///\\n /// [ProjectModelStorageSpec]\\n spec Json\\n\\n /// The projects using this model storage.\\n projects Project[]\\n}\\n\\nmodel PulumiBackend {\\n /// The CUIDv2 of the Pulumi backend.\\n id String @id @default(cuid(2))\\n\\n /// The backend meta managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The spec of the Pulumi backend.\\n ///\\n /// [PulumiBackendSpec]\\n spec Json\\n\\n /// The projects using this backend.\\n projects Project[]\\n}\\n\\n/// Unlock methods describe trusted identities that can decrypt the backend master key.\\nmodel BackendUnlockMethod {\\n /// The CUIDv2 of the unlock method.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the unlock method managed by the backend.\\n /// \\n /// [BackendUnlockMethodMeta]\\n meta Json\\n\\n /// The AGE recipient for this unlock method.\\n recipient String @unique\\n\\n /// The time when the unlock method was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the unlock method was last updated.\\n updatedAt DateTime @updatedAt\\n}\\n\\ndatasource db {\\n provider = \\\"sqlite\\\"\\n}\\n\\ngenerator client {\\n provider = \\\"prisma-client\\\"\\n output = \\\"../../../src/database/_generated/backend/sqlite\\\"\\n moduleFormat = \\\"esm\\\"\\n generatedFileExtension = \\\"ts\\\"\\n importFileExtension = \\\"ts\\\"\\n}\\n\\ngenerator json {\\n provider = \\\"prisma-json-types-generator\\\"\\n}\\n\",\n \"runtimeDataModel\": {\n \"models\": {},\n \"enums\": {},\n \"types\": {}\n }\n}\n\nconfig.runtimeDataModel = JSON.parse(\"{\\\"models\\\":{\\\"UserWorkspaceLayout\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"layout\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"}],\\\"dbName\\\":null},\\\"Library\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"spec\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"projects\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Project\\\",\\\"relationName\\\":\\\"LibraryToProject\\\"}],\\\"dbName\\\":null},\\\"Project\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"spaceId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"modelStorageId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"libraryId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"pulumiBackendId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"encryptedMasterKey\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"unlockSuite\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"databaseVersion\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"space\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ProjectSpace\\\",\\\"relationName\\\":\\\"ProjectToProjectSpace\\\"},{\\\"name\\\":\\\"modelStorage\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ProjectModelStorage\\\",\\\"relationName\\\":\\\"ProjectToProjectModelStorage\\\"},{\\\"name\\\":\\\"library\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Library\\\",\\\"relationName\\\":\\\"LibraryToProject\\\"},{\\\"name\\\":\\\"pulumiBackend\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"PulumiBackend\\\",\\\"relationName\\\":\\\"ProjectToPulumiBackend\\\"}],\\\"dbName\\\":null},\\\"ProjectSpace\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"parentId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"projects\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Project\\\",\\\"relationName\\\":\\\"ProjectToProjectSpace\\\"},{\\\"name\\\":\\\"parent\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ProjectSpace\\\",\\\"relationName\\\":\\\"ProjectSpaceHierarchy\\\"},{\\\"name\\\":\\\"children\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ProjectSpace\\\",\\\"relationName\\\":\\\"ProjectSpaceHierarchy\\\"}],\\\"dbName\\\":null},\\\"ProjectModelStorage\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"spec\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"projects\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Project\\\",\\\"relationName\\\":\\\"ProjectToProjectModelStorage\\\"}],\\\"dbName\\\":null},\\\"PulumiBackend\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"spec\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"projects\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Project\\\",\\\"relationName\\\":\\\"ProjectToPulumiBackend\\\"}],\\\"dbName\\\":null},\\\"BackendUnlockMethod\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"recipient\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null}},\\\"enums\\\":{},\\\"types\\\":{}}\")\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n const { Buffer } = await import('node:buffer')\n const wasmArray = Buffer.from(wasmBase64, 'base64')\n return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.sqlite.mjs\"),\n\n getQueryCompilerWasmModule: async () => {\n const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.sqlite.wasm-base64.mjs\")\n return await decodeBase64AsWasm(wasm)\n },\n\n importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n 'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n /**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more UserWorkspaceLayouts\n * const userWorkspaceLayouts = await prisma.userWorkspaceLayout.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\n new <\n Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n LogOpts extends LogOptions<Options> = LogOptions<Options>,\n OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n >(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more UserWorkspaceLayouts\n * const userWorkspaceLayouts = await prisma.userWorkspaceLayout.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n in LogOpts extends Prisma.LogLevel = never,\n in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,\n in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n /**\n * Connect with the database\n */\n $connect(): runtime.Types.Utils.JsPromise<void>;\n\n /**\n * Disconnect from the database\n */\n $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n * Executes a prepared raw query and returns the number of affected rows.\n * @example\n * ```\n * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Executes a raw query and returns the number of affected rows.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Performs a prepared raw query and returns the `SELECT` data.\n * @example\n * ```\n * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n /**\n * Performs a raw query and returns the `SELECT` data.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n /**\n * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n * @example\n * ```\n * const [george, bob, alice] = await prisma.$transaction([\n * prisma.user.create({ data: { name: 'George' } }),\n * prisma.user.create({ data: { name: 'Bob' } }),\n * prisma.user.create({ data: { name: 'Alice' } }),\n * ])\n * ```\n * \n * Read more in our [docs](https://www.prisma.io/docs/concepts/components/prisma-client/transactions).\n */\n $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n extArgs: ExtArgs\n }>>\n\n /**\n * `prisma.userWorkspaceLayout`: Exposes CRUD operations for the **UserWorkspaceLayout** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more UserWorkspaceLayouts\n * const userWorkspaceLayouts = await prisma.userWorkspaceLayout.findMany()\n * ```\n */\n get userWorkspaceLayout(): Prisma.UserWorkspaceLayoutDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.library`: Exposes CRUD operations for the **Library** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Libraries\n * const libraries = await prisma.library.findMany()\n * ```\n */\n get library(): Prisma.LibraryDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.project`: Exposes CRUD operations for the **Project** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Projects\n * const projects = await prisma.project.findMany()\n * ```\n */\n get project(): Prisma.ProjectDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.projectSpace`: Exposes CRUD operations for the **ProjectSpace** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ProjectSpaces\n * const projectSpaces = await prisma.projectSpace.findMany()\n * ```\n */\n get projectSpace(): Prisma.ProjectSpaceDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.projectModelStorage`: Exposes CRUD operations for the **ProjectModelStorage** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ProjectModelStorages\n * const projectModelStorages = await prisma.projectModelStorage.findMany()\n * ```\n */\n get projectModelStorage(): Prisma.ProjectModelStorageDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.pulumiBackend`: Exposes CRUD operations for the **PulumiBackend** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more PulumiBackends\n * const pulumiBackends = await prisma.pulumiBackend.findMany()\n * ```\n */\n get pulumiBackend(): Prisma.PulumiBackendDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.backendUnlockMethod`: Exposes CRUD operations for the **BackendUnlockMethod** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more BackendUnlockMethods\n * const backendUnlockMethods = await prisma.backendUnlockMethod.findMany()\n * ```\n */\n get backendUnlockMethod(): Prisma.BackendUnlockMethodDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.\n * While this enables partial backward compatibility, it is not part of the stable public API.\n *\n * If you are looking for your Models, Enums, and Input Types, please import them from the respective\n * model files in the `model` directory!\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"../models.ts\"\nimport { type PrismaClient } from \"./class.ts\"\n\nexport type * from '../models.ts'\n\nexport type DMMF = typeof runtime.DMMF\n\nexport type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>\n\n/**\n * Prisma Errors\n */\n\nexport const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\nexport type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\n\nexport const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\nexport type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\n\nexport const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\nexport type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\n\nexport const PrismaClientInitializationError = runtime.PrismaClientInitializationError\nexport type PrismaClientInitializationError = runtime.PrismaClientInitializationError\n\nexport const PrismaClientValidationError = runtime.PrismaClientValidationError\nexport type PrismaClientValidationError = runtime.PrismaClientValidationError\n\n/**\n * Re-export of sql-template-tag\n */\nexport const sql = runtime.sqltag\nexport const empty = runtime.empty\nexport const join = runtime.join\nexport const raw = runtime.raw\nexport const Sql = runtime.Sql\nexport type Sql = runtime.Sql\n\n\n\n/**\n * Decimal.js\n */\nexport const Decimal = runtime.Decimal\nexport type Decimal = runtime.Decimal\n\nexport type DecimalJsLike = runtime.DecimalJsLike\n\n/**\n* Extensions\n*/\nexport type Extension = runtime.Types.Extensions.UserArgs\nexport const getExtensionContext = runtime.Extensions.getExtensionContext\nexport type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>\nexport type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>\nexport type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>\nexport type Exact<A, W> = runtime.Types.Public.Exact<A, W>\n\nexport type PrismaVersion = {\n client: string\n engine: string\n}\n\n/**\n * Prisma Client JS version: 7.3.0\n * Query Engine version: 9d6ad21cbbceab97458517b147a6a09ff43aa735\n */\nexport const prismaVersion: PrismaVersion = {\n client: \"7.3.0\",\n engine: \"9d6ad21cbbceab97458517b147a6a09ff43aa735\"\n}\n\n/**\n * Utility Types\n */\n\nexport type Bytes = runtime.Bytes\nexport type JsonObject = runtime.JsonObject\nexport type JsonArray = runtime.JsonArray\nexport type JsonValue = runtime.JsonValue\nexport type InputJsonObject = runtime.InputJsonObject\nexport type InputJsonArray = runtime.InputJsonArray\nexport type InputJsonValue = runtime.InputJsonValue\n\n\nexport const NullTypes = {\n DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),\n JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),\n AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),\n}\n/**\n * Helper for filtering JSON entries that have `null` on the database (empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const DbNull = runtime.DbNull\n\n/**\n * Helper for filtering JSON entries that have JSON `null` values (not empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const JsonNull = runtime.JsonNull\n\n/**\n * Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const AnyNull = runtime.AnyNull\n\n\ntype SelectAndInclude = {\n select: any\n include: any\n}\n\ntype SelectAndOmit = {\n select: any\n omit: any\n}\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Prisma__Pick<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Subset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection\n */\nexport type Subset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never;\n};\n\n/**\n * SelectSubset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection.\n * Additionally, it validates, if both select and include are present. If the case, it errors.\n */\nexport type SelectSubset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n (T extends SelectAndInclude\n ? 'Please either choose `select` or `include`.'\n : T extends SelectAndOmit\n ? 'Please either choose `select` or `omit`.'\n : {})\n\n/**\n * Subset + Intersection\n * @desc From `T` pick properties that exist in `U` and intersect `K`\n */\nexport type SubsetIntersection<T, U, K> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n K\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\n\n/**\n * XOR is needed to have a real mutually exclusive union type\n * https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\nexport type XOR<T, U> =\n T extends object ?\n U extends object ?\n (Without<T, U> & U) | (Without<U, T> & T)\n : U : T\n\n\n/**\n * Is T a Record?\n */\ntype IsObject<T extends any> = T extends Array<any>\n? False\n: T extends Date\n? False\n: T extends Uint8Array\n? False\n: T extends BigInt\n? False\n: T extends object\n? True\n: False\n\n\n/**\n * If it's T[], return T\n */\nexport type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T\n\n/**\n * From ts-toolbelt\n */\n\ntype __Either<O extends object, K extends Key> = Omit<O, K> &\n {\n // Merge all but K\n [P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities\n }[K]\n\ntype EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>\n\ntype EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>\n\ntype _Either<\n O extends object,\n K extends Key,\n strict extends Boolean\n> = {\n 1: EitherStrict<O, K>\n 0: EitherLoose<O, K>\n}[strict]\n\nexport type Either<\n O extends object,\n K extends Key,\n strict extends Boolean = 1\n> = O extends unknown ? _Either<O, K, strict> : never\n\nexport type Union = any\n\nexport type PatchUndefined<O extends object, O1 extends object> = {\n [K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]\n} & {}\n\n/** Helper Types for \"Merge\" **/\nexport type IntersectOf<U extends Union> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never\n\nexport type Overwrite<O extends object, O1 extends object> = {\n [K in keyof O]: K extends keyof O1 ? O1[K] : O[K];\n} & {};\n\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n [K in keyof U]-?: At<U, K>;\n}>>;\n\ntype Key = string | number | symbol;\ntype AtStrict<O extends object, K extends Key> = O[K & keyof O];\ntype AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;\nexport type At<O extends object, K extends Key, strict extends Boolean = 1> = {\n 1: AtStrict<O, K>;\n 0: AtLoose<O, K>;\n}[strict];\n\nexport type ComputeRaw<A extends any> = A extends Function ? A : {\n [K in keyof A]: A[K];\n} & {};\n\nexport type OptionalFlat<O> = {\n [K in keyof O]?: O[K];\n} & {};\n\ntype _Record<K extends keyof any, T> = {\n [P in K]: T;\n};\n\n// cause typescript not to expand types and preserve names\ntype NoExpand<T> = T extends unknown ? T : never;\n\n// this type assumes the passed object is entirely optional\nexport type AtLeast<O extends object, K extends string> = NoExpand<\n O extends unknown\n ? | (K extends keyof O ? { [P in K]: O[P] } & O : O)\n | {[P in keyof O as P extends K ? P : never]-?: O[P]} & O\n : never>;\n\ntype _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;\n\nexport type Strict<U extends object> = ComputeRaw<_Strict<U>>;\n/** End Helper Types for \"Merge\" **/\n\nexport type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;\n\nexport type Boolean = True | False\n\nexport type True = 1\n\nexport type False = 0\n\nexport type Not<B extends Boolean> = {\n 0: 1\n 1: 0\n}[B]\n\nexport type Extends<A1 extends any, A2 extends any> = [A1] extends [never]\n ? 0 // anything `never` is false\n : A1 extends A2\n ? 1\n : 0\n\nexport type Has<U extends Union, U1 extends Union> = Not<\n Extends<Exclude<U1, U>, U1>\n>\n\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n 0: {\n 0: 0\n 1: 1\n }\n 1: {\n 0: 1\n 1: 1\n }\n}[B1][B2]\n\nexport type Keys<U extends Union> = U extends unknown ? keyof U : never\n\nexport type GetScalarType<T, O> = O extends object ? {\n [P in keyof T]: P extends keyof O\n ? O[P]\n : never\n} : never\n\ntype FieldPaths<\n T,\n U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>\n> = IsObject<T> extends True ? U : T\n\nexport type GetHavingFields<T> = {\n [K in keyof T]: Or<\n Or<Extends<'OR', K>, Extends<'AND', K>>,\n Extends<'NOT', K>\n > extends True\n ? // infer is only needed to not hit TS limit\n // based on the brilliant idea of Pierre-Antoine Mills\n // https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437\n T[K] extends infer TK\n ? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>\n : never\n : {} extends FieldPaths<T[K]>\n ? never\n : K\n}[keyof T]\n\n/**\n * Convert tuple to union\n */\ntype _TupleToUnion<T> = T extends (infer E)[] ? E : never\ntype TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>\nexport type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T\n\n/**\n * Like `Pick`, but additionally can also accept an array of keys\n */\nexport type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>\n\n/**\n * Exclude all keys with underscores\n */\nexport type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T\n\n\nexport type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>\n\ntype FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>\n\n\nexport const ModelName = {\n UserWorkspaceLayout: 'UserWorkspaceLayout',\n Library: 'Library',\n Project: 'Project',\n ProjectSpace: 'ProjectSpace',\n ProjectModelStorage: 'ProjectModelStorage',\n PulumiBackend: 'PulumiBackend',\n BackendUnlockMethod: 'BackendUnlockMethod'\n} as const\n\nexport type ModelName = (typeof ModelName)[keyof typeof ModelName]\n\n\n\nexport interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {\n returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>\n}\n\nexport type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {\n globalOmitOptions: {\n omit: GlobalOmitOptions\n }\n meta: {\n modelProps: \"userWorkspaceLayout\" | \"library\" | \"project\" | \"projectSpace\" | \"projectModelStorage\" | \"pulumiBackend\" | \"backendUnlockMethod\"\n txIsolationLevel: TransactionIsolationLevel\n }\n model: {\n UserWorkspaceLayout: {\n payload: Prisma.$UserWorkspaceLayoutPayload<ExtArgs>\n fields: Prisma.UserWorkspaceLayoutFieldRefs\n operations: {\n findUnique: {\n args: Prisma.UserWorkspaceLayoutFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.UserWorkspaceLayoutFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n findFirst: {\n args: Prisma.UserWorkspaceLayoutFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.UserWorkspaceLayoutFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n findMany: {\n args: Prisma.UserWorkspaceLayoutFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>[]\n }\n create: {\n args: Prisma.UserWorkspaceLayoutCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n createMany: {\n args: Prisma.UserWorkspaceLayoutCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.UserWorkspaceLayoutCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>[]\n }\n delete: {\n args: Prisma.UserWorkspaceLayoutDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n update: {\n args: Prisma.UserWorkspaceLayoutUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n deleteMany: {\n args: Prisma.UserWorkspaceLayoutDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.UserWorkspaceLayoutUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.UserWorkspaceLayoutUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>[]\n }\n upsert: {\n args: Prisma.UserWorkspaceLayoutUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n aggregate: {\n args: Prisma.UserWorkspaceLayoutAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateUserWorkspaceLayout>\n }\n groupBy: {\n args: Prisma.UserWorkspaceLayoutGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserWorkspaceLayoutGroupByOutputType>[]\n }\n count: {\n args: Prisma.UserWorkspaceLayoutCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserWorkspaceLayoutCountAggregateOutputType> | number\n }\n }\n }\n Library: {\n payload: Prisma.$LibraryPayload<ExtArgs>\n fields: Prisma.LibraryFieldRefs\n operations: {\n findUnique: {\n args: Prisma.LibraryFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.LibraryFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n findFirst: {\n args: Prisma.LibraryFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.LibraryFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n findMany: {\n args: Prisma.LibraryFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>[]\n }\n create: {\n args: Prisma.LibraryCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n createMany: {\n args: Prisma.LibraryCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.LibraryCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>[]\n }\n delete: {\n args: Prisma.LibraryDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n update: {\n args: Prisma.LibraryUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n deleteMany: {\n args: Prisma.LibraryDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.LibraryUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.LibraryUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>[]\n }\n upsert: {\n args: Prisma.LibraryUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n aggregate: {\n args: Prisma.LibraryAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateLibrary>\n }\n groupBy: {\n args: Prisma.LibraryGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.LibraryGroupByOutputType>[]\n }\n count: {\n args: Prisma.LibraryCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.LibraryCountAggregateOutputType> | number\n }\n }\n }\n Project: {\n payload: Prisma.$ProjectPayload<ExtArgs>\n fields: Prisma.ProjectFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ProjectFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ProjectFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n findFirst: {\n args: Prisma.ProjectFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ProjectFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n findMany: {\n args: Prisma.ProjectFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>[]\n }\n create: {\n args: Prisma.ProjectCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n createMany: {\n args: Prisma.ProjectCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ProjectCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>[]\n }\n delete: {\n args: Prisma.ProjectDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n update: {\n args: Prisma.ProjectUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n deleteMany: {\n args: Prisma.ProjectDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ProjectUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ProjectUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>[]\n }\n upsert: {\n args: Prisma.ProjectUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n aggregate: {\n args: Prisma.ProjectAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateProject>\n }\n groupBy: {\n args: Prisma.ProjectGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectGroupByOutputType>[]\n }\n count: {\n args: Prisma.ProjectCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectCountAggregateOutputType> | number\n }\n }\n }\n ProjectSpace: {\n payload: Prisma.$ProjectSpacePayload<ExtArgs>\n fields: Prisma.ProjectSpaceFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ProjectSpaceFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ProjectSpaceFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n findFirst: {\n args: Prisma.ProjectSpaceFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ProjectSpaceFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n findMany: {\n args: Prisma.ProjectSpaceFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>[]\n }\n create: {\n args: Prisma.ProjectSpaceCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n createMany: {\n args: Prisma.ProjectSpaceCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ProjectSpaceCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>[]\n }\n delete: {\n args: Prisma.ProjectSpaceDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n update: {\n args: Prisma.ProjectSpaceUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n deleteMany: {\n args: Prisma.ProjectSpaceDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ProjectSpaceUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ProjectSpaceUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>[]\n }\n upsert: {\n args: Prisma.ProjectSpaceUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n aggregate: {\n args: Prisma.ProjectSpaceAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateProjectSpace>\n }\n groupBy: {\n args: Prisma.ProjectSpaceGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectSpaceGroupByOutputType>[]\n }\n count: {\n args: Prisma.ProjectSpaceCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectSpaceCountAggregateOutputType> | number\n }\n }\n }\n ProjectModelStorage: {\n payload: Prisma.$ProjectModelStoragePayload<ExtArgs>\n fields: Prisma.ProjectModelStorageFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ProjectModelStorageFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ProjectModelStorageFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n findFirst: {\n args: Prisma.ProjectModelStorageFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ProjectModelStorageFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n findMany: {\n args: Prisma.ProjectModelStorageFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>[]\n }\n create: {\n args: Prisma.ProjectModelStorageCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n createMany: {\n args: Prisma.ProjectModelStorageCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ProjectModelStorageCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>[]\n }\n delete: {\n args: Prisma.ProjectModelStorageDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n update: {\n args: Prisma.ProjectModelStorageUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n deleteMany: {\n args: Prisma.ProjectModelStorageDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ProjectModelStorageUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ProjectModelStorageUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>[]\n }\n upsert: {\n args: Prisma.ProjectModelStorageUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n aggregate: {\n args: Prisma.ProjectModelStorageAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateProjectModelStorage>\n }\n groupBy: {\n args: Prisma.ProjectModelStorageGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectModelStorageGroupByOutputType>[]\n }\n count: {\n args: Prisma.ProjectModelStorageCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectModelStorageCountAggregateOutputType> | number\n }\n }\n }\n PulumiBackend: {\n payload: Prisma.$PulumiBackendPayload<ExtArgs>\n fields: Prisma.PulumiBackendFieldRefs\n operations: {\n findUnique: {\n args: Prisma.PulumiBackendFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.PulumiBackendFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n findFirst: {\n args: Prisma.PulumiBackendFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.PulumiBackendFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n findMany: {\n args: Prisma.PulumiBackendFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>[]\n }\n create: {\n args: Prisma.PulumiBackendCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n createMany: {\n args: Prisma.PulumiBackendCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.PulumiBackendCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>[]\n }\n delete: {\n args: Prisma.PulumiBackendDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n update: {\n args: Prisma.PulumiBackendUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n deleteMany: {\n args: Prisma.PulumiBackendDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.PulumiBackendUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.PulumiBackendUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>[]\n }\n upsert: {\n args: Prisma.PulumiBackendUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n aggregate: {\n args: Prisma.PulumiBackendAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregatePulumiBackend>\n }\n groupBy: {\n args: Prisma.PulumiBackendGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.PulumiBackendGroupByOutputType>[]\n }\n count: {\n args: Prisma.PulumiBackendCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.PulumiBackendCountAggregateOutputType> | number\n }\n }\n }\n BackendUnlockMethod: {\n payload: Prisma.$BackendUnlockMethodPayload<ExtArgs>\n fields: Prisma.BackendUnlockMethodFieldRefs\n operations: {\n findUnique: {\n args: Prisma.BackendUnlockMethodFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.BackendUnlockMethodFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n findFirst: {\n args: Prisma.BackendUnlockMethodFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.BackendUnlockMethodFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n findMany: {\n args: Prisma.BackendUnlockMethodFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>[]\n }\n create: {\n args: Prisma.BackendUnlockMethodCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n createMany: {\n args: Prisma.BackendUnlockMethodCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.BackendUnlockMethodCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>[]\n }\n delete: {\n args: Prisma.BackendUnlockMethodDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n update: {\n args: Prisma.BackendUnlockMethodUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n deleteMany: {\n args: Prisma.BackendUnlockMethodDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.BackendUnlockMethodUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.BackendUnlockMethodUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>[]\n }\n upsert: {\n args: Prisma.BackendUnlockMethodUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n aggregate: {\n args: Prisma.BackendUnlockMethodAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateBackendUnlockMethod>\n }\n groupBy: {\n args: Prisma.BackendUnlockMethodGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.BackendUnlockMethodGroupByOutputType>[]\n }\n count: {\n args: Prisma.BackendUnlockMethodCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.BackendUnlockMethodCountAggregateOutputType> | number\n }\n }\n }\n }\n} & {\n other: {\n payload: any\n operations: {\n $executeRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $executeRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n $queryRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $queryRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n }\n }\n}\n\n/**\n * Enums\n */\n\nexport const TransactionIsolationLevel = runtime.makeStrictEnum({\n Serializable: 'Serializable'\n} as const)\n\nexport type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]\n\n\nexport const UserWorkspaceLayoutScalarFieldEnum = {\n userId: 'userId',\n layout: 'layout'\n} as const\n\nexport type UserWorkspaceLayoutScalarFieldEnum = (typeof UserWorkspaceLayoutScalarFieldEnum)[keyof typeof UserWorkspaceLayoutScalarFieldEnum]\n\n\nexport const LibraryScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n spec: 'spec'\n} as const\n\nexport type LibraryScalarFieldEnum = (typeof LibraryScalarFieldEnum)[keyof typeof LibraryScalarFieldEnum]\n\n\nexport const ProjectScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n name: 'name',\n spaceId: 'spaceId',\n modelStorageId: 'modelStorageId',\n libraryId: 'libraryId',\n pulumiBackendId: 'pulumiBackendId',\n encryptedMasterKey: 'encryptedMasterKey',\n unlockSuite: 'unlockSuite',\n databaseVersion: 'databaseVersion',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type ProjectScalarFieldEnum = (typeof ProjectScalarFieldEnum)[keyof typeof ProjectScalarFieldEnum]\n\n\nexport const ProjectSpaceScalarFieldEnum = {\n id: 'id',\n name: 'name',\n parentId: 'parentId',\n meta: 'meta'\n} as const\n\nexport type ProjectSpaceScalarFieldEnum = (typeof ProjectSpaceScalarFieldEnum)[keyof typeof ProjectSpaceScalarFieldEnum]\n\n\nexport const ProjectModelStorageScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n spec: 'spec'\n} as const\n\nexport type ProjectModelStorageScalarFieldEnum = (typeof ProjectModelStorageScalarFieldEnum)[keyof typeof ProjectModelStorageScalarFieldEnum]\n\n\nexport const PulumiBackendScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n spec: 'spec'\n} as const\n\nexport type PulumiBackendScalarFieldEnum = (typeof PulumiBackendScalarFieldEnum)[keyof typeof PulumiBackendScalarFieldEnum]\n\n\nexport const BackendUnlockMethodScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n recipient: 'recipient',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type BackendUnlockMethodScalarFieldEnum = (typeof BackendUnlockMethodScalarFieldEnum)[keyof typeof BackendUnlockMethodScalarFieldEnum]\n\n\nexport const SortOrder = {\n asc: 'asc',\n desc: 'desc'\n} as const\n\nexport type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]\n\n\nexport const JsonNullValueInput = {\n JsonNull: JsonNull\n} as const\n\nexport type JsonNullValueInput = (typeof JsonNullValueInput)[keyof typeof JsonNullValueInput]\n\n\nexport const JsonNullValueFilter = {\n DbNull: DbNull,\n JsonNull: JsonNull,\n AnyNull: AnyNull\n} as const\n\nexport type JsonNullValueFilter = (typeof JsonNullValueFilter)[keyof typeof JsonNullValueFilter]\n\n\nexport const QueryMode = {\n default: 'default',\n insensitive: 'insensitive'\n} as const\n\nexport type QueryMode = (typeof QueryMode)[keyof typeof QueryMode]\n\n\nexport const NullsOrder = {\n first: 'first',\n last: 'last'\n} as const\n\nexport type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]\n\n\n\n/**\n * Field references\n */\n\n\n/**\n * Reference to a field of type 'String'\n */\nexport type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>\n \n\n\n/**\n * Reference to a field of type 'Json'\n */\nexport type JsonFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Json'>\n \n\n\n/**\n * Reference to a field of type 'QueryMode'\n */\nexport type EnumQueryModeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'QueryMode'>\n \n\n\n/**\n * Reference to a field of type 'Int'\n */\nexport type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>\n \n\n\n/**\n * Reference to a field of type 'DateTime'\n */\nexport type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>\n \n\n\n/**\n * Reference to a field of type 'Float'\n */\nexport type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>\n \n\n/**\n * Batch Payload for updateMany & deleteMany & createMany\n */\nexport type BatchPayload = {\n count: number\n}\n\nexport const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<\"define\", TypeMapCb, runtime.Types.Extensions.DefaultArgs>\nexport type DefaultPrismaClient = PrismaClient\nexport type ErrorFormat = 'pretty' | 'colorless' | 'minimal'\nexport type PrismaClientOptions = ({\n /**\n * Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-pg`.\n */\n adapter: runtime.SqlDriverAdapterFactory\n accelerateUrl?: never\n} | {\n /**\n * Prisma Accelerate URL allowing the client to connect through Accelerate instead of a direct database.\n */\n accelerateUrl: string\n adapter?: never\n}) & {\n /**\n * @default \"colorless\"\n */\n errorFormat?: ErrorFormat\n /**\n * @example\n * ```\n * // Shorthand for `emit: 'stdout'`\n * log: ['query', 'info', 'warn', 'error']\n * \n * // Emit as events only\n * log: [\n * { emit: 'event', level: 'query' },\n * { emit: 'event', level: 'info' },\n * { emit: 'event', level: 'warn' }\n * { emit: 'event', level: 'error' }\n * ]\n * \n * / Emit as events and log to stdout\n * og: [\n * { emit: 'stdout', level: 'query' },\n * { emit: 'stdout', level: 'info' },\n * { emit: 'stdout', level: 'warn' }\n * { emit: 'stdout', level: 'error' }\n * \n * ```\n * Read more in our [docs](https://pris.ly/d/logging).\n */\n log?: (LogLevel | LogDefinition)[]\n /**\n * The default values for transactionOptions\n * maxWait ?= 2000\n * timeout ?= 5000\n */\n transactionOptions?: {\n maxWait?: number\n timeout?: number\n isolationLevel?: TransactionIsolationLevel\n }\n /**\n * Global configuration for omitting model fields by default.\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * omit: {\n * user: {\n * password: true\n * }\n * }\n * })\n * ```\n */\n omit?: GlobalOmitConfig\n /**\n * SQL commenter plugins that add metadata to SQL queries as comments.\n * Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter,\n * comments: [\n * traceContext(),\n * queryInsights(),\n * ],\n * })\n * ```\n */\n comments?: runtime.SqlCommenterPlugin[]\n}\nexport type GlobalOmitConfig = {\n userWorkspaceLayout?: Prisma.UserWorkspaceLayoutOmit\n library?: Prisma.LibraryOmit\n project?: Prisma.ProjectOmit\n projectSpace?: Prisma.ProjectSpaceOmit\n projectModelStorage?: Prisma.ProjectModelStorageOmit\n pulumiBackend?: Prisma.PulumiBackendOmit\n backendUnlockMethod?: Prisma.BackendUnlockMethodOmit\n}\n\n/* Types for Logging */\nexport type LogLevel = 'info' | 'query' | 'warn' | 'error'\nexport type LogDefinition = {\n level: LogLevel\n emit: 'stdout' | 'event'\n}\n\nexport type CheckIsLogLevel<T> = T extends LogLevel ? T : never;\n\nexport type GetLogType<T> = CheckIsLogLevel<\n T extends LogDefinition ? T['level'] : T\n>;\n\nexport type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>\n ? GetLogType<T[number]>\n : never;\n\nexport type QueryEvent = {\n timestamp: Date\n query: string\n params: string\n duration: number\n target: string\n}\n\nexport type LogEvent = {\n timestamp: Date\n message: string\n target: string\n}\n/* End Types for Logging */\n\n\nexport type PrismaAction =\n | 'findUnique'\n | 'findUniqueOrThrow'\n | 'findMany'\n | 'findFirst'\n | 'findFirstOrThrow'\n | 'create'\n | 'createMany'\n | 'createManyAndReturn'\n | 'update'\n | 'updateMany'\n | 'updateManyAndReturn'\n | 'upsert'\n | 'delete'\n | 'deleteMany'\n | 'executeRaw'\n | 'queryRaw'\n | 'aggregate'\n | 'count'\n | 'runCommandRaw'\n | 'findRaw'\n | 'groupBy'\n\n/**\n * `PrismaClient` proxy available in interactive transactions.\n */\nexport type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>\n\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * 🟢 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums.ts\"\nimport * as $Class from \"./internal/class.ts\"\nimport * as Prisma from \"./internal/prismaNamespace.ts\"\n\nexport * as $Enums from './enums.ts'\nexport * from \"./enums.ts\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more UserWorkspaceLayouts\n * const userWorkspaceLayouts = await prisma.userWorkspaceLayout.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model UserWorkspaceLayout\n * \n */\nexport type UserWorkspaceLayout = Prisma.UserWorkspaceLayoutModel\n/**\n * Model Library\n * \n */\nexport type Library = Prisma.LibraryModel\n/**\n * Model Project\n * \n */\nexport type Project = Prisma.ProjectModel\n/**\n * Model ProjectSpace\n * \n */\nexport type ProjectSpace = Prisma.ProjectSpaceModel\n/**\n * Model ProjectModelStorage\n * \n */\nexport type ProjectModelStorage = Prisma.ProjectModelStorageModel\n/**\n * Model PulumiBackend\n * \n */\nexport type PulumiBackend = Prisma.PulumiBackendModel\n/**\n * Model BackendUnlockMethod\n * Unlock methods describe trusted identities that can decrypt the backend master key.\n */\nexport type BackendUnlockMethod = Prisma.BackendUnlockMethodModel\n","import type { Logger } from \"pino\"\nimport { readFile } from \"node:fs/promises\"\nimport { dirname, join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { resolve as importMetaResolve } from \"import-meta-resolve\"\nimport { BackendError } from \"../shared\"\n\nexport type MigrationClient = {\n $transaction<T>(callback: (tx: unknown) => Promise<T>): Promise<T>\n $executeRawUnsafe(query: string): Promise<number>\n}\n\nexport type MigrationPack = {\n type: \"backend\" | \"project\"\n schemaPath: string\n migrationNames: string[]\n}\n\nexport const migrationPacks = {\n \"backend/sqlite\": {\n type: \"backend\" as const,\n schemaPath: \"backend/sqlite\",\n migrationNames: [\n //\n \"20250928124105_initial_migration\",\n ],\n },\n project: {\n type: \"project\" as const,\n schemaPath: \"project\",\n migrationNames: [\n //\n \"20250928130725_initial_migration\",\n \"20260123000000_add_instance_state_self_hash\",\n ],\n },\n}\n\nexport const backendDatabaseVersion = migrationPacks[\"backend/sqlite\"].migrationNames.length\nexport const projectDatabaseVersion = migrationPacks.project.migrationNames.length\n\nexport async function migrateDatabase(\n client: MigrationClient,\n migrationPack: MigrationPack,\n currentVersion: number,\n writeVersion: (version: number) => Promise<void>,\n logger: Logger,\n): Promise<void> {\n const { type, schemaPath, migrationNames } = migrationPack\n const targetVersion = migrationNames.length\n\n const backendIndexPath = importMetaResolve(\"@highstate/backend\", import.meta.url)\n const backendRootPath = join(dirname(fileURLToPath(backendIndexPath)), \"..\")\n const migrationsDir = resolve(backendRootPath, `prisma`, schemaPath, \"migrations\")\n\n logger.debug(`migrations dir: \"%s\"`, migrationsDir)\n\n if (currentVersion > targetVersion) {\n throw new BackendError(\n `The version of the ${type} database (${currentVersion}) is newer than expected (${targetVersion}). Do you need to upgrade Highstate?`,\n )\n }\n\n for (let version = currentVersion; version < migrationNames.length; version++) {\n const nextVersion = version + 1\n const nextMigrationName = migrationNames[nextVersion - 1]\n\n logger.info(\n `applying migration for %s database, %d -> %d: %s`,\n type,\n version,\n nextVersion,\n nextMigrationName,\n )\n\n const migrationPath = join(migrationsDir, nextMigrationName, \"migration.sql\")\n const content = await readFile(migrationPath, \"utf-8\")\n\n const statements = splitToStatements(content)\n\n // execute each statement and update the version in a single transaction\n await client.$transaction(async tx => {\n for (const statement of statements) {\n await (tx as MigrationClient).$executeRawUnsafe(statement)\n }\n\n await writeVersion(nextVersion)\n })\n }\n\n logger.info(`database is up to date at version %d`, migrationNames.length)\n}\n\nfunction splitToStatements(sql: string): string[] {\n const statements: string[] = []\n let currentStatement = \"\"\n let insideString = false\n let stringChar = \"\"\n\n for (let i = 0; i < sql.length; i++) {\n const char = sql[i]\n\n if ((char === \"'\" || char === '\"') && !insideString) {\n insideString = true\n stringChar = char\n } else if (char === stringChar && insideString) {\n insideString = false\n stringChar = \"\"\n }\n\n if (char === \";\" && !insideString) {\n if (currentStatement.trim().length > 0) {\n statements.push(currentStatement.trim())\n }\n currentStatement = \"\"\n } else {\n currentStatement += char\n }\n }\n\n if (currentStatement.trim().length > 0) {\n statements.push(currentStatement.trim())\n }\n\n return statements\n}\n","import type { BackendDatabase } from \"./prisma\"\nimport {\n codebaseLibrary,\n codebaseProjectModelStorage,\n databaseProjectModelStorage,\n globalProjectSpace,\n hostPulumiBackend,\n} from \"../shared/models/backend/well-known\"\n\nexport async function ensureWellKnownEntitiesCreated(database: BackendDatabase): Promise<void> {\n await database.$transaction([\n database.projectSpace.upsert({\n where: { id: globalProjectSpace.id },\n create: globalProjectSpace,\n update: globalProjectSpace,\n }),\n database.library.upsert({\n where: { id: codebaseLibrary.id },\n create: codebaseLibrary,\n update: codebaseLibrary,\n }),\n database.pulumiBackend.upsert({\n where: { id: hostPulumiBackend.id },\n create: hostPulumiBackend,\n update: hostPulumiBackend,\n }),\n database.projectModelStorage.upsert({\n where: { id: codebaseProjectModelStorage.id },\n create: codebaseProjectModelStorage,\n update: codebaseProjectModelStorage,\n }),\n database.projectModelStorage.upsert({\n where: { id: databaseProjectModelStorage.id },\n create: databaseProjectModelStorage,\n update: databaseProjectModelStorage,\n }),\n ])\n}\n","import type { Logger } from \"pino\"\nimport { readFile } from \"node:fs/promises\"\nimport { AsyncEntry, findCredentialsAsync } from \"@napi-rs/keyring\"\nimport { generateIdentity } from \"age-encryption\"\nimport { z } from \"zod\"\n\nconst serviceName = \"io.highstate.backend\"\nconst accountName = \"identity\"\n\nexport const backendIdentityConfig = z.object({\n HIGHSTATE_BACKEND_DATABASE_IDENTITY: z.string().optional(),\n HIGHSTATE_BACKEND_DATABASE_IDENTITY_PATH: z.string().optional(),\n})\n\nexport type BackendIdentityConfig = z.infer<typeof backendIdentityConfig>\n\n/**\n * Retrieves or creates the backend identity for database encryption.\n *\n * The identity can be loaded from multiple sources in this priority order:\n * 1. Environment variable HIGHSTATE_BACKEND_DATABASE_IDENTITY (direct identity string)\n * 2. Environment variable HIGHSTATE_BACKEND_DATABASE_IDENTITY_PATH (path to identity file)\n * 3. OS keyring (default behavior - creates new identity if not found)\n *\n * When using environment variables, the OS keyring is bypassed entirely.\n * This is useful for environments where OS keyring is not available or for automation.\n *\n * @param config Configuration object containing optional identity environment variables.\n * @param logger Logger instance for recording identity source and operations.\n * @returns The AGE identity string used to decrypt the backend master key.\n */\nexport async function getOrCreateBackendIdentity(\n config: BackendIdentityConfig,\n logger: Logger,\n): Promise<string> {\n // priority 1: direct identity from environment variable\n if (config.HIGHSTATE_BACKEND_DATABASE_IDENTITY) {\n logger.info(\"using backend identity from HIGHSTATE_BACKEND_DATABASE_IDENTITY\")\n return config.HIGHSTATE_BACKEND_DATABASE_IDENTITY\n }\n\n // priority 2: identity from file path specified in environment variable\n if (config.HIGHSTATE_BACKEND_DATABASE_IDENTITY_PATH) {\n try {\n const identity = await readFile(config.HIGHSTATE_BACKEND_DATABASE_IDENTITY_PATH, \"utf-8\")\n logger.info(\n `using backend identity from path specified in HIGHSTATE_BACKEND_DATABASE_IDENTITY_PATH`,\n )\n return identity.trim()\n } catch (error) {\n throw new Error(\n `Failed to read backend identity from \"${config.HIGHSTATE_BACKEND_DATABASE_IDENTITY_PATH}\"`,\n { cause: error },\n )\n }\n }\n\n // priority 3: OS keyring (default behavior)\n const credentials = await findCredentialsAsync(serviceName)\n const entry = credentials.find(entry => entry.account === accountName)\n\n if (entry) {\n logger.info(\"using backend identity from OS keyring\")\n return entry.password\n }\n\n const newIdentity = await generateIdentity()\n await new AsyncEntry(serviceName, accountName).setPassword(newIdentity)\n\n logger.info(\"created new backend identity and stored it in the OS keyring\")\n return newIdentity\n}\n","import { readFile, writeFile } from \"node:fs/promises\"\nimport { parse, stringify } from \"yaml\"\nimport { z } from \"zod\"\n\nconst databaseMetaFileSchema = z.object({\n version: z.number(),\n masterKey: z.string().optional(),\n})\n\nexport type DatabaseMetaFile = z.infer<typeof databaseMetaFileSchema>\n\nexport async function readMetaFile(\n databasePath: string,\n): Promise<z.infer<typeof databaseMetaFileSchema> | undefined> {\n const metaFilePath = `${databasePath}/backend.meta.yaml`\n\n let content: string\n try {\n content = await readFile(metaFilePath, \"utf-8\")\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined\n }\n\n throw new Error(`Failed to read database meta file at \"${metaFilePath}\"`, { cause: error })\n }\n\n try {\n return databaseMetaFileSchema.parse(parse(content))\n } catch (error) {\n throw new Error(`Failed to parse database meta file at \"${metaFilePath}\"`, { cause: error })\n }\n}\n\nexport async function writeMetaFile(\n databasePath: string,\n meta: z.infer<typeof databaseMetaFileSchema>,\n): Promise<void> {\n const metaFilePath = `${databasePath}/backend.meta.yaml`\n\n try {\n await writeFile(metaFilePath, stringify(meta), \"utf-8\")\n } catch (error) {\n throw new Error(`Failed to write database meta file at \"${metaFilePath}\"`, { cause: error })\n }\n}\n","import type { Logger } from \"pino\"\nimport type { BackendDatabaseBackend } from \"../abstractions\"\nimport type { BackendDatabase } from \"../prisma\"\nimport { randomBytes } from \"node:crypto\"\nimport { hostname } from \"node:os\"\nimport { PrismaLibSql } from \"@prisma/adapter-libsql\"\nimport { armor, Decrypter, Encrypter, identityToRecipient } from \"age-encryption\"\nimport { z } from \"zod\"\nimport { codebaseConfig, getCodebaseHighstatePath } from \"../../common\"\nimport { PrismaClient } from \"../_generated/backend/sqlite/client\"\nimport { migrateDatabase, migrationPacks } from \"../migration\"\nimport { ensureWellKnownEntitiesCreated } from \"../well-known\"\nimport {\n type BackendIdentityConfig,\n backendIdentityConfig,\n getOrCreateBackendIdentity,\n} from \"./keyring\"\nimport { type DatabaseMetaFile, readMetaFile, writeMetaFile } from \"./meta\"\n\nexport const localBackendDatabaseConfig = z.object({\n ...codebaseConfig.shape,\n HIGHSTATE_BACKEND_DATABASE_LOCAL_PATH: z.string().optional(),\n ...backendIdentityConfig.shape,\n HIGHSTATE_ENCRYPTION_ENABLED: z.stringbool().default(true),\n})\n\n/**\n * Local implementation backed by a LibSQL database with optional encryption.\n */\nclass LocalBackendDatabaseBackend implements BackendDatabaseBackend {\n constructor(\n readonly database: BackendDatabase,\n private readonly databasePath: string,\n private readonly config: BackendIdentityConfig,\n private readonly logger: Logger,\n readonly isEncryptionEnabled: boolean,\n ) {}\n\n /**\n * Rewrites the encrypted master key to match the provided recipients.\n *\n * @param recipients AGE recipients that should retain access to the backend master key.\n */\n async reencryptMasterKey(recipients: string[]): Promise<void> {\n if (!this.isEncryptionEnabled) {\n return\n }\n\n const meta = await readMetaFile(this.databasePath)\n if (!meta?.masterKey) {\n this.logger.warn(\n { databasePath: this.databasePath },\n \"backend meta file does not contain a master key; skipping re-encryption\",\n )\n return\n }\n\n const identity = await getOrCreateBackendIdentity(this.config, this.logger)\n const decrypter = new Decrypter()\n decrypter.addIdentity(identity)\n\n const plaintextMasterKey = await decrypter.decrypt(armor.decode(meta.masterKey), \"text\")\n\n const encrypter = new Encrypter()\n const allowedRecipients = new Set<string>(recipients)\n allowedRecipients.add(await identityToRecipient(identity))\n\n for (const recipient of allowedRecipients) {\n encrypter.addRecipient(recipient)\n }\n\n const encrypted = await encrypter.encrypt(plaintextMasterKey)\n\n await writeMetaFile(this.databasePath, {\n ...meta,\n masterKey: armor.encode(encrypted),\n })\n }\n}\n\nasync function createMasterKey(config: BackendIdentityConfig, logger: Logger) {\n const identity = await getOrCreateBackendIdentity(config, logger)\n\n const masterKey = randomBytes(32).toString(\"hex\")\n const encrypter = new Encrypter()\n\n const recipient = await identityToRecipient(identity)\n encrypter.addRecipient(recipient)\n\n const encryptedMasterKey = await encrypter.encrypt(masterKey)\n const armoredMasterKey = armor.encode(encryptedMasterKey)\n\n return { armoredMasterKey, masterKey, recipient }\n}\n\ntype DatabaseInitializationResult = {\n masterKey?: string\n metaFile: DatabaseMetaFile\n created: boolean\n initialRecipient?: string\n}\n\nasync function ensureDatabaseInitialized(\n databasePath: string,\n encryptionEnabled: boolean,\n config: BackendIdentityConfig,\n logger: Logger,\n): Promise<DatabaseInitializationResult> {\n const meta = await readMetaFile(databasePath)\n\n if (!meta) {\n logger.info(\"creating new database\")\n\n const masterKey = encryptionEnabled ? await createMasterKey(config, logger) : undefined\n\n const metaFile: DatabaseMetaFile = {\n version: 0,\n masterKey: masterKey?.armoredMasterKey,\n }\n\n return {\n masterKey: masterKey?.masterKey,\n metaFile,\n created: true,\n initialRecipient: masterKey?.recipient,\n }\n }\n\n if (!encryptionEnabled) {\n return {\n masterKey: undefined,\n metaFile: meta,\n created: false,\n }\n }\n\n if (!meta.masterKey) {\n throw new Error(\n `Database meta file at \"${databasePath}/backend.meta.yaml\" does not contain a master key.`,\n )\n }\n\n const identity = await getOrCreateBackendIdentity(config, logger)\n\n const decrypter = new Decrypter()\n decrypter.addIdentity(identity)\n\n const encryptedMasterKey = armor.decode(meta.masterKey)\n const masterKey = await decrypter.decrypt(encryptedMasterKey, \"text\")\n\n return {\n masterKey,\n metaFile: meta,\n created: false,\n }\n}\n\n/**\n * Creates the local backend database backend with migrations applied.\n *\n * @param config Backend database configuration resolved from environment variables.\n * @param logger Logger scoped to backend startup.\n * @returns The backend database backend bound to the local LibSQL store.\n */\nexport async function createLocalBackendDatabaseBackend(\n config: z.infer<typeof localBackendDatabaseConfig>,\n logger: Logger,\n): Promise<BackendDatabaseBackend> {\n if (!config.HIGHSTATE_ENCRYPTION_ENABLED) {\n logger.warn(\"local database encryption is disabled, this is not recommended for production use\")\n }\n\n let databasePath = config.HIGHSTATE_BACKEND_DATABASE_LOCAL_PATH\n databasePath ??= await getCodebaseHighstatePath(config, logger)\n\n const { masterKey, metaFile, created, initialRecipient } = await ensureDatabaseInitialized(\n databasePath,\n config.HIGHSTATE_ENCRYPTION_ENABLED,\n config,\n logger,\n )\n\n const databaseUrl = `file:${databasePath}/backend.db`\n\n const adapter = new PrismaLibSql({\n url: databaseUrl,\n encryptionKey: masterKey,\n })\n\n const prismaClient = new PrismaClient({\n adapter,\n })\n\n await migrateDatabase(\n prismaClient,\n migrationPacks[\"backend/sqlite\"],\n metaFile.version,\n async version => await writeMetaFile(databasePath, { ...metaFile, version }),\n logger,\n )\n\n const database = prismaClient as BackendDatabase\n\n await ensureWellKnownEntitiesCreated(database)\n\n const backendLogger = logger.child({ service: \"LocalBackendDatabaseBackend\" })\n\n await ensureInitialUnlockMethod(database, created, initialRecipient, backendLogger)\n\n return new LocalBackendDatabaseBackend(\n database,\n databasePath,\n config,\n backendLogger,\n config.HIGHSTATE_ENCRYPTION_ENABLED,\n )\n}\n\n/**\n * Derives the meta payload for the auto-generated backend unlock method.\n *\n * @param host Raw host name captured during backend initialization.\n */\nexport function getInitialBackendUnlockMethodMeta(host: string | undefined): {\n title: string\n description: string\n} {\n const trimmed = host?.trim() ?? \"\"\n const title = trimmed.length > 0 ? trimmed : \"initial\"\n const description =\n trimmed.length > 0\n ? `Identity automatically registered for ${trimmed} when this backend database was created.`\n : \"Identity automatically registered when this backend database was created.\"\n\n return { title, description }\n}\n\n/**\n * Registers the machine that initialized the backend as the first unlock method.\n */\nasync function ensureInitialUnlockMethod(\n database: BackendDatabase,\n created: boolean,\n initialRecipient: string | undefined,\n logger: Logger,\n): Promise<void> {\n if (!created || !initialRecipient) {\n return\n }\n\n const meta = getInitialBackendUnlockMethodMeta(hostname())\n\n await database.backendUnlockMethod.create({\n data: {\n recipient: initialRecipient,\n meta,\n },\n })\n\n logger.info(\n { title: meta.title, recipient: initialRecipient },\n \"registered initial backend unlock method\",\n )\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace.ts\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n \"previewFeatures\": [],\n \"clientVersion\": \"7.3.0\",\n \"engineVersion\": \"9d6ad21cbbceab97458517b147a6a09ff43aa735\",\n \"activeProvider\": \"postgresql\",\n \"inlineSchema\": \"model UserWorkspaceLayout {\\n /// The opaque ID of the user to which this layout belongs.\\n userId String @id\\n\\n /// The layout of the user workspace managed by the frontend.\\n ///\\n /// ![unknown]\\n layout Json\\n}\\n\\nmodel Library {\\n /// The CUIDv2 of the library.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the library managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The spec of the library.\\n ///\\n /// [LibrarySpec]\\n spec Json\\n\\n /// The projects using this library.\\n projects Project[]\\n}\\n\\nmodel Project {\\n /// The CUIDv2 of the project.\\n id String @id @default(cuid(2))\\n\\n /// Project meta managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The name of the project within the space.\\n name String\\n\\n /// The ID of the project space this project belongs to.\\n spaceId String\\n\\n /// The ID of the project model storage this project uses.\\n modelStorageId String\\n\\n /// The ID of the library used by this project.\\n libraryId String\\n\\n /// The ID of the Pulumi backend used by this project.\\n pulumiBackendId String\\n\\n /// Encrypted project master key in AGE format.\\n encryptedMasterKey String\\n\\n /// The unlock suite for this project.\\n ///\\n /// [ProjectUnlockSuite]\\n unlockSuite Json\\n\\n /// The current version of the project database.\\n /// This is used to determine if the project needs to be migrated.\\n databaseVersion Int\\n\\n /// The time when the project was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the project was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The project space this project belongs to.\\n space ProjectSpace @relation(fields: [spaceId], references: [id])\\n\\n /// The project model storage this project uses.\\n modelStorage ProjectModelStorage @relation(fields: [modelStorageId], references: [id])\\n\\n /// The library used by this project.\\n library Library @relation(fields: [libraryId], references: [id])\\n\\n /// The Pulumi backend used by this project.\\n pulumiBackend PulumiBackend @relation(fields: [pulumiBackendId], references: [id])\\n\\n @@unique([spaceId, name])\\n}\\n\\nmodel ProjectSpace {\\n /// The CUIDv2 of the project space.\\n id String @id @default(cuid(2))\\n\\n /// The name of the project space within the parent space.\\n ///\\n /// Will be null for the global project space.\\n name String?\\n\\n /// The ID of the parent project space, if any.\\n parentId String?\\n\\n /// The metadata of the project space managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The projects in this project space.\\n projects Project[]\\n\\n /// The parent project space, if any.\\n parent ProjectSpace? @relation(\\\"ProjectSpaceHierarchy\\\", fields: [parentId], references: [id])\\n\\n /// The child project spaces, if any.\\n children ProjectSpace[] @relation(\\\"ProjectSpaceHierarchy\\\")\\n\\n @@unique([parentId, name])\\n}\\n\\nmodel ProjectModelStorage {\\n /// The CUIDv2 of the project model storage.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the project model storage managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The specification of the project model storage.\\n ///\\n /// [ProjectModelStorageSpec]\\n spec Json\\n\\n /// The projects using this model storage.\\n projects Project[]\\n}\\n\\nmodel PulumiBackend {\\n /// The CUIDv2 of the Pulumi backend.\\n id String @id @default(cuid(2))\\n\\n /// The backend meta managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The spec of the Pulumi backend.\\n ///\\n /// [PulumiBackendSpec]\\n spec Json\\n\\n /// The projects using this backend.\\n projects Project[]\\n}\\n\\n/// Unlock methods describe trusted identities that can decrypt the backend master key.\\nmodel BackendUnlockMethod {\\n /// The CUIDv2 of the unlock method.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the unlock method managed by the backend.\\n /// \\n /// [BackendUnlockMethodMeta]\\n meta Json\\n\\n /// The AGE recipient for this unlock method.\\n recipient String @unique\\n\\n /// The time when the unlock method was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the unlock method was last updated.\\n updatedAt DateTime @updatedAt\\n}\\n\\ndatasource db {\\n provider = \\\"postgresql\\\"\\n}\\n\\ngenerator client {\\n provider = \\\"prisma-client\\\"\\n output = \\\"../../../src/database/_generated/backend/postgresql\\\"\\n moduleFormat = \\\"esm\\\"\\n generatedFileExtension = \\\"ts\\\"\\n importFileExtension = \\\"ts\\\"\\n}\\n\\ngenerator json {\\n provider = \\\"prisma-json-types-generator\\\"\\n}\\n\",\n \"runtimeDataModel\": {\n \"models\": {},\n \"enums\": {},\n \"types\": {}\n }\n}\n\nconfig.runtimeDataModel = JSON.parse(\"{\\\"models\\\":{\\\"UserWorkspaceLayout\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"layout\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"}],\\\"dbName\\\":null},\\\"Library\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"spec\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"projects\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Project\\\",\\\"relationName\\\":\\\"LibraryToProject\\\"}],\\\"dbName\\\":null},\\\"Project\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"spaceId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"modelStorageId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"libraryId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"pulumiBackendId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"encryptedMasterKey\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"unlockSuite\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"databaseVersion\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"space\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ProjectSpace\\\",\\\"relationName\\\":\\\"ProjectToProjectSpace\\\"},{\\\"name\\\":\\\"modelStorage\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ProjectModelStorage\\\",\\\"relationName\\\":\\\"ProjectToProjectModelStorage\\\"},{\\\"name\\\":\\\"library\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Library\\\",\\\"relationName\\\":\\\"LibraryToProject\\\"},{\\\"name\\\":\\\"pulumiBackend\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"PulumiBackend\\\",\\\"relationName\\\":\\\"ProjectToPulumiBackend\\\"}],\\\"dbName\\\":null},\\\"ProjectSpace\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"parentId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"projects\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Project\\\",\\\"relationName\\\":\\\"ProjectToProjectSpace\\\"},{\\\"name\\\":\\\"parent\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ProjectSpace\\\",\\\"relationName\\\":\\\"ProjectSpaceHierarchy\\\"},{\\\"name\\\":\\\"children\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ProjectSpace\\\",\\\"relationName\\\":\\\"ProjectSpaceHierarchy\\\"}],\\\"dbName\\\":null},\\\"ProjectModelStorage\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"spec\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"projects\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Project\\\",\\\"relationName\\\":\\\"ProjectToProjectModelStorage\\\"}],\\\"dbName\\\":null},\\\"PulumiBackend\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"spec\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"projects\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Project\\\",\\\"relationName\\\":\\\"ProjectToPulumiBackend\\\"}],\\\"dbName\\\":null},\\\"BackendUnlockMethod\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"recipient\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null}},\\\"enums\\\":{},\\\"types\\\":{}}\")\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n const { Buffer } = await import('node:buffer')\n const wasmArray = Buffer.from(wasmBase64, 'base64')\n return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.postgresql.mjs\"),\n\n getQueryCompilerWasmModule: async () => {\n const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.postgresql.wasm-base64.mjs\")\n return await decodeBase64AsWasm(wasm)\n },\n\n importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n 'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n /**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more UserWorkspaceLayouts\n * const userWorkspaceLayouts = await prisma.userWorkspaceLayout.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\n new <\n Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n LogOpts extends LogOptions<Options> = LogOptions<Options>,\n OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n >(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more UserWorkspaceLayouts\n * const userWorkspaceLayouts = await prisma.userWorkspaceLayout.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n in LogOpts extends Prisma.LogLevel = never,\n in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,\n in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n /**\n * Connect with the database\n */\n $connect(): runtime.Types.Utils.JsPromise<void>;\n\n /**\n * Disconnect from the database\n */\n $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n * Executes a prepared raw query and returns the number of affected rows.\n * @example\n * ```\n * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Executes a raw query and returns the number of affected rows.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Performs a prepared raw query and returns the `SELECT` data.\n * @example\n * ```\n * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n /**\n * Performs a raw query and returns the `SELECT` data.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n /**\n * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n * @example\n * ```\n * const [george, bob, alice] = await prisma.$transaction([\n * prisma.user.create({ data: { name: 'George' } }),\n * prisma.user.create({ data: { name: 'Bob' } }),\n * prisma.user.create({ data: { name: 'Alice' } }),\n * ])\n * ```\n * \n * Read more in our [docs](https://www.prisma.io/docs/concepts/components/prisma-client/transactions).\n */\n $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n extArgs: ExtArgs\n }>>\n\n /**\n * `prisma.userWorkspaceLayout`: Exposes CRUD operations for the **UserWorkspaceLayout** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more UserWorkspaceLayouts\n * const userWorkspaceLayouts = await prisma.userWorkspaceLayout.findMany()\n * ```\n */\n get userWorkspaceLayout(): Prisma.UserWorkspaceLayoutDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.library`: Exposes CRUD operations for the **Library** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Libraries\n * const libraries = await prisma.library.findMany()\n * ```\n */\n get library(): Prisma.LibraryDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.project`: Exposes CRUD operations for the **Project** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Projects\n * const projects = await prisma.project.findMany()\n * ```\n */\n get project(): Prisma.ProjectDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.projectSpace`: Exposes CRUD operations for the **ProjectSpace** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ProjectSpaces\n * const projectSpaces = await prisma.projectSpace.findMany()\n * ```\n */\n get projectSpace(): Prisma.ProjectSpaceDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.projectModelStorage`: Exposes CRUD operations for the **ProjectModelStorage** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ProjectModelStorages\n * const projectModelStorages = await prisma.projectModelStorage.findMany()\n * ```\n */\n get projectModelStorage(): Prisma.ProjectModelStorageDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.pulumiBackend`: Exposes CRUD operations for the **PulumiBackend** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more PulumiBackends\n * const pulumiBackends = await prisma.pulumiBackend.findMany()\n * ```\n */\n get pulumiBackend(): Prisma.PulumiBackendDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.backendUnlockMethod`: Exposes CRUD operations for the **BackendUnlockMethod** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more BackendUnlockMethods\n * const backendUnlockMethods = await prisma.backendUnlockMethod.findMany()\n * ```\n */\n get backendUnlockMethod(): Prisma.BackendUnlockMethodDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.\n * While this enables partial backward compatibility, it is not part of the stable public API.\n *\n * If you are looking for your Models, Enums, and Input Types, please import them from the respective\n * model files in the `model` directory!\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"../models.ts\"\nimport { type PrismaClient } from \"./class.ts\"\n\nexport type * from '../models.ts'\n\nexport type DMMF = typeof runtime.DMMF\n\nexport type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>\n\n/**\n * Prisma Errors\n */\n\nexport const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\nexport type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\n\nexport const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\nexport type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\n\nexport const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\nexport type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\n\nexport const PrismaClientInitializationError = runtime.PrismaClientInitializationError\nexport type PrismaClientInitializationError = runtime.PrismaClientInitializationError\n\nexport const PrismaClientValidationError = runtime.PrismaClientValidationError\nexport type PrismaClientValidationError = runtime.PrismaClientValidationError\n\n/**\n * Re-export of sql-template-tag\n */\nexport const sql = runtime.sqltag\nexport const empty = runtime.empty\nexport const join = runtime.join\nexport const raw = runtime.raw\nexport const Sql = runtime.Sql\nexport type Sql = runtime.Sql\n\n\n\n/**\n * Decimal.js\n */\nexport const Decimal = runtime.Decimal\nexport type Decimal = runtime.Decimal\n\nexport type DecimalJsLike = runtime.DecimalJsLike\n\n/**\n* Extensions\n*/\nexport type Extension = runtime.Types.Extensions.UserArgs\nexport const getExtensionContext = runtime.Extensions.getExtensionContext\nexport type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>\nexport type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>\nexport type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>\nexport type Exact<A, W> = runtime.Types.Public.Exact<A, W>\n\nexport type PrismaVersion = {\n client: string\n engine: string\n}\n\n/**\n * Prisma Client JS version: 7.3.0\n * Query Engine version: 9d6ad21cbbceab97458517b147a6a09ff43aa735\n */\nexport const prismaVersion: PrismaVersion = {\n client: \"7.3.0\",\n engine: \"9d6ad21cbbceab97458517b147a6a09ff43aa735\"\n}\n\n/**\n * Utility Types\n */\n\nexport type Bytes = runtime.Bytes\nexport type JsonObject = runtime.JsonObject\nexport type JsonArray = runtime.JsonArray\nexport type JsonValue = runtime.JsonValue\nexport type InputJsonObject = runtime.InputJsonObject\nexport type InputJsonArray = runtime.InputJsonArray\nexport type InputJsonValue = runtime.InputJsonValue\n\n\nexport const NullTypes = {\n DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),\n JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),\n AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),\n}\n/**\n * Helper for filtering JSON entries that have `null` on the database (empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const DbNull = runtime.DbNull\n\n/**\n * Helper for filtering JSON entries that have JSON `null` values (not empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const JsonNull = runtime.JsonNull\n\n/**\n * Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const AnyNull = runtime.AnyNull\n\n\ntype SelectAndInclude = {\n select: any\n include: any\n}\n\ntype SelectAndOmit = {\n select: any\n omit: any\n}\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Prisma__Pick<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Subset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection\n */\nexport type Subset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never;\n};\n\n/**\n * SelectSubset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection.\n * Additionally, it validates, if both select and include are present. If the case, it errors.\n */\nexport type SelectSubset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n (T extends SelectAndInclude\n ? 'Please either choose `select` or `include`.'\n : T extends SelectAndOmit\n ? 'Please either choose `select` or `omit`.'\n : {})\n\n/**\n * Subset + Intersection\n * @desc From `T` pick properties that exist in `U` and intersect `K`\n */\nexport type SubsetIntersection<T, U, K> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n K\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\n\n/**\n * XOR is needed to have a real mutually exclusive union type\n * https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\nexport type XOR<T, U> =\n T extends object ?\n U extends object ?\n (Without<T, U> & U) | (Without<U, T> & T)\n : U : T\n\n\n/**\n * Is T a Record?\n */\ntype IsObject<T extends any> = T extends Array<any>\n? False\n: T extends Date\n? False\n: T extends Uint8Array\n? False\n: T extends BigInt\n? False\n: T extends object\n? True\n: False\n\n\n/**\n * If it's T[], return T\n */\nexport type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T\n\n/**\n * From ts-toolbelt\n */\n\ntype __Either<O extends object, K extends Key> = Omit<O, K> &\n {\n // Merge all but K\n [P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities\n }[K]\n\ntype EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>\n\ntype EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>\n\ntype _Either<\n O extends object,\n K extends Key,\n strict extends Boolean\n> = {\n 1: EitherStrict<O, K>\n 0: EitherLoose<O, K>\n}[strict]\n\nexport type Either<\n O extends object,\n K extends Key,\n strict extends Boolean = 1\n> = O extends unknown ? _Either<O, K, strict> : never\n\nexport type Union = any\n\nexport type PatchUndefined<O extends object, O1 extends object> = {\n [K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]\n} & {}\n\n/** Helper Types for \"Merge\" **/\nexport type IntersectOf<U extends Union> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never\n\nexport type Overwrite<O extends object, O1 extends object> = {\n [K in keyof O]: K extends keyof O1 ? O1[K] : O[K];\n} & {};\n\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n [K in keyof U]-?: At<U, K>;\n}>>;\n\ntype Key = string | number | symbol;\ntype AtStrict<O extends object, K extends Key> = O[K & keyof O];\ntype AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;\nexport type At<O extends object, K extends Key, strict extends Boolean = 1> = {\n 1: AtStrict<O, K>;\n 0: AtLoose<O, K>;\n}[strict];\n\nexport type ComputeRaw<A extends any> = A extends Function ? A : {\n [K in keyof A]: A[K];\n} & {};\n\nexport type OptionalFlat<O> = {\n [K in keyof O]?: O[K];\n} & {};\n\ntype _Record<K extends keyof any, T> = {\n [P in K]: T;\n};\n\n// cause typescript not to expand types and preserve names\ntype NoExpand<T> = T extends unknown ? T : never;\n\n// this type assumes the passed object is entirely optional\nexport type AtLeast<O extends object, K extends string> = NoExpand<\n O extends unknown\n ? | (K extends keyof O ? { [P in K]: O[P] } & O : O)\n | {[P in keyof O as P extends K ? P : never]-?: O[P]} & O\n : never>;\n\ntype _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;\n\nexport type Strict<U extends object> = ComputeRaw<_Strict<U>>;\n/** End Helper Types for \"Merge\" **/\n\nexport type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;\n\nexport type Boolean = True | False\n\nexport type True = 1\n\nexport type False = 0\n\nexport type Not<B extends Boolean> = {\n 0: 1\n 1: 0\n}[B]\n\nexport type Extends<A1 extends any, A2 extends any> = [A1] extends [never]\n ? 0 // anything `never` is false\n : A1 extends A2\n ? 1\n : 0\n\nexport type Has<U extends Union, U1 extends Union> = Not<\n Extends<Exclude<U1, U>, U1>\n>\n\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n 0: {\n 0: 0\n 1: 1\n }\n 1: {\n 0: 1\n 1: 1\n }\n}[B1][B2]\n\nexport type Keys<U extends Union> = U extends unknown ? keyof U : never\n\nexport type GetScalarType<T, O> = O extends object ? {\n [P in keyof T]: P extends keyof O\n ? O[P]\n : never\n} : never\n\ntype FieldPaths<\n T,\n U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>\n> = IsObject<T> extends True ? U : T\n\nexport type GetHavingFields<T> = {\n [K in keyof T]: Or<\n Or<Extends<'OR', K>, Extends<'AND', K>>,\n Extends<'NOT', K>\n > extends True\n ? // infer is only needed to not hit TS limit\n // based on the brilliant idea of Pierre-Antoine Mills\n // https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437\n T[K] extends infer TK\n ? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>\n : never\n : {} extends FieldPaths<T[K]>\n ? never\n : K\n}[keyof T]\n\n/**\n * Convert tuple to union\n */\ntype _TupleToUnion<T> = T extends (infer E)[] ? E : never\ntype TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>\nexport type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T\n\n/**\n * Like `Pick`, but additionally can also accept an array of keys\n */\nexport type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>\n\n/**\n * Exclude all keys with underscores\n */\nexport type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T\n\n\nexport type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>\n\ntype FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>\n\n\nexport const ModelName = {\n UserWorkspaceLayout: 'UserWorkspaceLayout',\n Library: 'Library',\n Project: 'Project',\n ProjectSpace: 'ProjectSpace',\n ProjectModelStorage: 'ProjectModelStorage',\n PulumiBackend: 'PulumiBackend',\n BackendUnlockMethod: 'BackendUnlockMethod'\n} as const\n\nexport type ModelName = (typeof ModelName)[keyof typeof ModelName]\n\n\n\nexport interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {\n returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>\n}\n\nexport type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {\n globalOmitOptions: {\n omit: GlobalOmitOptions\n }\n meta: {\n modelProps: \"userWorkspaceLayout\" | \"library\" | \"project\" | \"projectSpace\" | \"projectModelStorage\" | \"pulumiBackend\" | \"backendUnlockMethod\"\n txIsolationLevel: TransactionIsolationLevel\n }\n model: {\n UserWorkspaceLayout: {\n payload: Prisma.$UserWorkspaceLayoutPayload<ExtArgs>\n fields: Prisma.UserWorkspaceLayoutFieldRefs\n operations: {\n findUnique: {\n args: Prisma.UserWorkspaceLayoutFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.UserWorkspaceLayoutFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n findFirst: {\n args: Prisma.UserWorkspaceLayoutFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.UserWorkspaceLayoutFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n findMany: {\n args: Prisma.UserWorkspaceLayoutFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>[]\n }\n create: {\n args: Prisma.UserWorkspaceLayoutCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n createMany: {\n args: Prisma.UserWorkspaceLayoutCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.UserWorkspaceLayoutCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>[]\n }\n delete: {\n args: Prisma.UserWorkspaceLayoutDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n update: {\n args: Prisma.UserWorkspaceLayoutUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n deleteMany: {\n args: Prisma.UserWorkspaceLayoutDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.UserWorkspaceLayoutUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.UserWorkspaceLayoutUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>[]\n }\n upsert: {\n args: Prisma.UserWorkspaceLayoutUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserWorkspaceLayoutPayload>\n }\n aggregate: {\n args: Prisma.UserWorkspaceLayoutAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateUserWorkspaceLayout>\n }\n groupBy: {\n args: Prisma.UserWorkspaceLayoutGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserWorkspaceLayoutGroupByOutputType>[]\n }\n count: {\n args: Prisma.UserWorkspaceLayoutCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserWorkspaceLayoutCountAggregateOutputType> | number\n }\n }\n }\n Library: {\n payload: Prisma.$LibraryPayload<ExtArgs>\n fields: Prisma.LibraryFieldRefs\n operations: {\n findUnique: {\n args: Prisma.LibraryFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.LibraryFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n findFirst: {\n args: Prisma.LibraryFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.LibraryFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n findMany: {\n args: Prisma.LibraryFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>[]\n }\n create: {\n args: Prisma.LibraryCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n createMany: {\n args: Prisma.LibraryCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.LibraryCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>[]\n }\n delete: {\n args: Prisma.LibraryDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n update: {\n args: Prisma.LibraryUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n deleteMany: {\n args: Prisma.LibraryDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.LibraryUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.LibraryUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>[]\n }\n upsert: {\n args: Prisma.LibraryUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LibraryPayload>\n }\n aggregate: {\n args: Prisma.LibraryAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateLibrary>\n }\n groupBy: {\n args: Prisma.LibraryGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.LibraryGroupByOutputType>[]\n }\n count: {\n args: Prisma.LibraryCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.LibraryCountAggregateOutputType> | number\n }\n }\n }\n Project: {\n payload: Prisma.$ProjectPayload<ExtArgs>\n fields: Prisma.ProjectFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ProjectFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ProjectFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n findFirst: {\n args: Prisma.ProjectFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ProjectFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n findMany: {\n args: Prisma.ProjectFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>[]\n }\n create: {\n args: Prisma.ProjectCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n createMany: {\n args: Prisma.ProjectCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ProjectCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>[]\n }\n delete: {\n args: Prisma.ProjectDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n update: {\n args: Prisma.ProjectUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n deleteMany: {\n args: Prisma.ProjectDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ProjectUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ProjectUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>[]\n }\n upsert: {\n args: Prisma.ProjectUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectPayload>\n }\n aggregate: {\n args: Prisma.ProjectAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateProject>\n }\n groupBy: {\n args: Prisma.ProjectGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectGroupByOutputType>[]\n }\n count: {\n args: Prisma.ProjectCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectCountAggregateOutputType> | number\n }\n }\n }\n ProjectSpace: {\n payload: Prisma.$ProjectSpacePayload<ExtArgs>\n fields: Prisma.ProjectSpaceFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ProjectSpaceFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ProjectSpaceFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n findFirst: {\n args: Prisma.ProjectSpaceFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ProjectSpaceFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n findMany: {\n args: Prisma.ProjectSpaceFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>[]\n }\n create: {\n args: Prisma.ProjectSpaceCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n createMany: {\n args: Prisma.ProjectSpaceCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ProjectSpaceCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>[]\n }\n delete: {\n args: Prisma.ProjectSpaceDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n update: {\n args: Prisma.ProjectSpaceUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n deleteMany: {\n args: Prisma.ProjectSpaceDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ProjectSpaceUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ProjectSpaceUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>[]\n }\n upsert: {\n args: Prisma.ProjectSpaceUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectSpacePayload>\n }\n aggregate: {\n args: Prisma.ProjectSpaceAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateProjectSpace>\n }\n groupBy: {\n args: Prisma.ProjectSpaceGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectSpaceGroupByOutputType>[]\n }\n count: {\n args: Prisma.ProjectSpaceCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectSpaceCountAggregateOutputType> | number\n }\n }\n }\n ProjectModelStorage: {\n payload: Prisma.$ProjectModelStoragePayload<ExtArgs>\n fields: Prisma.ProjectModelStorageFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ProjectModelStorageFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ProjectModelStorageFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n findFirst: {\n args: Prisma.ProjectModelStorageFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ProjectModelStorageFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n findMany: {\n args: Prisma.ProjectModelStorageFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>[]\n }\n create: {\n args: Prisma.ProjectModelStorageCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n createMany: {\n args: Prisma.ProjectModelStorageCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ProjectModelStorageCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>[]\n }\n delete: {\n args: Prisma.ProjectModelStorageDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n update: {\n args: Prisma.ProjectModelStorageUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n deleteMany: {\n args: Prisma.ProjectModelStorageDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ProjectModelStorageUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ProjectModelStorageUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>[]\n }\n upsert: {\n args: Prisma.ProjectModelStorageUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ProjectModelStoragePayload>\n }\n aggregate: {\n args: Prisma.ProjectModelStorageAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateProjectModelStorage>\n }\n groupBy: {\n args: Prisma.ProjectModelStorageGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectModelStorageGroupByOutputType>[]\n }\n count: {\n args: Prisma.ProjectModelStorageCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ProjectModelStorageCountAggregateOutputType> | number\n }\n }\n }\n PulumiBackend: {\n payload: Prisma.$PulumiBackendPayload<ExtArgs>\n fields: Prisma.PulumiBackendFieldRefs\n operations: {\n findUnique: {\n args: Prisma.PulumiBackendFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.PulumiBackendFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n findFirst: {\n args: Prisma.PulumiBackendFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.PulumiBackendFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n findMany: {\n args: Prisma.PulumiBackendFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>[]\n }\n create: {\n args: Prisma.PulumiBackendCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n createMany: {\n args: Prisma.PulumiBackendCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.PulumiBackendCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>[]\n }\n delete: {\n args: Prisma.PulumiBackendDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n update: {\n args: Prisma.PulumiBackendUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n deleteMany: {\n args: Prisma.PulumiBackendDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.PulumiBackendUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.PulumiBackendUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>[]\n }\n upsert: {\n args: Prisma.PulumiBackendUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PulumiBackendPayload>\n }\n aggregate: {\n args: Prisma.PulumiBackendAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregatePulumiBackend>\n }\n groupBy: {\n args: Prisma.PulumiBackendGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.PulumiBackendGroupByOutputType>[]\n }\n count: {\n args: Prisma.PulumiBackendCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.PulumiBackendCountAggregateOutputType> | number\n }\n }\n }\n BackendUnlockMethod: {\n payload: Prisma.$BackendUnlockMethodPayload<ExtArgs>\n fields: Prisma.BackendUnlockMethodFieldRefs\n operations: {\n findUnique: {\n args: Prisma.BackendUnlockMethodFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.BackendUnlockMethodFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n findFirst: {\n args: Prisma.BackendUnlockMethodFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.BackendUnlockMethodFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n findMany: {\n args: Prisma.BackendUnlockMethodFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>[]\n }\n create: {\n args: Prisma.BackendUnlockMethodCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n createMany: {\n args: Prisma.BackendUnlockMethodCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.BackendUnlockMethodCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>[]\n }\n delete: {\n args: Prisma.BackendUnlockMethodDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n update: {\n args: Prisma.BackendUnlockMethodUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n deleteMany: {\n args: Prisma.BackendUnlockMethodDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.BackendUnlockMethodUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.BackendUnlockMethodUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>[]\n }\n upsert: {\n args: Prisma.BackendUnlockMethodUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BackendUnlockMethodPayload>\n }\n aggregate: {\n args: Prisma.BackendUnlockMethodAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateBackendUnlockMethod>\n }\n groupBy: {\n args: Prisma.BackendUnlockMethodGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.BackendUnlockMethodGroupByOutputType>[]\n }\n count: {\n args: Prisma.BackendUnlockMethodCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.BackendUnlockMethodCountAggregateOutputType> | number\n }\n }\n }\n }\n} & {\n other: {\n payload: any\n operations: {\n $executeRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $executeRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n $queryRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $queryRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n }\n }\n}\n\n/**\n * Enums\n */\n\nexport const TransactionIsolationLevel = runtime.makeStrictEnum({\n ReadUncommitted: 'ReadUncommitted',\n ReadCommitted: 'ReadCommitted',\n RepeatableRead: 'RepeatableRead',\n Serializable: 'Serializable'\n} as const)\n\nexport type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]\n\n\nexport const UserWorkspaceLayoutScalarFieldEnum = {\n userId: 'userId',\n layout: 'layout'\n} as const\n\nexport type UserWorkspaceLayoutScalarFieldEnum = (typeof UserWorkspaceLayoutScalarFieldEnum)[keyof typeof UserWorkspaceLayoutScalarFieldEnum]\n\n\nexport const LibraryScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n spec: 'spec'\n} as const\n\nexport type LibraryScalarFieldEnum = (typeof LibraryScalarFieldEnum)[keyof typeof LibraryScalarFieldEnum]\n\n\nexport const ProjectScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n name: 'name',\n spaceId: 'spaceId',\n modelStorageId: 'modelStorageId',\n libraryId: 'libraryId',\n pulumiBackendId: 'pulumiBackendId',\n encryptedMasterKey: 'encryptedMasterKey',\n unlockSuite: 'unlockSuite',\n databaseVersion: 'databaseVersion',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type ProjectScalarFieldEnum = (typeof ProjectScalarFieldEnum)[keyof typeof ProjectScalarFieldEnum]\n\n\nexport const ProjectSpaceScalarFieldEnum = {\n id: 'id',\n name: 'name',\n parentId: 'parentId',\n meta: 'meta'\n} as const\n\nexport type ProjectSpaceScalarFieldEnum = (typeof ProjectSpaceScalarFieldEnum)[keyof typeof ProjectSpaceScalarFieldEnum]\n\n\nexport const ProjectModelStorageScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n spec: 'spec'\n} as const\n\nexport type ProjectModelStorageScalarFieldEnum = (typeof ProjectModelStorageScalarFieldEnum)[keyof typeof ProjectModelStorageScalarFieldEnum]\n\n\nexport const PulumiBackendScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n spec: 'spec'\n} as const\n\nexport type PulumiBackendScalarFieldEnum = (typeof PulumiBackendScalarFieldEnum)[keyof typeof PulumiBackendScalarFieldEnum]\n\n\nexport const BackendUnlockMethodScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n recipient: 'recipient',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type BackendUnlockMethodScalarFieldEnum = (typeof BackendUnlockMethodScalarFieldEnum)[keyof typeof BackendUnlockMethodScalarFieldEnum]\n\n\nexport const SortOrder = {\n asc: 'asc',\n desc: 'desc'\n} as const\n\nexport type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]\n\n\nexport const JsonNullValueInput = {\n JsonNull: JsonNull\n} as const\n\nexport type JsonNullValueInput = (typeof JsonNullValueInput)[keyof typeof JsonNullValueInput]\n\n\nexport const QueryMode = {\n default: 'default',\n insensitive: 'insensitive'\n} as const\n\nexport type QueryMode = (typeof QueryMode)[keyof typeof QueryMode]\n\n\nexport const JsonNullValueFilter = {\n DbNull: DbNull,\n JsonNull: JsonNull,\n AnyNull: AnyNull\n} as const\n\nexport type JsonNullValueFilter = (typeof JsonNullValueFilter)[keyof typeof JsonNullValueFilter]\n\n\nexport const NullsOrder = {\n first: 'first',\n last: 'last'\n} as const\n\nexport type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]\n\n\n\n/**\n * Field references\n */\n\n\n/**\n * Reference to a field of type 'String'\n */\nexport type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>\n \n\n\n/**\n * Reference to a field of type 'String[]'\n */\nexport type ListStringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String[]'>\n \n\n\n/**\n * Reference to a field of type 'Json'\n */\nexport type JsonFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Json'>\n \n\n\n/**\n * Reference to a field of type 'QueryMode'\n */\nexport type EnumQueryModeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'QueryMode'>\n \n\n\n/**\n * Reference to a field of type 'Int'\n */\nexport type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>\n \n\n\n/**\n * Reference to a field of type 'Int[]'\n */\nexport type ListIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int[]'>\n \n\n\n/**\n * Reference to a field of type 'DateTime'\n */\nexport type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>\n \n\n\n/**\n * Reference to a field of type 'DateTime[]'\n */\nexport type ListDateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime[]'>\n \n\n\n/**\n * Reference to a field of type 'Float'\n */\nexport type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>\n \n\n\n/**\n * Reference to a field of type 'Float[]'\n */\nexport type ListFloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float[]'>\n \n\n/**\n * Batch Payload for updateMany & deleteMany & createMany\n */\nexport type BatchPayload = {\n count: number\n}\n\nexport const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<\"define\", TypeMapCb, runtime.Types.Extensions.DefaultArgs>\nexport type DefaultPrismaClient = PrismaClient\nexport type ErrorFormat = 'pretty' | 'colorless' | 'minimal'\nexport type PrismaClientOptions = ({\n /**\n * Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-pg`.\n */\n adapter: runtime.SqlDriverAdapterFactory\n accelerateUrl?: never\n} | {\n /**\n * Prisma Accelerate URL allowing the client to connect through Accelerate instead of a direct database.\n */\n accelerateUrl: string\n adapter?: never\n}) & {\n /**\n * @default \"colorless\"\n */\n errorFormat?: ErrorFormat\n /**\n * @example\n * ```\n * // Shorthand for `emit: 'stdout'`\n * log: ['query', 'info', 'warn', 'error']\n * \n * // Emit as events only\n * log: [\n * { emit: 'event', level: 'query' },\n * { emit: 'event', level: 'info' },\n * { emit: 'event', level: 'warn' }\n * { emit: 'event', level: 'error' }\n * ]\n * \n * / Emit as events and log to stdout\n * og: [\n * { emit: 'stdout', level: 'query' },\n * { emit: 'stdout', level: 'info' },\n * { emit: 'stdout', level: 'warn' }\n * { emit: 'stdout', level: 'error' }\n * \n * ```\n * Read more in our [docs](https://pris.ly/d/logging).\n */\n log?: (LogLevel | LogDefinition)[]\n /**\n * The default values for transactionOptions\n * maxWait ?= 2000\n * timeout ?= 5000\n */\n transactionOptions?: {\n maxWait?: number\n timeout?: number\n isolationLevel?: TransactionIsolationLevel\n }\n /**\n * Global configuration for omitting model fields by default.\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * omit: {\n * user: {\n * password: true\n * }\n * }\n * })\n * ```\n */\n omit?: GlobalOmitConfig\n /**\n * SQL commenter plugins that add metadata to SQL queries as comments.\n * Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter,\n * comments: [\n * traceContext(),\n * queryInsights(),\n * ],\n * })\n * ```\n */\n comments?: runtime.SqlCommenterPlugin[]\n}\nexport type GlobalOmitConfig = {\n userWorkspaceLayout?: Prisma.UserWorkspaceLayoutOmit\n library?: Prisma.LibraryOmit\n project?: Prisma.ProjectOmit\n projectSpace?: Prisma.ProjectSpaceOmit\n projectModelStorage?: Prisma.ProjectModelStorageOmit\n pulumiBackend?: Prisma.PulumiBackendOmit\n backendUnlockMethod?: Prisma.BackendUnlockMethodOmit\n}\n\n/* Types for Logging */\nexport type LogLevel = 'info' | 'query' | 'warn' | 'error'\nexport type LogDefinition = {\n level: LogLevel\n emit: 'stdout' | 'event'\n}\n\nexport type CheckIsLogLevel<T> = T extends LogLevel ? T : never;\n\nexport type GetLogType<T> = CheckIsLogLevel<\n T extends LogDefinition ? T['level'] : T\n>;\n\nexport type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>\n ? GetLogType<T[number]>\n : never;\n\nexport type QueryEvent = {\n timestamp: Date\n query: string\n params: string\n duration: number\n target: string\n}\n\nexport type LogEvent = {\n timestamp: Date\n message: string\n target: string\n}\n/* End Types for Logging */\n\n\nexport type PrismaAction =\n | 'findUnique'\n | 'findUniqueOrThrow'\n | 'findMany'\n | 'findFirst'\n | 'findFirstOrThrow'\n | 'create'\n | 'createMany'\n | 'createManyAndReturn'\n | 'update'\n | 'updateMany'\n | 'updateManyAndReturn'\n | 'upsert'\n | 'delete'\n | 'deleteMany'\n | 'executeRaw'\n | 'queryRaw'\n | 'aggregate'\n | 'count'\n | 'runCommandRaw'\n | 'findRaw'\n | 'groupBy'\n\n/**\n * `PrismaClient` proxy available in interactive transactions.\n */\nexport type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>\n\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * 🟢 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums.ts\"\nimport * as $Class from \"./internal/class.ts\"\nimport * as Prisma from \"./internal/prismaNamespace.ts\"\n\nexport * as $Enums from './enums.ts'\nexport * from \"./enums.ts\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more UserWorkspaceLayouts\n * const userWorkspaceLayouts = await prisma.userWorkspaceLayout.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model UserWorkspaceLayout\n * \n */\nexport type UserWorkspaceLayout = Prisma.UserWorkspaceLayoutModel\n/**\n * Model Library\n * \n */\nexport type Library = Prisma.LibraryModel\n/**\n * Model Project\n * \n */\nexport type Project = Prisma.ProjectModel\n/**\n * Model ProjectSpace\n * \n */\nexport type ProjectSpace = Prisma.ProjectSpaceModel\n/**\n * Model ProjectModelStorage\n * \n */\nexport type ProjectModelStorage = Prisma.ProjectModelStorageModel\n/**\n * Model PulumiBackend\n * \n */\nexport type PulumiBackend = Prisma.PulumiBackendModel\n/**\n * Model BackendUnlockMethod\n * Unlock methods describe trusted identities that can decrypt the backend master key.\n */\nexport type BackendUnlockMethod = Prisma.BackendUnlockMethodModel\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace.ts\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n \"previewFeatures\": [],\n \"clientVersion\": \"7.3.0\",\n \"engineVersion\": \"9d6ad21cbbceab97458517b147a6a09ff43aa735\",\n \"activeProvider\": \"sqlite\",\n \"inlineSchema\": \"/// The API key provides authentication tokens for accessing the platform API.\\n///\\n/// Each API key impersonates a service account, inheriting its permissions and access scope.\\n/// Keys are automatically created for worker versions and can be manually created for\\n/// external integrations. The token is a 32-byte random hex string that can be regenerated.\\nmodel ApiKey {\\n /// The CUIDv2 of the API key.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the API key managed by the backend.\\n ///\\n /// [ApiKeyMeta]\\n meta Json\\n\\n /// The ID of the service account impersonated by this API key.\\n serviceAccountId String\\n\\n /// The API token for authentication.\\n ///\\n /// Should be treated as a secret and only shown once at creation/regeneration.\\n token String @unique\\n\\n /// The time when the API key was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the API key was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The worker version that owns this API key.\\n worker WorkerVersion?\\n\\n /// The service account which this API key impersonates.\\n serviceAccount ServiceAccount @relation(fields: [serviceAccountId], references: [id])\\n}\\n\\n/// The artifact represents a file or folder stored in the system.\\n///\\n/// It can be produced by units or manually uploaded via API by service accounts.\\n///\\n/// Since different actors can produce the same artifact with the same content and hash,\\n/// there is the ownership/usage concept to track which entities produce or use the artifact.\\n/// The \\\"ownership\\\" and \\\"usage\\\" are synonymous in this context and often referred to as \\\"usage\\\".\\n///\\n/// When no usages are present, the artifact will be automatically garbage collected after a certain period.\\nmodel Artifact {\\n /// The CUIDv2 of the artifact.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the artifact managed by the backend.\\n ///\\n /// Since multiple actors can produce the same artifact,\\n /// this metadata is the last one provided by any actor.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The SHA256 hash of the artifact content.\\n hash String @unique\\n\\n /// The size of the compressed artifact content in bytes.\\n ///\\n /// Does not represent the size of the original file or folder,\\n /// but the size used to store the artifact in the system.\\n size Int\\n\\n /// The chunk size of the artifact content in bytes.\\n /// Used to split the artifact into smaller chunks for storage.\\n chunkSize Int\\n\\n /// The time when the artifact first appeared in the system.\\n createdAt DateTime @default(now())\\n\\n /// The time when the artifact was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The service accounts using this artifact.\\n serviceAccounts ServiceAccount[]\\n\\n /// The instances using this artifact.\\n instances InstanceState[]\\n\\n /// The terminals using this artifact.\\n terminals Terminal[]\\n\\n /// The pages using this artifact.\\n pages Page[]\\n}\\n\\nmodel InstanceCustomStatus {\\n /// The ID of the instance state this status belongs to.\\n stateId String\\n\\n /// The ID of the service account which attached this custom status.\\n serviceAccountId String\\n\\n /// The name of the custom status unique within the instance and service account.\\n name String\\n\\n /// The metadata of the custom status managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The status value of the custom status.\\n value String\\n\\n /// The message describing the instance's custom status.\\n /// \\n /// Can be used to provide additional context or information about the status.\\n ///\\n /// The message will be displayed in the 800x600 ANSI terminal in the UI,\\n /// so different TUI elements should be drawn within this area.\\n message String?\\n\\n /// The order of the custom status in the list of statuses.\\n ///\\n /// Should be values from 0 to 100, where 0 is the highest priority.\\n /// By default, the order is 50.\\n order Int @default(50)\\n\\n /// The time when the custom status was first attached to the instance.\\n createdAt DateTime @default(now())\\n\\n /// The time when the custom status was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The instance this custom status belongs to.\\n state InstanceState @relation(fields: [stateId], references: [id])\\n\\n /// The service account this custom status belongs to.\\n serviceAccount ServiceAccount @relation(fields: [serviceAccountId], references: [id])\\n\\n @@id([stateId, serviceAccountId, name]) // the name must be unique within the instance and service account\\n}\\n\\nenum InstanceEvaluationStatus {\\n /// transient statuses (not persisted in the database)\\n evaluating\\n\\n /// stable statuses\\n evaluated\\n error\\n}\\n\\n/// The evaluation state tracks the result of evaluating composite instances to produce virtual instances.\\n///\\n/// Composite instances are template components that generate other instances (virtual instances) when evaluated.\\n/// The evaluation process executes the composite's create function with resolved inputs to produce a tree\\n/// of child instances. These virtual instances exist in the source \\\"virtual\\\" state and can be units\\n/// (mapping to Pulumi resources) or other composites (producing more virtual instances recursively).\\n///\\n/// Evaluation happens automatically after project unlock and library reloads to keep virtual instances\\n/// synchronized with their composite definitions. Evaluation state persists the produced instance model\\n/// and tracks success/error status with descriptive messages showing the instance tree or error details.\\nmodel InstanceEvaluationState {\\n /// The ID of the state of the instance.\\n stateId String @id\\n\\n /// The status of the instance evaluation.\\n status InstanceEvaluationStatus\\n\\n /// The message describing the evaluation status.\\n /// If the evaluation is failed, this message will contain the error description.\\n message String?\\n\\n /// The model produced by the evaluation.\\n ///\\n /// Will be `null` if the evaluation is failed.\\n ///\\n /// Can be set for both: real composite instances and virtual instances produced by the evaluation.\\n ///\\n /// [InstanceModel]\\n model Json?\\n\\n /// The time when the last evaluation was finished.\\n evaluatedAt DateTime @updatedAt\\n\\n /// The instance this state belongs to.\\n state InstanceState @relation(fields: [stateId], references: [id])\\n}\\n\\nenum InstanceStatus {\\n /// The instance is exists in the model (resident or virtual), but not yet deployed or was completely destroyed.\\n ///\\n /// \\\"attempted\\\", \\\"deployed\\\" and \\\"failed\\\" instances can be transitioned back to \\\"undeployed\\\" after\\n /// successful \\\"destroy\\\" operation.\\n undeployed\\n\\n /// The instance is attempted, but not yet fully deployed.\\n ///\\n /// Normally, this status is very short-lived, and here to indicate that the instance\\n /// cannot be safely deleted from the the model until it will be completely destroyed.\\n attempted\\n\\n /// The initial deployment of the instance was successful.\\n ///\\n /// The transition of \\\"deployed -> failed\\\" is not possible, so consequent failed operations\\n /// will not affect this status.\\n ///\\n /// Like \\\"attempted\\\", that instance cannot be safely deleted from the model until it will be completely destroyed.\\n deployed\\n\\n /// The initial deployment of the instance failed.\\n /// It can still be transitioned to \\\"deployed\\\" by a successful operation\\n ///\\n /// Like \\\"attempted\\\", that instance cannot be safely deleted from the model until it will be completely destroyed.\\n failed\\n}\\n\\nenum InstanceSource {\\n /// The instance is defined in the project model.\\n resident\\n\\n /// The instance is produced by evaluation of composite instance.\\n virtual\\n}\\n\\nmodel InstanceState {\\n /// The surrogate CUIDv2 primary key of the instance to allow renaming instances.\\n id String @id @default(cuid(2))\\n\\n /// The ID of the instance managed by the system.\\n ///\\n /// [InstanceId]\\n instanceId String @unique\\n\\n /// The status of the instance.\\n status InstanceStatus\\n\\n /// The source of the instance.\\n source InstanceSource\\n\\n /// The kind of the instance.\\n ///\\n /// [InstanceKind]\\n kind String\\n\\n /// The ID of the parent instance state, if this instance is a child of another composite instance.\\n parentId String?\\n\\n /// The 32-bit nonce used to invalidate the input hash when secrets are updated.\\n inputHashNonce Int?\\n\\n /// The calculated CRC32 hash of the instance's own configuration at the moment of last operation completion.\\n ///\\n /// This hash covers:\\n /// - component definition hash;\\n /// - the unit's source hash (if applicable);\\n /// - the instance's configuration (name, args, secret hashes / nonce).\\n ///\\n /// It does not include hashes of dependencies.\\n ///\\n /// Used together with `dependencyOutputHash` to short-circuit execution at runtime.\\n selfHash Int?\\n\\n /// The calculated instance CRC32 input hash at the moment of last operation completion.\\n ///\\n /// This hash covers:\\n /// - the instance's configuration (name, args, secret hashes);\\n /// - component definition hash;\\n /// - the unit's source hash (if applicable);\\n /// - the input hashes and output hashes of all input instances.\\n inputHash Int?\\n\\n /// The CRC32 of the SHA256 of the output produced by the instance at the moment of last operation completion.\\n ///\\n /// Does not depend on anything except the instance's output.\\n outputHash Int?\\n\\n /// The calculated CRC32 dependency output hash at the moment of last operation completion.\\n ///\\n /// This hash is calculated as combination of output hashes of all input instances and nothing else.\\n ///\\n /// The primary use case of this hash is to \\\"short-circuit\\\" execution:\\n /// if the outputs of input instances have not changed, dependent instances can skip execution,\\n /// even if their input hashes changed due to upstream config changes.\\n /// This prevents unnecessary re-execution of the entire dependency graph when only non-output-affecting inputs are modified.\\n dependencyOutputHash Int?\\n\\n /// The mapping of instance output names to artifact IDs passed via them.\\n ///\\n /// Used to authorize access to artifacts for other instances connected to these outputs.\\n ///\\n /// [InstanceArtifactIds]\\n exportedArtifactIds Json?\\n\\n /// The snapshot of the instance model at the moment of last non-preview operation start.\\n ///\\n /// Null if the instance was never operated on.\\n ///\\n /// [InstanceModel]\\n model Json?\\n\\n /// The snapshot of the resolved inputs at the moment of last non-preview operation start.\\n ///\\n /// Null if the instance was never operated on.\\n ///\\n /// [InstanceResolvedInputs]\\n resolvedInputs Json?\\n\\n /// The count of Pulumi resources currently managed by this instance.\\n currentResourceCount Int?\\n\\n /// The status fields produced by the last operation.\\n ///\\n /// [InstanceStatusFields]\\n statusFields Json?\\n\\n /// The parent instance.\\n parent InstanceState? @relation(\\\"InstanceHierarchy\\\", fields: [parentId], references: [id])\\n\\n /// The child instances, if any.\\n children InstanceState[] @relation(\\\"InstanceHierarchy\\\")\\n\\n /// The evaluation state of this instance.\\n evaluationState InstanceEvaluationState?\\n\\n /// The operation states associated with this instance.\\n operationStates InstanceOperationState[]\\n\\n /// The secrets associated with this instance.\\n secrets Secret[]\\n\\n /// The terminals associated with this instance.\\n terminals Terminal[]\\n\\n /// The pages associated with this instance.\\n pages Page[]\\n\\n /// The triggers associated with this instance.\\n triggers Trigger[]\\n\\n /// Custom statuses for this instance.\\n customStatuses InstanceCustomStatus[]\\n\\n /// The lock that is currently held on this instance.\\n lock InstanceLock?\\n\\n /// Worker registrations associated with this instance.\\n workerRegistrations WorkerUnitRegistration[]\\n\\n /// The artifacts produced or used by this instance.\\n artifacts Artifact[]\\n\\n /// The operation logs associated with this instance.\\n operationLogs OperationLog[]\\n\\n /// The user viewports associated with this instance.\\n userViewports UserCompositeViewport[]\\n}\\n\\nmodel UserProjectViewport {\\n /// The opaque ID of the user to which this viewport belongs.\\n userId String @id\\n\\n /// The viewport of the user project managed by the frontend.\\n ///\\n /// ![unknown]\\n viewport Json\\n}\\n\\nmodel UserCompositeViewport {\\n /// The opaque ID of the user to which this viewport belongs.\\n userId String\\n\\n /// The ID of the state of the composite instance to which this viewport belongs.\\n stateId String\\n\\n /// The viewport of the user composite instance managed by the frontend.\\n ///\\n /// ![unknown]\\n viewport Json\\n\\n /// The instance state to which this viewport belongs.\\n state InstanceState @relation(fields: [stateId], references: [id])\\n\\n @@id([userId, stateId])\\n}\\n\\nmodel InstanceLock {\\n /// The ID of the instance state being locked.\\n stateId String @id\\n\\n /// The metadata of the lock managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The CUIDv2 token to ensure ownership of the lock.\\n token String\\n\\n /// The time when the lock was acquired.\\n acquiredAt DateTime @default(now())\\n\\n /// The instance being locked.\\n state InstanceState @relation(fields: [stateId], references: [id])\\n}\\n\\ndatasource db {\\n provider = \\\"sqlite\\\"\\n}\\n\\ngenerator client {\\n provider = \\\"prisma-client\\\"\\n engineType = \\\"client\\\"\\n output = \\\"../../src/database/_generated/project\\\"\\n moduleFormat = \\\"esm\\\"\\n generatedFileExtension = \\\"ts\\\"\\n importFileExtension = \\\"ts\\\"\\n}\\n\\ngenerator json {\\n provider = \\\"prisma-json-types-generator\\\"\\n}\\n\\n/// The container for project instances. \\n///\\n/// Only used when \\\"database\\\" project model storage is used.\\nmodel InstanceModel {\\n /// The ID of the instance in the format of `{type}:{name}`.\\n id String @id\\n\\n /// The model of the instance managed by the backend.\\n ///\\n /// [InstanceModel]\\n model Json\\n\\n /// The time when the instance model was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the instance model was last updated.\\n updatedAt DateTime @updatedAt\\n}\\n\\n/// The container for project hubs.\\n///\\n/// Only used when \\\"database\\\" project model storage is used.\\nmodel HubModel {\\n /// The CUIDv2 of the hub.\\n id String @id\\n\\n /// The model of the hub managed by the backend.\\n ///\\n /// [HubModel]\\n model Json\\n\\n /// The time when the hub model was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the hub model was last updated.\\n updatedAt DateTime @updatedAt\\n}\\n\\nenum OperationStatus {\\n // transient statuses\\n pending\\n running\\n failing\\n cancelling\\n\\n // stable statuses\\n completed\\n failed\\n cancelled\\n}\\n\\nenum OperationType {\\n update\\n preview\\n destroy\\n recreate\\n refresh\\n}\\n\\nenum InstanceOperationStatus {\\n // transient statuses\\n updating\\n processing_triggers\\n previewing\\n destroying\\n refreshing\\n pending\\n cancelling\\n\\n // stable statuses\\n updated\\n previewed\\n skipped\\n destroyed\\n refreshed\\n cancelled\\n failed\\n}\\n\\nmodel Operation {\\n /// The CUIDv2 of the operation.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the operation.\\n ///\\n /// [OperationMeta]\\n meta Json\\n\\n /// The type of the operation.\\n type OperationType\\n\\n /// The status of the operation.\\n status OperationStatus @default(pending)\\n\\n /// The options of the operation.\\n ///\\n /// [OperationOptions]\\n options Json\\n\\n /// The IDs of the instances that were exlicitly requested to operate on.\\n ///\\n /// [InstanceIds]\\n requestedInstanceIds Json\\n\\n /// The execution phases of the operation.\\n ///\\n /// [OperationPhase[]]\\n phases Json?\\n\\n /// The time when the operation started.\\n startedAt DateTime @default(now())\\n\\n /// The time when the operation was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The time when the operation finished.\\n finishedAt DateTime?\\n\\n /// The operation states associated with this operation.\\n operationStates InstanceOperationState[]\\n\\n /// The logs of the operation.\\n logs OperationLog[]\\n}\\n\\nmodel InstanceOperationState {\\n /// The ID of the operation this state belongs to.\\n operationId String\\n\\n /// The ID of the instance state affected by the operation.\\n stateId String\\n\\n /// The enum representing the current status of the instance from the operation perspective.\\n status InstanceOperationStatus\\n\\n /// The current count of the Pulumi resources being managed by this instance.\\n currentResourceCount Int?\\n\\n /// The total count of the Pulumi resources that this instance is expected to manage.\\n totalResourceCount Int?\\n\\n /// The snapshot of the instance model at the moment of operation start.\\n ///\\n /// [InstanceModel]\\n model Json\\n\\n /// The snapshot of the resolved inputs at the moment of operation start.\\n ///\\n /// [InstanceResolvedInputs]\\n resolvedInputs Json\\n\\n /// The time when the operation on this instance started.\\n /// Not populated on create, even if the instance is ready to start immediately.\\n startedAt DateTime?\\n\\n /// The time when the operation on this instance finished.\\n finishedAt DateTime?\\n\\n /// The operation this state belongs to.\\n operation Operation @relation(fields: [operationId], references: [id])\\n\\n /// The instance this state belongs to.\\n state InstanceState @relation(fields: [stateId], references: [id])\\n\\n @@id([operationId, stateId])\\n}\\n\\nmodel OperationLog {\\n /// The ULID of the log. Also used to extract the timestamp.\\n id String @id\\n\\n /// The ID of the operation this log belongs to.\\n operationId String\\n\\n /// The ID of the instance state this log produced by.\\n /// Can be `null` if the log is not associated with any instance.\\n stateId String?\\n\\n /// Whether this log is a system/runtime message (vs unit output).\\n isSystem Boolean @default(false)\\n\\n /// The content of the log.\\n content String\\n\\n /// The operation this log belongs to.\\n operation Operation @relation(fields: [operationId], references: [id])\\n\\n /// The instance this log produced by.\\n /// Can be `null` if the log is not associated with any instance.\\n state InstanceState? @relation(fields: [stateId], references: [id])\\n}\\n\\n/// The page provides custom UI content for instances and service accounts.\\n///\\n/// Pages can be created by units to display instance-specific information or by service accounts.\\n/// The content consists of blocks that support markdown text, QR codes with optional content display,\\n/// and file attachments (inline or artifact references). Instance pages are explicitly deleted\\n/// when instances are destroyed.\\nmodel Page {\\n /// The CUIDv2 of the page.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the page managed by the backend.\\n ///\\n /// [GlobalCommonObjectMeta]\\n meta Json\\n\\n /// The ID of the instance state that owns this page.\\n stateId String?\\n\\n /// The name of the page within the instance.\\n /// Will be null if the page is not owned by an instance.\\n name String?\\n\\n /// The ID of the service account that owns this page.\\n serviceAccountId String?\\n\\n /// The content of the page as an array of blocks.\\n ///\\n /// Supports markdown, QR codes, and file blocks.\\n ///\\n /// [PageContent]\\n content Json\\n\\n /// The time when the page was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the page was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The instance this page belongs to if any.\\n state InstanceState? @relation(fields: [stateId], references: [id])\\n\\n /// The service account this page belongs to if any. \\n serviceAccount ServiceAccount? @relation(fields: [serviceAccountId], references: [id])\\n\\n /// The artifacts used by this page.\\n artifacts Artifact[]\\n\\n @@unique([stateId, name]) // the name is unique within the instance\\n}\\n\\n/// The secret stores sensitive configuration values for instances, service accounts, and system components.\\n///\\n/// Secrets can be instance-owned (for unit configuration), service account-owned, or system-level\\n/// (like Pulumi passwords). \\n///\\n/// Secrets persist through normal destroy (recreate) operations\\n/// and are only deleted when explicitly forgetting instance state with the deleteSecrets flag or when manually deleted.\\n///\\n/// Secret updates invalidate instance input hashes via inputHashNonce, triggering re-execution\\n/// during operations. But the content of the secrets itself do not contribute to the input hash.\\n///\\n/// System secrets like Pulumi passwords are created on-demand and persist for the whole project lifetime.\\nmodel Secret {\\n /// The CUIDv2 of the secret.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the secret managed by the backend.\\n ///\\n /// [GlobalCommonObjectMeta]\\n meta Json\\n\\n /// The ID of the state of the instance owning this secret.\\n stateId String?\\n\\n /// The name of the secret within the instance.\\n ///\\n /// Will be null if the secret is not owned by an instance.\\n name String?\\n\\n /// The name of the secret within the project if the secret is a system secret.\\n systemName String? @unique\\n\\n /// The ID of the service account owning this secret.\\n serviceAccountId String?\\n\\n /// The content of the secret.\\n ///\\n /// ![unknown]\\n content Json\\n\\n /// The time when the secret was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the secret was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The instance this secret belongs to.\\n state InstanceState? @relation(fields: [stateId], references: [id])\\n\\n /// The service account this secret belongs to.\\n serviceAccount ServiceAccount? @relation(fields: [serviceAccountId], references: [id])\\n\\n @@unique([stateId, name]) // the name must be unique within the instance\\n}\\n\\n/// The service account represents an identity for non-human actors in the system.\\n///\\n/// Service accounts are automatically created for workers and can be manually created\\n/// for external integrations. They define the access scope for resources like artifacts,\\n/// secrets, terminals, and pages. Multiple API keys can impersonate the same service account,\\n/// allowing different authentication tokens to share the same permissions.\\nmodel ServiceAccount {\\n /// The CUIDv2 of the service account.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the service account managed by the backend.\\n ///\\n /// [ServiceAccountMeta]\\n meta Json\\n\\n /// The time when the service account was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the service account was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The workers using this service account.\\n workers Worker[]\\n\\n /// The artifacts used by this service account.\\n artifacts Artifact[]\\n\\n /// The secrets owned by this service account.\\n secrets Secret[]\\n\\n /// The terminals owned by this service account.\\n terminals Terminal[]\\n\\n /// The pages owned by this service account.\\n pages Page[]\\n\\n /// The instance custom statuses attached by this service account.\\n customStatuses InstanceCustomStatus[]\\n\\n /// The API keys impersonating this service account.\\n apiKeys ApiKey[]\\n}\\n\\n/// The terminal status indicates whether a terminal can accept new connections.\\nenum TerminalStatus {\\n /// The terminal is currently active and can create new sessions.\\n active\\n\\n /// The instance was destroyed and the terminal is no longer available, but here for historical purposes.\\n unavailable\\n}\\n\\n/// The terminal provides interactive shell access to infrastructure resources.\\n///\\n/// Terminals can be created by units (owned by instances) or by service accounts.\\n/// Each terminal maintains a specification for creating containers that power the terminal,\\n/// including image, command, environment, and mounted files.\\n///\\n/// Instance-owned terminals are marked unavailable when the instance is destroyed, preserving session history.\\n/// Service account terminals persist independently.\\nmodel Terminal {\\n /// The CUIDv2 of the terminal.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the terminal managed by the backend.\\n ///\\n /// [GlobalCommonObjectMeta]\\n meta Json\\n\\n /// The status of the terminal.\\n status TerminalStatus @default(active)\\n\\n /// The specification for creating the container that powers this terminal.\\n ///\\n /// Includes image, command, working directory, environment variables, and files.\\n ///\\n /// [TerminalSpec]\\n spec Json\\n\\n /// The ID of the instance state owning this terminal.\\n stateId String?\\n\\n /// The name of the terminal within the instance.\\n ///\\n /// Will be null if the terminal is not owned by an instance.\\n name String?\\n\\n /// The ID of the service account owning this terminal.\\n serviceAccountId String?\\n\\n /// The time when the terminal was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the terminal was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The instance this terminal belongs to.\\n state InstanceState? @relation(fields: [stateId], references: [id])\\n\\n /// The service account this terminal belongs to.\\n serviceAccount ServiceAccount? @relation(fields: [serviceAccountId], references: [id])\\n\\n /// The terminal sessions associated with this terminal.\\n sessions TerminalSession[]\\n\\n /// The artifacts used by this terminal.\\n artifacts Artifact[]\\n\\n @@unique([stateId, name]) // the name is unique within the instance\\n}\\n\\n/// The terminal session represents a single interactive connection to a terminal.\\n///\\n/// Each session tracks when it started and finished. All session output is preserved in logs.\\nmodel TerminalSession {\\n /// The CUIDv2 of the terminal session.\\n id String @id @default(cuid(2))\\n\\n /// The ID of the terminal this session belongs to.\\n terminalId String\\n\\n /// The time when the terminal session started.\\n startedAt DateTime @default(now())\\n\\n /// The time when the terminal session finished.\\n finishedAt DateTime?\\n\\n /// The terminal this session belongs to.\\n terminal Terminal @relation(fields: [terminalId], references: [id], onDelete: Cascade)\\n\\n /// The logs of the terminal session.\\n logs TerminalSessionLog[]\\n}\\n\\n/// The terminal session log captures all input and output from a terminal session.\\n///\\n/// Logs are stored with ULID identifiers for timestamp ordering.\\nmodel TerminalSessionLog {\\n /// The ULID of the session log. Also used to extract the timestamp.\\n id String @id\\n\\n /// The ID of the terminal session this log belongs to.\\n sessionId String\\n\\n /// The content of the log.\\n content String\\n\\n /// The terminal session this log belongs to.\\n session TerminalSession @relation(fields: [sessionId], references: [id], onDelete: Cascade)\\n}\\n\\n/// The trigger defines automated actions that execute in response to specific events.\\n///\\n/// Triggers are created by units to perform actions at defined points in the instance lifecycle\\n/// or on schedule. The spec field determines the trigger type and behavior - currently supporting\\n/// before-destroy triggers, with planned support for additional types like cron scheduling.\\n/// Triggers are deleted along with their instance.\\nmodel Trigger {\\n /// The CUIDv2 of the trigger.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the trigger managed by the backend.\\n ///\\n /// [GlobalCommonObjectMeta]\\n meta Json\\n\\n /// The ID of the instance state this trigger belongs to.\\n stateId String\\n\\n /// The name of the trigger within the instance.\\n name String\\n\\n /// The specification of the trigger describing its type and behavior.\\n ///\\n /// [TriggerSpec]\\n spec Json\\n\\n /// The time when the trigger was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the trigger was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The instance this trigger belongs to.\\n state InstanceState @relation(fields: [stateId], references: [id])\\n\\n @@unique([stateId, name]) // the name is unique within the instance\\n}\\n\\n/// The unlock method type determines how users authenticate to decrypt project databases.\\nenum UnlockMethodType {\\n /// The password is used to unlock the project.\\n password\\n\\n /// The passkey (via WebAuthn) is used to unlock the project.\\n passkey\\n}\\n\\n/// The unlock method enables decryption of project databases through user authentication.\\n///\\n/// Each project database is encrypted with a master key, which is then encrypted for each\\n/// unlock method's recipient using AGE encryption. Users authenticate (password or passkey)\\n/// to decrypt their specific AGE identity, which then decrypts the master key.\\n///\\n/// Multiple unlock methods can exist per project, allowing different authentication paths\\n/// to the same encrypted database. When unlock methods are added/removed, the master key\\n/// is re-encrypted for the new set of recipients.\\n///\\n/// The encryptedIdentity contains the AGE identity encrypted with the user's authentication\\n/// method (password-derived key or WebAuthn), while the recipient is the public key\\n/// corresponding to that identity.\\nmodel UnlockMethod {\\n /// The CUIDv2 of the unlock method.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the unlock method managed by the backend.\\n /// \\n /// [UnlockMethodMeta]\\n meta Json\\n\\n /// The type of unlock method.\\n type UnlockMethodType\\n\\n /// The AGE identity encrypted and armored also with AGE.\\n encryptedIdentity String\\n\\n /// The AGE recipient for this unlock method.\\n recipient String @unique\\n\\n /// The time when the unlock method was created.\\n createdAt DateTime @default(now())\\n\\n /// The time when the unlock method was last updated.\\n updatedAt DateTime @updatedAt\\n}\\n\\n/// The worker represents a containerized application that extends unit capabilities beyond Pulumi execution.\\n///\\n/// Workers enable units to perform runtime operations after Pulumi program completion,\\n/// such as attaching custom statuses, monitoring resources, or triggering unit reconfigurations.\\n/// Since Pulumi programs cannot affect instances after execution, workers bypass this limitation\\n/// by providing persistent runtime behavior.\\n///\\n/// The worker identity (fully qualified image name) indicates the same publisher/party and services as natural authentication mechanism.\\n/// All versions of a worker share the same service account, meaning they operate over\\n/// the same resources and have the same access scope within the platform.\\nmodel Worker {\\n /// The CUIDv2 of the worker.\\n id String @id @default(cuid(2))\\n\\n /// The identity of the worker derived from the container image.\\n ///\\n /// This is the fully qualified image name without the tag or digest.\\n /// The format is `{<registry>/}[<namespace>/]<name>`.\\n ///\\n /// For example: `ghcr.io/highstate/worker` or `docker.io/library/ubuntu`.\\n identity String @unique\\n\\n /// The ID of the service account this worker uses.\\n serviceAccountId String @unique\\n\\n /// The time this worker first appeared in the system.\\n createdAt DateTime @default(now())\\n\\n /// The service account impersonating this worker.\\n serviceAccount ServiceAccount @relation(fields: [serviceAccountId], references: [id])\\n\\n /// The versions of this worker.\\n versions WorkerVersion[]\\n}\\n\\nenum WorkerVersionStatus {\\n /// The status is unknown.\\n unknown\\n\\n /// The worker is being started by one of the runtimes.\\n starting\\n\\n /// The worker is running and serving registrations.\\n running\\n\\n /// The worker is being stopping (after was starting/running and was disabled).\\n stopping\\n\\n /// The worker is stopped and not serving registrations.\\n stopped\\n\\n /// The worker failed to start/crashed more than the allowed number of times.\\n error\\n}\\n\\n/// The worker version represents a specific container image digest of a worker.\\n///\\n/// Each version corresponds to an immutable container image identified by its SHA256 digest.\\n/// Versions are automatically created when units reference new image digests and deleted\\n/// when no longer referenced by any unit registrations.\\n///\\n/// Each version has its own API key for isolation, but all versions of a worker\\n/// share the same service account and thus the same access scope within the platform.\\n/// The runtime starts containers when registrations exist and stops them when removed.\\nmodel WorkerVersion {\\n /// The CUIDv2 of the worker version.\\n id String @id @default(cuid(2))\\n\\n /// The metadata of the worker version managed by the backend.\\n ///\\n /// [CommonObjectMeta]\\n meta Json\\n\\n /// The current status of the worker version reported by the runtime.\\n status WorkerVersionStatus @default(unknown)\\n\\n /// Whether this worker version is enabled and will be launched when project is unclocked.\\n enabled Boolean @default(true)\\n\\n /// The ID of the runtime where this worker version currently runs.\\n runtimeId String?\\n\\n /// The ID of the worker this version belongs to.\\n workerId String\\n\\n /// The digest of the worker version used to identify it.\\n /// The format is raw SHA256 digest without the `sha256:` prefix in lowercase hex.\\n digest String @unique\\n\\n /// The ID of the API key this worker version uses.\\n apiKeyId String @unique\\n\\n /// The time this worker version was created.\\n createdAt DateTime @default(now())\\n\\n /// The time this worker version was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The worker this version belongs to.\\n worker Worker @relation(fields: [workerId], references: [id])\\n\\n /// The API key this worker version uses.\\n apiKey ApiKey @relation(fields: [apiKeyId], references: [id])\\n\\n /// The unit registrations for this worker version.\\n unitRegistrations WorkerUnitRegistration[]\\n\\n /// The logs produced by this worker version.\\n logs WorkerVersionLog[]\\n}\\n\\n/// The worker unit registration tracks which unit instances require specific worker versions.\\n///\\n/// Units declare worker dependencies through their outputs, creating registrations that\\n/// trigger the runtime to start corresponding worker containers. Each registration\\n/// includes parameters passed to the worker for unit-specific configuration.\\n///\\n/// Registrations are managed during operation execution - created when units declare workers\\n/// and removed when units are destroyed. Worker versions without registrations are garbage collected.\\nmodel WorkerUnitRegistration {\\n /// The ID of the state of the unit instance requesting the registration.\\n stateId String\\n\\n /// The name of the worker within the instance.\\n name String\\n\\n /// The parameters of the registration passed by the unit.\\n ///\\n /// [WorkerUnitRegistrationParams]\\n params Json\\n\\n /// The ID of the worker version this registration currently uses.\\n workerVersionId String\\n\\n /// The time this registration was created.\\n createdAt DateTime @default(now())\\n\\n /// The time this registration was last updated.\\n updatedAt DateTime @updatedAt\\n\\n /// The unit instance requesting the registration.\\n state InstanceState @relation(fields: [stateId], references: [id])\\n\\n /// The worker version this registration currently uses.\\n workerVersion WorkerVersion @relation(fields: [workerVersionId], references: [id])\\n\\n @@id([stateId, name]) // the registration is identified by the instance and name\\n}\\n\\n/// The worker version log captures output from running worker containers.\\n///\\n/// Logs include both worker-generated output and system messages from the runtime.\\n/// The ULID identifier provides timestamp ordering. Logs are deleted with the worker version.\\nmodel WorkerVersionLog {\\n /// The ULID of the worker log. Also used to extract the timestamp.\\n id String @id @default(ulid())\\n\\n /// The ID of the worker version that produced this log.\\n workerVersionId String\\n\\n /// The log content.\\n content String\\n\\n /// Whether this log is a system/runtime message (vs worker output).\\n isSystem Boolean @default(false)\\n\\n /// The worker version that produced this log.\\n workerVersion WorkerVersion @relation(fields: [workerVersionId], references: [id], onDelete: Cascade)\\n}\\n\",\n \"runtimeDataModel\": {\n \"models\": {},\n \"enums\": {},\n \"types\": {}\n }\n}\n\nconfig.runtimeDataModel = JSON.parse(\"{\\\"models\\\":{\\\"ApiKey\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"serviceAccountId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"token\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"worker\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"WorkerVersion\\\",\\\"relationName\\\":\\\"ApiKeyToWorkerVersion\\\"},{\\\"name\\\":\\\"serviceAccount\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ServiceAccount\\\",\\\"relationName\\\":\\\"ApiKeyToServiceAccount\\\"}],\\\"dbName\\\":null},\\\"Artifact\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"hash\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"size\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chunkSize\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"serviceAccounts\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ServiceAccount\\\",\\\"relationName\\\":\\\"ArtifactToServiceAccount\\\"},{\\\"name\\\":\\\"instances\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"ArtifactToInstanceState\\\"},{\\\"name\\\":\\\"terminals\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Terminal\\\",\\\"relationName\\\":\\\"ArtifactToTerminal\\\"},{\\\"name\\\":\\\"pages\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Page\\\",\\\"relationName\\\":\\\"ArtifactToPage\\\"}],\\\"dbName\\\":null},\\\"InstanceCustomStatus\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"serviceAccountId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"value\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"message\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"order\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceCustomStatusToInstanceState\\\"},{\\\"name\\\":\\\"serviceAccount\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ServiceAccount\\\",\\\"relationName\\\":\\\"InstanceCustomStatusToServiceAccount\\\"}],\\\"dbName\\\":null},\\\"InstanceEvaluationState\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"InstanceEvaluationStatus\\\"},{\\\"name\\\":\\\"message\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"model\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"evaluatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceEvaluationStateToInstanceState\\\"}],\\\"dbName\\\":null},\\\"InstanceState\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"instanceId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"InstanceStatus\\\"},{\\\"name\\\":\\\"source\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"InstanceSource\\\"},{\\\"name\\\":\\\"kind\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"parentId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"inputHashNonce\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"selfHash\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"inputHash\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"outputHash\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"dependencyOutputHash\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"exportedArtifactIds\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"model\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"resolvedInputs\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"currentResourceCount\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"statusFields\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"parent\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceHierarchy\\\"},{\\\"name\\\":\\\"children\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceHierarchy\\\"},{\\\"name\\\":\\\"evaluationState\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceEvaluationState\\\",\\\"relationName\\\":\\\"InstanceEvaluationStateToInstanceState\\\"},{\\\"name\\\":\\\"operationStates\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceOperationState\\\",\\\"relationName\\\":\\\"InstanceOperationStateToInstanceState\\\"},{\\\"name\\\":\\\"secrets\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Secret\\\",\\\"relationName\\\":\\\"InstanceStateToSecret\\\"},{\\\"name\\\":\\\"terminals\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Terminal\\\",\\\"relationName\\\":\\\"InstanceStateToTerminal\\\"},{\\\"name\\\":\\\"pages\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Page\\\",\\\"relationName\\\":\\\"InstanceStateToPage\\\"},{\\\"name\\\":\\\"triggers\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Trigger\\\",\\\"relationName\\\":\\\"InstanceStateToTrigger\\\"},{\\\"name\\\":\\\"customStatuses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceCustomStatus\\\",\\\"relationName\\\":\\\"InstanceCustomStatusToInstanceState\\\"},{\\\"name\\\":\\\"lock\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceLock\\\",\\\"relationName\\\":\\\"InstanceLockToInstanceState\\\"},{\\\"name\\\":\\\"workerRegistrations\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"WorkerUnitRegistration\\\",\\\"relationName\\\":\\\"InstanceStateToWorkerUnitRegistration\\\"},{\\\"name\\\":\\\"artifacts\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Artifact\\\",\\\"relationName\\\":\\\"ArtifactToInstanceState\\\"},{\\\"name\\\":\\\"operationLogs\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"OperationLog\\\",\\\"relationName\\\":\\\"InstanceStateToOperationLog\\\"},{\\\"name\\\":\\\"userViewports\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"UserCompositeViewport\\\",\\\"relationName\\\":\\\"InstanceStateToUserCompositeViewport\\\"}],\\\"dbName\\\":null},\\\"UserProjectViewport\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"viewport\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"}],\\\"dbName\\\":null},\\\"UserCompositeViewport\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"viewport\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceStateToUserCompositeViewport\\\"}],\\\"dbName\\\":null},\\\"InstanceLock\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"token\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"acquiredAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceLockToInstanceState\\\"}],\\\"dbName\\\":null},\\\"InstanceModel\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"model\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"HubModel\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"model\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"Operation\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"type\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"OperationType\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"OperationStatus\\\"},{\\\"name\\\":\\\"options\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"requestedInstanceIds\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"phases\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"startedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"finishedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"operationStates\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceOperationState\\\",\\\"relationName\\\":\\\"InstanceOperationStateToOperation\\\"},{\\\"name\\\":\\\"logs\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"OperationLog\\\",\\\"relationName\\\":\\\"OperationToOperationLog\\\"}],\\\"dbName\\\":null},\\\"InstanceOperationState\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"operationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"InstanceOperationStatus\\\"},{\\\"name\\\":\\\"currentResourceCount\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"totalResourceCount\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"model\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"resolvedInputs\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"startedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"finishedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"operation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Operation\\\",\\\"relationName\\\":\\\"InstanceOperationStateToOperation\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceOperationStateToInstanceState\\\"}],\\\"dbName\\\":null},\\\"OperationLog\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"operationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"isSystem\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"operation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Operation\\\",\\\"relationName\\\":\\\"OperationToOperationLog\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceStateToOperationLog\\\"}],\\\"dbName\\\":null},\\\"Page\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"serviceAccountId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceStateToPage\\\"},{\\\"name\\\":\\\"serviceAccount\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ServiceAccount\\\",\\\"relationName\\\":\\\"PageToServiceAccount\\\"},{\\\"name\\\":\\\"artifacts\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Artifact\\\",\\\"relationName\\\":\\\"ArtifactToPage\\\"}],\\\"dbName\\\":null},\\\"Secret\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"systemName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"serviceAccountId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceStateToSecret\\\"},{\\\"name\\\":\\\"serviceAccount\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ServiceAccount\\\",\\\"relationName\\\":\\\"SecretToServiceAccount\\\"}],\\\"dbName\\\":null},\\\"ServiceAccount\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"workers\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Worker\\\",\\\"relationName\\\":\\\"ServiceAccountToWorker\\\"},{\\\"name\\\":\\\"artifacts\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Artifact\\\",\\\"relationName\\\":\\\"ArtifactToServiceAccount\\\"},{\\\"name\\\":\\\"secrets\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Secret\\\",\\\"relationName\\\":\\\"SecretToServiceAccount\\\"},{\\\"name\\\":\\\"terminals\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Terminal\\\",\\\"relationName\\\":\\\"ServiceAccountToTerminal\\\"},{\\\"name\\\":\\\"pages\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Page\\\",\\\"relationName\\\":\\\"PageToServiceAccount\\\"},{\\\"name\\\":\\\"customStatuses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceCustomStatus\\\",\\\"relationName\\\":\\\"InstanceCustomStatusToServiceAccount\\\"},{\\\"name\\\":\\\"apiKeys\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ApiKey\\\",\\\"relationName\\\":\\\"ApiKeyToServiceAccount\\\"}],\\\"dbName\\\":null},\\\"Terminal\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"TerminalStatus\\\"},{\\\"name\\\":\\\"spec\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"serviceAccountId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceStateToTerminal\\\"},{\\\"name\\\":\\\"serviceAccount\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ServiceAccount\\\",\\\"relationName\\\":\\\"ServiceAccountToTerminal\\\"},{\\\"name\\\":\\\"sessions\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"TerminalSession\\\",\\\"relationName\\\":\\\"TerminalToTerminalSession\\\"},{\\\"name\\\":\\\"artifacts\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Artifact\\\",\\\"relationName\\\":\\\"ArtifactToTerminal\\\"}],\\\"dbName\\\":null},\\\"TerminalSession\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"terminalId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"startedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"finishedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"terminal\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Terminal\\\",\\\"relationName\\\":\\\"TerminalToTerminalSession\\\"},{\\\"name\\\":\\\"logs\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"TerminalSessionLog\\\",\\\"relationName\\\":\\\"TerminalSessionToTerminalSessionLog\\\"}],\\\"dbName\\\":null},\\\"TerminalSessionLog\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sessionId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"session\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"TerminalSession\\\",\\\"relationName\\\":\\\"TerminalSessionToTerminalSessionLog\\\"}],\\\"dbName\\\":null},\\\"Trigger\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"spec\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceStateToTrigger\\\"}],\\\"dbName\\\":null},\\\"UnlockMethod\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"type\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"UnlockMethodType\\\"},{\\\"name\\\":\\\"encryptedIdentity\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"recipient\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"Worker\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"identity\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"serviceAccountId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"serviceAccount\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ServiceAccount\\\",\\\"relationName\\\":\\\"ServiceAccountToWorker\\\"},{\\\"name\\\":\\\"versions\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"WorkerVersion\\\",\\\"relationName\\\":\\\"WorkerToWorkerVersion\\\"}],\\\"dbName\\\":null},\\\"WorkerVersion\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"meta\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"WorkerVersionStatus\\\"},{\\\"name\\\":\\\"enabled\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"runtimeId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"workerId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"digest\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"apiKeyId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"worker\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Worker\\\",\\\"relationName\\\":\\\"WorkerToWorkerVersion\\\"},{\\\"name\\\":\\\"apiKey\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ApiKey\\\",\\\"relationName\\\":\\\"ApiKeyToWorkerVersion\\\"},{\\\"name\\\":\\\"unitRegistrations\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"WorkerUnitRegistration\\\",\\\"relationName\\\":\\\"WorkerUnitRegistrationToWorkerVersion\\\"},{\\\"name\\\":\\\"logs\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"WorkerVersionLog\\\",\\\"relationName\\\":\\\"WorkerVersionToWorkerVersionLog\\\"}],\\\"dbName\\\":null},\\\"WorkerUnitRegistration\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"stateId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"params\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"workerVersionId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"state\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"InstanceState\\\",\\\"relationName\\\":\\\"InstanceStateToWorkerUnitRegistration\\\"},{\\\"name\\\":\\\"workerVersion\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"WorkerVersion\\\",\\\"relationName\\\":\\\"WorkerUnitRegistrationToWorkerVersion\\\"}],\\\"dbName\\\":null},\\\"WorkerVersionLog\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"workerVersionId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"isSystem\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"workerVersion\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"WorkerVersion\\\",\\\"relationName\\\":\\\"WorkerVersionToWorkerVersionLog\\\"}],\\\"dbName\\\":null}},\\\"enums\\\":{},\\\"types\\\":{}}\")\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n const { Buffer } = await import('node:buffer')\n const wasmArray = Buffer.from(wasmBase64, 'base64')\n return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.sqlite.mjs\"),\n\n getQueryCompilerWasmModule: async () => {\n const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.sqlite.wasm-base64.mjs\")\n return await decodeBase64AsWasm(wasm)\n },\n\n importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n 'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n /**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more ApiKeys\n * const apiKeys = await prisma.apiKey.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\n new <\n Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n LogOpts extends LogOptions<Options> = LogOptions<Options>,\n OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n >(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more ApiKeys\n * const apiKeys = await prisma.apiKey.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n in LogOpts extends Prisma.LogLevel = never,\n in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,\n in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n /**\n * Connect with the database\n */\n $connect(): runtime.Types.Utils.JsPromise<void>;\n\n /**\n * Disconnect from the database\n */\n $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n * Executes a prepared raw query and returns the number of affected rows.\n * @example\n * ```\n * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Executes a raw query and returns the number of affected rows.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Performs a prepared raw query and returns the `SELECT` data.\n * @example\n * ```\n * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n /**\n * Performs a raw query and returns the `SELECT` data.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n /**\n * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n * @example\n * ```\n * const [george, bob, alice] = await prisma.$transaction([\n * prisma.user.create({ data: { name: 'George' } }),\n * prisma.user.create({ data: { name: 'Bob' } }),\n * prisma.user.create({ data: { name: 'Alice' } }),\n * ])\n * ```\n * \n * Read more in our [docs](https://www.prisma.io/docs/concepts/components/prisma-client/transactions).\n */\n $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n extArgs: ExtArgs\n }>>\n\n /**\n * `prisma.apiKey`: Exposes CRUD operations for the **ApiKey** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ApiKeys\n * const apiKeys = await prisma.apiKey.findMany()\n * ```\n */\n get apiKey(): Prisma.ApiKeyDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.artifact`: Exposes CRUD operations for the **Artifact** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Artifacts\n * const artifacts = await prisma.artifact.findMany()\n * ```\n */\n get artifact(): Prisma.ArtifactDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.instanceCustomStatus`: Exposes CRUD operations for the **InstanceCustomStatus** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more InstanceCustomStatuses\n * const instanceCustomStatuses = await prisma.instanceCustomStatus.findMany()\n * ```\n */\n get instanceCustomStatus(): Prisma.InstanceCustomStatusDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.instanceEvaluationState`: Exposes CRUD operations for the **InstanceEvaluationState** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more InstanceEvaluationStates\n * const instanceEvaluationStates = await prisma.instanceEvaluationState.findMany()\n * ```\n */\n get instanceEvaluationState(): Prisma.InstanceEvaluationStateDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.instanceState`: Exposes CRUD operations for the **InstanceState** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more InstanceStates\n * const instanceStates = await prisma.instanceState.findMany()\n * ```\n */\n get instanceState(): Prisma.InstanceStateDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.userProjectViewport`: Exposes CRUD operations for the **UserProjectViewport** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more UserProjectViewports\n * const userProjectViewports = await prisma.userProjectViewport.findMany()\n * ```\n */\n get userProjectViewport(): Prisma.UserProjectViewportDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.userCompositeViewport`: Exposes CRUD operations for the **UserCompositeViewport** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more UserCompositeViewports\n * const userCompositeViewports = await prisma.userCompositeViewport.findMany()\n * ```\n */\n get userCompositeViewport(): Prisma.UserCompositeViewportDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.instanceLock`: Exposes CRUD operations for the **InstanceLock** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more InstanceLocks\n * const instanceLocks = await prisma.instanceLock.findMany()\n * ```\n */\n get instanceLock(): Prisma.InstanceLockDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.instanceModel`: Exposes CRUD operations for the **InstanceModel** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more InstanceModels\n * const instanceModels = await prisma.instanceModel.findMany()\n * ```\n */\n get instanceModel(): Prisma.InstanceModelDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.hubModel`: Exposes CRUD operations for the **HubModel** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more HubModels\n * const hubModels = await prisma.hubModel.findMany()\n * ```\n */\n get hubModel(): Prisma.HubModelDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.operation`: Exposes CRUD operations for the **Operation** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Operations\n * const operations = await prisma.operation.findMany()\n * ```\n */\n get operation(): Prisma.OperationDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.instanceOperationState`: Exposes CRUD operations for the **InstanceOperationState** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more InstanceOperationStates\n * const instanceOperationStates = await prisma.instanceOperationState.findMany()\n * ```\n */\n get instanceOperationState(): Prisma.InstanceOperationStateDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.operationLog`: Exposes CRUD operations for the **OperationLog** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more OperationLogs\n * const operationLogs = await prisma.operationLog.findMany()\n * ```\n */\n get operationLog(): Prisma.OperationLogDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.page`: Exposes CRUD operations for the **Page** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Pages\n * const pages = await prisma.page.findMany()\n * ```\n */\n get page(): Prisma.PageDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.secret`: Exposes CRUD operations for the **Secret** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Secrets\n * const secrets = await prisma.secret.findMany()\n * ```\n */\n get secret(): Prisma.SecretDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.serviceAccount`: Exposes CRUD operations for the **ServiceAccount** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ServiceAccounts\n * const serviceAccounts = await prisma.serviceAccount.findMany()\n * ```\n */\n get serviceAccount(): Prisma.ServiceAccountDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.terminal`: Exposes CRUD operations for the **Terminal** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Terminals\n * const terminals = await prisma.terminal.findMany()\n * ```\n */\n get terminal(): Prisma.TerminalDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.terminalSession`: Exposes CRUD operations for the **TerminalSession** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more TerminalSessions\n * const terminalSessions = await prisma.terminalSession.findMany()\n * ```\n */\n get terminalSession(): Prisma.TerminalSessionDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.terminalSessionLog`: Exposes CRUD operations for the **TerminalSessionLog** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more TerminalSessionLogs\n * const terminalSessionLogs = await prisma.terminalSessionLog.findMany()\n * ```\n */\n get terminalSessionLog(): Prisma.TerminalSessionLogDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.trigger`: Exposes CRUD operations for the **Trigger** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Triggers\n * const triggers = await prisma.trigger.findMany()\n * ```\n */\n get trigger(): Prisma.TriggerDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.unlockMethod`: Exposes CRUD operations for the **UnlockMethod** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more UnlockMethods\n * const unlockMethods = await prisma.unlockMethod.findMany()\n * ```\n */\n get unlockMethod(): Prisma.UnlockMethodDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.worker`: Exposes CRUD operations for the **Worker** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Workers\n * const workers = await prisma.worker.findMany()\n * ```\n */\n get worker(): Prisma.WorkerDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.workerVersion`: Exposes CRUD operations for the **WorkerVersion** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more WorkerVersions\n * const workerVersions = await prisma.workerVersion.findMany()\n * ```\n */\n get workerVersion(): Prisma.WorkerVersionDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.workerUnitRegistration`: Exposes CRUD operations for the **WorkerUnitRegistration** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more WorkerUnitRegistrations\n * const workerUnitRegistrations = await prisma.workerUnitRegistration.findMany()\n * ```\n */\n get workerUnitRegistration(): Prisma.WorkerUnitRegistrationDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.workerVersionLog`: Exposes CRUD operations for the **WorkerVersionLog** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more WorkerVersionLogs\n * const workerVersionLogs = await prisma.workerVersionLog.findMany()\n * ```\n */\n get workerVersionLog(): Prisma.WorkerVersionLogDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.\n * While this enables partial backward compatibility, it is not part of the stable public API.\n *\n * If you are looking for your Models, Enums, and Input Types, please import them from the respective\n * model files in the `model` directory!\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"../models.ts\"\nimport { type PrismaClient } from \"./class.ts\"\n\nexport type * from '../models.ts'\n\nexport type DMMF = typeof runtime.DMMF\n\nexport type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>\n\n/**\n * Prisma Errors\n */\n\nexport const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\nexport type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\n\nexport const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\nexport type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\n\nexport const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\nexport type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\n\nexport const PrismaClientInitializationError = runtime.PrismaClientInitializationError\nexport type PrismaClientInitializationError = runtime.PrismaClientInitializationError\n\nexport const PrismaClientValidationError = runtime.PrismaClientValidationError\nexport type PrismaClientValidationError = runtime.PrismaClientValidationError\n\n/**\n * Re-export of sql-template-tag\n */\nexport const sql = runtime.sqltag\nexport const empty = runtime.empty\nexport const join = runtime.join\nexport const raw = runtime.raw\nexport const Sql = runtime.Sql\nexport type Sql = runtime.Sql\n\n\n\n/**\n * Decimal.js\n */\nexport const Decimal = runtime.Decimal\nexport type Decimal = runtime.Decimal\n\nexport type DecimalJsLike = runtime.DecimalJsLike\n\n/**\n* Extensions\n*/\nexport type Extension = runtime.Types.Extensions.UserArgs\nexport const getExtensionContext = runtime.Extensions.getExtensionContext\nexport type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>\nexport type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>\nexport type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>\nexport type Exact<A, W> = runtime.Types.Public.Exact<A, W>\n\nexport type PrismaVersion = {\n client: string\n engine: string\n}\n\n/**\n * Prisma Client JS version: 7.3.0\n * Query Engine version: 9d6ad21cbbceab97458517b147a6a09ff43aa735\n */\nexport const prismaVersion: PrismaVersion = {\n client: \"7.3.0\",\n engine: \"9d6ad21cbbceab97458517b147a6a09ff43aa735\"\n}\n\n/**\n * Utility Types\n */\n\nexport type Bytes = runtime.Bytes\nexport type JsonObject = runtime.JsonObject\nexport type JsonArray = runtime.JsonArray\nexport type JsonValue = runtime.JsonValue\nexport type InputJsonObject = runtime.InputJsonObject\nexport type InputJsonArray = runtime.InputJsonArray\nexport type InputJsonValue = runtime.InputJsonValue\n\n\nexport const NullTypes = {\n DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),\n JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),\n AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),\n}\n/**\n * Helper for filtering JSON entries that have `null` on the database (empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const DbNull = runtime.DbNull\n\n/**\n * Helper for filtering JSON entries that have JSON `null` values (not empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const JsonNull = runtime.JsonNull\n\n/**\n * Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const AnyNull = runtime.AnyNull\n\n\ntype SelectAndInclude = {\n select: any\n include: any\n}\n\ntype SelectAndOmit = {\n select: any\n omit: any\n}\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Prisma__Pick<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Subset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection\n */\nexport type Subset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never;\n};\n\n/**\n * SelectSubset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection.\n * Additionally, it validates, if both select and include are present. If the case, it errors.\n */\nexport type SelectSubset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n (T extends SelectAndInclude\n ? 'Please either choose `select` or `include`.'\n : T extends SelectAndOmit\n ? 'Please either choose `select` or `omit`.'\n : {})\n\n/**\n * Subset + Intersection\n * @desc From `T` pick properties that exist in `U` and intersect `K`\n */\nexport type SubsetIntersection<T, U, K> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n K\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\n\n/**\n * XOR is needed to have a real mutually exclusive union type\n * https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\nexport type XOR<T, U> =\n T extends object ?\n U extends object ?\n (Without<T, U> & U) | (Without<U, T> & T)\n : U : T\n\n\n/**\n * Is T a Record?\n */\ntype IsObject<T extends any> = T extends Array<any>\n? False\n: T extends Date\n? False\n: T extends Uint8Array\n? False\n: T extends BigInt\n? False\n: T extends object\n? True\n: False\n\n\n/**\n * If it's T[], return T\n */\nexport type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T\n\n/**\n * From ts-toolbelt\n */\n\ntype __Either<O extends object, K extends Key> = Omit<O, K> &\n {\n // Merge all but K\n [P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities\n }[K]\n\ntype EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>\n\ntype EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>\n\ntype _Either<\n O extends object,\n K extends Key,\n strict extends Boolean\n> = {\n 1: EitherStrict<O, K>\n 0: EitherLoose<O, K>\n}[strict]\n\nexport type Either<\n O extends object,\n K extends Key,\n strict extends Boolean = 1\n> = O extends unknown ? _Either<O, K, strict> : never\n\nexport type Union = any\n\nexport type PatchUndefined<O extends object, O1 extends object> = {\n [K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]\n} & {}\n\n/** Helper Types for \"Merge\" **/\nexport type IntersectOf<U extends Union> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never\n\nexport type Overwrite<O extends object, O1 extends object> = {\n [K in keyof O]: K extends keyof O1 ? O1[K] : O[K];\n} & {};\n\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n [K in keyof U]-?: At<U, K>;\n}>>;\n\ntype Key = string | number | symbol;\ntype AtStrict<O extends object, K extends Key> = O[K & keyof O];\ntype AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;\nexport type At<O extends object, K extends Key, strict extends Boolean = 1> = {\n 1: AtStrict<O, K>;\n 0: AtLoose<O, K>;\n}[strict];\n\nexport type ComputeRaw<A extends any> = A extends Function ? A : {\n [K in keyof A]: A[K];\n} & {};\n\nexport type OptionalFlat<O> = {\n [K in keyof O]?: O[K];\n} & {};\n\ntype _Record<K extends keyof any, T> = {\n [P in K]: T;\n};\n\n// cause typescript not to expand types and preserve names\ntype NoExpand<T> = T extends unknown ? T : never;\n\n// this type assumes the passed object is entirely optional\nexport type AtLeast<O extends object, K extends string> = NoExpand<\n O extends unknown\n ? | (K extends keyof O ? { [P in K]: O[P] } & O : O)\n | {[P in keyof O as P extends K ? P : never]-?: O[P]} & O\n : never>;\n\ntype _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;\n\nexport type Strict<U extends object> = ComputeRaw<_Strict<U>>;\n/** End Helper Types for \"Merge\" **/\n\nexport type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;\n\nexport type Boolean = True | False\n\nexport type True = 1\n\nexport type False = 0\n\nexport type Not<B extends Boolean> = {\n 0: 1\n 1: 0\n}[B]\n\nexport type Extends<A1 extends any, A2 extends any> = [A1] extends [never]\n ? 0 // anything `never` is false\n : A1 extends A2\n ? 1\n : 0\n\nexport type Has<U extends Union, U1 extends Union> = Not<\n Extends<Exclude<U1, U>, U1>\n>\n\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n 0: {\n 0: 0\n 1: 1\n }\n 1: {\n 0: 1\n 1: 1\n }\n}[B1][B2]\n\nexport type Keys<U extends Union> = U extends unknown ? keyof U : never\n\nexport type GetScalarType<T, O> = O extends object ? {\n [P in keyof T]: P extends keyof O\n ? O[P]\n : never\n} : never\n\ntype FieldPaths<\n T,\n U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>\n> = IsObject<T> extends True ? U : T\n\nexport type GetHavingFields<T> = {\n [K in keyof T]: Or<\n Or<Extends<'OR', K>, Extends<'AND', K>>,\n Extends<'NOT', K>\n > extends True\n ? // infer is only needed to not hit TS limit\n // based on the brilliant idea of Pierre-Antoine Mills\n // https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437\n T[K] extends infer TK\n ? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>\n : never\n : {} extends FieldPaths<T[K]>\n ? never\n : K\n}[keyof T]\n\n/**\n * Convert tuple to union\n */\ntype _TupleToUnion<T> = T extends (infer E)[] ? E : never\ntype TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>\nexport type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T\n\n/**\n * Like `Pick`, but additionally can also accept an array of keys\n */\nexport type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>\n\n/**\n * Exclude all keys with underscores\n */\nexport type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T\n\n\nexport type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>\n\ntype FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>\n\n\nexport const ModelName = {\n ApiKey: 'ApiKey',\n Artifact: 'Artifact',\n InstanceCustomStatus: 'InstanceCustomStatus',\n InstanceEvaluationState: 'InstanceEvaluationState',\n InstanceState: 'InstanceState',\n UserProjectViewport: 'UserProjectViewport',\n UserCompositeViewport: 'UserCompositeViewport',\n InstanceLock: 'InstanceLock',\n InstanceModel: 'InstanceModel',\n HubModel: 'HubModel',\n Operation: 'Operation',\n InstanceOperationState: 'InstanceOperationState',\n OperationLog: 'OperationLog',\n Page: 'Page',\n Secret: 'Secret',\n ServiceAccount: 'ServiceAccount',\n Terminal: 'Terminal',\n TerminalSession: 'TerminalSession',\n TerminalSessionLog: 'TerminalSessionLog',\n Trigger: 'Trigger',\n UnlockMethod: 'UnlockMethod',\n Worker: 'Worker',\n WorkerVersion: 'WorkerVersion',\n WorkerUnitRegistration: 'WorkerUnitRegistration',\n WorkerVersionLog: 'WorkerVersionLog'\n} as const\n\nexport type ModelName = (typeof ModelName)[keyof typeof ModelName]\n\n\n\nexport interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {\n returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>\n}\n\nexport type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {\n globalOmitOptions: {\n omit: GlobalOmitOptions\n }\n meta: {\n modelProps: \"apiKey\" | \"artifact\" | \"instanceCustomStatus\" | \"instanceEvaluationState\" | \"instanceState\" | \"userProjectViewport\" | \"userCompositeViewport\" | \"instanceLock\" | \"instanceModel\" | \"hubModel\" | \"operation\" | \"instanceOperationState\" | \"operationLog\" | \"page\" | \"secret\" | \"serviceAccount\" | \"terminal\" | \"terminalSession\" | \"terminalSessionLog\" | \"trigger\" | \"unlockMethod\" | \"worker\" | \"workerVersion\" | \"workerUnitRegistration\" | \"workerVersionLog\"\n txIsolationLevel: TransactionIsolationLevel\n }\n model: {\n ApiKey: {\n payload: Prisma.$ApiKeyPayload<ExtArgs>\n fields: Prisma.ApiKeyFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ApiKeyFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ApiKeyFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>\n }\n findFirst: {\n args: Prisma.ApiKeyFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ApiKeyFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>\n }\n findMany: {\n args: Prisma.ApiKeyFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>[]\n }\n create: {\n args: Prisma.ApiKeyCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>\n }\n createMany: {\n args: Prisma.ApiKeyCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ApiKeyCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>[]\n }\n delete: {\n args: Prisma.ApiKeyDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>\n }\n update: {\n args: Prisma.ApiKeyUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>\n }\n deleteMany: {\n args: Prisma.ApiKeyDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ApiKeyUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ApiKeyUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>[]\n }\n upsert: {\n args: Prisma.ApiKeyUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ApiKeyPayload>\n }\n aggregate: {\n args: Prisma.ApiKeyAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateApiKey>\n }\n groupBy: {\n args: Prisma.ApiKeyGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ApiKeyGroupByOutputType>[]\n }\n count: {\n args: Prisma.ApiKeyCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ApiKeyCountAggregateOutputType> | number\n }\n }\n }\n Artifact: {\n payload: Prisma.$ArtifactPayload<ExtArgs>\n fields: Prisma.ArtifactFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ArtifactFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ArtifactFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>\n }\n findFirst: {\n args: Prisma.ArtifactFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ArtifactFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>\n }\n findMany: {\n args: Prisma.ArtifactFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>[]\n }\n create: {\n args: Prisma.ArtifactCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>\n }\n createMany: {\n args: Prisma.ArtifactCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ArtifactCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>[]\n }\n delete: {\n args: Prisma.ArtifactDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>\n }\n update: {\n args: Prisma.ArtifactUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>\n }\n deleteMany: {\n args: Prisma.ArtifactDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ArtifactUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ArtifactUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>[]\n }\n upsert: {\n args: Prisma.ArtifactUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ArtifactPayload>\n }\n aggregate: {\n args: Prisma.ArtifactAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateArtifact>\n }\n groupBy: {\n args: Prisma.ArtifactGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ArtifactGroupByOutputType>[]\n }\n count: {\n args: Prisma.ArtifactCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ArtifactCountAggregateOutputType> | number\n }\n }\n }\n InstanceCustomStatus: {\n payload: Prisma.$InstanceCustomStatusPayload<ExtArgs>\n fields: Prisma.InstanceCustomStatusFieldRefs\n operations: {\n findUnique: {\n args: Prisma.InstanceCustomStatusFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.InstanceCustomStatusFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>\n }\n findFirst: {\n args: Prisma.InstanceCustomStatusFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.InstanceCustomStatusFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>\n }\n findMany: {\n args: Prisma.InstanceCustomStatusFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>[]\n }\n create: {\n args: Prisma.InstanceCustomStatusCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>\n }\n createMany: {\n args: Prisma.InstanceCustomStatusCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.InstanceCustomStatusCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>[]\n }\n delete: {\n args: Prisma.InstanceCustomStatusDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>\n }\n update: {\n args: Prisma.InstanceCustomStatusUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>\n }\n deleteMany: {\n args: Prisma.InstanceCustomStatusDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.InstanceCustomStatusUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.InstanceCustomStatusUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>[]\n }\n upsert: {\n args: Prisma.InstanceCustomStatusUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceCustomStatusPayload>\n }\n aggregate: {\n args: Prisma.InstanceCustomStatusAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateInstanceCustomStatus>\n }\n groupBy: {\n args: Prisma.InstanceCustomStatusGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceCustomStatusGroupByOutputType>[]\n }\n count: {\n args: Prisma.InstanceCustomStatusCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceCustomStatusCountAggregateOutputType> | number\n }\n }\n }\n InstanceEvaluationState: {\n payload: Prisma.$InstanceEvaluationStatePayload<ExtArgs>\n fields: Prisma.InstanceEvaluationStateFieldRefs\n operations: {\n findUnique: {\n args: Prisma.InstanceEvaluationStateFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.InstanceEvaluationStateFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>\n }\n findFirst: {\n args: Prisma.InstanceEvaluationStateFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.InstanceEvaluationStateFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>\n }\n findMany: {\n args: Prisma.InstanceEvaluationStateFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>[]\n }\n create: {\n args: Prisma.InstanceEvaluationStateCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>\n }\n createMany: {\n args: Prisma.InstanceEvaluationStateCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.InstanceEvaluationStateCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>[]\n }\n delete: {\n args: Prisma.InstanceEvaluationStateDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>\n }\n update: {\n args: Prisma.InstanceEvaluationStateUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>\n }\n deleteMany: {\n args: Prisma.InstanceEvaluationStateDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.InstanceEvaluationStateUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.InstanceEvaluationStateUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>[]\n }\n upsert: {\n args: Prisma.InstanceEvaluationStateUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceEvaluationStatePayload>\n }\n aggregate: {\n args: Prisma.InstanceEvaluationStateAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateInstanceEvaluationState>\n }\n groupBy: {\n args: Prisma.InstanceEvaluationStateGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceEvaluationStateGroupByOutputType>[]\n }\n count: {\n args: Prisma.InstanceEvaluationStateCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceEvaluationStateCountAggregateOutputType> | number\n }\n }\n }\n InstanceState: {\n payload: Prisma.$InstanceStatePayload<ExtArgs>\n fields: Prisma.InstanceStateFieldRefs\n operations: {\n findUnique: {\n args: Prisma.InstanceStateFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.InstanceStateFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>\n }\n findFirst: {\n args: Prisma.InstanceStateFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.InstanceStateFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>\n }\n findMany: {\n args: Prisma.InstanceStateFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>[]\n }\n create: {\n args: Prisma.InstanceStateCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>\n }\n createMany: {\n args: Prisma.InstanceStateCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.InstanceStateCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>[]\n }\n delete: {\n args: Prisma.InstanceStateDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>\n }\n update: {\n args: Prisma.InstanceStateUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>\n }\n deleteMany: {\n args: Prisma.InstanceStateDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.InstanceStateUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.InstanceStateUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>[]\n }\n upsert: {\n args: Prisma.InstanceStateUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceStatePayload>\n }\n aggregate: {\n args: Prisma.InstanceStateAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateInstanceState>\n }\n groupBy: {\n args: Prisma.InstanceStateGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceStateGroupByOutputType>[]\n }\n count: {\n args: Prisma.InstanceStateCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceStateCountAggregateOutputType> | number\n }\n }\n }\n UserProjectViewport: {\n payload: Prisma.$UserProjectViewportPayload<ExtArgs>\n fields: Prisma.UserProjectViewportFieldRefs\n operations: {\n findUnique: {\n args: Prisma.UserProjectViewportFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.UserProjectViewportFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>\n }\n findFirst: {\n args: Prisma.UserProjectViewportFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.UserProjectViewportFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>\n }\n findMany: {\n args: Prisma.UserProjectViewportFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>[]\n }\n create: {\n args: Prisma.UserProjectViewportCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>\n }\n createMany: {\n args: Prisma.UserProjectViewportCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.UserProjectViewportCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>[]\n }\n delete: {\n args: Prisma.UserProjectViewportDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>\n }\n update: {\n args: Prisma.UserProjectViewportUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>\n }\n deleteMany: {\n args: Prisma.UserProjectViewportDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.UserProjectViewportUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.UserProjectViewportUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>[]\n }\n upsert: {\n args: Prisma.UserProjectViewportUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserProjectViewportPayload>\n }\n aggregate: {\n args: Prisma.UserProjectViewportAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateUserProjectViewport>\n }\n groupBy: {\n args: Prisma.UserProjectViewportGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserProjectViewportGroupByOutputType>[]\n }\n count: {\n args: Prisma.UserProjectViewportCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserProjectViewportCountAggregateOutputType> | number\n }\n }\n }\n UserCompositeViewport: {\n payload: Prisma.$UserCompositeViewportPayload<ExtArgs>\n fields: Prisma.UserCompositeViewportFieldRefs\n operations: {\n findUnique: {\n args: Prisma.UserCompositeViewportFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.UserCompositeViewportFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>\n }\n findFirst: {\n args: Prisma.UserCompositeViewportFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.UserCompositeViewportFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>\n }\n findMany: {\n args: Prisma.UserCompositeViewportFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>[]\n }\n create: {\n args: Prisma.UserCompositeViewportCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>\n }\n createMany: {\n args: Prisma.UserCompositeViewportCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.UserCompositeViewportCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>[]\n }\n delete: {\n args: Prisma.UserCompositeViewportDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>\n }\n update: {\n args: Prisma.UserCompositeViewportUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>\n }\n deleteMany: {\n args: Prisma.UserCompositeViewportDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.UserCompositeViewportUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.UserCompositeViewportUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>[]\n }\n upsert: {\n args: Prisma.UserCompositeViewportUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserCompositeViewportPayload>\n }\n aggregate: {\n args: Prisma.UserCompositeViewportAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateUserCompositeViewport>\n }\n groupBy: {\n args: Prisma.UserCompositeViewportGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserCompositeViewportGroupByOutputType>[]\n }\n count: {\n args: Prisma.UserCompositeViewportCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserCompositeViewportCountAggregateOutputType> | number\n }\n }\n }\n InstanceLock: {\n payload: Prisma.$InstanceLockPayload<ExtArgs>\n fields: Prisma.InstanceLockFieldRefs\n operations: {\n findUnique: {\n args: Prisma.InstanceLockFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.InstanceLockFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>\n }\n findFirst: {\n args: Prisma.InstanceLockFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.InstanceLockFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>\n }\n findMany: {\n args: Prisma.InstanceLockFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>[]\n }\n create: {\n args: Prisma.InstanceLockCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>\n }\n createMany: {\n args: Prisma.InstanceLockCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.InstanceLockCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>[]\n }\n delete: {\n args: Prisma.InstanceLockDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>\n }\n update: {\n args: Prisma.InstanceLockUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>\n }\n deleteMany: {\n args: Prisma.InstanceLockDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.InstanceLockUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.InstanceLockUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>[]\n }\n upsert: {\n args: Prisma.InstanceLockUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceLockPayload>\n }\n aggregate: {\n args: Prisma.InstanceLockAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateInstanceLock>\n }\n groupBy: {\n args: Prisma.InstanceLockGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceLockGroupByOutputType>[]\n }\n count: {\n args: Prisma.InstanceLockCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceLockCountAggregateOutputType> | number\n }\n }\n }\n InstanceModel: {\n payload: Prisma.$InstanceModelPayload<ExtArgs>\n fields: Prisma.InstanceModelFieldRefs\n operations: {\n findUnique: {\n args: Prisma.InstanceModelFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.InstanceModelFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>\n }\n findFirst: {\n args: Prisma.InstanceModelFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.InstanceModelFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>\n }\n findMany: {\n args: Prisma.InstanceModelFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>[]\n }\n create: {\n args: Prisma.InstanceModelCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>\n }\n createMany: {\n args: Prisma.InstanceModelCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.InstanceModelCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>[]\n }\n delete: {\n args: Prisma.InstanceModelDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>\n }\n update: {\n args: Prisma.InstanceModelUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>\n }\n deleteMany: {\n args: Prisma.InstanceModelDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.InstanceModelUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.InstanceModelUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>[]\n }\n upsert: {\n args: Prisma.InstanceModelUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceModelPayload>\n }\n aggregate: {\n args: Prisma.InstanceModelAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateInstanceModel>\n }\n groupBy: {\n args: Prisma.InstanceModelGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceModelGroupByOutputType>[]\n }\n count: {\n args: Prisma.InstanceModelCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceModelCountAggregateOutputType> | number\n }\n }\n }\n HubModel: {\n payload: Prisma.$HubModelPayload<ExtArgs>\n fields: Prisma.HubModelFieldRefs\n operations: {\n findUnique: {\n args: Prisma.HubModelFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.HubModelFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>\n }\n findFirst: {\n args: Prisma.HubModelFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.HubModelFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>\n }\n findMany: {\n args: Prisma.HubModelFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>[]\n }\n create: {\n args: Prisma.HubModelCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>\n }\n createMany: {\n args: Prisma.HubModelCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.HubModelCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>[]\n }\n delete: {\n args: Prisma.HubModelDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>\n }\n update: {\n args: Prisma.HubModelUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>\n }\n deleteMany: {\n args: Prisma.HubModelDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.HubModelUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.HubModelUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>[]\n }\n upsert: {\n args: Prisma.HubModelUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$HubModelPayload>\n }\n aggregate: {\n args: Prisma.HubModelAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateHubModel>\n }\n groupBy: {\n args: Prisma.HubModelGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.HubModelGroupByOutputType>[]\n }\n count: {\n args: Prisma.HubModelCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.HubModelCountAggregateOutputType> | number\n }\n }\n }\n Operation: {\n payload: Prisma.$OperationPayload<ExtArgs>\n fields: Prisma.OperationFieldRefs\n operations: {\n findUnique: {\n args: Prisma.OperationFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.OperationFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>\n }\n findFirst: {\n args: Prisma.OperationFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.OperationFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>\n }\n findMany: {\n args: Prisma.OperationFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>[]\n }\n create: {\n args: Prisma.OperationCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>\n }\n createMany: {\n args: Prisma.OperationCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.OperationCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>[]\n }\n delete: {\n args: Prisma.OperationDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>\n }\n update: {\n args: Prisma.OperationUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>\n }\n deleteMany: {\n args: Prisma.OperationDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.OperationUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.OperationUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>[]\n }\n upsert: {\n args: Prisma.OperationUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationPayload>\n }\n aggregate: {\n args: Prisma.OperationAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateOperation>\n }\n groupBy: {\n args: Prisma.OperationGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.OperationGroupByOutputType>[]\n }\n count: {\n args: Prisma.OperationCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.OperationCountAggregateOutputType> | number\n }\n }\n }\n InstanceOperationState: {\n payload: Prisma.$InstanceOperationStatePayload<ExtArgs>\n fields: Prisma.InstanceOperationStateFieldRefs\n operations: {\n findUnique: {\n args: Prisma.InstanceOperationStateFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.InstanceOperationStateFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>\n }\n findFirst: {\n args: Prisma.InstanceOperationStateFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.InstanceOperationStateFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>\n }\n findMany: {\n args: Prisma.InstanceOperationStateFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>[]\n }\n create: {\n args: Prisma.InstanceOperationStateCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>\n }\n createMany: {\n args: Prisma.InstanceOperationStateCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.InstanceOperationStateCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>[]\n }\n delete: {\n args: Prisma.InstanceOperationStateDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>\n }\n update: {\n args: Prisma.InstanceOperationStateUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>\n }\n deleteMany: {\n args: Prisma.InstanceOperationStateDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.InstanceOperationStateUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.InstanceOperationStateUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>[]\n }\n upsert: {\n args: Prisma.InstanceOperationStateUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InstanceOperationStatePayload>\n }\n aggregate: {\n args: Prisma.InstanceOperationStateAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateInstanceOperationState>\n }\n groupBy: {\n args: Prisma.InstanceOperationStateGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceOperationStateGroupByOutputType>[]\n }\n count: {\n args: Prisma.InstanceOperationStateCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InstanceOperationStateCountAggregateOutputType> | number\n }\n }\n }\n OperationLog: {\n payload: Prisma.$OperationLogPayload<ExtArgs>\n fields: Prisma.OperationLogFieldRefs\n operations: {\n findUnique: {\n args: Prisma.OperationLogFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.OperationLogFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>\n }\n findFirst: {\n args: Prisma.OperationLogFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.OperationLogFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>\n }\n findMany: {\n args: Prisma.OperationLogFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>[]\n }\n create: {\n args: Prisma.OperationLogCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>\n }\n createMany: {\n args: Prisma.OperationLogCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.OperationLogCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>[]\n }\n delete: {\n args: Prisma.OperationLogDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>\n }\n update: {\n args: Prisma.OperationLogUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>\n }\n deleteMany: {\n args: Prisma.OperationLogDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.OperationLogUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.OperationLogUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>[]\n }\n upsert: {\n args: Prisma.OperationLogUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$OperationLogPayload>\n }\n aggregate: {\n args: Prisma.OperationLogAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateOperationLog>\n }\n groupBy: {\n args: Prisma.OperationLogGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.OperationLogGroupByOutputType>[]\n }\n count: {\n args: Prisma.OperationLogCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.OperationLogCountAggregateOutputType> | number\n }\n }\n }\n Page: {\n payload: Prisma.$PagePayload<ExtArgs>\n fields: Prisma.PageFieldRefs\n operations: {\n findUnique: {\n args: Prisma.PageFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.PageFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>\n }\n findFirst: {\n args: Prisma.PageFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.PageFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>\n }\n findMany: {\n args: Prisma.PageFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>[]\n }\n create: {\n args: Prisma.PageCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>\n }\n createMany: {\n args: Prisma.PageCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.PageCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>[]\n }\n delete: {\n args: Prisma.PageDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>\n }\n update: {\n args: Prisma.PageUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>\n }\n deleteMany: {\n args: Prisma.PageDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.PageUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.PageUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>[]\n }\n upsert: {\n args: Prisma.PageUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$PagePayload>\n }\n aggregate: {\n args: Prisma.PageAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregatePage>\n }\n groupBy: {\n args: Prisma.PageGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.PageGroupByOutputType>[]\n }\n count: {\n args: Prisma.PageCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.PageCountAggregateOutputType> | number\n }\n }\n }\n Secret: {\n payload: Prisma.$SecretPayload<ExtArgs>\n fields: Prisma.SecretFieldRefs\n operations: {\n findUnique: {\n args: Prisma.SecretFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.SecretFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>\n }\n findFirst: {\n args: Prisma.SecretFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.SecretFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>\n }\n findMany: {\n args: Prisma.SecretFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>[]\n }\n create: {\n args: Prisma.SecretCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>\n }\n createMany: {\n args: Prisma.SecretCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.SecretCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>[]\n }\n delete: {\n args: Prisma.SecretDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>\n }\n update: {\n args: Prisma.SecretUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>\n }\n deleteMany: {\n args: Prisma.SecretDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.SecretUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.SecretUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>[]\n }\n upsert: {\n args: Prisma.SecretUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$SecretPayload>\n }\n aggregate: {\n args: Prisma.SecretAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateSecret>\n }\n groupBy: {\n args: Prisma.SecretGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.SecretGroupByOutputType>[]\n }\n count: {\n args: Prisma.SecretCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.SecretCountAggregateOutputType> | number\n }\n }\n }\n ServiceAccount: {\n payload: Prisma.$ServiceAccountPayload<ExtArgs>\n fields: Prisma.ServiceAccountFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ServiceAccountFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ServiceAccountFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>\n }\n findFirst: {\n args: Prisma.ServiceAccountFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ServiceAccountFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>\n }\n findMany: {\n args: Prisma.ServiceAccountFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>[]\n }\n create: {\n args: Prisma.ServiceAccountCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>\n }\n createMany: {\n args: Prisma.ServiceAccountCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ServiceAccountCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>[]\n }\n delete: {\n args: Prisma.ServiceAccountDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>\n }\n update: {\n args: Prisma.ServiceAccountUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>\n }\n deleteMany: {\n args: Prisma.ServiceAccountDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ServiceAccountUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ServiceAccountUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>[]\n }\n upsert: {\n args: Prisma.ServiceAccountUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ServiceAccountPayload>\n }\n aggregate: {\n args: Prisma.ServiceAccountAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateServiceAccount>\n }\n groupBy: {\n args: Prisma.ServiceAccountGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ServiceAccountGroupByOutputType>[]\n }\n count: {\n args: Prisma.ServiceAccountCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ServiceAccountCountAggregateOutputType> | number\n }\n }\n }\n Terminal: {\n payload: Prisma.$TerminalPayload<ExtArgs>\n fields: Prisma.TerminalFieldRefs\n operations: {\n findUnique: {\n args: Prisma.TerminalFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.TerminalFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>\n }\n findFirst: {\n args: Prisma.TerminalFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.TerminalFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>\n }\n findMany: {\n args: Prisma.TerminalFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>[]\n }\n create: {\n args: Prisma.TerminalCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>\n }\n createMany: {\n args: Prisma.TerminalCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.TerminalCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>[]\n }\n delete: {\n args: Prisma.TerminalDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>\n }\n update: {\n args: Prisma.TerminalUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>\n }\n deleteMany: {\n args: Prisma.TerminalDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.TerminalUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.TerminalUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>[]\n }\n upsert: {\n args: Prisma.TerminalUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalPayload>\n }\n aggregate: {\n args: Prisma.TerminalAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateTerminal>\n }\n groupBy: {\n args: Prisma.TerminalGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TerminalGroupByOutputType>[]\n }\n count: {\n args: Prisma.TerminalCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TerminalCountAggregateOutputType> | number\n }\n }\n }\n TerminalSession: {\n payload: Prisma.$TerminalSessionPayload<ExtArgs>\n fields: Prisma.TerminalSessionFieldRefs\n operations: {\n findUnique: {\n args: Prisma.TerminalSessionFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.TerminalSessionFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>\n }\n findFirst: {\n args: Prisma.TerminalSessionFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.TerminalSessionFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>\n }\n findMany: {\n args: Prisma.TerminalSessionFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>[]\n }\n create: {\n args: Prisma.TerminalSessionCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>\n }\n createMany: {\n args: Prisma.TerminalSessionCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.TerminalSessionCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>[]\n }\n delete: {\n args: Prisma.TerminalSessionDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>\n }\n update: {\n args: Prisma.TerminalSessionUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>\n }\n deleteMany: {\n args: Prisma.TerminalSessionDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.TerminalSessionUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.TerminalSessionUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>[]\n }\n upsert: {\n args: Prisma.TerminalSessionUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionPayload>\n }\n aggregate: {\n args: Prisma.TerminalSessionAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateTerminalSession>\n }\n groupBy: {\n args: Prisma.TerminalSessionGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TerminalSessionGroupByOutputType>[]\n }\n count: {\n args: Prisma.TerminalSessionCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TerminalSessionCountAggregateOutputType> | number\n }\n }\n }\n TerminalSessionLog: {\n payload: Prisma.$TerminalSessionLogPayload<ExtArgs>\n fields: Prisma.TerminalSessionLogFieldRefs\n operations: {\n findUnique: {\n args: Prisma.TerminalSessionLogFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.TerminalSessionLogFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>\n }\n findFirst: {\n args: Prisma.TerminalSessionLogFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.TerminalSessionLogFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>\n }\n findMany: {\n args: Prisma.TerminalSessionLogFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>[]\n }\n create: {\n args: Prisma.TerminalSessionLogCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>\n }\n createMany: {\n args: Prisma.TerminalSessionLogCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.TerminalSessionLogCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>[]\n }\n delete: {\n args: Prisma.TerminalSessionLogDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>\n }\n update: {\n args: Prisma.TerminalSessionLogUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>\n }\n deleteMany: {\n args: Prisma.TerminalSessionLogDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.TerminalSessionLogUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.TerminalSessionLogUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>[]\n }\n upsert: {\n args: Prisma.TerminalSessionLogUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TerminalSessionLogPayload>\n }\n aggregate: {\n args: Prisma.TerminalSessionLogAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateTerminalSessionLog>\n }\n groupBy: {\n args: Prisma.TerminalSessionLogGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TerminalSessionLogGroupByOutputType>[]\n }\n count: {\n args: Prisma.TerminalSessionLogCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TerminalSessionLogCountAggregateOutputType> | number\n }\n }\n }\n Trigger: {\n payload: Prisma.$TriggerPayload<ExtArgs>\n fields: Prisma.TriggerFieldRefs\n operations: {\n findUnique: {\n args: Prisma.TriggerFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.TriggerFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>\n }\n findFirst: {\n args: Prisma.TriggerFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.TriggerFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>\n }\n findMany: {\n args: Prisma.TriggerFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>[]\n }\n create: {\n args: Prisma.TriggerCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>\n }\n createMany: {\n args: Prisma.TriggerCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.TriggerCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>[]\n }\n delete: {\n args: Prisma.TriggerDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>\n }\n update: {\n args: Prisma.TriggerUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>\n }\n deleteMany: {\n args: Prisma.TriggerDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.TriggerUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.TriggerUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>[]\n }\n upsert: {\n args: Prisma.TriggerUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TriggerPayload>\n }\n aggregate: {\n args: Prisma.TriggerAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateTrigger>\n }\n groupBy: {\n args: Prisma.TriggerGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TriggerGroupByOutputType>[]\n }\n count: {\n args: Prisma.TriggerCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TriggerCountAggregateOutputType> | number\n }\n }\n }\n UnlockMethod: {\n payload: Prisma.$UnlockMethodPayload<ExtArgs>\n fields: Prisma.UnlockMethodFieldRefs\n operations: {\n findUnique: {\n args: Prisma.UnlockMethodFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.UnlockMethodFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>\n }\n findFirst: {\n args: Prisma.UnlockMethodFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.UnlockMethodFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>\n }\n findMany: {\n args: Prisma.UnlockMethodFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>[]\n }\n create: {\n args: Prisma.UnlockMethodCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>\n }\n createMany: {\n args: Prisma.UnlockMethodCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.UnlockMethodCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>[]\n }\n delete: {\n args: Prisma.UnlockMethodDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>\n }\n update: {\n args: Prisma.UnlockMethodUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>\n }\n deleteMany: {\n args: Prisma.UnlockMethodDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.UnlockMethodUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.UnlockMethodUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>[]\n }\n upsert: {\n args: Prisma.UnlockMethodUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UnlockMethodPayload>\n }\n aggregate: {\n args: Prisma.UnlockMethodAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateUnlockMethod>\n }\n groupBy: {\n args: Prisma.UnlockMethodGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UnlockMethodGroupByOutputType>[]\n }\n count: {\n args: Prisma.UnlockMethodCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UnlockMethodCountAggregateOutputType> | number\n }\n }\n }\n Worker: {\n payload: Prisma.$WorkerPayload<ExtArgs>\n fields: Prisma.WorkerFieldRefs\n operations: {\n findUnique: {\n args: Prisma.WorkerFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.WorkerFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>\n }\n findFirst: {\n args: Prisma.WorkerFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.WorkerFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>\n }\n findMany: {\n args: Prisma.WorkerFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>[]\n }\n create: {\n args: Prisma.WorkerCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>\n }\n createMany: {\n args: Prisma.WorkerCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.WorkerCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>[]\n }\n delete: {\n args: Prisma.WorkerDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>\n }\n update: {\n args: Prisma.WorkerUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>\n }\n deleteMany: {\n args: Prisma.WorkerDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.WorkerUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.WorkerUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>[]\n }\n upsert: {\n args: Prisma.WorkerUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerPayload>\n }\n aggregate: {\n args: Prisma.WorkerAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateWorker>\n }\n groupBy: {\n args: Prisma.WorkerGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.WorkerGroupByOutputType>[]\n }\n count: {\n args: Prisma.WorkerCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.WorkerCountAggregateOutputType> | number\n }\n }\n }\n WorkerVersion: {\n payload: Prisma.$WorkerVersionPayload<ExtArgs>\n fields: Prisma.WorkerVersionFieldRefs\n operations: {\n findUnique: {\n args: Prisma.WorkerVersionFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.WorkerVersionFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>\n }\n findFirst: {\n args: Prisma.WorkerVersionFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.WorkerVersionFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>\n }\n findMany: {\n args: Prisma.WorkerVersionFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>[]\n }\n create: {\n args: Prisma.WorkerVersionCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>\n }\n createMany: {\n args: Prisma.WorkerVersionCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.WorkerVersionCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>[]\n }\n delete: {\n args: Prisma.WorkerVersionDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>\n }\n update: {\n args: Prisma.WorkerVersionUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>\n }\n deleteMany: {\n args: Prisma.WorkerVersionDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.WorkerVersionUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.WorkerVersionUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>[]\n }\n upsert: {\n args: Prisma.WorkerVersionUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionPayload>\n }\n aggregate: {\n args: Prisma.WorkerVersionAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateWorkerVersion>\n }\n groupBy: {\n args: Prisma.WorkerVersionGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.WorkerVersionGroupByOutputType>[]\n }\n count: {\n args: Prisma.WorkerVersionCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.WorkerVersionCountAggregateOutputType> | number\n }\n }\n }\n WorkerUnitRegistration: {\n payload: Prisma.$WorkerUnitRegistrationPayload<ExtArgs>\n fields: Prisma.WorkerUnitRegistrationFieldRefs\n operations: {\n findUnique: {\n args: Prisma.WorkerUnitRegistrationFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.WorkerUnitRegistrationFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>\n }\n findFirst: {\n args: Prisma.WorkerUnitRegistrationFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.WorkerUnitRegistrationFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>\n }\n findMany: {\n args: Prisma.WorkerUnitRegistrationFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>[]\n }\n create: {\n args: Prisma.WorkerUnitRegistrationCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>\n }\n createMany: {\n args: Prisma.WorkerUnitRegistrationCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.WorkerUnitRegistrationCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>[]\n }\n delete: {\n args: Prisma.WorkerUnitRegistrationDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>\n }\n update: {\n args: Prisma.WorkerUnitRegistrationUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>\n }\n deleteMany: {\n args: Prisma.WorkerUnitRegistrationDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.WorkerUnitRegistrationUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.WorkerUnitRegistrationUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>[]\n }\n upsert: {\n args: Prisma.WorkerUnitRegistrationUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerUnitRegistrationPayload>\n }\n aggregate: {\n args: Prisma.WorkerUnitRegistrationAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateWorkerUnitRegistration>\n }\n groupBy: {\n args: Prisma.WorkerUnitRegistrationGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.WorkerUnitRegistrationGroupByOutputType>[]\n }\n count: {\n args: Prisma.WorkerUnitRegistrationCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.WorkerUnitRegistrationCountAggregateOutputType> | number\n }\n }\n }\n WorkerVersionLog: {\n payload: Prisma.$WorkerVersionLogPayload<ExtArgs>\n fields: Prisma.WorkerVersionLogFieldRefs\n operations: {\n findUnique: {\n args: Prisma.WorkerVersionLogFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.WorkerVersionLogFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>\n }\n findFirst: {\n args: Prisma.WorkerVersionLogFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.WorkerVersionLogFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>\n }\n findMany: {\n args: Prisma.WorkerVersionLogFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>[]\n }\n create: {\n args: Prisma.WorkerVersionLogCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>\n }\n createMany: {\n args: Prisma.WorkerVersionLogCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.WorkerVersionLogCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>[]\n }\n delete: {\n args: Prisma.WorkerVersionLogDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>\n }\n update: {\n args: Prisma.WorkerVersionLogUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>\n }\n deleteMany: {\n args: Prisma.WorkerVersionLogDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.WorkerVersionLogUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.WorkerVersionLogUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>[]\n }\n upsert: {\n args: Prisma.WorkerVersionLogUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$WorkerVersionLogPayload>\n }\n aggregate: {\n args: Prisma.WorkerVersionLogAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateWorkerVersionLog>\n }\n groupBy: {\n args: Prisma.WorkerVersionLogGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.WorkerVersionLogGroupByOutputType>[]\n }\n count: {\n args: Prisma.WorkerVersionLogCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.WorkerVersionLogCountAggregateOutputType> | number\n }\n }\n }\n }\n} & {\n other: {\n payload: any\n operations: {\n $executeRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $executeRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n $queryRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $queryRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n }\n }\n}\n\n/**\n * Enums\n */\n\nexport const TransactionIsolationLevel = runtime.makeStrictEnum({\n Serializable: 'Serializable'\n} as const)\n\nexport type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]\n\n\nexport const ApiKeyScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n serviceAccountId: 'serviceAccountId',\n token: 'token',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type ApiKeyScalarFieldEnum = (typeof ApiKeyScalarFieldEnum)[keyof typeof ApiKeyScalarFieldEnum]\n\n\nexport const ArtifactScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n hash: 'hash',\n size: 'size',\n chunkSize: 'chunkSize',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type ArtifactScalarFieldEnum = (typeof ArtifactScalarFieldEnum)[keyof typeof ArtifactScalarFieldEnum]\n\n\nexport const InstanceCustomStatusScalarFieldEnum = {\n stateId: 'stateId',\n serviceAccountId: 'serviceAccountId',\n name: 'name',\n meta: 'meta',\n value: 'value',\n message: 'message',\n order: 'order',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type InstanceCustomStatusScalarFieldEnum = (typeof InstanceCustomStatusScalarFieldEnum)[keyof typeof InstanceCustomStatusScalarFieldEnum]\n\n\nexport const InstanceEvaluationStateScalarFieldEnum = {\n stateId: 'stateId',\n status: 'status',\n message: 'message',\n model: 'model',\n evaluatedAt: 'evaluatedAt'\n} as const\n\nexport type InstanceEvaluationStateScalarFieldEnum = (typeof InstanceEvaluationStateScalarFieldEnum)[keyof typeof InstanceEvaluationStateScalarFieldEnum]\n\n\nexport const InstanceStateScalarFieldEnum = {\n id: 'id',\n instanceId: 'instanceId',\n status: 'status',\n source: 'source',\n kind: 'kind',\n parentId: 'parentId',\n inputHashNonce: 'inputHashNonce',\n selfHash: 'selfHash',\n inputHash: 'inputHash',\n outputHash: 'outputHash',\n dependencyOutputHash: 'dependencyOutputHash',\n exportedArtifactIds: 'exportedArtifactIds',\n model: 'model',\n resolvedInputs: 'resolvedInputs',\n currentResourceCount: 'currentResourceCount',\n statusFields: 'statusFields'\n} as const\n\nexport type InstanceStateScalarFieldEnum = (typeof InstanceStateScalarFieldEnum)[keyof typeof InstanceStateScalarFieldEnum]\n\n\nexport const UserProjectViewportScalarFieldEnum = {\n userId: 'userId',\n viewport: 'viewport'\n} as const\n\nexport type UserProjectViewportScalarFieldEnum = (typeof UserProjectViewportScalarFieldEnum)[keyof typeof UserProjectViewportScalarFieldEnum]\n\n\nexport const UserCompositeViewportScalarFieldEnum = {\n userId: 'userId',\n stateId: 'stateId',\n viewport: 'viewport'\n} as const\n\nexport type UserCompositeViewportScalarFieldEnum = (typeof UserCompositeViewportScalarFieldEnum)[keyof typeof UserCompositeViewportScalarFieldEnum]\n\n\nexport const InstanceLockScalarFieldEnum = {\n stateId: 'stateId',\n meta: 'meta',\n token: 'token',\n acquiredAt: 'acquiredAt'\n} as const\n\nexport type InstanceLockScalarFieldEnum = (typeof InstanceLockScalarFieldEnum)[keyof typeof InstanceLockScalarFieldEnum]\n\n\nexport const InstanceModelScalarFieldEnum = {\n id: 'id',\n model: 'model',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type InstanceModelScalarFieldEnum = (typeof InstanceModelScalarFieldEnum)[keyof typeof InstanceModelScalarFieldEnum]\n\n\nexport const HubModelScalarFieldEnum = {\n id: 'id',\n model: 'model',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type HubModelScalarFieldEnum = (typeof HubModelScalarFieldEnum)[keyof typeof HubModelScalarFieldEnum]\n\n\nexport const OperationScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n type: 'type',\n status: 'status',\n options: 'options',\n requestedInstanceIds: 'requestedInstanceIds',\n phases: 'phases',\n startedAt: 'startedAt',\n updatedAt: 'updatedAt',\n finishedAt: 'finishedAt'\n} as const\n\nexport type OperationScalarFieldEnum = (typeof OperationScalarFieldEnum)[keyof typeof OperationScalarFieldEnum]\n\n\nexport const InstanceOperationStateScalarFieldEnum = {\n operationId: 'operationId',\n stateId: 'stateId',\n status: 'status',\n currentResourceCount: 'currentResourceCount',\n totalResourceCount: 'totalResourceCount',\n model: 'model',\n resolvedInputs: 'resolvedInputs',\n startedAt: 'startedAt',\n finishedAt: 'finishedAt'\n} as const\n\nexport type InstanceOperationStateScalarFieldEnum = (typeof InstanceOperationStateScalarFieldEnum)[keyof typeof InstanceOperationStateScalarFieldEnum]\n\n\nexport const OperationLogScalarFieldEnum = {\n id: 'id',\n operationId: 'operationId',\n stateId: 'stateId',\n isSystem: 'isSystem',\n content: 'content'\n} as const\n\nexport type OperationLogScalarFieldEnum = (typeof OperationLogScalarFieldEnum)[keyof typeof OperationLogScalarFieldEnum]\n\n\nexport const PageScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n stateId: 'stateId',\n name: 'name',\n serviceAccountId: 'serviceAccountId',\n content: 'content',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type PageScalarFieldEnum = (typeof PageScalarFieldEnum)[keyof typeof PageScalarFieldEnum]\n\n\nexport const SecretScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n stateId: 'stateId',\n name: 'name',\n systemName: 'systemName',\n serviceAccountId: 'serviceAccountId',\n content: 'content',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type SecretScalarFieldEnum = (typeof SecretScalarFieldEnum)[keyof typeof SecretScalarFieldEnum]\n\n\nexport const ServiceAccountScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type ServiceAccountScalarFieldEnum = (typeof ServiceAccountScalarFieldEnum)[keyof typeof ServiceAccountScalarFieldEnum]\n\n\nexport const TerminalScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n status: 'status',\n spec: 'spec',\n stateId: 'stateId',\n name: 'name',\n serviceAccountId: 'serviceAccountId',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type TerminalScalarFieldEnum = (typeof TerminalScalarFieldEnum)[keyof typeof TerminalScalarFieldEnum]\n\n\nexport const TerminalSessionScalarFieldEnum = {\n id: 'id',\n terminalId: 'terminalId',\n startedAt: 'startedAt',\n finishedAt: 'finishedAt'\n} as const\n\nexport type TerminalSessionScalarFieldEnum = (typeof TerminalSessionScalarFieldEnum)[keyof typeof TerminalSessionScalarFieldEnum]\n\n\nexport const TerminalSessionLogScalarFieldEnum = {\n id: 'id',\n sessionId: 'sessionId',\n content: 'content'\n} as const\n\nexport type TerminalSessionLogScalarFieldEnum = (typeof TerminalSessionLogScalarFieldEnum)[keyof typeof TerminalSessionLogScalarFieldEnum]\n\n\nexport const TriggerScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n stateId: 'stateId',\n name: 'name',\n spec: 'spec',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type TriggerScalarFieldEnum = (typeof TriggerScalarFieldEnum)[keyof typeof TriggerScalarFieldEnum]\n\n\nexport const UnlockMethodScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n type: 'type',\n encryptedIdentity: 'encryptedIdentity',\n recipient: 'recipient',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type UnlockMethodScalarFieldEnum = (typeof UnlockMethodScalarFieldEnum)[keyof typeof UnlockMethodScalarFieldEnum]\n\n\nexport const WorkerScalarFieldEnum = {\n id: 'id',\n identity: 'identity',\n serviceAccountId: 'serviceAccountId',\n createdAt: 'createdAt'\n} as const\n\nexport type WorkerScalarFieldEnum = (typeof WorkerScalarFieldEnum)[keyof typeof WorkerScalarFieldEnum]\n\n\nexport const WorkerVersionScalarFieldEnum = {\n id: 'id',\n meta: 'meta',\n status: 'status',\n enabled: 'enabled',\n runtimeId: 'runtimeId',\n workerId: 'workerId',\n digest: 'digest',\n apiKeyId: 'apiKeyId',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type WorkerVersionScalarFieldEnum = (typeof WorkerVersionScalarFieldEnum)[keyof typeof WorkerVersionScalarFieldEnum]\n\n\nexport const WorkerUnitRegistrationScalarFieldEnum = {\n stateId: 'stateId',\n name: 'name',\n params: 'params',\n workerVersionId: 'workerVersionId',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type WorkerUnitRegistrationScalarFieldEnum = (typeof WorkerUnitRegistrationScalarFieldEnum)[keyof typeof WorkerUnitRegistrationScalarFieldEnum]\n\n\nexport const WorkerVersionLogScalarFieldEnum = {\n id: 'id',\n workerVersionId: 'workerVersionId',\n content: 'content',\n isSystem: 'isSystem'\n} as const\n\nexport type WorkerVersionLogScalarFieldEnum = (typeof WorkerVersionLogScalarFieldEnum)[keyof typeof WorkerVersionLogScalarFieldEnum]\n\n\nexport const SortOrder = {\n asc: 'asc',\n desc: 'desc'\n} as const\n\nexport type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]\n\n\nexport const JsonNullValueInput = {\n JsonNull: JsonNull\n} as const\n\nexport type JsonNullValueInput = (typeof JsonNullValueInput)[keyof typeof JsonNullValueInput]\n\n\nexport const NullableJsonNullValueInput = {\n DbNull: DbNull,\n JsonNull: JsonNull\n} as const\n\nexport type NullableJsonNullValueInput = (typeof NullableJsonNullValueInput)[keyof typeof NullableJsonNullValueInput]\n\n\nexport const JsonNullValueFilter = {\n DbNull: DbNull,\n JsonNull: JsonNull,\n AnyNull: AnyNull\n} as const\n\nexport type JsonNullValueFilter = (typeof JsonNullValueFilter)[keyof typeof JsonNullValueFilter]\n\n\nexport const QueryMode = {\n default: 'default',\n insensitive: 'insensitive'\n} as const\n\nexport type QueryMode = (typeof QueryMode)[keyof typeof QueryMode]\n\n\nexport const NullsOrder = {\n first: 'first',\n last: 'last'\n} as const\n\nexport type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]\n\n\n\n/**\n * Field references\n */\n\n\n/**\n * Reference to a field of type 'String'\n */\nexport type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>\n \n\n\n/**\n * Reference to a field of type 'Json'\n */\nexport type JsonFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Json'>\n \n\n\n/**\n * Reference to a field of type 'QueryMode'\n */\nexport type EnumQueryModeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'QueryMode'>\n \n\n\n/**\n * Reference to a field of type 'DateTime'\n */\nexport type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>\n \n\n\n/**\n * Reference to a field of type 'Int'\n */\nexport type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>\n \n\n\n/**\n * Reference to a field of type 'InstanceEvaluationStatus'\n */\nexport type EnumInstanceEvaluationStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'InstanceEvaluationStatus'>\n \n\n\n/**\n * Reference to a field of type 'InstanceStatus'\n */\nexport type EnumInstanceStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'InstanceStatus'>\n \n\n\n/**\n * Reference to a field of type 'InstanceSource'\n */\nexport type EnumInstanceSourceFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'InstanceSource'>\n \n\n\n/**\n * Reference to a field of type 'OperationType'\n */\nexport type EnumOperationTypeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'OperationType'>\n \n\n\n/**\n * Reference to a field of type 'OperationStatus'\n */\nexport type EnumOperationStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'OperationStatus'>\n \n\n\n/**\n * Reference to a field of type 'InstanceOperationStatus'\n */\nexport type EnumInstanceOperationStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'InstanceOperationStatus'>\n \n\n\n/**\n * Reference to a field of type 'Boolean'\n */\nexport type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'>\n \n\n\n/**\n * Reference to a field of type 'TerminalStatus'\n */\nexport type EnumTerminalStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'TerminalStatus'>\n \n\n\n/**\n * Reference to a field of type 'UnlockMethodType'\n */\nexport type EnumUnlockMethodTypeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'UnlockMethodType'>\n \n\n\n/**\n * Reference to a field of type 'WorkerVersionStatus'\n */\nexport type EnumWorkerVersionStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'WorkerVersionStatus'>\n \n\n\n/**\n * Reference to a field of type 'Float'\n */\nexport type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>\n \n\n/**\n * Batch Payload for updateMany & deleteMany & createMany\n */\nexport type BatchPayload = {\n count: number\n}\n\nexport const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<\"define\", TypeMapCb, runtime.Types.Extensions.DefaultArgs>\nexport type DefaultPrismaClient = PrismaClient\nexport type ErrorFormat = 'pretty' | 'colorless' | 'minimal'\nexport type PrismaClientOptions = ({\n /**\n * Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-pg`.\n */\n adapter: runtime.SqlDriverAdapterFactory\n accelerateUrl?: never\n} | {\n /**\n * Prisma Accelerate URL allowing the client to connect through Accelerate instead of a direct database.\n */\n accelerateUrl: string\n adapter?: never\n}) & {\n /**\n * @default \"colorless\"\n */\n errorFormat?: ErrorFormat\n /**\n * @example\n * ```\n * // Shorthand for `emit: 'stdout'`\n * log: ['query', 'info', 'warn', 'error']\n * \n * // Emit as events only\n * log: [\n * { emit: 'event', level: 'query' },\n * { emit: 'event', level: 'info' },\n * { emit: 'event', level: 'warn' }\n * { emit: 'event', level: 'error' }\n * ]\n * \n * / Emit as events and log to stdout\n * og: [\n * { emit: 'stdout', level: 'query' },\n * { emit: 'stdout', level: 'info' },\n * { emit: 'stdout', level: 'warn' }\n * { emit: 'stdout', level: 'error' }\n * \n * ```\n * Read more in our [docs](https://pris.ly/d/logging).\n */\n log?: (LogLevel | LogDefinition)[]\n /**\n * The default values for transactionOptions\n * maxWait ?= 2000\n * timeout ?= 5000\n */\n transactionOptions?: {\n maxWait?: number\n timeout?: number\n isolationLevel?: TransactionIsolationLevel\n }\n /**\n * Global configuration for omitting model fields by default.\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * omit: {\n * user: {\n * password: true\n * }\n * }\n * })\n * ```\n */\n omit?: GlobalOmitConfig\n /**\n * SQL commenter plugins that add metadata to SQL queries as comments.\n * Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter,\n * comments: [\n * traceContext(),\n * queryInsights(),\n * ],\n * })\n * ```\n */\n comments?: runtime.SqlCommenterPlugin[]\n}\nexport type GlobalOmitConfig = {\n apiKey?: Prisma.ApiKeyOmit\n artifact?: Prisma.ArtifactOmit\n instanceCustomStatus?: Prisma.InstanceCustomStatusOmit\n instanceEvaluationState?: Prisma.InstanceEvaluationStateOmit\n instanceState?: Prisma.InstanceStateOmit\n userProjectViewport?: Prisma.UserProjectViewportOmit\n userCompositeViewport?: Prisma.UserCompositeViewportOmit\n instanceLock?: Prisma.InstanceLockOmit\n instanceModel?: Prisma.InstanceModelOmit\n hubModel?: Prisma.HubModelOmit\n operation?: Prisma.OperationOmit\n instanceOperationState?: Prisma.InstanceOperationStateOmit\n operationLog?: Prisma.OperationLogOmit\n page?: Prisma.PageOmit\n secret?: Prisma.SecretOmit\n serviceAccount?: Prisma.ServiceAccountOmit\n terminal?: Prisma.TerminalOmit\n terminalSession?: Prisma.TerminalSessionOmit\n terminalSessionLog?: Prisma.TerminalSessionLogOmit\n trigger?: Prisma.TriggerOmit\n unlockMethod?: Prisma.UnlockMethodOmit\n worker?: Prisma.WorkerOmit\n workerVersion?: Prisma.WorkerVersionOmit\n workerUnitRegistration?: Prisma.WorkerUnitRegistrationOmit\n workerVersionLog?: Prisma.WorkerVersionLogOmit\n}\n\n/* Types for Logging */\nexport type LogLevel = 'info' | 'query' | 'warn' | 'error'\nexport type LogDefinition = {\n level: LogLevel\n emit: 'stdout' | 'event'\n}\n\nexport type CheckIsLogLevel<T> = T extends LogLevel ? T : never;\n\nexport type GetLogType<T> = CheckIsLogLevel<\n T extends LogDefinition ? T['level'] : T\n>;\n\nexport type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>\n ? GetLogType<T[number]>\n : never;\n\nexport type QueryEvent = {\n timestamp: Date\n query: string\n params: string\n duration: number\n target: string\n}\n\nexport type LogEvent = {\n timestamp: Date\n message: string\n target: string\n}\n/* End Types for Logging */\n\n\nexport type PrismaAction =\n | 'findUnique'\n | 'findUniqueOrThrow'\n | 'findMany'\n | 'findFirst'\n | 'findFirstOrThrow'\n | 'create'\n | 'createMany'\n | 'createManyAndReturn'\n | 'update'\n | 'updateMany'\n | 'updateManyAndReturn'\n | 'upsert'\n | 'delete'\n | 'deleteMany'\n | 'executeRaw'\n | 'queryRaw'\n | 'aggregate'\n | 'count'\n | 'runCommandRaw'\n | 'findRaw'\n | 'groupBy'\n\n/**\n * `PrismaClient` proxy available in interactive transactions.\n */\nexport type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>\n\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * 🟢 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums.ts\"\nimport * as $Class from \"./internal/class.ts\"\nimport * as Prisma from \"./internal/prismaNamespace.ts\"\n\nexport * as $Enums from './enums.ts'\nexport * from \"./enums.ts\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more ApiKeys\n * const apiKeys = await prisma.apiKey.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model ApiKey\n * The API key provides authentication tokens for accessing the platform API.\n * \n * Each API key impersonates a service account, inheriting its permissions and access scope.\n * Keys are automatically created for worker versions and can be manually created for\n * external integrations. The token is a 32-byte random hex string that can be regenerated.\n */\nexport type ApiKey = Prisma.ApiKeyModel\n/**\n * Model Artifact\n * The artifact represents a file or folder stored in the system.\n * \n * It can be produced by units or manually uploaded via API by service accounts.\n * \n * Since different actors can produce the same artifact with the same content and hash,\n * there is the ownership/usage concept to track which entities produce or use the artifact.\n * The \"ownership\" and \"usage\" are synonymous in this context and often referred to as \"usage\".\n * \n * When no usages are present, the artifact will be automatically garbage collected after a certain period.\n */\nexport type Artifact = Prisma.ArtifactModel\n/**\n * Model InstanceCustomStatus\n * \n */\nexport type InstanceCustomStatus = Prisma.InstanceCustomStatusModel\n/**\n * Model InstanceEvaluationState\n * The evaluation state tracks the result of evaluating composite instances to produce virtual instances.\n * \n * Composite instances are template components that generate other instances (virtual instances) when evaluated.\n * The evaluation process executes the composite's create function with resolved inputs to produce a tree\n * of child instances. These virtual instances exist in the source \"virtual\" state and can be units\n * (mapping to Pulumi resources) or other composites (producing more virtual instances recursively).\n * \n * Evaluation happens automatically after project unlock and library reloads to keep virtual instances\n * synchronized with their composite definitions. Evaluation state persists the produced instance model\n * and tracks success/error status with descriptive messages showing the instance tree or error details.\n */\nexport type InstanceEvaluationState = Prisma.InstanceEvaluationStateModel\n/**\n * Model InstanceState\n * \n */\nexport type InstanceState = Prisma.InstanceStateModel\n/**\n * Model UserProjectViewport\n * \n */\nexport type UserProjectViewport = Prisma.UserProjectViewportModel\n/**\n * Model UserCompositeViewport\n * \n */\nexport type UserCompositeViewport = Prisma.UserCompositeViewportModel\n/**\n * Model InstanceLock\n * \n */\nexport type InstanceLock = Prisma.InstanceLockModel\n/**\n * Model InstanceModel\n * The container for project instances. \n * \n * Only used when \"database\" project model storage is used.\n */\nexport type InstanceModel = Prisma.InstanceModelModel\n/**\n * Model HubModel\n * The container for project hubs.\n * \n * Only used when \"database\" project model storage is used.\n */\nexport type HubModel = Prisma.HubModelModel\n/**\n * Model Operation\n * \n */\nexport type Operation = Prisma.OperationModel\n/**\n * Model InstanceOperationState\n * \n */\nexport type InstanceOperationState = Prisma.InstanceOperationStateModel\n/**\n * Model OperationLog\n * \n */\nexport type OperationLog = Prisma.OperationLogModel\n/**\n * Model Page\n * The page provides custom UI content for instances and service accounts.\n * \n * Pages can be created by units to display instance-specific information or by service accounts.\n * The content consists of blocks that support markdown text, QR codes with optional content display,\n * and file attachments (inline or artifact references). Instance pages are explicitly deleted\n * when instances are destroyed.\n */\nexport type Page = Prisma.PageModel\n/**\n * Model Secret\n * The secret stores sensitive configuration values for instances, service accounts, and system components.\n * \n * Secrets can be instance-owned (for unit configuration), service account-owned, or system-level\n * (like Pulumi passwords). \n * \n * Secrets persist through normal destroy (recreate) operations\n * and are only deleted when explicitly forgetting instance state with the deleteSecrets flag or when manually deleted.\n * \n * Secret updates invalidate instance input hashes via inputHashNonce, triggering re-execution\n * during operations. But the content of the secrets itself do not contribute to the input hash.\n * \n * System secrets like Pulumi passwords are created on-demand and persist for the whole project lifetime.\n */\nexport type Secret = Prisma.SecretModel\n/**\n * Model ServiceAccount\n * The service account represents an identity for non-human actors in the system.\n * \n * Service accounts are automatically created for workers and can be manually created\n * for external integrations. They define the access scope for resources like artifacts,\n * secrets, terminals, and pages. Multiple API keys can impersonate the same service account,\n * allowing different authentication tokens to share the same permissions.\n */\nexport type ServiceAccount = Prisma.ServiceAccountModel\n/**\n * Model Terminal\n * The terminal provides interactive shell access to infrastructure resources.\n * \n * Terminals can be created by units (owned by instances) or by service accounts.\n * Each terminal maintains a specification for creating containers that power the terminal,\n * including image, command, environment, and mounted files.\n * \n * Instance-owned terminals are marked unavailable when the instance is destroyed, preserving session history.\n * Service account terminals persist independently.\n */\nexport type Terminal = Prisma.TerminalModel\n/**\n * Model TerminalSession\n * The terminal session represents a single interactive connection to a terminal.\n * \n * Each session tracks when it started and finished. All session output is preserved in logs.\n */\nexport type TerminalSession = Prisma.TerminalSessionModel\n/**\n * Model TerminalSessionLog\n * The terminal session log captures all input and output from a terminal session.\n * \n * Logs are stored with ULID identifiers for timestamp ordering.\n */\nexport type TerminalSessionLog = Prisma.TerminalSessionLogModel\n/**\n * Model Trigger\n * The trigger defines automated actions that execute in response to specific events.\n * \n * Triggers are created by units to perform actions at defined points in the instance lifecycle\n * or on schedule. The spec field determines the trigger type and behavior - currently supporting\n * before-destroy triggers, with planned support for additional types like cron scheduling.\n * Triggers are deleted along with their instance.\n */\nexport type Trigger = Prisma.TriggerModel\n/**\n * Model UnlockMethod\n * The unlock method enables decryption of project databases through user authentication.\n * \n * Each project database is encrypted with a master key, which is then encrypted for each\n * unlock method's recipient using AGE encryption. Users authenticate (password or passkey)\n * to decrypt their specific AGE identity, which then decrypts the master key.\n * \n * Multiple unlock methods can exist per project, allowing different authentication paths\n * to the same encrypted database. When unlock methods are added/removed, the master key\n * is re-encrypted for the new set of recipients.\n * \n * The encryptedIdentity contains the AGE identity encrypted with the user's authentication\n * method (password-derived key or WebAuthn), while the recipient is the public key\n * corresponding to that identity.\n */\nexport type UnlockMethod = Prisma.UnlockMethodModel\n/**\n * Model Worker\n * The worker represents a containerized application that extends unit capabilities beyond Pulumi execution.\n * \n * Workers enable units to perform runtime operations after Pulumi program completion,\n * such as attaching custom statuses, monitoring resources, or triggering unit reconfigurations.\n * Since Pulumi programs cannot affect instances after execution, workers bypass this limitation\n * by providing persistent runtime behavior.\n * \n * The worker identity (fully qualified image name) indicates the same publisher/party and services as natural authentication mechanism.\n * All versions of a worker share the same service account, meaning they operate over\n * the same resources and have the same access scope within the platform.\n */\nexport type Worker = Prisma.WorkerModel\n/**\n * Model WorkerVersion\n * The worker version represents a specific container image digest of a worker.\n * \n * Each version corresponds to an immutable container image identified by its SHA256 digest.\n * Versions are automatically created when units reference new image digests and deleted\n * when no longer referenced by any unit registrations.\n * \n * Each version has its own API key for isolation, but all versions of a worker\n * share the same service account and thus the same access scope within the platform.\n * The runtime starts containers when registrations exist and stops them when removed.\n */\nexport type WorkerVersion = Prisma.WorkerVersionModel\n/**\n * Model WorkerUnitRegistration\n * The worker unit registration tracks which unit instances require specific worker versions.\n * \n * Units declare worker dependencies through their outputs, creating registrations that\n * trigger the runtime to start corresponding worker containers. Each registration\n * includes parameters passed to the worker for unit-specific configuration.\n * \n * Registrations are managed during operation execution - created when units declare workers\n * and removed when units are destroyed. Worker versions without registrations are garbage collected.\n */\nexport type WorkerUnitRegistration = Prisma.WorkerUnitRegistrationModel\n/**\n * Model WorkerVersionLog\n * The worker version log captures output from running worker containers.\n * \n * Logs include both worker-generated output and system messages from the runtime.\n * The ULID identifier provides timestamp ordering. Logs are deleted with the worker version.\n */\nexport type WorkerVersionLog = Prisma.WorkerVersionLogModel\n","import type { Logger } from \"pino\"\nimport type { z } from \"zod\"\nimport type { ProjectDatabaseBackend } from \"../abstractions\"\nimport { mkdir } from \"node:fs/promises\"\nimport { PrismaLibSql } from \"@prisma/adapter-libsql\"\nimport { type codebaseConfig, getCodebaseHighstatePath } from \"../../common\"\nimport { ProjectDatabase } from \"../prisma\"\n\nexport class LocalProjectDatabaseBackend implements ProjectDatabaseBackend {\n constructor(private readonly highstatePath: string) {}\n\n async openProjectDatabase(projectId: string, masterKey?: string): Promise<ProjectDatabase> {\n const databasePath = `${this.highstatePath}/projects/${projectId}`\n await mkdir(databasePath, { recursive: true })\n\n const databaseUrl = `file:${databasePath}/project.db`\n\n const adapter = new PrismaLibSql({\n url: databaseUrl,\n encryptionKey: masterKey,\n })\n\n return new ProjectDatabase({ adapter })\n }\n\n static async create(\n config: z.infer<typeof codebaseConfig>,\n logger: Logger,\n ): Promise<LocalProjectDatabaseBackend> {\n const highstatePath = await getCodebaseHighstatePath(config, logger)\n\n return new LocalProjectDatabaseBackend(highstatePath)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { ProjectUnlockBackend } from \"../unlock\"\nimport type { BackendDatabaseBackend, ProjectDatabaseBackend } from \"./abstractions\"\nimport type { BackendDatabase, ProjectDatabase } from \"./prisma\"\nimport { LRUCache } from \"lru-cache\"\nimport z from \"zod\"\nimport { createProjectLogger } from \"../common\"\nimport { ProjectLockedError, ProjectNotFoundError } from \"../shared\"\nimport { migrateDatabase, migrationPacks } from \"./migration\"\n\nexport const databaseManagerConfig = z.object({\n HIGHSTATE_ENCRYPTION_ENABLED: z.stringbool().default(true),\n})\n\nexport interface DatabaseManager {\n /**\n * The backend database instance.\n */\n readonly backend: BackendDatabase\n\n /**\n * Whether the encryption is enabled for the backend and project databases.\n */\n readonly isEncryptionEnabled: boolean\n\n /**\n * Re-encrypts the backend master key so it can be decrypted by the provided recipients.\n *\n * @param recipients AGE recipients that must be able to decrypt the backend master key.\n */\n updateBackendUnlockRecipients(recipients: string[]): Promise<void>\n\n /**\n * Returns the master key of the project with the given ID.\n *\n * If the project does not exist or is not unlocked, this will throw an error.\n *\n * Returns `undefined` if the encryption is not enabled.\n *\n * @param projectId The ID of the project to get the master key for.\n * @returns A Promise that resolves to the master key of the project as a Uint8Array.\n */\n getProjectMasterKey(projectId: string): Promise<Buffer | undefined>\n\n /**\n * Sets up the database for the project with the given ID.\n *\n * Assumes that no database exists yet.\n *\n * The project must be unlocked before calling this method.\n *\n * @param projectId The ID of the project to set up the database for.\n */\n setupDatabase(projectId: string): Promise<ProjectDatabase>\n\n /**\n * Returns the database client for the project with the given ID.\n *\n * Automatically migrates the project database if necessary.\n *\n * If the project does not exist or not unlocked, this will throw an error.\n *\n * @param projectId The ID of the project to get the database client for.\n */\n forProject(projectId: string): Promise<ProjectDatabase>\n}\n\nexport class DatabaseManagerImpl implements DatabaseManager {\n constructor(\n private readonly backendBackend: BackendDatabaseBackend,\n private readonly projectUnlockBackend: ProjectUnlockBackend,\n private readonly projectDatabaseBackend: ProjectDatabaseBackend,\n private readonly config: z.infer<typeof databaseManagerConfig>,\n private readonly logger: Logger,\n ) {}\n\n get backend(): BackendDatabase {\n return this.backendBackend.database\n }\n\n // store the master keys in memory cache for 30 seconds\n private readonly projectMasterKeys = new LRUCache<string, Buffer>({\n ttl: 30_000,\n ttlAutopurge: true,\n })\n\n // TODO: auto unload project databases after some time\n private readonly projectDatabases = new Map<string, ProjectDatabase>()\n\n get isEncryptionEnabled(): boolean {\n return this.config.HIGHSTATE_ENCRYPTION_ENABLED\n }\n\n /**\n * Delegates backend master-key rotation to the active backend database backend.\n *\n * @param recipients AGE recipients that must retain access to the backend master key.\n */\n async updateBackendUnlockRecipients(recipients: string[]): Promise<void> {\n if (!this.backendBackend.isEncryptionEnabled) {\n return\n }\n\n await this.backendBackend.reencryptMasterKey(recipients)\n }\n\n async getProjectMasterKey(projectId: string): Promise<Buffer | undefined> {\n if (!this.isEncryptionEnabled) {\n return undefined\n }\n\n const cachedInfo = this.projectMasterKeys.get(projectId)\n if (cachedInfo) {\n return cachedInfo\n }\n\n const masterKey = await this.projectUnlockBackend.getProjectMasterKey(projectId)\n if (!masterKey) {\n throw new ProjectLockedError(projectId)\n }\n\n this.projectMasterKeys.set(projectId, masterKey)\n return masterKey\n }\n\n async setupDatabase(projectId: string): Promise<ProjectDatabase> {\n const logger = createProjectLogger(this.logger, projectId)\n const masterKey = await this.getProjectMasterKey(projectId)\n const hexMasterKey = masterKey?.toString(\"hex\")\n\n const database = await this.projectDatabaseBackend.openProjectDatabase(projectId, hexMasterKey)\n\n // can safely apply migrations here, because no one knows about the database yet\n await migrateDatabase(\n database,\n migrationPacks.project,\n 0, // current version\n () => Promise.resolve(), // project will be created later\n logger,\n )\n\n this.projectDatabases.set(projectId, database)\n\n return database\n }\n\n async forProject(projectId: string): Promise<ProjectDatabase> {\n const cachedDatabase = this.projectDatabases.get(projectId)\n if (cachedDatabase) {\n return cachedDatabase\n }\n\n const logger = createProjectLogger(this.logger, projectId)\n const masterKey = await this.getProjectMasterKey(projectId)\n const hexMasterKey = masterKey?.toString(\"hex\")\n\n // TODO: is it really necessary to migrate the database inside the transaction?\n let database = await this.backend.$transaction(async tx => {\n const project = await tx.project.findUnique({\n where: { id: projectId },\n select: { databaseVersion: true },\n })\n\n if (!project) {\n throw new ProjectNotFoundError(projectId)\n }\n\n const database = await this.projectDatabaseBackend.openProjectDatabase(\n projectId,\n hexMasterKey,\n )\n\n await migrateDatabase(\n database,\n migrationPacks.project,\n project.databaseVersion,\n async version => {\n await tx.project.update({\n where: { id: projectId },\n data: { databaseVersion: version },\n })\n },\n logger,\n )\n\n return database\n })\n\n if (!database) {\n // open database if was not migrated in the transaction\n const _database = await this.projectDatabaseBackend.openProjectDatabase(\n projectId,\n hexMasterKey,\n )\n\n database = _database\n }\n\n this.projectDatabases.set(projectId, database)\n\n return database\n }\n}\n","import type { Logger } from \"pino\"\nimport type { BackendDatabaseBackend, ProjectDatabaseBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport {\n createLocalBackendDatabaseBackend,\n LocalProjectDatabaseBackend,\n localBackendDatabaseConfig,\n} from \"./local\"\nimport { databaseManagerConfig } from \"./manager\"\n\nexport const databaseConfig = z.object({\n HIGHSTATE_BACKEND_DATABASE_TYPE: z.enum([\"local\"]).default(\"local\"),\n HIGHSTATE_PROJECT_DATABASE_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localBackendDatabaseConfig.shape,\n ...databaseManagerConfig.shape,\n})\n\nexport function createBackendDatabaseBackend(\n config: z.infer<typeof databaseConfig>,\n logger: Logger,\n): Promise<BackendDatabaseBackend> {\n switch (config.HIGHSTATE_BACKEND_DATABASE_TYPE) {\n case \"local\":\n return createLocalBackendDatabaseBackend(config, logger)\n }\n}\n\nexport function createProjectDatabaseBackend(\n config: z.infer<typeof databaseConfig>,\n logger: Logger,\n): Promise<ProjectDatabaseBackend> {\n switch (config.HIGHSTATE_PROJECT_DATABASE_TYPE) {\n case \"local\":\n return LocalProjectDatabaseBackend.create(config, logger)\n }\n}\n","import type {\n ComponentKind,\n UnitPage,\n UnitTerminal,\n UnitTrigger,\n UnitWorker,\n} from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type { ArtifactService } from \"../artifact\"\nimport type { SecretService, UnitExtraService, WorkerService } from \"../business\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { RunnerBackend } from \"../runner\"\nimport { type InstanceId, parseInstanceId } from \"@highstate/contract\"\nimport { isNonNullish, omit } from \"remeda\"\nimport {\n type DatabaseManager,\n DbNull,\n type InstanceOperationStateCreateManyInput,\n type InstanceOperationStateUpdateInput,\n type InstanceStateInclude,\n type InstanceStateUpdateInput,\n type ProjectTransaction,\n} from \"../database\"\nimport {\n forSchema,\n type InstanceCustomStatusInput,\n InstanceLockedError,\n type InstanceOperationState,\n type InstanceState,\n InstanceStateNotFoundError,\n ProjectNotFoundError,\n projectOutputSchema,\n waitAll,\n} from \"../shared\"\n\nexport type GetProjectInstancesOptions = {\n /**\n * Whether to include evaluation states in the result.\n *\n * By default, this is false.\n */\n includeEvaluationState?: boolean\n\n /**\n * Include last operation state in the result.\n *\n * By default, this is false.\n */\n includeLastOperationState?: boolean\n\n /**\n * Include the instance ID of the parent instance in the result.\n *\n * By default, this is false.\n */\n includeParentInstanceId?: boolean\n\n /**\n * Whether to include `terminalIds` and `pageIds` in the result.\n *\n * By default, this is false.\n */\n includeExtra?: boolean\n\n /**\n * Whether to load custom statuses for each instance.\n *\n * By default, this is false.\n */\n loadCustomStatuses?: boolean\n}\n\nexport type ForgetInstanceStateOptions = {\n /**\n * Whether to delete terminals and their sessions associated with the instance.\n *\n * If `false`, the terminals will be marked as deleted and no new sessions will be allowed to be created,\n * but existing sessions will remain to provide history and logs.\n *\n * By default, this is false.\n */\n clearTerminalData?: boolean\n\n /**\n * Whether to delete the secrets associated with the instance.\n *\n * By default, this is false.\n */\n deleteSecrets?: boolean\n}\n\nexport type InstanceStatePatch = Pick<\n Partial<InstanceState>,\n | \"status\"\n | \"statusFields\"\n | \"parentId\"\n | \"lastOperationState\"\n | \"selfHash\"\n | \"inputHash\"\n | \"outputHash\"\n | \"dependencyOutputHash\"\n | \"model\"\n | \"resolvedInputs\"\n | \"currentResourceCount\"\n | \"exportedArtifactIds\"\n>\n\nexport type UpdateOperationStateOptions = {\n /**\n * The operation state to update.\n */\n operationState: InstanceOperationStateUpdateInput\n\n /**\n * Instance state patch to update or function to compute patch from current state.\n */\n instanceState?: InstanceStatePatch\n\n /**\n * Unit-specific extra data to update.\n */\n unitExtra?: {\n /**\n * Unit pages to update.\n */\n pages: UnitPage[]\n\n /**\n * Unit terminals to update.\n */\n terminals: UnitTerminal[]\n\n /**\n * Unit triggers to update.\n */\n triggers: UnitTrigger[]\n\n /**\n * Unit workers to update.\n */\n workers: UnitWorker[]\n\n /**\n * Unit secrets to update.\n */\n secrets: Record<string, unknown>\n\n /**\n * Artifact IDs that should remain linked to the instance.\n *\n * Any existing instance artifacts not listed here will be disconnected.\n */\n artifactIds?: string[]\n }\n}\n\nexport function includeForInstanceState(\n options: GetProjectInstancesOptions = {},\n): InstanceStateInclude {\n return {\n secrets: {\n select: { name: true },\n },\n\n parent: options.includeParentInstanceId ? { select: { instanceId: true } } : undefined,\n\n operationStates: options.includeLastOperationState\n ? { take: 1, orderBy: { startedAt: \"desc\" } }\n : undefined,\n\n evaluationState: options.includeEvaluationState,\n\n terminals: options.includeExtra ? { select: { id: true } } : undefined,\n pages: options.includeExtra ? { select: { id: true } } : undefined,\n\n customStatuses: options.loadCustomStatuses\n ? {\n orderBy: [{ order: \"asc\" }, { createdAt: \"asc\" }],\n }\n : undefined,\n }\n}\n\nexport function mapInstanceStateResult(\n instance: InstanceState & {\n secrets: { name: string | null }[]\n parent?: { instanceId: InstanceId } | null\n operationStates?: InstanceOperationState[]\n terminals?: { id: string }[]\n pages?: { id: string }[]\n customStatuses: InstanceState[\"customStatuses\"]\n },\n): InstanceState {\n return {\n ...omit(instance, [\n \"secrets\",\n \"parent\",\n \"operationStates\",\n \"terminals\",\n \"pages\",\n \"customStatuses\",\n ]),\n\n secretNames: instance.secrets.map(secret => secret.name).filter(isNonNullish),\n parentInstanceId: instance.parent ? (instance.parent?.instanceId ?? null) : undefined,\n lastOperationState: instance.operationStates?.[0],\n evaluationState: instance.evaluationState ?? undefined,\n terminalIds: instance.terminals ? instance.terminals.map(terminal => terminal.id) : undefined,\n pageIds: instance.pages ? instance.pages.map(page => page.id) : undefined,\n customStatuses: instance.customStatuses ?? undefined,\n }\n}\n\nexport class InstanceStateService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly pubsubManager: PubSubManager,\n private readonly runnerBackend: RunnerBackend,\n private readonly workerService: WorkerService,\n private readonly artifactService: ArtifactService,\n private readonly unitExtraService: UnitExtraService,\n private readonly secretService: SecretService,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Gets the aggregates of all instances in the project.\n *\n * @param projectId The ID of the project for which to retrieve instances.\n * @param options Options to customize the retrieval of instances.\n */\n async getInstanceStates(\n projectId: string,\n options: GetProjectInstancesOptions = {},\n ): Promise<InstanceState[]> {\n const database = await this.database.forProject(projectId)\n\n // load instance states from the database\n const queryResult = await database.instanceState.findMany({\n include: includeForInstanceState(options),\n })\n\n // aggregate the results from the database\n return queryResult.map(mapInstanceStateResult)\n }\n\n /**\n * Marks an instance state as deleted and cleans up associated resources.\n *\n * This operation:\n * - only allows deletion of instances with operation state null or \"destroyed\";\n * - prevents deletion of instances that have active locks;\n * - marks the instance state as \"deleted\" (never actually removes the record);\n * - handles terminals: deletes data if requested, otherwise marks as \"unavailable\";\n * - handles secrets: deletes if requested, otherwise ignores them;\n * - deletes artifact references for the instance;\n * - recursively handles child instances using parentId relationship;\n * - performs worker cleanup and synchronization;\n * - performs artifact garbage collection.\n *\n * @param projectId The ID of the project containing the instance.\n * @param instanceId The ID of the instance whose state is to be marked as deleted.\n * @param options Configuration options for terminal and secret handling.\n */\n async forgetInstanceState(\n projectId: string,\n instanceId: InstanceId,\n { deleteSecrets = false, clearTerminalData = false }: ForgetInstanceStateOptions = {},\n ): Promise<void> {\n await this.forgetInstanceStates(projectId, [instanceId], {\n deleteSecrets,\n clearTerminalData,\n })\n }\n\n /**\n * Forgets states for multiple instances in a single transaction.\n *\n * The transaction ensures the operation is all-or-nothing.\n * Side effects are still performed after commit.\n *\n * @param projectId The ID of the project containing the instances.\n * @param instanceIds The IDs of the instances whose states are to be forgotten.\n * @param options Configuration options for terminal and secret handling.\n */\n async forgetInstanceStates(\n projectId: string,\n instanceIds: InstanceId[],\n { deleteSecrets = false, clearTerminalData = false }: ForgetInstanceStateOptions = {},\n ): Promise<void> {\n if (instanceIds.length === 0) {\n return\n }\n\n const database = await this.database.forProject(projectId)\n const project = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: forSchema(projectOutputSchema),\n })\n\n if (!project) {\n throw new ProjectNotFoundError(projectId)\n }\n\n const uniqueInstanceIds = Array.from(new Set(instanceIds))\n\n // collect instances to process cleanup after transaction\n const unitInstancesToCleanup: { id: string; instanceId: InstanceId }[] = []\n const updatedStateIds: string[] = []\n\n await database.$transaction(async tx => {\n for (const instanceId of uniqueInstanceIds) {\n const state = await tx.instanceState.findUnique({\n where: { instanceId },\n select: {\n id: true,\n kind: true,\n instanceId: true,\n lock: { select: { stateId: true } },\n },\n })\n\n if (!state) {\n throw new InstanceStateNotFoundError(projectId, instanceId)\n }\n\n if (state.lock) {\n throw new InstanceLockedError(projectId, instanceId)\n }\n\n await this.processInstanceDeletion(\n tx,\n projectId,\n state,\n { deleteSecrets, clearTerminalData },\n unitInstancesToCleanup,\n updatedStateIds,\n )\n }\n })\n\n const uniqueUpdatedStateIds = Array.from(new Set(updatedStateIds))\n const uniqueUnitInstancesToCleanup = Array.from(\n new Map(unitInstancesToCleanup.map(item => [item.id, item])).values(),\n )\n\n // publish state events for all updated instances\n for (const updatedStateId of uniqueUpdatedStateIds) {\n void this.pubsubManager.publish([\"instance-state\", projectId], {\n type: \"patched\",\n stateId: updatedStateId,\n patch: {\n status: \"undeployed\",\n statusFields: null,\n selfHash: null,\n inputHash: null,\n outputHash: null,\n dependencyOutputHash: null,\n currentResourceCount: null,\n model: null,\n resolvedInputs: null,\n secretNames: deleteSecrets ? [] : undefined,\n terminalIds: clearTerminalData ? [] : undefined,\n pageIds: [],\n customStatuses: [],\n triggerIds: [],\n evaluationState: null,\n },\n })\n }\n\n // process side effects\n try {\n await waitAll([\n this.workerService.cleanupWorkerUsageAndSync(projectId),\n this.artifactService.collectGarbage(projectId),\n ...uniqueUnitInstancesToCleanup.map(async ({ id, instanceId }) => {\n const [instanceType, instanceName] = parseInstanceId(instanceId)\n\n await this.runnerBackend.deleteState({\n projectId: project.id,\n stateId: id,\n libraryId: project.libraryId,\n instanceName,\n instanceType,\n })\n }),\n ])\n } catch (error) {\n this.logger.warn(\n { error, projectId, instanceIds: uniqueInstanceIds },\n \"failed to perform side effects after forgetting instance state\",\n )\n }\n }\n\n /**\n * Processes the deletion of an instance within a transaction.\n * Handles validation, deletion logic, and recursive child deletion.\n */\n private async processInstanceDeletion(\n tx: ProjectTransaction,\n projectId: string,\n state: { id: string; kind: ComponentKind; instanceId: InstanceId },\n options: ForgetInstanceStateOptions,\n unitInstancesToCleanup: { id: string; instanceId: InstanceId }[],\n updatedStateIds: string[],\n ): Promise<void> {\n const { deleteSecrets = false, clearTerminalData = false } = options\n\n // always mark instance state as undeployed (never actually delete the record)\n await tx.instanceState.update({\n where: { id: state.id },\n data: {\n status: \"undeployed\",\n statusFields: DbNull,\n selfHash: null,\n inputHash: null,\n outputHash: null,\n dependencyOutputHash: null,\n currentResourceCount: null,\n model: DbNull,\n resolvedInputs: DbNull,\n },\n })\n\n // handle terminals\n if (clearTerminalData) {\n await tx.terminal.deleteMany({ where: { stateId: state.id } })\n } else {\n await tx.terminal.updateMany({\n where: { stateId: state.id },\n data: { status: \"unavailable\" },\n })\n }\n\n // handle secrets\n if (deleteSecrets) {\n await tx.secret.deleteMany({\n where: { stateId: state.id },\n })\n }\n\n // delete custom statuses for this instance\n await tx.instanceCustomStatus.deleteMany({\n where: { stateId: state.id },\n })\n\n // delete other related resources\n await tx.page.deleteMany({ where: { stateId: state.id } })\n await tx.trigger.deleteMany({ where: { stateId: state.id } })\n\n // remove artifact references for this instance\n await tx.instanceState.update({\n where: { id: state.id },\n data: {\n artifacts: {\n set: [],\n },\n },\n })\n\n // collect unit instances for Pulumi cleanup (to be done outside transaction)\n if (state.kind === \"unit\") {\n unitInstancesToCleanup.push({ id: state.id, instanceId: state.instanceId })\n }\n\n // track this instance as updated\n updatedStateIds.push(state.id)\n\n this.logger.info({ projectId }, `marked state \"%s\" as undeployed`, state.id)\n\n // recursively handle child instances using parentId\n if (state.kind === \"composite\") {\n const childStates = await tx.instanceState.findMany({\n where: {\n parentId: state.id,\n status: { not: \"undeployed\" }, // don't process undeployed children\n },\n select: {\n id: true,\n kind: true,\n instanceId: true,\n },\n })\n\n // recursively delete child states (within the same transaction)\n for (const child of childStates) {\n await this.processInstanceDeletion(\n tx,\n projectId,\n child,\n options,\n unitInstancesToCleanup,\n updatedStateIds,\n )\n }\n }\n }\n\n public publishGhostInstanceDeletion(projectId: string, instanceIds: Iterable<InstanceId>): void {\n const ids = Array.from(instanceIds)\n if (ids.length === 0) {\n return\n }\n\n void this.pubsubManager.publish([\"project-model\", projectId], {\n deletedGhostInstanceIds: ids,\n })\n }\n\n /**\n * Replaces or adds a custom status for an instance in a project.\n *\n * @param projectId The ID of the project containing the instance.\n * @param serviceAccoundtId The ID of the service account owning the instance.\n * @param stateId The ID of the instance state to update.\n * @param status The custom status to replace or add.\n */\n async updateCustomStatus(\n projectId: string,\n stateId: string,\n serviceAccountId: string,\n status: InstanceCustomStatusInput,\n ): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n const customStatuses = await database.$transaction(async tx => {\n await tx.instanceCustomStatus.upsert({\n where: {\n stateId_serviceAccountId_name: {\n stateId,\n serviceAccountId,\n name: status.name,\n },\n },\n create: {\n stateId: stateId,\n serviceAccountId,\n name: status.name,\n meta: status.meta,\n value: status.value,\n message: status.message ?? null,\n order: status.order ?? 50,\n },\n update: {\n meta: status.meta,\n value: status.value,\n message: status.message ?? null,\n order: status.order ?? 50,\n },\n })\n\n return await tx.instanceCustomStatus.findMany({\n where: { stateId, serviceAccountId },\n orderBy: [{ order: \"asc\" }, { createdAt: \"asc\" }],\n })\n })\n\n void this.pubsubManager.publish([\"instance-state\", projectId], {\n type: \"patched\",\n stateId,\n patch: { customStatuses },\n })\n }\n\n /**\n * Removes a custom status from an instance in a project.\n *\n * @param projectId The ID of the project containing the instance.\n * @param stateId The ID of the instance state to update.\n * @param serviceAccountId The ID of the service account owning the instance.\n * @param statusName The name of the custom status to remove.\n */\n async removeCustomStatus(\n projectId: string,\n stateId: string,\n serviceAccountId: string,\n statusName: string,\n ): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n const customStatuses = await database.$transaction(async tx => {\n await tx.instanceCustomStatus.deleteMany({\n where: {\n stateId,\n serviceAccountId,\n name: statusName,\n },\n })\n\n return await tx.instanceCustomStatus.findMany({\n where: { stateId, serviceAccountId },\n orderBy: [{ order: \"asc\" }, { createdAt: \"asc\" }],\n })\n })\n\n void this.pubsubManager.publish([\"instance-state\", projectId], {\n type: \"patched\",\n stateId,\n patch: { customStatuses },\n })\n }\n\n /**\n * Creates the provided operation states.\n * Also updates the instance state if provided.\n *\n * @param projectId The ID of the project containing the instances.\n * @param operationStates The tuples of operation state data to create and instance state patch to apply.\n */\n async createOperationStates(\n projectId: string,\n operationStates: [\n opState: InstanceOperationStateCreateManyInput,\n instanceState: InstanceStatePatch,\n ][],\n ): Promise<Partial<InstanceState>[]> {\n const database = await this.database.forProject(projectId)\n\n const patches = await database.$transaction(async tx => {\n return await Promise.all(\n operationStates.map(async ([opState, instanceState]) => {\n const operationState = await tx.instanceOperationState.create({\n data: opState,\n })\n\n const state = await tx.instanceState.update({\n where: { id: opState.stateId },\n data: instanceState as InstanceStateUpdateInput,\n })\n\n return { ...state, lastOperationState: operationState }\n }),\n )\n })\n\n // publish patches after transaction\n for (const patch of patches) {\n void this.pubsubManager.publish([\"instance-state\", projectId], {\n type: \"patched\",\n stateId: patch.id,\n patch,\n })\n }\n\n return patches\n }\n\n /**\n * Updates the operation state and instance state for a specific instance.\n *\n * @param projectId The ID of the project containing the instance.\n * @param stateId The ID of the instance state to update.\n * @param operationId The ID of the operation (required if operationState is provided).\n * @param options Update options containing operation state, instance state, and unit-specific data.\n * @return The instance state patch containing the updated operation state and instance state fields.\n */\n async updateOperationState(\n projectId: string,\n stateId: string,\n operationId: string,\n options: UpdateOperationStateOptions,\n ): Promise<Partial<InstanceState>> {\n const { operationState, instanceState, unitExtra } = options\n const database = await this.database.forProject(projectId)\n\n const result = await database.$transaction(async tx => {\n let unitExtraData = null\n\n // update operation state\n const updatedOperationState = await tx.instanceOperationState.update({\n where: {\n operationId_stateId: {\n operationId,\n stateId,\n },\n },\n data: operationState,\n })\n\n const project = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: { libraryId: true },\n })\n\n if (!project) {\n throw new ProjectNotFoundError(projectId)\n }\n\n // update unit-specific data if provided\n if (unitExtra) {\n const [pageIds, terminalIds, triggerIds, secretNames] = await Promise.all([\n this.unitExtraService.processUnitPages(tx, stateId, unitExtra.pages),\n this.unitExtraService.processUnitTerminals(tx, stateId, unitExtra.terminals),\n this.unitExtraService.processUnitTriggers(tx, stateId, unitExtra.triggers),\n this.secretService.updateInstanceSecretsCore(\n tx,\n project.libraryId,\n stateId,\n unitExtra.secrets,\n ),\n this.workerService.updateUnitRegistrations(tx, projectId, stateId, unitExtra.workers),\n ])\n\n unitExtraData = { pageIds, terminalIds, triggerIds, secretNames }\n\n if (unitExtra.artifactIds !== undefined) {\n await this.unitExtraService.pruneInstanceArtifacts(tx, stateId, unitExtra.artifactIds)\n }\n }\n\n // update instance state if provided\n if (instanceState) {\n await tx.instanceState.update({\n where: { id: stateId },\n data: instanceState as InstanceStateUpdateInput,\n })\n }\n\n return { updatedOperationState, unitExtraData }\n })\n\n if (options.unitExtra?.artifactIds !== undefined) {\n await this.artifactService.collectGarbage(projectId)\n }\n\n // build patch combining operation state, instance state, and unit extra data\n const patch: Partial<InstanceState> = {\n ...instanceState,\n ...result.unitExtraData,\n lastOperationState: result.updatedOperationState,\n }\n\n // emit the patch after transaction\n void this.pubsubManager.publish([\"instance-state\", projectId], {\n type: \"patched\",\n stateId,\n patch,\n })\n\n this.logger.debug(\n { projectId, stateId, operationId, options },\n \"updated operation state for instance\",\n )\n\n return patch\n }\n}\n","import type { InstanceId } from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type { DatabaseManager, Operation, OperationStatus, OperationUpdateInput } from \"../database\"\nimport type { PubSubManager } from \"../pubsub\"\nimport { ulid } from \"ulid\"\nimport {\n type OperationMeta,\n OperationNotFoundError,\n type OperationOptions,\n type OperationType,\n} from \"../shared\"\n\nexport class OperationService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Creates a new operation in the database.\n *\n * @param projectId The project ID to which the operation belongs.\n * @param meta The operation metadata.\n * @param type The operation type.\n * @param requestedInstanceIds The instance IDs that were explicitly requested.\n * @param options The operation options.\n * @returns The created operation.\n */\n async createOperation(\n projectId: string,\n meta: OperationMeta,\n type: OperationType,\n requestedInstanceIds: InstanceId[],\n options: OperationOptions,\n ): Promise<Operation> {\n const database = await this.database.forProject(projectId)\n\n const operation = await database.operation.create({\n data: {\n meta,\n type,\n options,\n requestedInstanceIds,\n startedAt: new Date(),\n },\n })\n\n await this.pubsubManager.publish([\"operation\", projectId], {\n type: \"updated\",\n operation,\n })\n\n this.logger.info({ projectId, operationId: operation.id }, \"created operation\")\n return operation\n }\n\n /**\n * Updates an existing operation in the database.\n *\n * @param projectId The project ID containing the operation.\n * @param operationId The operation ID to update.\n * @param updates The updates to apply.\n * @returns The updated operation.\n */\n async updateOperation(\n projectId: string,\n operationId: string,\n updates: OperationUpdateInput,\n ): Promise<Operation> {\n const database = await this.database.forProject(projectId)\n\n const operation = await database.operation.update({\n where: { id: operationId },\n data: updates,\n })\n\n await this.pubsubManager.publish([\"operation\", projectId], {\n type: \"updated\",\n operation,\n })\n\n this.logger.info({ projectId, operationId }, \"updated operation\")\n return operation\n }\n\n /**\n * Gets an operation by ID.\n *\n * @param projectId The project ID containing the operation.\n * @param operationId The operation ID.\n * @returns The operation or undefined if not found.\n */\n async getOperation(projectId: string, operationId: string): Promise<Operation | undefined> {\n const database = await this.database.forProject(projectId)\n\n const operation = await database.operation.findUnique({\n where: { id: operationId },\n })\n\n return operation ?? undefined\n }\n\n /**\n * Gets all operations for a project.\n *\n * @param projectId The project ID.\n * @param limit Optional limit on number of operations to return.\n * @returns Array of operations.\n */\n async getOperations(projectId: string, limit?: number): Promise<Operation[]> {\n const database = await this.database.forProject(projectId)\n\n return await database.operation.findMany({\n orderBy: { startedAt: \"desc\" },\n take: limit,\n })\n }\n\n /**\n * Appends log for a specific operation.\n *\n * @param projectId The ID of the project to persist the log for.\n * @param operationId The ID of the operation to persist the log for.\n * @param stateId The ID of the instance state that produced the log (optional).\n * @param content The log content to append.\n */\n async appendLog(\n projectId: string,\n operationId: string,\n stateId: string | null,\n content: string,\n ): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n // verify operation exists\n const operation = await database.operation.findUnique({\n where: { id: operationId },\n select: { id: true, finishedAt: true },\n })\n\n if (!operation) {\n throw new OperationNotFoundError(projectId, operationId)\n }\n\n // store logs in database\n const entry = await database.operationLog.create({\n data: {\n id: ulid(),\n operationId,\n stateId,\n content,\n },\n })\n\n // publish logs via pubsub - only for logs with stateId (not system logs)\n if (stateId) {\n await this.pubsubManager.publish([\"operation-instance-log\", operationId, stateId], entry)\n }\n }\n\n /**\n * Retrieves logs for a specific operation and optionally an instance.\n *\n * @param projectId The ID of the project to retrieve logs for.\n * @param operationId The ID of the operation to retrieve logs for.\n * @param stateId Optional instance state ID to filter logs.\n * @returns Array of log entries.\n */\n async getOperationLogs(\n projectId: string,\n operationId: string,\n stateId?: string,\n ): Promise<Array<{ id: string; stateId: string | null; content: string }>> {\n const database = await this.database.forProject(projectId)\n\n const logs = await database.operationLog.findMany({\n where: {\n operationId,\n ...(stateId ? { stateId } : {}),\n },\n orderBy: { id: \"asc\" },\n select: {\n id: true,\n stateId: true,\n content: true,\n },\n })\n\n return logs\n }\n\n /**\n * Marks an operation as finished with given status.\n *\n * @param projectId The project ID containing the operation.\n * @param operationId The operation ID to complete.\n * @returns The updated operation.\n */\n async markOperationFinished(\n projectId: string,\n operationId: string,\n status: OperationStatus,\n ): Promise<Operation> {\n const result = await this.updateOperation(projectId, operationId, {\n status,\n finishedAt: new Date(),\n })\n\n this.logger.info(\n { projectId, operationId, status },\n `marked operation as finished with status \"${status}\"`,\n )\n\n return result\n }\n}\n","import type { InstanceId, InstanceModel } from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type { LibraryBackend } from \"../library\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { ProjectModelService } from \"./project-model\"\nimport type { ProjectUnlockService } from \"./project-unlock\"\nimport { isNonNullish } from \"remeda\"\nimport { renderTree, type TreeNode } from \"../common\"\nimport {\n type DatabaseManager,\n DbNull,\n type InstanceEvaluationStateUncheckedCreateInput,\n type InstanceEvaluationStateUpdateInput,\n type InstanceStatus,\n} from \"../database\"\n\ntype EvaluatedInstance = {\n instanceId: InstanceId\n status: \"evaluated\" | \"error\"\n message?: string\n model?: InstanceModel | null\n}\n\nexport class ProjectEvaluationSubsystem {\n private readonly projectWatchers = new Map<string, AbortController>()\n\n constructor(\n private readonly database: DatabaseManager,\n private readonly libraryBackend: LibraryBackend,\n private readonly projectModelService: ProjectModelService,\n private readonly pubsubManager: PubSubManager,\n private readonly projectUnlockService: ProjectUnlockService,\n private readonly logger: Logger,\n ) {\n this.projectUnlockService.registerUnlockTask(\n \"evaluate-project\",\n //\n projectId => this.evaluateProject(projectId),\n )\n\n this.projectUnlockService.registerUnlockTask(\n //\n \"track-unlocked-project\",\n projectId => this.trackUnlockedProject(projectId),\n )\n }\n\n async evaluateProject(projectId: string): Promise<void> {\n const { project, instances, resolvedInputs } =\n await this.projectModelService.resolveProject(projectId)\n\n const instancesMap = new Map<string, InstanceModel>()\n for (const instance of instances) {\n instancesMap.set(instance.id, instance)\n }\n\n const compositeInstanceIds = instances\n .filter(instance => instance.kind === \"composite\")\n .map(instance => instance.id)\n\n try {\n const result = await this.libraryBackend.evaluateCompositeInstances(\n project.libraryId,\n instances,\n resolvedInputs,\n )\n\n if (result.success) {\n // create evaluation tree for success messages\n const treeNodes = ProjectEvaluationSubsystem.createEvaluatedInstanceTree(\n result.virtualInstances,\n )\n\n // store evaluation states for virtual instances\n const evaluatedInstances: EvaluatedInstance[] = result.virtualInstances.map(instance => ({\n instanceId: instance.id as InstanceId,\n status: \"evaluated\",\n message: ProjectEvaluationSubsystem.renderEvaluationMessage(treeNodes, instance.id),\n model: instance,\n }))\n\n const errorEvaluatedInstances: EvaluatedInstance[] = Object.entries(\n result.topLevelErrors,\n ).map(([instanceId, message]) => ({\n instanceId: instanceId as InstanceId,\n status: \"error\",\n message,\n model: null,\n }))\n\n await this.setInstanceEvaluationStates(project.id, [\n ...evaluatedInstances,\n ...errorEvaluatedInstances,\n ])\n } else {\n // set all composite instances to error state in evaluation\n const errorEvaluationStates: EvaluatedInstance[] = compositeInstanceIds.map(instanceId => ({\n instanceId: instanceId as InstanceId,\n status: \"error\",\n message: result.error,\n model: instancesMap.get(instanceId) ?? null,\n }))\n\n await this.setInstanceEvaluationStates(project.id, errorEvaluationStates)\n }\n\n this.logger.info(\n { projectId: project.id, compositeInstanceIds },\n \"composite instances evaluation completed\",\n )\n } catch (error) {\n this.logger.error({ projectId: project.id, error }, \"failed to evaluate project\")\n\n // set all composite instances to internal error state\n const internalErrorStates: EvaluatedInstance[] = compositeInstanceIds.map(instanceId => ({\n instanceId: instanceId as InstanceId,\n status: \"error\",\n message: \"Internal error occurred during evaluation.\",\n model: instancesMap.get(instanceId) ?? null,\n }))\n\n await this.setInstanceEvaluationStates(project.id, internalErrorStates)\n }\n }\n\n /**\n * Sets the evaluation states for multiple instances in a project.\n *\n * @param projectId The ID of the project to update.\n * @param evaluatedInstances The evaluation states to set.\n */\n private async setInstanceEvaluationStates(\n projectId: string,\n evaluatedInstances: EvaluatedInstance[],\n ): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n const previousVirtualStates = await tx.instanceState.findMany({\n where: { source: \"virtual\" },\n select: {\n id: true,\n instanceId: true,\n status: true,\n model: true,\n evaluationState: { select: { stateId: true } },\n },\n })\n\n // 1. resolve instanceId -> stateId for all evaluated instances\n // also ensure that all states exist and has \"virtual\" source\n const instanceIdToStateMap = new Map<\n string,\n { id: string; status: InstanceStatus; model: InstanceModel | null }\n >()\n\n for (const instance of evaluatedInstances) {\n const state = await tx.instanceState.upsert({\n select: { id: true, status: true, model: true },\n where: { instanceId: instance.instanceId },\n create: {\n instanceId: instance.instanceId,\n kind: instance.model?.kind ?? \"unit\",\n source: \"virtual\",\n status: \"undeployed\",\n },\n update: {\n source: \"virtual\",\n },\n })\n\n instanceIdToStateMap.set(instance.instanceId, state)\n }\n\n // 2. convert EvaluatedInstance[] to InstanceEvaluationStateUncheckedCreateInput[]\n const states: InstanceEvaluationStateUncheckedCreateInput[] = evaluatedInstances.map(ei => {\n return {\n stateId: instanceIdToStateMap.get(ei.instanceId)!.id,\n status: ei.status,\n message: ei.message,\n model: ei.model ?? DbNull,\n }\n })\n\n // 3. persist the evaluation states\n const existingStates = await tx.instanceEvaluationState.findMany({\n select: {\n stateId: true,\n state: {\n select: {\n instanceId: true,\n source: true,\n },\n },\n },\n })\n\n const existingStateIds = new Set(existingStates.map(state => state.stateId))\n const actualStateIds = new Set(states.map(state => state.stateId))\n\n const newStates = states.filter(state => !existingStateIds.has(state.stateId))\n const statesToUpdate = states.filter(state => existingStateIds.has(state.stateId))\n const statesToDelete = existingStates.filter(state => !actualStateIds.has(state.stateId))\n\n // create new states\n await tx.instanceEvaluationState.createMany({ data: newStates })\n\n // update existing states\n const updatedStates = await Promise.all(\n statesToUpdate.map(state =>\n tx.instanceEvaluationState.update({\n where: { stateId: state.stateId },\n data: state as InstanceEvaluationStateUpdateInput,\n }),\n ),\n )\n\n // delete states that are no longer present\n await tx.instanceEvaluationState.deleteMany({\n where: {\n stateId: {\n in: statesToDelete.map(state => state.stateId),\n },\n },\n })\n\n // 5. publish evaluation state updates\n for (const state of updatedStates) {\n void this.pubsubManager.publish([\"instance-state\", projectId], {\n type: \"patched\",\n stateId: state.stateId,\n patch: {\n evaluationState: state,\n },\n })\n }\n\n const currentVirtualStates = await tx.instanceState.findMany({\n where: { source: \"virtual\" },\n select: {\n id: true,\n instanceId: true,\n status: true,\n model: true,\n evaluationState: { select: { stateId: true } },\n },\n })\n\n const previousGhostStates = new Map(\n previousVirtualStates\n .filter(state => state.status !== \"undeployed\" && !state.evaluationState)\n .map(state => [state.id, state]),\n )\n\n const currentGhostStates = new Map(\n currentVirtualStates\n .filter(state => state.status !== \"undeployed\" && !state.evaluationState)\n .map(state => [state.id, state]),\n )\n\n const newGhostInstances: InstanceModel[] = []\n for (const [stateId, state] of currentGhostStates) {\n if (previousGhostStates.has(stateId)) {\n continue\n }\n\n if (state.model) {\n newGhostInstances.push(state.model as InstanceModel)\n }\n }\n\n const resolvedGhostInstanceIds: InstanceId[] = []\n for (const [stateId, state] of previousGhostStates) {\n if (!currentGhostStates.has(stateId)) {\n resolvedGhostInstanceIds.push(state.instanceId as InstanceId)\n }\n }\n\n // 6. publish project model update\n void this.pubsubManager.publish([\"project-model\", projectId], {\n updatedVirtualInstances: [...newStates, ...updatedStates]\n .map(state => state.model as InstanceModel)\n .filter(isNonNullish),\n\n deletedVirtualInstanceIds: statesToDelete.map(state => state.state.instanceId),\n\n updatedGhostInstances: newGhostInstances.filter(isNonNullish),\n\n deletedGhostInstanceIds: resolvedGhostInstanceIds,\n })\n })\n }\n\n private async trackUnlockedProject(projectId: string): Promise<void> {\n if (this.projectWatchers.has(projectId)) {\n this.logger.debug({ projectId }, \"project already being tracked, skipping\")\n return\n }\n\n try {\n const project = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: { id: true, libraryId: true },\n })\n\n if (!project) {\n this.logger.warn({ projectId }, \"project not found, cannot track\")\n return\n }\n\n const controller = new AbortController()\n\n this.projectWatchers.set(projectId, controller)\n this.logger.debug(\n { projectId, libraryId: project.libraryId },\n \"tracking unlocked project for library reload evaluations\",\n )\n\n void this.startProjectLibraryWatcher(projectId, project.libraryId, controller.signal)\n } catch (error) {\n this.logger.error({ projectId, error }, \"failed to start tracking project\")\n }\n }\n\n private async startProjectLibraryWatcher(\n projectId: string,\n libraryId: string,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n for await (const updates of this.libraryBackend.watchLibrary(libraryId, signal)) {\n // only handle reload-completed events\n if (updates.some(update => update.type === \"reload-completed\")) {\n await this.handleProjectLibraryReload(projectId)\n }\n }\n } catch (error) {\n this.logger.error({ projectId, libraryId, error }, \"project library reload watcher failed\")\n } finally {\n this.projectWatchers.delete(projectId)\n }\n }\n\n private async handleProjectLibraryReload(projectId: string): Promise<void> {\n this.logger.info({ projectId }, \"launching evaluation for project after library reload\")\n\n try {\n await this.evaluateProject(projectId)\n } catch (error) {\n this.logger.error({ projectId, error }, \"failed to evaluate project after library reload\")\n }\n }\n\n static createEvaluatedInstanceTree(virtualInstances: InstanceModel[]): Map<string, TreeNode> {\n const treeNodes = new Map<string, TreeNode>()\n\n for (const instance of virtualInstances) {\n const node: TreeNode = {\n text: instance.id,\n children: [],\n }\n\n treeNodes.set(instance.id, node)\n\n const parentNode = instance.parentId ? treeNodes.get(instance.parentId) : undefined\n\n if (parentNode) {\n parentNode.children.push(node)\n }\n }\n\n return treeNodes\n }\n\n static renderEvaluationMessage(treeNodes: Map<string, TreeNode>, rootNodeId: string): string {\n // get the root node\n const rootNode = treeNodes.get(rootNodeId)\n if (!rootNode) {\n return `Composite instance evaluation completed successfully, but failed to build the tree structure.`\n }\n\n // render the tree structure\n const tree = renderTree(rootNode)\n\n return `Composite instance evaluation completed successfully.\\n\\nInstance Tree:\\n${tree}`\n }\n}\n","import { BackendError } from \"../shared\"\n\n/**\n * Base error class for all project model related errors.\n */\nexport class ProjectModelError extends BackendError {\n constructor(message: string, cause?: unknown) {\n super(message, cause)\n this.name = \"ProjectModelError\"\n }\n}\n\n/**\n * Error thrown when a project model backend is not found for the given type.\n */\nexport class ProjectModelBackendNotFoundError extends ProjectModelError {\n constructor(backendType: string) {\n super(`Project model backend \"${backendType}\" not found`)\n this.name = \"ProjectModelBackendNotFoundError\"\n }\n}\n\n/**\n * Error thrown when a project model is not found.\n */\nexport class ProjectModelNotFoundError extends ProjectModelError {\n constructor(projectId: string) {\n super(`Project model not found for project \"${projectId}\"`)\n this.name = \"ProjectModelNotFoundError\"\n }\n}\n\n/**\n * Error thrown when an instance is not found in the project model.\n */\nexport class ProjectModelInstanceNotFoundError extends ProjectModelError {\n constructor(projectId: string, instanceId: string) {\n super(`Instance \"${instanceId}\" not found in project \"${projectId}\"`)\n this.name = \"ProjectModelInstanceNotFoundError\"\n }\n}\n\n/**\n * Error thrown when a hub is not found in the project model.\n */\nexport class ProjectModelHubNotFoundError extends ProjectModelError {\n constructor(projectId: string, hubId: string) {\n super(`Hub \"${hubId}\" not found in project \"${projectId}\"`)\n this.name = \"ProjectModelHubNotFoundError\"\n }\n}\n\n/**\n * Error thrown when attempting to create an instance that already exists.\n */\nexport class ProjectModelInstanceAlreadyExistsError extends ProjectModelError {\n constructor(projectId: string, instanceId: string) {\n super(`Instance \"${instanceId}\" already exists in project \"${projectId}\"`)\n this.name = \"ProjectModelInstanceAlreadyExistsError\"\n }\n}\n\n/**\n * Error thrown when attempting to create a hub that already exists.\n */\nexport class ProjectModelHubAlreadyExistsError extends ProjectModelError {\n constructor(projectId: string, hubId: string) {\n super(`Hub \"${hubId}\" already exists in project \"${projectId}\"`)\n this.name = \"ProjectModelHubAlreadyExistsError\"\n }\n}\n\n/**\n * Error thrown when a project model operation fails.\n */\nexport class ProjectModelOperationError extends ProjectModelError {\n constructor(operation: string, projectId: string, cause?: unknown) {\n super(`Failed to ${operation} for project \"${projectId}\"`, cause)\n this.name = \"ProjectModelOperationError\"\n }\n}\n","import type {\n HubInput,\n HubModel,\n HubModelPatch,\n InstanceId,\n InstanceInput,\n InstanceModel,\n InstanceModelPatch,\n} from \"@highstate/contract\"\n\n/**\n * Deletes all references to an instance from other instances' inputs.\n *\n * @param inputs The inputs record to clean up.\n * @param instanceId The instance ID to remove references to.\n */\nexport function deleteInstanceReferences(\n inputs: Record<string, InstanceInput[]>,\n instanceId: string,\n): void {\n for (const [inputKey, input] of Object.entries(inputs)) {\n inputs[inputKey] = input.filter(inputItem => inputItem.instanceId !== instanceId)\n\n if (inputs[inputKey].length === 0) {\n delete inputs[inputKey]\n }\n }\n}\n\n/**\n * Deletes all references to a hub from instance hub inputs.\n *\n * @param inputs The hub inputs record to clean up.\n * @param hubId The hub ID to remove references to.\n */\nexport function deleteHubReferences(inputs: Record<string, HubInput[]>, hubId: string): void {\n for (const [inputKey, input] of Object.entries(inputs)) {\n inputs[inputKey] = input.filter(inputItem => inputItem.hubId !== hubId)\n\n if (inputs[inputKey].length === 0) {\n delete inputs[inputKey]\n }\n }\n}\n\n/**\n * Updates all references to an instance with a new instance ID.\n *\n * @param inputs The inputs array to update.\n * @param oldInstanceId The old instance ID to replace.\n * @param newInstanceId The new instance ID to use.\n */\nexport function renameInstanceReferences(\n inputs: InstanceInput[],\n oldInstanceId: string,\n newInstanceId: InstanceId,\n): void {\n for (const input of inputs) {\n if (input.instanceId === oldInstanceId) {\n input.instanceId = newInstanceId\n }\n }\n}\n\n/**\n * Removes all references to a deleted instance from instances and hubs.\n *\n * @param instances The instances to clean up.\n * @param hubs The hubs to clean up.\n * @param instanceId The instance ID to remove references to.\n */\nexport function cleanupInstanceReferences(\n instances: Iterable<InstanceModel>,\n hubs: Iterable<HubModel>,\n instanceId: string,\n): void {\n // delete all inputs of instances that reference deleted instance\n for (const otherInstance of instances) {\n if (!otherInstance.inputs) {\n continue\n }\n\n deleteInstanceReferences(otherInstance.inputs, instanceId)\n\n if (Object.keys(otherInstance.inputs).length === 0) {\n delete otherInstance.inputs\n }\n }\n\n // delete all inputs of hubs that reference deleted instance\n for (const hub of hubs) {\n if (!hub.inputs) {\n continue\n }\n\n hub.inputs = hub.inputs.filter(input => input.instanceId !== instanceId)\n\n if (hub.inputs.length === 0) {\n delete hub.inputs\n }\n }\n}\n\n/**\n * Removes all references to a deleted hub from instances and hubs.\n *\n * @param instances The instances to clean up.\n * @param hubs The hubs to clean up.\n * @param hubId The hub ID to remove references to.\n */\nexport function cleanupHubReferences(\n instances: Iterable<InstanceModel>,\n hubs: Iterable<HubModel>,\n hubId: string,\n): void {\n // delete all inputs of instances that reference deleted hub\n for (const instance of instances) {\n if (instance.hubInputs) {\n deleteHubReferences(instance.hubInputs, hubId)\n\n if (Object.keys(instance.hubInputs).length === 0) {\n delete instance.hubInputs\n }\n }\n\n if (instance.injectionInputs) {\n instance.injectionInputs = instance.injectionInputs.filter(input => input.hubId !== hubId)\n\n if (instance.injectionInputs.length === 0) {\n delete instance.injectionInputs\n }\n }\n }\n\n // delete all inputs of hubs that reference deleted hub\n for (const otherHub of hubs) {\n if (!otherHub.injectionInputs) {\n continue\n }\n\n otherHub.injectionInputs = otherHub.injectionInputs.filter(input => input.hubId !== hubId)\n\n if (otherHub.injectionInputs.length === 0) {\n delete otherHub.injectionInputs\n }\n }\n}\n\n/**\n * Updates all references to a renamed instance in instances and hubs.\n *\n * @param instances The instances to update.\n * @param hubs The hubs to update.\n * @param oldInstanceId The old instance ID to replace.\n * @param newInstanceId The new instance ID to use.\n */\nexport function updateInstanceReferences(\n instances: Iterable<InstanceModel>,\n hubs: Iterable<HubModel>,\n oldInstanceId: string,\n newInstanceId: InstanceId,\n): void {\n // update all references to the instance from other instances\n for (const otherInstance of instances) {\n for (const inputs of Object.values(otherInstance.inputs ?? {})) {\n renameInstanceReferences(inputs, oldInstanceId, newInstanceId)\n }\n }\n\n // update all references to the instance from hubs\n for (const hub of hubs) {\n renameInstanceReferences(hub.inputs ?? [], oldInstanceId, newInstanceId)\n }\n}\n\n/**\n * Applies a patch to an instance model.\n *\n * @param instance The instance to patch.\n * @param patch The patch to apply.\n */\nexport function applyInstancePatch(instance: InstanceModel, patch: InstanceModelPatch): void {\n if (patch.args) {\n instance.args = patch.args\n }\n\n if (patch.position) {\n instance.position = patch.position\n }\n\n if (patch.inputs) {\n if (Object.keys(patch.inputs).length > 0) {\n instance.inputs = patch.inputs\n } else {\n delete instance.inputs\n }\n }\n\n if (patch.hubInputs) {\n if (Object.keys(patch.hubInputs).length > 0) {\n instance.hubInputs = patch.hubInputs\n } else {\n delete instance.hubInputs\n }\n }\n\n if (patch.injectionInputs) {\n if (patch.injectionInputs.length > 0) {\n instance.injectionInputs = patch.injectionInputs\n } else {\n delete instance.injectionInputs\n }\n }\n}\n\n/**\n * Applies a patch to a hub model.\n *\n * @param hub The hub to patch.\n * @param patch The patch to apply.\n */\nexport function applyHubPatch(hub: HubModel, patch: HubModelPatch): void {\n if (patch.position) {\n hub.position = patch.position\n }\n\n if (patch.inputs) {\n if (patch.inputs.length > 0) {\n hub.inputs = patch.inputs\n } else {\n delete hub.inputs\n }\n }\n\n if (patch.injectionInputs) {\n if (patch.injectionInputs.length > 0) {\n hub.injectionInputs = patch.injectionInputs\n } else {\n delete hub.injectionInputs\n }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { ProjectModel, ProjectModelStorageSpec, ProjectOutput } from \"../../shared\"\nimport type { ProjectModelBackend } from \"../abstractions\"\nimport { constants } from \"node:fs\"\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\"\nimport { resolve } from \"node:path\"\nimport {\n getInstanceId,\n type HubModel,\n type HubModelPatch,\n hubModelSchema,\n type InstanceModel,\n type InstanceModelPatch,\n instanceModelSchema,\n} from \"@highstate/contract\"\nimport { BetterLock } from \"better-lock\"\nimport { parse, stringify } from \"yaml\"\nimport { z } from \"zod\"\nimport { resolveMainLocalProject } from \"../../common\"\nimport {\n ProjectModelHubAlreadyExistsError,\n ProjectModelHubNotFoundError,\n ProjectModelInstanceAlreadyExistsError,\n ProjectModelInstanceNotFoundError,\n ProjectModelOperationError,\n} from \"../errors\"\nimport {\n applyHubPatch,\n applyInstancePatch,\n cleanupHubReferences,\n cleanupInstanceReferences,\n updateInstanceReferences,\n} from \"../utils\"\n\nconst codebaseProjectDataSchema = z.object({\n instances: z.record(z.string(), instanceModelSchema),\n hubs: z.record(z.string(), hubModelSchema),\n})\n\n/**\n * A project model backend that stores the project models locally on disk.\n *\n * By default, the project models are stored in the `projects` directory near the \"package.json\" file.\n */\nexport class CodebaseProjectModelBackend implements ProjectModelBackend {\n private readonly lock = new BetterLock()\n\n constructor(\n private readonly projectsDir: string,\n private readonly logger: Logger,\n ) {}\n\n async getProjectModel(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n ): Promise<ProjectModel> {\n assertCodebaseSpec(spec)\n\n try {\n const projectData = await this.loadProject(project.name)\n\n return {\n instances: Object.values(projectData.instances),\n hubs: Object.values(projectData.hubs),\n }\n } catch (error) {\n throw new ProjectModelOperationError(\"get project model\", project.id, error)\n }\n }\n\n async createProjectModel(project: ProjectOutput, spec: ProjectModelStorageSpec): Promise<void> {\n assertCodebaseSpec(spec)\n\n try {\n const projectPath = this.getProjectPath(project.name)\n\n // check if project file already exists\n try {\n await access(projectPath, constants.F_OK)\n throw new Error(`Project \"${project.name}\" already exists`)\n } catch (error) {\n // if access throws ENOENT, file doesn't exist (which is what we want)\n if (error instanceof Error && \"code\" in error && error.code !== \"ENOENT\") {\n throw error\n }\n }\n\n await this.withProject(project.name, () => {\n // create an empty project\n return { instances: {}, hubs: {} }\n })\n\n this.logger.info(\n { projectId: project.id, projectName: project.name },\n \"created project model\",\n )\n } catch (error) {\n throw new ProjectModelOperationError(\"create project model\", project.id, error)\n }\n }\n\n async updateInstance(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n instanceId: string,\n patch: InstanceModelPatch,\n ): Promise<InstanceModel> {\n assertCodebaseSpec(spec)\n\n try {\n return await this.withInstance(project.id, project.name, instanceId, instance => {\n applyInstancePatch(instance, patch)\n return instance\n })\n } catch (error) {\n throw new ProjectModelOperationError(\"update instance\", project.id, error)\n }\n }\n\n async deleteInstance(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n instanceId: string,\n ): Promise<void> {\n assertCodebaseSpec(spec)\n\n try {\n await this.withProject(project.name, projectData => {\n if (!projectData.instances[instanceId]) {\n throw new ProjectModelInstanceNotFoundError(project.id, instanceId)\n }\n\n delete projectData.instances[instanceId]\n\n cleanupInstanceReferences(\n Object.values(projectData.instances),\n Object.values(projectData.hubs),\n instanceId,\n )\n })\n\n this.logger.info({ projectId: project.id, instanceId }, \"deleted instance from project model\")\n } catch (error) {\n throw new ProjectModelOperationError(\"delete instance\", project.id, error)\n }\n }\n\n async renameInstance(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n instanceId: string,\n newName: string,\n ): Promise<InstanceModel> {\n assertCodebaseSpec(spec)\n\n try {\n return await this.withProject(project.name, projectData => {\n // rename the instance\n const instance = projectData.instances[instanceId]\n if (!instance) {\n throw new ProjectModelInstanceNotFoundError(project.id, instanceId)\n }\n\n const newInstanceId = getInstanceId(instance.type, newName)\n if (projectData.instances[newInstanceId]) {\n throw new ProjectModelInstanceAlreadyExistsError(project.id, newInstanceId)\n }\n\n delete projectData.instances[instanceId]\n instance.id = newInstanceId\n instance.name = newName\n projectData.instances[newInstanceId] = instance\n\n updateInstanceReferences(\n Object.values(projectData.instances),\n Object.values(projectData.hubs),\n instanceId,\n instance.id,\n )\n\n this.logger.info(\n { projectId: project.id, oldInstanceId: instanceId, newInstanceId: instance.id },\n \"renamed instance in project model\",\n )\n\n return instance\n })\n } catch (error) {\n throw new ProjectModelOperationError(\"rename instance\", project.id, error)\n }\n }\n\n async updateHub(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n hubId: string,\n patch: HubModelPatch,\n ): Promise<HubModel> {\n assertCodebaseSpec(spec)\n\n try {\n return await this.withProject(project.name, projectData => {\n const hub = projectData.hubs[hubId]\n if (!hub) {\n throw new ProjectModelHubNotFoundError(project.id, hubId)\n }\n\n applyHubPatch(hub, patch)\n\n this.logger.info({ projectId: project.id, hubId }, \"updated hub in project model\")\n\n return hub\n })\n } catch (error) {\n throw new ProjectModelOperationError(\"update hub\", project.id, error)\n }\n }\n\n async deleteHub(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n hubId: string,\n ): Promise<void> {\n assertCodebaseSpec(spec)\n\n try {\n await this.withProject(project.name, projectData => {\n if (!projectData.hubs[hubId]) {\n throw new ProjectModelHubNotFoundError(project.id, hubId)\n }\n\n delete projectData.hubs[hubId]\n\n cleanupHubReferences(\n Object.values(projectData.instances),\n Object.values(projectData.hubs),\n hubId,\n )\n })\n\n this.logger.info({ projectId: project.id, hubId }, \"deleted hub from project model\")\n } catch (error) {\n throw new ProjectModelOperationError(\"delete hub\", project.id, error)\n }\n }\n\n async createNodes(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n instances: InstanceModel[],\n hubs: HubModel[],\n ): Promise<void> {\n assertCodebaseSpec(spec)\n\n try {\n await this.withProject(project.name, projectData => {\n // ensure that instances and hubs do not conflict with existing ones\n for (const instance of instances) {\n if (projectData.instances[instance.id]) {\n throw new ProjectModelInstanceAlreadyExistsError(project.id, instance.id)\n }\n projectData.instances[instance.id] = instance\n }\n\n for (const hub of hubs) {\n if (projectData.hubs[hub.id]) {\n throw new ProjectModelHubAlreadyExistsError(project.id, hub.id)\n }\n projectData.hubs[hub.id] = hub\n }\n\n return {}\n })\n\n this.logger.debug(\n { projectId: project.id, instanceCount: instances.length, hubCount: hubs.length },\n \"created nodes in project model\",\n )\n } catch (error) {\n throw new ProjectModelOperationError(\"create nodes\", project.id, error)\n }\n }\n\n private getProjectPath(projectName: string) {\n return `${this.projectsDir}/${projectName}.yaml`\n }\n\n private async loadProject(projectName: string) {\n const projectPath = this.getProjectPath(projectName)\n\n try {\n const content = await readFile(projectPath, \"utf-8\")\n\n return codebaseProjectDataSchema.parse(parse(content))\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return { instances: {}, hubs: {} }\n }\n\n throw error\n }\n }\n\n private async writeProject(\n projectName: string,\n project: z.infer<typeof codebaseProjectDataSchema>,\n ) {\n const projectPath = this.getProjectPath(projectName)\n const content = stringify(project, undefined, 2)\n\n await writeFile(projectPath, content)\n }\n\n private async withInstance<T>(\n projectId: string,\n projectName: string,\n instanceId: string,\n callback: (instance: InstanceModel) => T,\n ): Promise<T> {\n return await this.withProject(projectName, projectData => {\n const instance = projectData.instances[instanceId]\n if (!instance) {\n throw new ProjectModelInstanceNotFoundError(projectId, instanceId)\n }\n\n return callback(instance)\n })\n }\n\n private async withProject<T>(\n projectName: string,\n callback: (project: z.infer<typeof codebaseProjectDataSchema>) => T,\n ): Promise<T> {\n return await this.lock.acquire(projectName, async () => {\n const projectData = await this.loadProject(projectName)\n\n const result = callback(projectData)\n await this.writeProject(projectName, projectData)\n\n return result\n })\n }\n\n public static async create(logger: Logger): Promise<CodebaseProjectModelBackend> {\n const [mainProjectPath] = await resolveMainLocalProject()\n const projectsPath = resolve(mainProjectPath, \"projects\")\n\n await mkdir(projectsPath, { recursive: true })\n\n return new CodebaseProjectModelBackend(projectsPath, logger)\n }\n}\n\n/**\n * Type guard and casting helper for codebase storage spec.\n *\n * @param spec The project model storage specification.\n * @throws Error if spec is not codebase type.\n */\nfunction assertCodebaseSpec(\n spec: ProjectModelStorageSpec,\n): asserts spec is Extract<ProjectModelStorageSpec, { type: \"codebase\" }> {\n if (spec.type !== \"codebase\") {\n throw new Error(`Expected codebase spec, got ${spec.type}`)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { DatabaseManager } from \"../../database\"\nimport type { ProjectModel, ProjectModelStorageSpec, ProjectOutput } from \"../../shared\"\nimport type { ProjectModelBackend } from \"../abstractions\"\nimport {\n getInstanceId,\n type HubModel,\n type HubModelPatch,\n hubModelSchema,\n type InstanceModel,\n type InstanceModelPatch,\n instanceModelSchema,\n} from \"@highstate/contract\"\nimport {\n ProjectModelHubAlreadyExistsError,\n ProjectModelHubNotFoundError,\n ProjectModelInstanceAlreadyExistsError,\n ProjectModelInstanceNotFoundError,\n ProjectModelOperationError,\n} from \"../errors\"\nimport {\n applyHubPatch,\n applyInstancePatch,\n cleanupHubReferences,\n cleanupInstanceReferences,\n updateInstanceReferences,\n} from \"../utils\"\n\n/**\n * A project model backend that stores the project models in the project database.\n *\n * Uses the InstanceModel and HubModel tables in the project database.\n */\nexport class DatabaseProjectModelBackend implements ProjectModelBackend {\n constructor(\n private readonly database: DatabaseManager,\n private readonly logger: Logger,\n ) {}\n\n async getProjectModel(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n ): Promise<ProjectModel> {\n assertDatabaseSpec(spec)\n\n try {\n const projectDatabase = await this.database.forProject(project.id)\n\n const [instanceRecords, hubRecords] = await Promise.all([\n projectDatabase.instanceModel.findMany({\n select: { model: true },\n }),\n projectDatabase.hubModel.findMany({\n select: { model: true },\n }),\n ])\n\n const instances = instanceRecords.map(record => instanceModelSchema.parse(record.model))\n const hubs = hubRecords.map(record => hubModelSchema.parse(record.model))\n\n return { instances, hubs }\n } catch (error) {\n throw new ProjectModelOperationError(\"get project model\", project.id, error)\n }\n }\n\n async createProjectModel(project: ProjectOutput, spec: ProjectModelStorageSpec): Promise<void> {\n assertDatabaseSpec(spec)\n\n try {\n // for database storage, creating an empty project model means ensuring tables exist\n // the tables are created automatically by Prisma migrations, so nothing to do here\n this.logger.info({ projectId: project.id }, \"created project model\")\n } catch (error) {\n throw new ProjectModelOperationError(\"create project model\", project.id, error)\n }\n }\n\n async updateInstance(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n instanceId: string,\n patch: InstanceModelPatch,\n ): Promise<InstanceModel> {\n assertDatabaseSpec(spec)\n\n try {\n const projectDatabase = await this.database.forProject(project.id)\n\n const existingRecord = await projectDatabase.instanceModel.findUnique({\n where: { id: instanceId },\n })\n\n if (!existingRecord) {\n throw new ProjectModelInstanceNotFoundError(project.id, instanceId)\n }\n\n const instance = instanceModelSchema.parse(existingRecord.model)\n\n // apply patch\n applyInstancePatch(instance, patch)\n\n // update in database\n await projectDatabase.instanceModel.update({\n where: { id: instanceId },\n data: { model: instance },\n })\n\n this.logger.info({ projectId: project.id, instanceId }, \"updated instance in project model\")\n\n return instance\n } catch (error) {\n throw new ProjectModelOperationError(\"update instance\", project.id, error)\n }\n }\n\n async deleteInstance(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n instanceId: string,\n ): Promise<void> {\n assertDatabaseSpec(spec)\n\n try {\n const projectDatabase = await this.database.forProject(project.id)\n\n // this is a multi-node operation, so we need a transaction\n await projectDatabase.$transaction(async tx => {\n const existingRecord = await tx.instanceModel.findUnique({\n where: { id: instanceId },\n })\n\n if (!existingRecord) {\n throw new ProjectModelInstanceNotFoundError(project.id, instanceId)\n }\n\n // delete the instance\n await tx.instanceModel.delete({\n where: { id: instanceId },\n })\n\n // get all instances and hubs to clean up references\n const [instanceRecords, hubRecords] = await Promise.all([\n tx.instanceModel.findMany({ select: { id: true, model: true } }),\n tx.hubModel.findMany({ select: { id: true, model: true } }),\n ])\n\n const instances = instanceRecords.map(record => instanceModelSchema.parse(record.model))\n const hubs = hubRecords.map(record => hubModelSchema.parse(record.model))\n\n // clean up references\n cleanupInstanceReferences(instances, hubs, instanceId)\n\n // update modified instances and hubs back to database\n await Promise.all([\n ...instances.map(instance =>\n tx.instanceModel.update({\n where: { id: instance.id },\n data: { model: instance },\n }),\n ),\n ...hubs.map(hub =>\n tx.hubModel.update({\n where: { id: hub.id },\n data: { model: hub },\n }),\n ),\n ])\n })\n\n this.logger.info({ projectId: project.id, instanceId }, \"deleted instance from project model\")\n } catch (error) {\n throw new ProjectModelOperationError(\"delete instance\", project.id, error)\n }\n }\n\n async renameInstance(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n instanceId: string,\n newName: string,\n ): Promise<InstanceModel> {\n assertDatabaseSpec(spec)\n\n try {\n const projectDatabase = await this.database.forProject(project.id)\n\n // this is a multi-node operation, so we need a transaction\n const renamedInstance = await projectDatabase.$transaction(async tx => {\n const existingRecord = await tx.instanceModel.findUnique({\n where: { id: instanceId },\n })\n\n if (!existingRecord) {\n throw new ProjectModelInstanceNotFoundError(project.id, instanceId)\n }\n\n const instance = instanceModelSchema.parse(existingRecord.model)\n const newInstanceId = getInstanceId(instance.type, newName)\n\n // check if new instance ID already exists\n const conflictRecord = await tx.instanceModel.findUnique({\n where: { id: newInstanceId },\n })\n\n if (conflictRecord) {\n throw new ProjectModelInstanceAlreadyExistsError(project.id, newInstanceId)\n }\n\n // update instance\n instance.id = newInstanceId\n instance.name = newName\n\n // delete old record and create new one\n await tx.instanceModel.delete({ where: { id: instanceId } })\n await tx.instanceModel.create({\n data: { id: newInstanceId, model: instance },\n })\n\n // get all instances and hubs to update references\n const [instanceRecords, hubRecords] = await Promise.all([\n tx.instanceModel.findMany({ select: { id: true, model: true } }),\n tx.hubModel.findMany({ select: { id: true, model: true } }),\n ])\n\n const instances = instanceRecords.map(record => instanceModelSchema.parse(record.model))\n const hubs = hubRecords.map(record => hubModelSchema.parse(record.model))\n\n // update references\n updateInstanceReferences(instances, hubs, instanceId, newInstanceId)\n\n // update modified instances and hubs back to database\n await Promise.all([\n ...instances.map(inst =>\n tx.instanceModel.update({\n where: { id: inst.id },\n data: { model: inst },\n }),\n ),\n ...hubs.map(hub =>\n tx.hubModel.update({\n where: { id: hub.id },\n data: { model: hub },\n }),\n ),\n ])\n\n return instance\n })\n\n this.logger.info(\n { projectId: project.id, oldInstanceId: instanceId, newInstanceId: renamedInstance.id },\n \"renamed instance in project model\",\n )\n\n return renamedInstance\n } catch (error) {\n throw new ProjectModelOperationError(\"rename instance\", project.id, error)\n }\n }\n\n async updateHub(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n hubId: string,\n patch: HubModelPatch,\n ): Promise<HubModel> {\n assertDatabaseSpec(spec)\n\n try {\n const projectDatabase = await this.database.forProject(project.id)\n\n const existingRecord = await projectDatabase.hubModel.findUnique({\n where: { id: hubId },\n })\n\n if (!existingRecord) {\n throw new ProjectModelHubNotFoundError(project.id, hubId)\n }\n\n const hub = hubModelSchema.parse(existingRecord.model)\n\n // apply patch\n applyHubPatch(hub, patch)\n\n // update in database\n await projectDatabase.hubModel.update({\n where: { id: hubId },\n data: { model: hub },\n })\n\n this.logger.info({ projectId: project.id, hubId }, \"updated hub in project model\")\n\n return hub\n } catch (error) {\n throw new ProjectModelOperationError(\"update hub\", project.id, error)\n }\n }\n\n async deleteHub(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n hubId: string,\n ): Promise<void> {\n assertDatabaseSpec(spec)\n\n try {\n const projectDatabase = await this.database.forProject(project.id)\n\n // this is a multi-node operation, so we need a transaction\n await projectDatabase.$transaction(async tx => {\n const existingRecord = await tx.hubModel.findUnique({\n where: { id: hubId },\n })\n\n if (!existingRecord) {\n throw new ProjectModelHubNotFoundError(project.id, hubId)\n }\n\n // delete the hub\n await tx.hubModel.delete({\n where: { id: hubId },\n })\n\n // get all instances and hubs to clean up references\n const [instanceRecords, hubRecords] = await Promise.all([\n tx.instanceModel.findMany({ select: { id: true, model: true } }),\n tx.hubModel.findMany({ select: { id: true, model: true } }),\n ])\n\n const instances = instanceRecords.map(record => instanceModelSchema.parse(record.model))\n const hubs = hubRecords.map(record => hubModelSchema.parse(record.model))\n\n // clean up references\n cleanupHubReferences(instances, hubs, hubId)\n\n // update modified instances and hubs back to database\n await Promise.all([\n ...instances.map(instance =>\n tx.instanceModel.update({\n where: { id: instance.id },\n data: { model: instance },\n }),\n ),\n ...hubs.map(hub =>\n tx.hubModel.update({\n where: { id: hub.id },\n data: { model: hub },\n }),\n ),\n ])\n })\n\n this.logger.info({ projectId: project.id, hubId }, \"deleted hub from project model\")\n } catch (error) {\n throw new ProjectModelOperationError(\"delete hub\", project.id, error)\n }\n }\n\n async createNodes(\n project: ProjectOutput,\n spec: ProjectModelStorageSpec,\n instances: InstanceModel[],\n hubs: HubModel[],\n ): Promise<void> {\n assertDatabaseSpec(spec)\n\n try {\n const projectDatabase = await this.database.forProject(project.id)\n\n // this is a multi-node operation, so we need a transaction\n await projectDatabase.$transaction(async tx => {\n // check for conflicts\n const [conflictingInstance, conflictingHub] = await Promise.all([\n instances.length > 0\n ? tx.instanceModel.findFirst({\n where: { id: { in: instances.map(i => i.id) } },\n select: { id: true },\n })\n : null,\n hubs.length > 0\n ? tx.hubModel.findFirst({\n where: { id: { in: hubs.map(h => h.id) } },\n select: { id: true },\n })\n : null,\n ])\n\n if (conflictingInstance) {\n throw new ProjectModelInstanceAlreadyExistsError(project.id, conflictingInstance.id)\n }\n\n if (conflictingHub) {\n throw new ProjectModelHubAlreadyExistsError(project.id, conflictingHub.id)\n }\n\n // create instances and hubs using createMany\n await Promise.all([\n instances.length > 0\n ? tx.instanceModel.createMany({\n data: instances.map(instance => ({\n id: instance.id,\n model: instance,\n })),\n })\n : Promise.resolve(),\n hubs.length > 0\n ? tx.hubModel.createMany({\n data: hubs.map(hub => ({\n id: hub.id,\n model: hub,\n })),\n })\n : Promise.resolve(),\n ])\n })\n\n this.logger.debug(\n { projectId: project.id, instanceCount: instances.length, hubCount: hubs.length },\n \"created nodes in project model\",\n )\n } catch (error) {\n throw new ProjectModelOperationError(\"create nodes\", project.id, error)\n }\n }\n}\n\n/**\n * Type guard and casting helper for database storage spec.\n *\n * @param spec The project model storage specification.\n * @throws Error if spec is not database type.\n */\nfunction assertDatabaseSpec(\n spec: ProjectModelStorageSpec,\n): asserts spec is Extract<ProjectModelStorageSpec, { type: \"database\" }> {\n if (spec.type !== \"database\") {\n throw new Error(`Expected database spec, got ${spec.type}`)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { DatabaseManager } from \"../database\"\nimport type { ProjectModelBackend } from \"./abstractions\"\nimport { CodebaseProjectModelBackend } from \"./backends/codebase\"\nimport { DatabaseProjectModelBackend } from \"./backends/database\"\n\nexport async function createProjectModelBackends(\n database: DatabaseManager,\n logger: Logger,\n): Promise<Record<string, ProjectModelBackend>> {\n const codebaseBackend = await CodebaseProjectModelBackend.create(\n logger.child({ backend: \"CodebaseProjectModelBackend\" }),\n )\n\n const databaseBackend = new DatabaseProjectModelBackend(\n database,\n logger.child({ backend: \"DatabaseProjectModelBackend\" }),\n )\n\n return {\n codebase: codebaseBackend,\n database: databaseBackend,\n }\n}\n","import type { InputJsonValue } from \"@prisma/client/runtime/client\"\nimport type { Logger } from \"pino\"\nimport type { LibraryBackend } from \"../library\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { ProjectModelService } from \"./project-model\"\nimport type { ProjectUnlockService } from \"./project-unlock\"\nimport {\n type HubModel,\n type HubModelPatch,\n type InstanceId,\n type InstanceModel,\n type InstanceModelPatch,\n instanceModelSchema,\n isUnitModel,\n parseInstanceId,\n} from \"@highstate/contract\"\nimport { createId } from \"@paralleldrive/cuid2\"\nimport { createProjectLogger } from \"../common\"\nimport { type DatabaseManager, type Project, projectDatabaseVersion } from \"../database\"\nimport {\n applyInstancePatch,\n type ProjectEvaluationSubsystem,\n type ProjectModelBackend,\n ProjectModelError,\n ProjectModelInstanceNotFoundError,\n} from \"../project-model\"\nimport {\n type FullProjectModel,\n forSchema,\n type ProjectInput,\n type ProjectModelStorageSpec,\n ProjectNotFoundError,\n type ProjectOutput,\n projectOutputSchema,\n type UnlockMethodInput,\n} from \"../shared\"\nimport { includeForInstanceState, mapInstanceStateResult } from \"./instance-state\"\n\nexport class ProjectService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly projectUnlockService: ProjectUnlockService,\n private readonly projectEvaluationSubsystem: ProjectEvaluationSubsystem,\n private readonly projectModelService: ProjectModelService,\n private readonly projectModelBackends: Record<string, ProjectModelBackend>,\n private readonly libraryBackend: LibraryBackend,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Returns all projects in the system.\n */\n async getProjects(): Promise<ProjectOutput[]> {\n return await this.database.backend.project.findMany({\n select: forSchema(projectOutputSchema),\n })\n }\n\n /**\n * Creates a new project with the given input and unlock method.\n *\n * This will set up the project database and persist the unlock method.\n *\n * @param projectInput The input for the new project.\n * @param unlockMethodInput The unlock method to use for the new project.\n */\n async createProject(\n projectInput: ProjectInput,\n unlockMethodInput: UnlockMethodInput,\n ): Promise<Project> {\n // start by generating a random ID\n const projectId = createId()\n const logger = createProjectLogger(this.logger, projectId)\n\n logger.info(\"creating new project\")\n\n // setup project database\n const [encryptedMasterKey, unlockSuite] = await this.projectUnlockService.setupProjectDatabase(\n projectId,\n unlockMethodInput,\n )\n\n logger.info(\"project database set up\")\n\n // finally, create the project in the database\n const project = await this.database.backend.project.create({\n data: {\n id: projectId,\n name: projectInput.name,\n meta: projectInput.meta,\n databaseVersion: projectDatabaseVersion,\n encryptedMasterKey,\n unlockSuite,\n spaceId: projectInput.spaceId,\n modelStorageId: projectInput.modelStorageId,\n libraryId: projectInput.libraryId,\n pulumiBackendId: projectInput.pulumiBackendId,\n },\n })\n\n logger.info(\"project successfully created\")\n\n return project\n }\n\n /**\n * Returns the project with the given ID.\n *\n * If the project does not exist, this will throw an error.\n *\n * @param projectId The ID of the project to get.\n */\n async getProjectOrThrow(projectId: string): Promise<ProjectOutput> {\n const project = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: forSchema(projectOutputSchema),\n })\n\n if (!project) {\n throw new ProjectNotFoundError(projectId)\n }\n\n return project\n }\n\n /**\n * Get the project model containing instances, hubs + virtual and ghost instances.\n *\n * @param projectId The ID of the project to get the model for.\n * @param signal Optional abort signal for cancellation.\n */\n async getProjectModel(projectId: string): Promise<FullProjectModel> {\n const [projectModel] = await this.projectModelService.getProjectModel(projectId, {\n includeVirtualInstances: true,\n includeGhostInstances: true,\n })\n\n return projectModel\n }\n\n /**\n * Rename an instance in the project.\n *\n * @param projectId The ID of the project containing the instance.\n * @param instanceId The ID of the instance to rename.\n * @param newName The new name for the instance.\n */\n async renameInstance(\n projectId: string,\n instanceId: InstanceId,\n newName: string,\n ): Promise<InstanceModel> {\n try {\n // rename the instance in the model\n const { project, backend, spec } = await this.getProjectWithBackend(projectId)\n const instance = await backend.renameInstance(project, spec, instanceId, newName)\n\n // rename in the database state\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n const state = await tx.instanceState.findUnique({\n where: { instanceId },\n select: { id: true },\n })\n\n if (!state) {\n // ignore if state doesn't exist yet\n return\n }\n\n await tx.instanceState.update({\n where: { id: state.id },\n data: { instanceId: instance.id },\n })\n\n // if the instance is composite, we also need to rename all child instance states\n // we will replace all old instance name occurrences with the new names\n // this will not work in general, since child IDs may be arbitrary strings:\n // e.g. we have parent with name \"foo\" and child with name pattern \"{parent}-foo\"\n // if we rename parent to \"bar\", the child should be renamed to \"bar-foo\",\n // but will be renamed to \"bar-bar\" with this approach, leading to child recreation\n // it is not ideal, but this is the best we can do in the current evaluation model\n\n if (instance.kind !== \"composite\") {\n return\n }\n\n const [, oldName] = parseInstanceId(instanceId)\n\n // TODO: use proper SQL to do this in the database instead of in memory\n const allStates = await tx.instanceState.findMany({\n where: { source: \"virtual\" },\n select: { id: true, parentId: true, instanceId: true },\n })\n\n const stateMap = new Map<string, { parentId: string | null }>()\n for (const s of allStates) {\n stateMap.set(s.instanceId, s)\n }\n\n const isChild = (s: { parentId: string | null }) => {\n while (s.parentId) {\n if (s.parentId === state.id) {\n return true\n }\n\n const parent = stateMap.get(s.parentId)\n if (!parent) {\n break\n }\n\n s = parent\n }\n\n return false\n }\n\n for (const childState of allStates) {\n if (!isChild(childState)) {\n // reduce the scope of replacement to only child instances to reduce risk of incorrect renames\n continue\n }\n\n const newChildInstanceId = childState.instanceId.replace(oldName, newName)\n if (newChildInstanceId === childState.instanceId) {\n continue\n }\n\n await tx.instanceState.update({\n where: { id: childState.id },\n data: { instanceId: newChildInstanceId },\n })\n }\n })\n\n await this.pubsubManager.publish([\"project-model\", projectId], {\n updatedInstances: [instance],\n deletedInstanceIds: [instanceId],\n })\n\n void this.projectEvaluationSubsystem.evaluateProject(projectId)\n\n return instance\n } catch (error) {\n this.logger.error({ error, projectId, instanceId, newName }, \"failed to rename instance\")\n throw error\n }\n }\n\n /**\n * Update an instance in the project.\n *\n * @param projectId The ID of the project containing the instance.\n * @param instanceId The ID of the instance to update.\n * @param patch The patch to apply to the instance.\n */\n async updateInstance(\n projectId: string,\n instanceId: InstanceId,\n patch: InstanceModelPatch,\n ): Promise<InstanceModel> {\n try {\n const { project, backend, spec } = await this.getProjectWithBackend(projectId)\n try {\n const instance = await backend.updateInstance(project, spec, instanceId, patch)\n const library = await this.libraryBackend.loadLibrary(project.libraryId)\n\n await this.pubsubManager.publish([\"project-model\", projectId], {\n updatedInstances: [instance],\n })\n\n if (!isUnitModel(library.components[instance.type]) && patch.args) {\n // evaluate the project if arguments changed for composite instancer\n void this.projectEvaluationSubsystem.evaluateProject(projectId)\n } else if (patch.hubInputs || patch.injectionInputs || patch.inputs) {\n // TODO: only evaluate if inputs changed for composite instances\n void this.projectEvaluationSubsystem.evaluateProject(projectId)\n }\n\n return instance\n } catch (error) {\n const cause =\n error instanceof ProjectModelError && error.cause instanceof Error ? error.cause : error\n\n if (cause instanceof ProjectModelInstanceNotFoundError) {\n const instance = await this.updateGhostInstanceModel(projectId, instanceId, patch)\n\n await this.pubsubManager.publish([\"project-model\", projectId], {\n updatedGhostInstances: [instance],\n })\n\n return instance\n }\n\n throw error\n }\n } catch (error) {\n this.logger.error({ error, projectId, instanceId }, \"failed to update instance\")\n throw error\n }\n }\n\n /**\n * Delete an instance from the project.\n *\n * @param projectId The ID of the project containing the instance.\n * @param instanceId The ID of the instance to delete.\n */\n async deleteInstance(projectId: string, instanceId: InstanceId): Promise<void> {\n try {\n const { project, backend, spec } = await this.getProjectWithBackend(projectId)\n await backend.deleteInstance(project, spec, instanceId)\n\n await this.pubsubManager.publish([\"project-model\", projectId], {\n deletedInstanceIds: [instanceId],\n })\n\n void this.projectEvaluationSubsystem.evaluateProject(projectId)\n } catch (error) {\n this.logger.error({ error, projectId, instanceId }, \"failed to delete instance\")\n throw error\n }\n }\n\n private async updateGhostInstanceModel(\n projectId: string,\n instanceId: InstanceId,\n patch: InstanceModelPatch,\n ): Promise<InstanceModel> {\n const database = await this.database.forProject(projectId)\n\n const state = await database.instanceState.findUnique({\n where: { instanceId },\n select: { id: true, model: true },\n })\n\n if (!state?.model) {\n throw new ProjectModelInstanceNotFoundError(projectId, instanceId)\n }\n\n const instance = instanceModelSchema.parse(state.model)\n\n applyInstancePatch(instance, patch)\n\n await database.instanceState.update({\n where: { id: state.id },\n data: { model: instance as InputJsonValue },\n })\n\n this.logger.info({ projectId, instanceId }, \"updated ghost instance model\")\n\n return instance\n }\n\n /**\n * Update a hub in the project.\n *\n * @param projectId The ID of the project containing the hub.\n * @param hubId The ID of the hub to update.\n * @param patch The patch to apply to the hub.\n */\n async updateHub(projectId: string, hubId: string, patch: HubModelPatch): Promise<HubModel> {\n try {\n const { project, backend, spec } = await this.getProjectWithBackend(projectId)\n const hub = await backend.updateHub(project, spec, hubId, patch)\n\n await this.pubsubManager.publish([\"project-model\", projectId], {\n updatedHubs: [hub],\n })\n\n if (patch.inputs || patch.injectionInputs) {\n void this.projectEvaluationSubsystem.evaluateProject(projectId)\n }\n\n return hub\n } catch (error) {\n this.logger.error({ error, projectId, hubId }, \"failed to update hub\")\n throw error\n }\n }\n\n /**\n * Delete a hub from the project.\n *\n * @param projectId The ID of the project containing the hub.\n * @param hubId The ID of the hub to delete.\n */\n async deleteHub(projectId: string, hubId: string): Promise<void> {\n try {\n const { project, backend, spec } = await this.getProjectWithBackend(projectId)\n await backend.deleteHub(project, spec, hubId)\n\n await this.pubsubManager.publish([\"project-model\", projectId], {\n deletedHubIds: [hubId],\n })\n\n void this.projectEvaluationSubsystem.evaluateProject(projectId)\n } catch (error) {\n this.logger.error({ error, projectId, hubId }, \"failed to delete hub\")\n throw error\n }\n }\n\n /**\n * Create multiple instances and hubs atomically from a blueprint.\n *\n * @param projectId The ID of the project to create the nodes in.\n * @param instances The instances to create.\n * @param hubs The hubs to create.\n */\n async createNodes(\n projectId: string,\n instances: InstanceModel[],\n hubs: HubModel[],\n ): Promise<void> {\n try {\n const database = await this.database.forProject(projectId)\n\n const states = await database.$transaction(async tx => {\n const { project, backend, spec } = await this.getProjectWithBackend(projectId)\n await backend.createNodes(project, spec, instances, hubs)\n\n // ensure instance states exist for created instances\n return await Promise.all(\n instances.map(async instance => {\n const result = await tx.instanceState.upsert({\n where: { instanceId: instance.id },\n create: {\n instanceId: instance.id,\n kind: instance.kind,\n source: \"resident\",\n status: \"undeployed\",\n },\n update: {\n // turn any virtual instance into resident\n // the next evaluation will throw an error indicating the instance is now duplicate and will no longer produce this virtual instance\n source: \"resident\",\n },\n // in case we restoring instance for existing state, to stream it correctly\n include: includeForInstanceState({\n includeEvaluationState: true,\n includeExtra: true,\n includeLastOperationState: true,\n loadCustomStatuses: true,\n }),\n })\n\n return mapInstanceStateResult(result)\n }),\n )\n })\n\n void this.pubsubManager.publish([\"project-model\", projectId], {\n updatedHubs: hubs,\n updatedInstances: instances,\n })\n\n for (const state of states) {\n void this.pubsubManager.publish([\"instance-state\", projectId], { type: \"updated\", state })\n }\n\n void this.projectEvaluationSubsystem.evaluateProject(projectId)\n } catch (error) {\n this.logger.error(\n { error, projectId, instanceCount: instances.length, hubCount: hubs.length },\n \"failed to create many nodes\",\n )\n throw error\n }\n }\n\n /**\n * Get the project, backend, and storage spec in a single optimized SQL call.\n *\n * @param projectId The ID of the project.\n * @returns Object containing project, backend, and spec.\n */\n private async getProjectWithBackend(projectId: string): Promise<{\n project: ProjectOutput\n backend: ProjectModelBackend\n spec: ProjectModelStorageSpec\n }> {\n const result = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: {\n ...forSchema(projectOutputSchema),\n modelStorage: {\n select: {\n spec: true,\n },\n },\n },\n })\n\n if (!result) {\n throw new ProjectNotFoundError(projectId)\n }\n\n const { modelStorage, ...project } = result\n const spec = modelStorage.spec\n const backend = this.getProjectModelBackend(spec.type)\n\n return { project, backend, spec }\n }\n\n /**\n * Get the appropriate project model backend for the given project.\n *\n * @param project The project to get the backend for.\n * @returns The project model backend.\n */\n private getProjectModelBackend(type: string): ProjectModelBackend {\n const backend = this.projectModelBackends[type]\n if (!backend) {\n throw new Error(`Project model backend not found for type: ${type}`)\n }\n return backend\n }\n}\n","import type { InstanceModel } from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type { DatabaseManager } from \"../database\"\nimport type { LibraryBackend } from \"../library\"\nimport type { ProjectModelBackend } from \"../project-model\"\nimport type { InstanceStateService } from \"./instance-state\"\nimport type { ProjectUnlockService } from \"./project-unlock\"\nimport { isNonNullish } from \"remeda\"\nimport {\n type FullProjectModel,\n forSchema,\n InputResolver,\n type InputResolverNode,\n ProjectNotFoundError,\n type ProjectOutput,\n projectOutputSchema,\n type ResolvedInstanceInput,\n} from \"../shared\"\n\nexport type GetProjectModelOptions = {\n /**\n * Whether to include virtual instances in the model.\n *\n * By default, virtual instances are not included.\n */\n includeVirtualInstances?: boolean\n\n /**\n * Whether to include ghost instances in the model.\n *\n * By default, ghost instances are not included.\n */\n includeGhostInstances?: boolean\n}\n\nexport class ProjectModelService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly libraryBackend: LibraryBackend,\n private readonly instanceStateService: InstanceStateService,\n private readonly projectModelBackends: Record<string, ProjectModelBackend>,\n private readonly projectUnlockService: ProjectUnlockService,\n private readonly logger: Logger,\n ) {\n this.projectUnlockService.registerUnlockTask(\n //\n \"sync-instance-states\",\n projectId => this.syncInstanceStates(projectId),\n )\n }\n\n /**\n * Get the project model containing instances, hubs + virtual instances and ghost instances if requested.\n *\n * @param projectId The ID of the project to get the model for.\n * @param options Options to control the model retrieval.\n */\n async getProjectModel(\n projectId: string,\n { includeVirtualInstances = false, includeGhostInstances = false }: GetProjectModelOptions = {},\n ): Promise<[projectModel: FullProjectModel, project: ProjectOutput]> {\n const { project, backend, spec } = await this.getProjectWithBackend(projectId)\n\n // get base model from storage backend\n const { instances, hubs } = await backend.getProjectModel(project, spec)\n\n return [\n {\n instances,\n hubs,\n virtualInstances: includeVirtualInstances ? await this.getVirtualInstances(projectId) : [],\n ghostInstances: includeGhostInstances\n ? await this.getGhostInstances(\n projectId,\n instances.map(instance => instance.id),\n )\n : [],\n },\n project,\n ]\n }\n\n /**\n * Resolve a project by loading all dependencies and processing input resolution.\n * Does not load virtual instances.\n *\n * @param projectId The ID of the project to resolve.\n */\n async resolveProject(projectId: string) {\n const [[{ instances, hubs }, project], states] = await Promise.all([\n this.getProjectModel(projectId),\n this.instanceStateService.getInstanceStates(projectId, { includeEvaluationState: true }),\n ])\n\n const library = await this.libraryBackend.loadLibrary(project.libraryId)\n\n const filteredInstances = instances.filter(instance => instance.type in library.components)\n const stateMap = new Map(states.map(state => [state.id, state]))\n\n const inputResolverNodes = new Map<string, InputResolverNode>()\n\n for (const instance of filteredInstances) {\n inputResolverNodes.set(`instance:${instance.id}`, {\n kind: \"instance\",\n instance,\n component: library.components[instance.type],\n })\n }\n\n for (const hub of hubs) {\n inputResolverNodes.set(`hub:${hub.id}`, { kind: \"hub\", hub })\n }\n\n const inputResolver = new InputResolver(inputResolverNodes, this.logger)\n inputResolver.addAllNodesToWorkset()\n\n const resolvedInputs: Record<string, Record<string, ResolvedInstanceInput[]>> = {}\n\n await inputResolver.process()\n\n for (const instance of filteredInstances) {\n const output = inputResolver.requireOutput(`instance:${instance.id}`)\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n resolvedInputs[instance.id] = output.resolvedInputs\n }\n\n return {\n project,\n library,\n instances: filteredInstances,\n stateMap,\n resolvedInputs,\n }\n }\n\n /**\n /**\n * Get the appropriate project model backend for the given project.\n *\n * @param type The project storage type.\n * @returns The project model backend.\n */\n private getProjectModelBackend(type: string): ProjectModelBackend {\n const backend = this.projectModelBackends[type]\n if (!backend) {\n throw new Error(`Project model backend not found for type: ${type}`)\n }\n\n return backend\n }\n\n /**\n * Get project with model backend and spec.\n *\n * @param projectId The project ID to get.\n * @returns The project, backend, and spec.\n */\n private async getProjectWithBackend(projectId: string) {\n const project = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: {\n ...forSchema(projectOutputSchema),\n modelStorage: {\n select: {\n spec: true,\n },\n },\n },\n })\n\n if (!project) {\n throw new ProjectNotFoundError(projectId)\n }\n\n const backend = this.getProjectModelBackend(project.modelStorage.spec.type)\n\n return {\n project,\n backend,\n spec: project.modelStorage.spec,\n }\n }\n\n /**\n * Get virtual instances from the database for the given project ID.\n *\n * @param projectId The project ID to get virtual instances for.\n * @returns The list of virtual instances.\n */\n private async getVirtualInstances(projectId: string): Promise<InstanceModel[]> {\n const database = await this.database.forProject(projectId)\n const states = await database.instanceEvaluationState.findMany({ select: { model: true } })\n\n return states.map(state => state.model).filter(isNonNullish)\n }\n\n /**\n * Get ghost instances from the database for the given project ID.\n *\n * @param projectId The project ID to get ghost instances for.\n * @param residentInstanceIds The IDs of the instances present in the model.\n * @return The list of ghost instances.\n */\n private async getGhostInstances(\n projectId: string,\n residentInstanceIds: string[],\n ): Promise<InstanceModel[]> {\n const database = await this.database.forProject(projectId)\n\n const states = await database.instanceState.findMany({\n where: {\n // undeployed instances cannot be considered ghost\n status: { not: \"undeployed\" },\n\n OR: [\n // the resident instance is ghost if it is not in the model\n { source: \"resident\", instanceId: { notIn: residentInstanceIds } },\n\n // the virtual instance is ghost if it is has no evaluation state\n { source: \"virtual\", evaluationState: null },\n ],\n },\n select: { model: true },\n })\n\n return states.map(state => state.model).filter(isNonNullish)\n }\n\n private async syncInstanceStates(projectId: string): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n const [{ instances }] = await this.getProjectModel(projectId)\n\n const existingStates = await tx.instanceState.findMany({ select: { instanceId: true } })\n const existingStateIds = new Set(existingStates.map(state => state.instanceId))\n const missingInstances = instances.filter(instance => !existingStateIds.has(instance.id))\n\n if (missingInstances.length === 0) {\n return\n }\n\n await tx.instanceState.createMany({\n data: missingInstances.map(instance => ({\n instanceId: instance.id,\n kind: instance.kind,\n source: \"resident\",\n status: \"undeployed\",\n })),\n })\n\n this.logger.info({ projectId }, \"created missing %s instance states\", missingInstances.length)\n })\n }\n}\n","import type { Logger } from \"pino\"\nimport type { DatabaseManager } from \"../database\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { ProjectUnlockBackend } from \"../unlock\"\nimport { randomBytes } from \"node:crypto\"\nimport { armor, Decrypter, Encrypter } from \"age-encryption\"\nimport { z } from \"zod\"\nimport { createProjectLogger } from \"../common\"\nimport {\n CannotDeleteLastUnlockMethodError,\n ProjectNotFoundError,\n type ProjectUnlockState,\n type ProjectUnlockSuite,\n type UnlockMethodInput,\n} from \"../shared\"\n\ntype UnlockTask = {\n name: string\n handler: (projectId: string) => Promise<void> | void\n}\n\nexport const projectUnlockServiceConfig = z.object({\n HIGHSTATE_ENCRYPTION_ENABLED: z.stringbool().default(true),\n HIGHSTATE_DEV_AUTO_UNLOCK_PROJECT_IDS: z\n .string()\n .transform(val => val?.split(\",\") ?? [])\n .default([]),\n})\n\nexport class ProjectUnlockService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly pubsubManager: PubSubManager,\n private readonly projectUnlockBackend: ProjectUnlockBackend,\n private readonly config: z.infer<typeof projectUnlockServiceConfig>,\n private readonly logger: Logger,\n ) {}\n\n private readonly unlockTasks: UnlockTask[] = []\n\n /**\n * Gets the current unlock state of the project.\n * If the project is unlocked, it returns an object with type \"unlocked\".\n * If the project is locked, it returns an object with type \"locked\" and the unlock suite.\n *\n * @param projectId The ID of the project to get the unlock state for.\n * @returns The unlock state of the project.\n */\n async getProjectUnlockState(projectId: string): Promise<ProjectUnlockState> {\n const isUnlocked = await this.projectUnlockBackend.checkProjectUnlocked(projectId)\n if (isUnlocked) {\n return { type: \"unlocked\" }\n }\n\n const project = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: { unlockSuite: true },\n })\n\n if (!project) {\n throw new ProjectNotFoundError(projectId)\n }\n\n return {\n type: \"locked\",\n unlockSuite: project.unlockSuite,\n }\n }\n\n /**\n * Sets up the project database by creating a master key and unlock suite with the provided unlock method.\n *\n * Creates databases, configures encryption and persists the unlock method inside the project database.\n *\n * Then returns the encrypted master key and the unlock suite for further persisting in the backend database.\n *\n * @param projectId The ID of the project to create the state for.\n * @param unlockMethod The unlock method to use to encrypt the master key. Should be provided by the frontend.\n */\n async setupProjectDatabase(\n projectId: string,\n unlockMethodInput: UnlockMethodInput,\n ): Promise<[encryptedMasterKey: string, unlockSuite: ProjectUnlockSuite]> {\n // generate a new master key for the project\n const masterKey = randomBytes(32)\n\n // set the master key to setup the database encryption\n await this.projectUnlockBackend.unlockProject(projectId, masterKey)\n\n const encryptedMasterKey = await this.encryptProjectMasterKey(projectId, [unlockMethodInput])\n\n const database = await this.database.setupDatabase(projectId)\n\n // persist unlock method (now we can do it since the database is set up and unlocked)\n await database.unlockMethod.create({ data: unlockMethodInput })\n\n const unlockSuite: ProjectUnlockSuite = {\n encryptedIdentities: [unlockMethodInput.encryptedIdentity],\n hasPasskey: unlockMethodInput.type === \"passkey\",\n }\n\n return [encryptedMasterKey, unlockSuite]\n }\n\n /**\n * Unlocks the project state using the provided identity.\n *\n * @param projectId The ID of the project to unlock.\n * @param decryptedIdentity The decrypted identity to use for unlocking the project. Should be provided by the frontend.\n */\n async unlockProject(projectId: string, decryptedIdentity: string): Promise<void> {\n if (await this.projectUnlockBackend.checkProjectUnlocked(projectId)) {\n this.logger.warn(\n { projectId },\n `project \"%s\" is already unlocked, skipping unlock operation`,\n projectId,\n )\n return\n }\n\n // load the encrypted master key for the project\n const project = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: { encryptedMasterKey: true },\n })\n\n if (!project) {\n throw new ProjectNotFoundError(projectId)\n }\n\n if (!this.config.HIGHSTATE_ENCRYPTION_ENABLED) {\n // no cryptography, just unlock with an empty master key\n await this.projectUnlockBackend.unlockProject(projectId, Buffer.alloc(0))\n await this.pubsubManager.publish([\"project-unlock-state\", projectId], { type: \"unlocked\" })\n await this.runUnlockTasks(projectId)\n return\n }\n\n const encryptedMasterKey = armor.decode(project.encryptedMasterKey)\n\n const decrypter = new Decrypter()\n decrypter.addIdentity(decryptedIdentity)\n\n // decrypt the master key using the provided identity\n const masterKey = await decrypter.decrypt(encryptedMasterKey)\n\n // unlock the project in the backend\n await this.projectUnlockBackend.unlockProject(projectId, Buffer.from(masterKey))\n await this.pubsubManager.publish([\"project-unlock-state\", projectId], { type: \"unlocked\" })\n\n // run unlock tasks\n await this.runUnlockTasks(projectId)\n }\n\n private async runUnlockTasks(projectId: string): Promise<void> {\n for (const task of this.unlockTasks) {\n try {\n await task.handler(projectId)\n } catch (error) {\n this.logger.error({ error }, `unlock task \"%s\" failed`, task.name)\n }\n }\n }\n\n /**\n * Adds a new unlock method to the project and updates the master identity set.\n * The project must be unlocked.\n *\n * @param projectId The ID of the project to add the unlock method to.\n * @param inputUnlockMethod The unlock method to add. Should be provided by the frontend.\n */\n async addProjectUnlockMethod(\n projectId: string,\n inputUnlockMethod: UnlockMethodInput,\n ): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n // 1. fetch all unlock method recipients for the project\n const unlockMethods = await tx.unlockMethod.findMany({\n select: { type: true, recipient: true, encryptedIdentity: true },\n })\n\n const allUnlockMethods = [...unlockMethods, inputUnlockMethod]\n\n // 2. encrypt the project data for all recipients + the new recipient\n const encryptedMasterKey = await this.encryptProjectMasterKey(projectId, allUnlockMethods)\n\n // 3. persist the new unlock method\n await tx.unlockMethod.create({ data: inputUnlockMethod })\n\n // 4. update the project with the new master key and unlock suite\n await this.database.backend.project.update({\n where: { id: projectId },\n data: {\n encryptedMasterKey,\n unlockSuite: ProjectUnlockService.createUnlockSuite(allUnlockMethods),\n },\n })\n })\n }\n\n /**\n * Removes an unlock method from the project and updates the master identity set.\n * The project must be unlocked.\n *\n * @param projectId The ID of the project to remove the unlock method from.\n * @param unlockMethodId The ID of the unlock method to remove.\n */\n async removeProjectUnlockMethod(projectId: string, unlockMethodId: string): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n // 1. fetch all unlock methods except the one to remove\n const unlockMethods = await tx.unlockMethod.findMany({\n where: { id: { not: unlockMethodId } },\n select: { type: true, recipient: true, encryptedIdentity: true },\n })\n\n if (unlockMethods.length === 0) {\n throw new CannotDeleteLastUnlockMethodError(projectId)\n }\n\n // 2. encrypt the project data for remaining recipients\n const encryptedMasterKey = await this.encryptProjectMasterKey(projectId, unlockMethods)\n\n // 3. delete the unlock method\n await tx.unlockMethod.delete({ where: { id: unlockMethodId } })\n\n // 4. update the project with the new master key and unlock suite\n await this.database.backend.project.update({\n where: { id: projectId },\n data: {\n encryptedMasterKey,\n unlockSuite: ProjectUnlockService.createUnlockSuite(unlockMethods),\n },\n })\n })\n }\n\n /**\n * Registers a new unlock task that will be executed when the project is unlocked.\n * This can be used to perform additional actions after unlocking, such as loading instance states.\n *\n * @param name The name of the unlock task.\n * @param handler The handler function for the unlock task. It receives the project ID as an argument.\n */\n registerUnlockTask(name: string, handler: (projectId: string) => Promise<void> | void): void {\n this.unlockTasks.push({ name, handler })\n }\n\n private async encryptProjectMasterKey(\n projectId: string,\n unlockMethods: { recipient: string }[],\n ): Promise<string> {\n const masterKey = await this.database.getProjectMasterKey(projectId)\n if (!masterKey) {\n // окак\n return \"encryption disabled\"\n }\n\n // encrypt the master key for all unlock methods\n const encrypter = new Encrypter()\n for (const unlockMethod of unlockMethods) {\n encrypter.addRecipient(unlockMethod.recipient)\n }\n\n const encryptedMasterKey = await encrypter.encrypt(masterKey)\n const armoredMasterKey = armor.encode(encryptedMasterKey)\n\n return armoredMasterKey\n }\n\n /**\n * Auto-unlocks the projects for the development environment.\n */\n async autoUnlockProjects(): Promise<void> {\n // just mark the projects as unlocked with an empty master key and run unlock tasks\n for (const projectId of this.config.HIGHSTATE_DEV_AUTO_UNLOCK_PROJECT_IDS) {\n const logger = createProjectLogger(this.logger, projectId)\n\n try {\n logger.info(\"auto-unlocking project (dev mode)\")\n\n await this.projectUnlockBackend.unlockProject(projectId, Buffer.alloc(0))\n await this.pubsubManager.publish([\"project-unlock-state\", projectId], { type: \"unlocked\" })\n await this.runUnlockTasks(projectId)\n } catch (error) {\n logger.error({ error }, \"failed to auto-unlock project\")\n }\n }\n }\n\n private static createUnlockSuite(\n unlockMethods: { type: string; encryptedIdentity: string }[],\n ): ProjectUnlockSuite {\n return {\n encryptedIdentities: unlockMethods.map(method => method.encryptedIdentity),\n hasPasskey: unlockMethods.some(method => method.type === \"passkey\"),\n }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { DatabaseManager, ProjectTransaction } from \"../database\"\nimport type { LibraryBackend } from \"../library\"\nimport type { PubSubManager } from \"../pubsub\"\nimport { randomBytes } from \"node:crypto\"\nimport { type CommonObjectMeta, isUnitModel, parseInstanceId } from \"@highstate/contract\"\nimport {\n InstanceStateNotFoundError,\n InvalidInstanceKindError,\n ProjectNotFoundError,\n SystemSecretNames,\n} from \"../shared\"\n\nexport class SecretService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly pubsubManager: PubSubManager,\n private readonly libraryBackend: LibraryBackend,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Updates the secrets for a specific instance within an existing transaction.\n * Only works with unit instances.\n *\n * @param tx The database transaction to use.\n * @param libraryId The ID of the library containing the component.\n * @param stateId The ID of the instance state.\n * @param secretValues The secrets to create or update. Existing secrets not in this update are preserved.\n * @returns The list of secret names that were updated or created.\n */\n async updateInstanceSecretsCore(\n tx: ProjectTransaction,\n libraryId: string,\n stateId: string,\n secretValues: Record<string, unknown>,\n ): Promise<string[]> {\n // verify instance exists and is a unit\n const state = await tx.instanceState.findUnique({\n where: { id: stateId },\n select: { kind: true, instanceId: true },\n })\n\n if (!state) {\n throw new InstanceStateNotFoundError(\"\", stateId)\n }\n\n if (state.kind !== \"unit\") {\n throw new InvalidInstanceKindError(\"\", stateId, \"unit\", state.kind)\n }\n\n const library = await this.libraryBackend.loadLibrary(libraryId)\n\n const [componentType] = parseInstanceId(state.instanceId)\n const component = library.components[componentType]\n\n if (!component) {\n throw new Error(`Component type \"${componentType}\" not found in library \"${libraryId}\"`)\n }\n\n if (!isUnitModel(component)) {\n throw new Error(`Component type \"${componentType}\" is not a unit model`)\n }\n\n // upsert provided secrets\n for (const [secretName, value] of Object.entries(secretValues)) {\n const componentSecret = component.secrets[secretName]\n if (!componentSecret) {\n throw new Error(`Secret \"${secretName}\" not defined in component \"${componentType}\"`)\n }\n\n const meta: CommonObjectMeta = {\n ...componentSecret.meta,\n\n // fallback to component icon if secret icon is not defined\n icon: componentSecret.meta.icon || component.meta.icon,\n iconColor: componentSecret.meta.iconColor || component.meta.iconColor,\n }\n\n await tx.secret.upsert({\n where: {\n stateId_name: {\n stateId,\n name: secretName,\n },\n },\n update: {\n meta,\n content: value,\n },\n create: {\n stateId,\n name: secretName,\n meta,\n content: value,\n },\n })\n }\n\n return Object.keys(secretValues)\n }\n\n /**\n * Updates secrets for a specific instance, handling creation and updates.\n * Only works with unit instances.\n *\n * @param projectId The project ID containing the instance.\n * @param stateId The ID of the instance state.\n * @param secretValues The secrets to create or update. Existing secrets not in this update are preserved.\n */\n async updateInstanceSecrets(\n projectId: string,\n stateId: string,\n secretValues: Record<string, unknown>,\n ): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n const project = await this.database.backend.project.findUnique({\n where: { id: projectId },\n select: { libraryId: true },\n })\n\n if (!project) {\n throw new ProjectNotFoundError(projectId)\n }\n\n const statePatch = await database.$transaction(async tx => {\n await this.updateInstanceSecretsCore(tx, project.libraryId, stateId, secretValues)\n\n // invalidate instance state\n const state = await tx.instanceState.update({\n where: { id: stateId },\n data: { inputHashNonce: randomBytes(4).readInt32LE() },\n select: { inputHashNonce: true },\n })\n\n return { ...state, secretNames: Object.keys(secretValues) }\n })\n\n this.pubsubManager.publish([\"instance-state\", projectId], {\n type: \"patched\",\n stateId,\n patch: statePatch,\n })\n\n this.logger.info(\n {\n projectId,\n stateId,\n secretCount: Object.keys(secretValues).length,\n },\n \"updated instance secrets\",\n )\n }\n\n /**\n * Gets the values of all secrets for a specific instance.\n * Only works with unit instances.\n *\n * @param projectId The project ID containing the instance.\n * @param stateId The ID of the instance state.\n * @returns A record of secret key-value pairs.\n */\n async getInstanceSecretValues(\n projectId: string,\n stateId: string,\n ): Promise<Record<string, unknown>> {\n const database = await this.database.forProject(projectId)\n\n // verify instance exists and is a unit\n const state = await database.instanceState.findUnique({\n where: { id: stateId },\n select: { kind: true },\n })\n\n if (!state) {\n throw new InstanceStateNotFoundError(projectId, stateId)\n }\n\n if (state.kind !== \"unit\") {\n throw new InvalidInstanceKindError(projectId, stateId, \"unit\", state.kind)\n }\n\n const secrets = await database.secret.findMany({\n where: {\n stateId,\n name: { not: null },\n },\n })\n\n const values: Record<string, unknown> = {}\n\n for (const secret of secrets) {\n if (secret.name) {\n values[secret.name] = secret.content\n }\n }\n\n return values\n }\n\n /**\n * Gets or creates the Pulumi password secret for the given project.\n * Uses the new direct systemName field approach.\n *\n * @param projectId The ID of the project for which to get or create the Pulumi password.\n * @returns The Pulumi password.\n */\n async getPulumiPassword(projectId: string): Promise<string> {\n const database = await this.database.forProject(projectId)\n\n return await database.$transaction(async tx => {\n const existingSecret = await tx.secret.findUnique({\n where: {\n systemName: SystemSecretNames.PulumiPassword,\n },\n })\n\n if (existingSecret) {\n return existingSecret.content as string\n }\n\n const newPassword = randomBytes(32).toString(\"hex\")\n\n await tx.secret.create({\n data: {\n systemName: SystemSecretNames.PulumiPassword,\n meta: {\n title: \"Pulumi Password\",\n description: \"The password used to encrypt the Pulumi state.\",\n icon: \"devicon:pulumi\",\n },\n content: newPassword,\n },\n })\n\n this.logger.info({ projectId }, \"created new Pulumi password\")\n return newPassword\n })\n }\n}\n","import type { CommonObjectMeta } from \"@highstate/contract\"\nimport type { DatabaseManager } from \"../database\"\nimport type {\n ApiKeyWhereInput,\n ArtifactWhereInput,\n OperationWhereInput,\n PageWhereInput,\n SecretWhereInput,\n ServiceAccountWhereInput,\n TerminalWhereInput,\n TriggerWhereInput,\n UnlockMethodWhereInput,\n WorkerVersionWhereInput,\n WorkerWhereInput,\n} from \"../database/_generated/project/models\"\nimport type {\n ApiKeyOutput,\n ApiKeyQuery,\n ArtifactOutput,\n ArtifactQuery,\n CollectionQuery,\n CollectionQueryResult,\n OperationOutput,\n OperationType,\n PageDetailsOutput,\n PageOutput,\n PageQuery,\n SecretOutput,\n SecretQuery,\n ServiceAccountOutput,\n ServiceAccountQuery,\n TerminalDetailsOutput,\n TerminalOutput,\n TerminalQuery,\n TerminalSessionOutput,\n TriggerOutput,\n TriggerQuery,\n UnlockMethodOutput,\n WorkerOutput,\n WorkerQuery,\n WorkerVersionOutput,\n} from \"../shared\"\nimport {\n apiKeyOutputSchema,\n artifactOutputSchema,\n forSchema,\n operationOutputSchema,\n pageDetailsOutputSchema,\n pageOutputSchema,\n secretOutputSchema,\n serviceAccountOutputSchema,\n terminalDetailsOutputSchema,\n terminalOutputSchema,\n toApiKeyOutput,\n toPageOutput,\n toSecretOutput,\n toTerminalDetailsOutput,\n toTerminalOutput,\n toWorkerOutput,\n toWorkerVersionOutput,\n triggerOutputSchema,\n unlockMethodOutputSchema,\n workerOutputSchema,\n workerVersionOutputSchema,\n} from \"../shared\"\n\nexport class SettingsService {\n constructor(private readonly database: DatabaseManager) {}\n\n private buildOperationWhere(query: CollectionQuery): OperationWhereInput {\n if (!query.search) return {}\n\n const searchTerm = query.search.toLowerCase()\n const OR: OperationWhereInput[] = [{ meta: { path: \"title\", string_contains: query.search } }]\n\n const matchingOperationTypes = [\"update\", \"preview\", \"destroy\", \"recreate\", \"refresh\"].filter(\n t => t.toLowerCase().includes(searchTerm),\n ) as OperationType[]\n\n if (matchingOperationTypes.length > 0) {\n OR.push({ type: { in: matchingOperationTypes } })\n }\n\n return { OR }\n }\n\n private buildTerminalWhere(query: TerminalQuery): TerminalWhereInput {\n const where: TerminalWhereInput = {}\n\n if (query.serviceAccountId) {\n where.serviceAccountId = query.serviceAccountId\n }\n\n if (query.stateId) {\n where.stateId = query.stateId\n }\n\n if (query.artifactId) {\n where.artifacts = {\n some: { id: query.artifactId },\n }\n }\n\n if (!query.search) return where\n\n return {\n ...where,\n OR: [\n { meta: { path: \"title\", string_contains: query.search } },\n { name: { contains: query.search } },\n ],\n }\n }\n\n private buildPageWhere(query: PageQuery): PageWhereInput {\n const where: PageWhereInput = {}\n\n if (query.serviceAccountId) {\n where.serviceAccountId = query.serviceAccountId\n }\n\n if (query.stateId) {\n where.stateId = query.stateId\n }\n\n if (query.artifactId) {\n where.artifacts = {\n some: { id: query.artifactId },\n }\n }\n\n if (!query.search) return where\n\n return {\n ...where,\n OR: [\n { meta: { path: \"title\", string_contains: query.search } },\n { name: { contains: query.search } },\n ],\n }\n }\n\n private buildSecretWhere(query: SecretQuery): SecretWhereInput {\n const where: SecretWhereInput = {}\n\n if (query.serviceAccountId) {\n where.serviceAccountId = query.serviceAccountId\n }\n\n if (query.stateId) {\n where.stateId = query.stateId\n }\n\n if (!query.search) return where\n\n return {\n ...where,\n OR: [\n { meta: { path: \"title\", string_contains: query.search } },\n { name: { contains: query.search } },\n ],\n }\n }\n\n private buildTriggerWhere(query: TriggerQuery): TriggerWhereInput {\n const where: TriggerWhereInput = {}\n\n if (query.stateId) {\n where.stateId = query.stateId\n }\n\n if (query.search) {\n where.OR = [\n { meta: { path: \"title\", string_contains: query.search } },\n { name: { contains: query.search } },\n ]\n }\n\n return where\n }\n\n private buildArtifactWhere(query: ArtifactQuery): ArtifactWhereInput {\n const where: ArtifactWhereInput = {}\n\n if (query.stateId) {\n where.instances = {\n some: { id: query.stateId },\n }\n }\n\n if (query.serviceAccountId) {\n where.serviceAccounts = {\n some: { id: query.serviceAccountId },\n }\n }\n\n if (query.terminalId) {\n where.terminals = {\n some: { id: query.terminalId },\n }\n }\n\n if (query.pageId) {\n where.pages = {\n some: { id: query.pageId },\n }\n }\n\n if (!query.search) return where\n\n return {\n ...where,\n OR: [\n { meta: { path: \"title\", string_contains: query.search } },\n { hash: { contains: query.search } },\n ],\n }\n }\n\n private buildWorkerWhere(query: WorkerQuery): WorkerWhereInput {\n const where: WorkerWhereInput = {}\n\n if (query.serviceAccountId) {\n where.serviceAccountId = query.serviceAccountId\n }\n\n if (!query.search) return where\n\n return {\n ...where,\n OR: [{ id: { contains: query.search } }, { identity: { contains: query.search } }],\n }\n }\n\n private buildWorkerVersionWhere(\n workerId: string,\n query: CollectionQuery,\n ): WorkerVersionWhereInput {\n const where: WorkerVersionWhereInput = { workerId }\n\n if (!query.search) return where\n\n return {\n ...where,\n OR: [\n { id: { contains: query.search } },\n { meta: { path: \"title\", string_contains: query.search } },\n { digest: { contains: query.search } },\n ],\n }\n }\n\n private buildUnlockMethodWhere(query: CollectionQuery): UnlockMethodWhereInput {\n if (!query.search) return {}\n\n const searchTerm = query.search.toLowerCase()\n const OR: UnlockMethodWhereInput[] = [\n { meta: { path: \"title\", string_contains: query.search } },\n ]\n\n const matchingTypes = [\"password\", \"passkey\"].filter(t =>\n t.toLowerCase().includes(searchTerm),\n ) as (\"password\" | \"passkey\")[]\n\n if (matchingTypes.length > 0) {\n OR.push({ type: { in: matchingTypes } })\n }\n\n return { OR }\n }\n\n private buildServiceAccountWhere(query: ServiceAccountQuery): ServiceAccountWhereInput {\n const where: ServiceAccountWhereInput = {}\n\n if (query.artifactId) {\n where.artifacts = {\n some: { id: query.artifactId },\n }\n }\n\n if (!query.search) return where\n\n return {\n ...where,\n OR: [\n { id: { contains: query.search } },\n { meta: { path: \"title\", string_contains: query.search } },\n ],\n }\n }\n\n private buildApiKeyWhere(query: ApiKeyQuery): ApiKeyWhereInput {\n const where: ApiKeyWhereInput = {}\n\n if (query.serviceAccountId) {\n where.serviceAccountId = query.serviceAccountId\n }\n\n if (!query.search) return where\n\n return {\n ...where,\n OR: [\n { id: { contains: query.search } },\n { meta: { path: \"title\", string_contains: query.search } },\n { serviceAccountId: { contains: query.search } },\n ],\n }\n }\n\n private buildTerminalSessionWhere(query: CollectionQuery, terminalId: string) {\n const baseWhere = { terminalId }\n\n if (!query.search) return baseWhere\n\n return {\n AND: [\n baseWhere,\n {\n OR: [{ id: { contains: query.search } }],\n },\n ],\n }\n }\n\n private buildOrderBy(query: CollectionQuery, defaultField: string) {\n if (!query.sortBy || query.sortBy.length === 0) {\n return { [defaultField]: \"desc\" }\n }\n\n if (query.sortBy.length === 1) {\n const sort = query.sortBy[0]\n return { [sort.key]: sort.order }\n }\n\n return query.sortBy.map(sort => ({ [sort.key]: sort.order }))\n }\n\n async queryOperations(\n projectId: string,\n query: CollectionQuery,\n ): Promise<CollectionQueryResult<OperationOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildOperationWhere(query)\n\n const [total, items] = await Promise.all([\n db.operation.count({ where: whereClause }),\n db.operation.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"startedAt\"),\n skip: query.skip,\n take: query.count,\n select: forSchema(operationOutputSchema),\n }),\n ])\n\n return { items, total }\n }\n\n async queryTerminals(\n projectId: string,\n query: TerminalQuery,\n ): Promise<CollectionQueryResult<TerminalOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildTerminalWhere(query)\n\n const [total, items] = await Promise.all([\n db.terminal.count({ where: whereClause }),\n db.terminal.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: {\n ...forSchema(terminalOutputSchema.omit({ serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n },\n }),\n ])\n\n const terminalOutputItems = items.map(item => toTerminalOutput(item, item.serviceAccount))\n return { items: terminalOutputItems, total }\n }\n\n async getTerminalDetails(\n projectId: string,\n terminalId: string,\n ): Promise<TerminalDetailsOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const terminal = await db.terminal.findUnique({\n where: { id: terminalId },\n select: {\n ...forSchema(terminalDetailsOutputSchema.omit({ serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n },\n })\n\n if (!terminal) return null\n return toTerminalDetailsOutput(terminal, terminal?.serviceAccount)\n }\n\n async getServiceAccountDetails(\n projectId: string,\n serviceAccountId: string,\n ): Promise<ServiceAccountOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const serviceAccount = await db.serviceAccount.findUnique({\n where: { id: serviceAccountId },\n select: forSchema(serviceAccountOutputSchema),\n })\n\n return serviceAccount\n }\n\n async getApiKeyDetails(projectId: string, apiKeyId: string): Promise<ApiKeyOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const apiKey = await db.apiKey.findUnique({\n where: { id: apiKeyId },\n select: {\n ...forSchema(apiKeyOutputSchema.omit({ serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n },\n })\n\n if (!apiKey) return null\n\n return toApiKeyOutput(apiKey, apiKey.serviceAccount)\n }\n\n async getWorkerDetails(projectId: string, workerId: string): Promise<WorkerOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const worker = await db.worker.findUnique({\n where: { id: workerId },\n select: {\n ...forSchema(workerOutputSchema.omit({ meta: true, serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n versions: {\n orderBy: { createdAt: \"desc\" },\n take: 1,\n select: { meta: true },\n },\n },\n })\n\n if (!worker) return null\n\n const lastVersion = worker.versions?.[0] ?? null\n return toWorkerOutput(worker, lastVersion, worker.serviceAccount)\n }\n\n async getWorkerVersionDetails(\n projectId: string,\n versionId: string,\n ): Promise<WorkerVersionOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const version = await db.workerVersion.findUnique({\n where: { id: versionId },\n select: {\n ...forSchema(workerVersionOutputSchema.omit({ apiKeyMeta: true })),\n apiKey: {\n select: { meta: true },\n },\n },\n })\n\n if (!version) return null\n\n return toWorkerVersionOutput(version, version.apiKey)\n }\n\n async getPageDetails(projectId: string, pageId: string): Promise<PageDetailsOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const page = await db.page.findUnique({\n where: { id: pageId },\n select: {\n ...forSchema(pageDetailsOutputSchema.omit({ serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n },\n })\n\n if (!page) return null\n\n return {\n ...toPageOutput(page, page.serviceAccount),\n content: page.content,\n }\n }\n\n async getSecretDetails(projectId: string, secretId: string): Promise<SecretOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const secret = await db.secret.findUnique({\n where: { id: secretId },\n select: {\n ...forSchema(secretOutputSchema.omit({ serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n },\n })\n\n if (!secret) return null\n\n return toSecretOutput(secret, secret.serviceAccount)\n }\n\n async getSecretValue(projectId: string, secretId: string): Promise<unknown> {\n const db = await this.database.forProject(projectId)\n\n const secret = await db.secret.findUnique({\n where: { id: secretId },\n select: {\n content: true,\n },\n })\n\n if (!secret) return null\n\n return secret.content\n }\n\n async getArtifactDetails(projectId: string, artifactId: string): Promise<ArtifactOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const artifact = await db.artifact.findUnique({\n where: { id: artifactId },\n select: forSchema(artifactOutputSchema),\n })\n\n return artifact\n }\n\n async getOperationDetails(\n projectId: string,\n operationId: string,\n ): Promise<OperationOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const operation = await db.operation.findUnique({\n where: { id: operationId },\n select: forSchema(operationOutputSchema),\n })\n\n return operation\n }\n\n async getTriggerDetails(projectId: string, triggerId: string): Promise<TriggerOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const trigger = await db.trigger.findUnique({\n where: { id: triggerId },\n select: forSchema(triggerOutputSchema),\n })\n\n return trigger\n }\n\n async getUnlockMethodDetails(\n projectId: string,\n unlockMethodId: string,\n ): Promise<UnlockMethodOutput | null> {\n const db = await this.database.forProject(projectId)\n\n const unlockMethod = await db.unlockMethod.findUnique({\n where: { id: unlockMethodId },\n select: forSchema(unlockMethodOutputSchema),\n })\n\n return unlockMethod\n }\n\n async getTerminalSessions(\n projectId: string,\n terminalId: string,\n query: CollectionQuery,\n ): Promise<CollectionQueryResult<TerminalSessionOutput>> {\n const db = await this.database.forProject(projectId)\n\n const whereClause = this.buildTerminalSessionWhere(query, terminalId)\n\n const [total, sessions] = await Promise.all([\n db.terminalSession.count({ where: whereClause }),\n db.terminalSession.findMany({\n where: whereClause,\n include: {\n terminal: {\n select: {\n meta: true,\n },\n },\n },\n orderBy: this.buildOrderBy(query, \"startedAt\"),\n skip: query.skip,\n take: query.count,\n }),\n ])\n\n const items = sessions.map(session => ({\n id: session.id,\n terminalId: session.terminalId,\n meta: session.terminal.meta as CommonObjectMeta,\n startedAt: session.startedAt,\n finishedAt: session.finishedAt,\n }))\n\n return { items, total }\n }\n\n async queryPages(\n projectId: string,\n query: PageQuery,\n ): Promise<CollectionQueryResult<PageOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildPageWhere(query)\n\n const [total, items] = await Promise.all([\n db.page.count({ where: whereClause }),\n db.page.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: {\n ...forSchema(pageOutputSchema.omit({ serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n },\n }),\n ])\n\n const pageOutputItems = items.map(item => toPageOutput(item, item.serviceAccount))\n return { items: pageOutputItems, total }\n }\n\n async querySecrets(\n projectId: string,\n query: SecretQuery,\n ): Promise<CollectionQueryResult<SecretOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildSecretWhere(query)\n\n const [total, items] = await Promise.all([\n db.secret.count({ where: whereClause }),\n db.secret.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: {\n ...forSchema(secretOutputSchema.omit({ serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n },\n }),\n ])\n\n const secretOutputItems = items.map(item => toSecretOutput(item, item.serviceAccount))\n return { items: secretOutputItems, total }\n }\n\n async queryTriggers(\n projectId: string,\n query: TriggerQuery,\n ): Promise<CollectionQueryResult<TriggerOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildTriggerWhere(query)\n\n const [total, items] = await Promise.all([\n db.trigger.count({ where: whereClause }),\n db.trigger.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: forSchema(triggerOutputSchema),\n }),\n ])\n\n return { items, total }\n }\n\n async queryArtifacts(\n projectId: string,\n query: ArtifactQuery,\n ): Promise<CollectionQueryResult<ArtifactOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildArtifactWhere(query)\n\n const [total, items] = await Promise.all([\n db.artifact.count({ where: whereClause }),\n db.artifact.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: forSchema(artifactOutputSchema),\n }),\n ])\n\n return { items, total }\n }\n\n async queryWorkers(\n projectId: string,\n query: WorkerQuery,\n ): Promise<CollectionQueryResult<WorkerOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildWorkerWhere(query)\n\n const [total, items] = await Promise.all([\n db.worker.count({ where: whereClause }),\n db.worker.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: {\n ...forSchema(workerOutputSchema.omit({ meta: true, serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n versions: {\n orderBy: { createdAt: \"desc\" },\n take: 1,\n select: { meta: true },\n },\n },\n }),\n ])\n\n const workerOutputItems = items.map(item => {\n const lastVersion = item.versions?.[0] ?? null\n\n return toWorkerOutput(item, lastVersion, item.serviceAccount)\n })\n\n return { items: workerOutputItems, total }\n }\n\n async queryWorkerVersions(\n projectId: string,\n workerId: string,\n query: CollectionQuery,\n ): Promise<CollectionQueryResult<WorkerVersionOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildWorkerVersionWhere(workerId, query)\n\n const [total, items] = await Promise.all([\n db.workerVersion.count({ where: whereClause }),\n db.workerVersion.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: {\n ...forSchema(workerVersionOutputSchema.omit({ apiKeyMeta: true })),\n apiKey: {\n select: { meta: true },\n },\n },\n }),\n ])\n\n const outputItems = items.map(item => toWorkerVersionOutput(item, item.apiKey))\n\n return { items: outputItems, total }\n }\n\n async queryUnlockMethods(\n projectId: string,\n query: CollectionQuery,\n ): Promise<CollectionQueryResult<UnlockMethodOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildUnlockMethodWhere(query)\n\n const [total, items] = await Promise.all([\n db.unlockMethod.count({ where: whereClause }),\n db.unlockMethod.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: forSchema(unlockMethodOutputSchema),\n }),\n ])\n\n return { items, total }\n }\n\n async queryServiceAccounts(\n projectId: string,\n query: ServiceAccountQuery,\n ): Promise<CollectionQueryResult<ServiceAccountOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildServiceAccountWhere(query)\n\n const [total, items] = await Promise.all([\n db.serviceAccount.count({ where: whereClause }),\n db.serviceAccount.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n }),\n ])\n\n return { items, total }\n }\n\n async queryApiKeys(\n projectId: string,\n query: ApiKeyQuery,\n ): Promise<CollectionQueryResult<ApiKeyOutput>> {\n const db = await this.database.forProject(projectId)\n const whereClause = this.buildApiKeyWhere(query)\n\n const [total, items] = await Promise.all([\n db.apiKey.count({ where: whereClause }),\n db.apiKey.findMany({\n where: whereClause,\n orderBy: this.buildOrderBy(query, \"createdAt\"),\n skip: query.skip,\n take: query.count,\n select: {\n ...forSchema(apiKeyOutputSchema.omit({ serviceAccountMeta: true })),\n serviceAccount: {\n select: { meta: true },\n },\n },\n }),\n ])\n\n const apiKeyOutputItems = items.map(item => toApiKeyOutput(item, item.serviceAccount))\n\n return { items: apiKeyOutputItems, total }\n }\n}\n","import type { DatabaseManager, TerminalSessionLog } from \"../database\"\nimport {\n type TerminalSessionOutput,\n toTerminalSessionOutput,\n} from \"../shared/models/project/terminal\"\n\n/**\n * Business service for managing terminal sessions\n */\nexport class TerminalSessionService {\n constructor(private readonly database: DatabaseManager) {}\n\n /**\n * Get terminal sessions for a specific instance\n *\n * @param projectId The project ID\n * @param stateId The state ID to get sessions for\n * @returns Array of terminal session outputs with metadata\n */\n async getInstanceTerminalSessions(\n projectId: string,\n stateId: string,\n ): Promise<TerminalSessionOutput[]> {\n const database = await this.database.forProject(projectId)\n\n const sessions = await database.terminalSession.findMany({\n include: {\n terminal: {\n select: { meta: true },\n },\n },\n where: {\n terminal: {\n stateId,\n },\n },\n orderBy: { startedAt: \"desc\" },\n take: 20,\n })\n\n return sessions.map(session => ({\n ...session,\n projectId,\n meta: session.terminal.meta,\n }))\n }\n\n /**\n * Get a specific terminal session by ID\n *\n * @param projectId The project ID\n * @param sessionId The session ID to get\n * @returns Terminal session output with metadata or null if not found\n */\n async getTerminalSession(\n projectId: string,\n sessionId: string,\n ): Promise<TerminalSessionOutput | null> {\n const database = await this.database.forProject(projectId)\n\n const session = await database.terminalSession.findUnique({\n where: { id: sessionId },\n include: {\n terminal: true,\n },\n })\n\n if (!session) {\n return null\n }\n\n return toTerminalSessionOutput(session.terminal, session)\n }\n\n /**\n * Get session history (logs) for a specific terminal session\n *\n * @param projectId The project ID\n * @param sessionId The session ID to get history for\n * @returns Array of session logs ordered by creation time\n */\n async getSessionHistory(projectId: string, sessionId: string): Promise<TerminalSessionLog[]> {\n const database = await this.database.forProject(projectId)\n\n return await database.terminalSessionLog.findMany({\n where: { sessionId },\n orderBy: { id: \"asc\" },\n })\n }\n}\n","import type { UnitPage, UnitTerminal, UnitTrigger } from \"@highstate/contract\"\nimport type { DatabaseManager, ProjectTransaction } from \"../database\"\n\nexport class UnitExtraService {\n constructor(private readonly database: DatabaseManager) {}\n\n /**\n * Processes unit terminals within an existing transaction.\n *\n * @param tx The database transaction to use.\n * @param stateId The ID of the instance state.\n * @param unitTerminals The unit terminals to process.\n * @returns Array of terminal IDs that are active for this instance.\n */\n async processUnitTerminals(\n tx: ProjectTransaction,\n stateId: string,\n unitTerminals: UnitTerminal[],\n ): Promise<string[]> {\n const terminalIds: string[] = []\n\n // upsert terminals\n for (const unit of unitTerminals) {\n const terminal = await tx.terminal.upsert({\n where: { stateId_name: { stateId, name: unit.name } },\n create: {\n stateId,\n name: unit.name,\n meta: unit.meta ?? {},\n spec: unit.spec,\n status: \"active\",\n },\n update: {\n meta: unit.meta ?? {},\n spec: unit.spec,\n status: \"active\",\n },\n select: { id: true },\n })\n terminalIds.push(terminal.id)\n }\n\n // mark dangling terminals as unavailable\n const unitNames = unitTerminals.map(u => u.name)\n await tx.terminal.updateMany({\n where: {\n stateId,\n name: { notIn: unitNames },\n status: \"active\",\n },\n data: { status: \"unavailable\" },\n })\n\n return terminalIds\n }\n\n /**\n * Processes unit pages within an existing transaction.\n *\n * @param tx The database transaction to use.\n * @param stateId The ID of the instance state.\n * @param unitPages The unit pages to process.\n * @returns Array of page IDs that exist for this instance.\n */\n async processUnitPages(\n tx: ProjectTransaction,\n stateId: string,\n unitPages: UnitPage[],\n ): Promise<string[]> {\n const pageIds: string[] = []\n\n // upsert pages\n for (const unit of unitPages) {\n const page = await tx.page.upsert({\n where: { stateId_name: { stateId, name: unit.name } },\n create: {\n stateId,\n name: unit.name,\n meta: unit.meta ?? {},\n content: unit.content,\n },\n update: {\n meta: unit.meta ?? {},\n content: unit.content,\n },\n select: { id: true },\n })\n pageIds.push(page.id)\n }\n\n // delete dangling pages\n const unitNames = unitPages.map(u => u.name)\n await tx.page.deleteMany({\n where: {\n stateId,\n name: { notIn: unitNames },\n },\n })\n\n return pageIds\n }\n\n /**\n * Processes unit triggers within an existing transaction.\n *\n * @param tx The database transaction to use.\n * @param stateId The ID of the instance state.\n * @param unitTriggers The unit triggers to process.\n * @returns Array of trigger IDs that exist for this instance.\n */\n async processUnitTriggers(\n tx: ProjectTransaction,\n stateId: string,\n unitTriggers: UnitTrigger[],\n ): Promise<string[]> {\n const triggerIds: string[] = []\n\n // upsert triggers\n for (const unit of unitTriggers) {\n const trigger = await tx.trigger.upsert({\n where: { stateId_name: { stateId, name: unit.name } },\n create: {\n stateId,\n name: unit.name,\n meta: unit.meta ?? {},\n spec: unit.spec,\n },\n update: {\n meta: unit.meta ?? {},\n spec: unit.spec,\n },\n select: { id: true },\n })\n triggerIds.push(trigger.id)\n }\n\n // delete dangling triggers\n const unitNames = unitTriggers.map(u => u.name)\n await tx.trigger.deleteMany({\n where: {\n stateId,\n name: { notIn: unitNames },\n },\n })\n\n return triggerIds\n }\n\n /**\n * Disconnects artifacts that are no longer referenced by the instance.\n *\n * @param tx The database transaction to use.\n * @param stateId The ID of the instance state.\n * @param artifactIds The artifact IDs that should remain connected to the instance.\n */\n async pruneInstanceArtifacts(\n tx: ProjectTransaction,\n stateId: string,\n artifactIds: string[],\n ): Promise<void> {\n const staleArtifacts = await tx.artifact.findMany({\n where: {\n instances: {\n some: {\n id: stateId,\n },\n },\n id: artifactIds.length > 0 ? { notIn: artifactIds } : undefined,\n },\n select: {\n id: true,\n },\n })\n\n if (staleArtifacts.length === 0) {\n return\n }\n\n await tx.instanceState.update({\n where: { id: stateId },\n data: {\n artifacts: {\n disconnect: staleArtifacts.map(artifact => ({ id: artifact.id })),\n },\n },\n })\n }\n\n /**\n * Gets all triggers for a specific instance.\n *\n * @param projectId The project ID.\n * @param stateId The ID of the instance state to get triggers for.\n */\n async getInstanceTriggers(projectId: string, stateId: string) {\n const database = await this.database.forProject(projectId)\n\n return database.trigger.findMany({ where: { stateId } })\n }\n}\n","import type { CommonObjectMeta, UnitWorker } from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type {\n DatabaseManager,\n ProjectTransaction,\n Worker,\n WorkerVersion,\n WorkerVersionLog,\n} from \"../database\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { WorkerManager } from \"../worker\"\nimport { randomBytes } from \"node:crypto\"\nimport { PrismaClientKnownRequestError } from \"@prisma/client/runtime/client\"\nimport { createProjectLogger } from \"../common\"\nimport {\n extractDigestFromImage,\n getWorkerIdentity,\n type WorkerUnitRegistrationEvent,\n} from \"../shared\"\nimport { WorkerVersionNotFoundError } from \"../shared/models/errors\"\n\nexport class WorkerService {\n constructor(\n private readonly database: DatabaseManager,\n private readonly workerManager: WorkerManager,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Updates unit worker registrations for an instance in a single transaction\n * creates workers and worker versions as needed and cleans up removed registrations\n *\n * @param tx The transaction to use for database operations.\n * @param projectId The ID of the project containing the instance.\n * @param stateId The ID of the instance state to update registrations for.\n * @param unitWorkers The list workers provided by the unit.\n */\n async updateUnitRegistrations(\n tx: ProjectTransaction,\n projectId: string,\n stateId: string,\n unitWorkers: UnitWorker[],\n ): Promise<void> {\n // parse images first\n const parsedWorkers = unitWorkers.map(w => {\n const digest = extractDigestFromImage(w.image)\n const identity = getWorkerIdentity(w.image)\n\n return { ...w, digest, identity }\n })\n\n const logger = createProjectLogger(this.logger, projectId)\n\n const eventsToPublish: { workerVersionId: string; event: WorkerUnitRegistrationEvent }[] = []\n\n // query all registrations for the instance\n const existingRegistrations = await tx.workerUnitRegistration.findMany({\n where: { stateId },\n select: { stateId: true, name: true, params: true, workerVersionId: true },\n })\n\n // the set of names we want to keep\n const desiredNames = new Set(parsedWorkers.map(w => w.name))\n\n for (const worker of parsedWorkers) {\n const workerRecord = await this.ensureWorker(tx, worker.identity)\n const workerVersionRecord = await this.ensureWorkerVersion(tx, workerRecord, worker.digest)\n\n const existing = existingRegistrations.find(r => r.name === worker.name)\n const stringifiedParams = JSON.stringify(worker.params)\n\n // create a new registration if it doesn't exist\n if (!existing) {\n await tx.workerUnitRegistration.create({\n data: {\n stateId,\n name: worker.name,\n params: worker.params,\n workerVersionId: workerVersionRecord.id,\n },\n })\n\n eventsToPublish.push({\n workerVersionId: workerVersionRecord.id,\n event: { type: \"registered\", instanceId: stateId, params: worker.params },\n })\n\n continue\n }\n\n const paramsChanged = JSON.stringify(existing.params) !== stringifiedParams\n const versionChanged = existing.workerVersionId !== workerVersionRecord.id\n\n // update existing registration if params or version changed\n if (paramsChanged || versionChanged) {\n await tx.workerUnitRegistration.update({\n where: { stateId_name: { stateId, name: worker.name } },\n data: {\n params: worker.params,\n workerVersionId: workerVersionRecord.id,\n },\n })\n\n // deregister from old worker version if it changed\n if (versionChanged) {\n eventsToPublish.push({\n workerVersionId: existing.workerVersionId,\n event: { type: \"deregistered\", instanceId: stateId },\n })\n }\n\n eventsToPublish.push({\n workerVersionId: workerVersionRecord.id,\n event: { type: \"registered\", instanceId: stateId, params: worker.params },\n })\n }\n }\n\n // remove registrations that are no longer desired\n for (const registration of existingRegistrations) {\n if (!desiredNames.has(registration.name)) {\n await tx.workerUnitRegistration.delete({\n where: { stateId_name: { stateId, name: registration.name } },\n })\n\n eventsToPublish.push({\n workerVersionId: registration.workerVersionId,\n event: { type: \"deregistered\", instanceId: stateId },\n })\n }\n }\n\n await this.cleanupUnusedWorkerVersions(tx)\n\n // publish events after transaction commits\n for (const { workerVersionId, event } of eventsToPublish) {\n void this.pubsubManager.publish(\n [\"worker-unit-registration\", projectId, workerVersionId],\n event,\n )\n }\n\n // ensure all worker versions are started\n void this.workerManager.syncWorkers(projectId)\n\n logger.info(`updated worker registrations for instance state \"%s\"`, stateId)\n }\n\n private async ensureWorker(tx: ProjectTransaction, identity: string): Promise<Worker> {\n const existing = await tx.worker.findUnique({ where: { identity } })\n if (existing) {\n return existing\n }\n\n // create a new service account for the worker\n const serviceAccount = await tx.serviceAccount.create({\n select: { id: true },\n data: {\n meta: {\n // this generic meta should be replaced by the worker when it starts\n title: \"Worker Service Account\",\n description: `Automatically created for worker \"${identity}\".`,\n },\n },\n })\n\n return await tx.worker.create({\n data: {\n identity,\n serviceAccountId: serviceAccount.id,\n },\n })\n }\n\n private async ensureWorkerVersion(\n tx: ProjectTransaction,\n worker: Worker,\n digest: string,\n ): Promise<WorkerVersion> {\n const existing = await tx.workerVersion.findUnique({ where: { digest } })\n if (existing) {\n return existing\n }\n\n // create an API key for the worker granting full access to its service account\n const apiKey = await tx.apiKey.create({\n data: {\n meta: {\n title: `Worker API Key for \"${worker.identity}\"`,\n description: `Automatically created for worker \"${worker.identity}\" with digest \"${digest}\".`,\n },\n serviceAccountId: worker.serviceAccountId,\n token: randomBytes(32).toString(\"hex\"),\n },\n })\n\n return await tx.workerVersion.create({\n data: {\n workerId: worker.id,\n digest,\n meta: {\n title: \"Worker Version\",\n description: `Worker version with digest ${digest}`,\n },\n apiKeyId: apiKey.id,\n },\n })\n }\n\n /**\n * Performs cleanup of unused worker versions and syncs workers for a project.\n * This method should be called after operations that may leave unused workers.\n *\n * @param projectId The ID of the project to cleanup and sync workers for.\n */\n async cleanupWorkerUsageAndSync(projectId: string): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n await this.cleanupUnusedWorkerVersions(tx)\n })\n\n // ensure all worker versions are started\n void this.workerManager.syncWorkers(projectId)\n }\n\n private async cleanupUnusedWorkerVersions(tx: ProjectTransaction): Promise<void> {\n const unused = await tx.workerVersion.findMany({\n where: {\n unitRegistrations: { none: {} },\n },\n select: { id: true },\n })\n\n if (unused.length === 0) {\n return\n }\n\n await tx.workerVersion.deleteMany({\n where: { id: { in: unused.map(u => u.id) } },\n })\n }\n\n /**\n * Updates the metadata for a worker version.\n *\n * @param projectId The ID of the project.\n * @param workerVersionId The ID of the worker version to update.\n * @param meta The new metadata to set.\n */\n async updateWorkerVersionMeta(\n projectId: string,\n workerVersionId: string,\n meta: CommonObjectMeta,\n ): Promise<void> {\n const database = await this.database.forProject(projectId)\n const logger = createProjectLogger(this.logger, projectId)\n\n try {\n await database.workerVersion.update({\n where: { id: workerVersionId },\n data: { meta },\n })\n } catch (error) {\n if (error instanceof PrismaClientKnownRequestError && error.code === \"P2025\") {\n throw new WorkerVersionNotFoundError(projectId, workerVersionId)\n }\n\n throw error\n }\n\n logger.info(`updated worker version metadata for \"%s\"`, workerVersionId)\n }\n\n /**\n * Gets logs for a worker version.\n *\n * @param projectId The ID of the project.\n * @param workerVersionId The ID of the worker version to get logs for.\n */\n async getWorkerVersionLogs(\n projectId: string,\n workerVersionId: string,\n ): Promise<WorkerVersionLog[]> {\n const database = await this.database.forProject(projectId)\n\n return await database.workerVersionLog.findMany({\n where: {\n workerVersionId,\n },\n orderBy: {\n id: \"asc\",\n },\n })\n }\n}\n","import type { DatabaseManager } from \"../database\"\nimport type { ArtifactBackend } from \"./abstractions\"\nimport { xchacha20poly1305 } from \"@noble/ciphers/chacha\"\nimport { managedNonce } from \"@noble/ciphers/webcrypto\"\n\nconst nonceSize = 24\n\n/**\n * The ArtifactBackend decorator that adds encryption and key obfuscation to the artifact storage.\n */\nexport class EncryptionArtifactBackend implements ArtifactBackend {\n constructor(\n private readonly artifactBackend: ArtifactBackend,\n private readonly database: DatabaseManager,\n ) {}\n\n async store(\n projectId: string,\n artifactId: string,\n chunkSize: number,\n content: AsyncIterable<Uint8Array>,\n ): Promise<void> {\n const encryptedContent = this.getEncryptedContent(projectId, content)\n\n await this.artifactBackend.store(projectId, artifactId, chunkSize + nonceSize, encryptedContent)\n }\n\n private async *getEncryptedContent(\n projectId: string,\n content: AsyncIterable<Uint8Array>,\n ): AsyncIterable<Uint8Array> {\n const masterKey = await this.database.getProjectMasterKey(projectId)\n if (!masterKey) {\n throw new Error(`No master key found for project ${projectId}`)\n }\n\n const xchacha = managedNonce(xchacha20poly1305)(masterKey)\n\n for await (const chunk of content) {\n yield xchacha.encrypt(chunk)\n }\n }\n\n async retrieve(\n projectId: string,\n artifactId: string,\n chunkSize: number,\n ): Promise<AsyncIterable<Uint8Array> | null> {\n const encryptedContent = await this.artifactBackend.retrieve(\n projectId,\n artifactId,\n chunkSize + nonceSize,\n )\n\n if (encryptedContent === null) {\n return null\n }\n\n return this.getDecryptedContent(projectId, encryptedContent)\n }\n\n private async *getDecryptedContent(\n projectId: string,\n encryptedContent: AsyncIterable<Uint8Array>,\n ): AsyncIterable<Uint8Array> {\n const masterKey = await this.database.getProjectMasterKey(projectId)\n if (!masterKey) {\n throw new Error(`No master key found for project ${projectId}`)\n }\n\n const xchacha = managedNonce(xchacha20poly1305)(masterKey)\n\n for await (const chunk of encryptedContent) {\n yield xchacha.decrypt(chunk)\n }\n }\n\n async delete(projectId: string, hash: string): Promise<void> {\n return await this.artifactBackend.delete(projectId, hash)\n }\n\n async exists(projectId: string, hash: string): Promise<boolean> {\n return await this.artifactBackend.exists(projectId, hash)\n }\n}\n","import type { Logger } from \"pino\"\nimport type z from \"zod\"\nimport type { ArtifactBackend } from \"./abstractions\"\nimport { createReadStream, createWriteStream } from \"node:fs\"\nimport { access, mkdir, readdir, rm, unlink } from \"node:fs/promises\"\nimport { join, resolve } from \"node:path\"\nimport { codebaseConfig, createProjectLogger, getCodebaseHighstatePath } from \"../common\"\n\nexport const localArtifactBackendConfig = codebaseConfig\n\n/**\n * A local artifact backend that stores artifacts in the filesystem.\n *\n * File structure:\n * - `{codebase}/.highstate/projects/{projectId}/artifacts/{id}.{extension}`\n */\nexport class LocalArtifactBackend implements ArtifactBackend {\n constructor(\n private readonly hsCodebasePath: string,\n private readonly extension: string,\n private readonly logger: Logger,\n ) {}\n\n async store(\n projectId: string,\n artifactId: string,\n chunkSize: number,\n content: AsyncIterable<Uint8Array>,\n ): Promise<void> {\n const logger = createProjectLogger(this.logger, projectId)\n const [baseDir, fileName] = this.getArtifactPath(projectId, artifactId)\n await mkdir(baseDir, { recursive: true })\n\n // check if the artifact already exists\n try {\n await access(fileName)\n logger.debug({ artifactId }, \"artifact already exists\")\n return\n } catch {\n // artifact does not exist, continue with storing\n }\n\n const file = createWriteStream(fileName, { highWaterMark: chunkSize })\n logger.debug({ artifactId, fileName }, \"opened file for writing\")\n\n for await (const chunk of content) {\n file.write(chunk)\n }\n\n file.end()\n logger.info({ artifactId, fileName }, \"artifact stored\")\n }\n\n async retrieve(\n projectId: string,\n artifactId: string,\n chunkSize: number,\n ): Promise<AsyncIterable<Uint8Array> | null> {\n const logger = createProjectLogger(this.logger, projectId)\n const [, fileName] = this.getArtifactPath(projectId, artifactId)\n\n try {\n return Promise.resolve(createReadStream(fileName, { highWaterMark: chunkSize }))\n } catch (error) {\n logger.debug({ hash: artifactId, error }, \"artifact retrieval failed\")\n return null\n }\n }\n\n async delete(projectId: string, hash: string): Promise<void> {\n const logger = createProjectLogger(this.logger, projectId)\n const [baseDir, fileName] = this.getArtifactPath(projectId, hash)\n\n try {\n await unlink(fileName)\n await this.deleteDirectoryIfEmpty(baseDir, logger)\n logger.info({ hash, fileName }, \"artifact deleted\")\n } catch (error) {\n logger.error({ hash, fileName, error }, \"artifact deletion failed\")\n }\n }\n\n async deleteDirectoryIfEmpty(dirPath: string, logger: Logger): Promise<void> {\n try {\n const files = await readdir(dirPath)\n if (files.length === 0) {\n await rm(dirPath)\n logger.info({ dirPath }, \"deleted empty directory\")\n } else {\n logger.debug({ dirPath, fileCount: files.length }, \"directory not empty, skipping deletion\")\n }\n } catch (error) {\n logger.error({ dirPath, error }, \"failed to delete directory\")\n }\n }\n\n async exists(projectId: string, artifactId: string): Promise<boolean> {\n const [, fileName] = this.getArtifactPath(projectId, artifactId)\n\n try {\n await access(fileName)\n return true\n } catch {\n return false\n }\n }\n\n private getArtifactPath(\n projectId: string,\n artifactId: string,\n ): [baseDir: string, fileName: string] {\n const baseDir = resolve(this.hsCodebasePath, \"projects\", projectId, \"artifacts\")\n const fileName = join(baseDir, `${artifactId}${this.extension}`)\n\n return [baseDir, fileName]\n }\n\n static async create(\n config: z.infer<typeof codebaseConfig>,\n extension: string,\n logger: Logger,\n ): Promise<LocalArtifactBackend> {\n const serviceLogger = logger.child({ service: \"LocalArtifactBackend\" })\n const codebasePath = await getCodebaseHighstatePath(config, logger)\n\n return new LocalArtifactBackend(codebasePath, extension, serviceLogger)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { DatabaseManager } from \"../database\"\nimport type { ArtifactBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { EncryptionArtifactBackend } from \"./encryption\"\nimport { LocalArtifactBackend, localArtifactBackendConfig } from \"./local\"\n\nexport const artifactBackendConfig = z.object({\n HIGHSTATE_ARTIFACT_BACKEND_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localArtifactBackendConfig.shape,\n})\n\nexport async function createArtifactBackend(\n config: z.infer<typeof artifactBackendConfig> & Record<string, unknown>,\n database: DatabaseManager,\n logger: Logger,\n): Promise<ArtifactBackend> {\n let backend: ArtifactBackend\n\n const fileExtension = config.HIGHSTATE_ARTIFACT_ENABLE_ENCRYPTION ? \".enc\" : \".tgz\"\n\n switch (config.HIGHSTATE_ARTIFACT_BACKEND_TYPE) {\n case \"local\": {\n backend = await LocalArtifactBackend.create(config, fileExtension, logger)\n }\n }\n\n if (database.isEncryptionEnabled) {\n backend = new EncryptionArtifactBackend(backend, database)\n }\n\n return backend\n}\n","import type { Logger } from \"pino\"\nimport type { LibraryBackend, ProjectEvaluationResult, ResolvedUnitSource } from \"./abstractions\"\nimport type {\n PackageResolutionResponse,\n PackageResolutionWorkerData,\n} from \"./package-resolution-worker\"\nimport type { WorkerData } from \"./worker/protocol\"\nimport { EventEmitter, on } from \"node:events\"\nimport { readFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { Worker } from \"node:worker_threads\"\nimport { type InstanceModel, isUnitModel } from \"@highstate/contract\"\nimport { decode } from \"@msgpack/msgpack\"\nimport { BetterLock } from \"better-lock\"\nimport { glob } from \"glob\"\nimport { resolve as importMetaResolve } from \"import-meta-resolve\"\nimport { addDependency, runScript } from \"nypm\"\nimport PQueue from \"p-queue\"\nimport { type PackageJson, readPackageJSON, resolvePackageJSON } from \"pkg-types\"\nimport { groupBy, isNonNullish } from \"remeda\"\nimport Watcher from \"watcher\"\nimport { z } from \"zod\"\nimport { resolveMainLocalProject, stringArrayType } from \"../common\"\nimport {\n diffLibraries,\n type LibraryModel,\n type LibraryUpdate,\n type ResolvedInstanceInput,\n} from \"../shared\"\n\nexport const localLibraryBackendConfig = z.object({\n HIGHSTATE_LIBRARY_BACKEND_LOCAL_LIBRARY_PACKAGES: stringArrayType.default(() => [\n \"@highstate/library\",\n ]),\n HIGHSTATE_LIBRARY_BACKEND_LOCAL_WORKSPACE_PATH: z.string().optional(),\n HIGHSTATE_LIBRARY_BACKEND_LOCAL_IMPORT_PATH: z.string().optional(),\n HIGHSTATE_LIBRARY_BACKEND_LOCAL_BUILD_CONCURRENCY: z.coerce.number().int().positive().default(3),\n HIGHSTATE_LIBRARY_BACKEND_LOCAL_BUILD_ON_STARTUP: z.stringbool().default(true),\n HIGHSTATE_LIBRARY_BACKEND_LOCAL_BUILD_ON_CHANGES: z.stringbool().default(true),\n})\n\ninterface Events {\n library: [LibraryUpdate[]]\n resolvedUnitSource: [ResolvedUnitSource]\n}\n\ntype HighstateManifestJson = {\n sourceHashes?: Record<string, number>\n}\n\ntype LibraryPackage = {\n name: string\n rootPath: string\n isHighstateManaged: boolean\n}\n\ntype RebuildState = {\n inProgress: boolean\n pending: boolean\n}\n\nexport class LocalLibraryBackend implements LibraryBackend {\n private readonly watcher: Watcher\n private readonly workspacePath: string\n readonly importPath: string\n private readonly workspacePatterns: string[]\n\n private readonly lock = new BetterLock()\n private readonly eventEmitter = new EventEmitter<Events>()\n\n private library: LibraryModel | null = null\n\n private readonly packages = new Map<string, LibraryPackage>()\n private readonly resolvedUnitSources = new Map<string, ResolvedUnitSource>()\n private readonly rebuildStates = new Map<string, RebuildState>()\n private readonly ignoredPackages = new Set<string>()\n private readonly buildQueue: PQueue\n private readonly configBuildOnStartup: boolean\n private readonly configBuildOnChanges: boolean\n\n private constructor(\n private readonly libraryPackages: string[],\n workspacePath: string,\n importPath: string,\n workspacePatterns: string[],\n buildConcurrency: number,\n buildOnStartup: boolean,\n buildOnChanges: boolean,\n private readonly logger: Logger,\n ) {\n this.workspacePath = workspacePath\n this.importPath = importPath\n this.workspacePatterns = workspacePatterns\n this.buildQueue = new PQueue({ concurrency: buildConcurrency })\n this.configBuildOnStartup = buildOnStartup\n this.configBuildOnChanges = buildOnChanges\n this.watcher = new Watcher([workspacePath], {\n recursive: true,\n ignoreInitial: true,\n ignore: /\\.git|node_modules|dist|\\.highstate|\\.nx/,\n })\n\n this.watcher.on(\"all\", (event: string, path: string) => {\n this.logger.debug({ event, path }, \"library event\")\n\n if (!path.endsWith(\".json\") && !path.endsWith(\".ts\")) {\n return\n }\n\n void this.handleFileEvent(path)\n })\n }\n\n async loadLibrary(): Promise<LibraryModel> {\n return await this.lock.acquire(async () => await this.getLibrary())\n }\n\n async *watchLibrary(_libraryId: string, signal?: AbortSignal): AsyncIterable<LibraryUpdate[]> {\n for await (const [library] of on(this.eventEmitter, \"library\", { signal })) {\n yield library\n }\n }\n\n getLoadedResolvedUnitSources(): Promise<ResolvedUnitSource[]> {\n return this.lock.acquire(() => {\n return Array.from(this.resolvedUnitSources.values())\n })\n }\n\n async getResolvedUnitSources(\n _libraryId: string,\n unitTypes: string[],\n ): Promise<ResolvedUnitSource[]> {\n return await this.lock.acquire(async () => {\n const library = await this.getLibrary()\n\n const units = unitTypes\n .map(type => library.components[type])\n .filter(Boolean)\n .filter(isUnitModel)\n\n const packageNames = Object.keys(groupBy(units, unit => unit.source.package))\n\n await this.ensureLibraryPackagesLoaded(packageNames, true)\n\n const result: ResolvedUnitSource[] = []\n\n for (const unitType of unitTypes) {\n const resolvedUnitSource = this.resolvedUnitSources.get(unitType)\n\n if (resolvedUnitSource) {\n result.push(resolvedUnitSource)\n } else {\n this.logger.warn(`resolved unit source not found for unit: \"%s\"`, unitType)\n }\n }\n\n return result\n })\n }\n\n async *watchResolvedUnitSources(\n _libraryId: string,\n signal?: AbortSignal,\n ): AsyncIterable<ResolvedUnitSource> {\n for await (const [resolvedUnitSource] of on(this.eventEmitter, \"resolvedUnitSource\", {\n signal,\n })) {\n yield resolvedUnitSource\n }\n }\n\n async evaluateCompositeInstances(\n _libraryId: string,\n allInstances: InstanceModel[],\n resolvedInputs: Record<string, Record<string, ResolvedInstanceInput[]>>,\n ): Promise<ProjectEvaluationResult> {\n const packagePaths = this.libraryPackages\n .map(name => this.packages.get(name))\n .filter(isNonNullish)\n // TODO: respect package exports field\n .map(pkg => `${pkg.rootPath}/dist/index.js`)\n\n const worker = this.createLibraryWorker({\n libraryModulePaths: packagePaths,\n allInstances,\n resolvedInputs,\n })\n\n for await (const [event] of on(worker, \"message\", { signal: AbortSignal.timeout(10_000) })) {\n return event as ProjectEvaluationResult\n }\n\n throw new Error(\"Worker ended without sending any response\")\n }\n\n private async getLibrary(): Promise<LibraryModel> {\n if (this.library) {\n return this.library\n }\n\n return await this.reloadLibrary()\n }\n\n private async reloadLibrary(): Promise<LibraryModel> {\n this.logger.info(\"reloading library\")\n\n this.eventEmitter.emit(\"library\", [{ type: \"reload-started\" }])\n\n await this.ensureLibraryPackagesLoaded(this.libraryPackages, true)\n\n const loadedPackages = this.packages\n .values()\n .filter(pkg => this.libraryPackages.includes(pkg.name))\n\n const mergedLibrary: LibraryModel = { components: {}, entities: {} }\n\n for (const loadedPackage of loadedPackages) {\n const libraryContent = await this.readLibraryContent(loadedPackage)\n\n for (const [componentType, component] of Object.entries(libraryContent.components)) {\n mergedLibrary.components[componentType] = component\n }\n\n for (const [entityType, entity] of Object.entries(libraryContent.entities)) {\n mergedLibrary.entities[entityType] = entity\n }\n }\n\n const updates = diffLibraries(this.library ?? { components: {}, entities: {} }, mergedLibrary)\n\n this.eventEmitter.emit(\"library\", updates)\n this.library = mergedLibrary\n\n this.logger.info(\"library reloaded\")\n\n this.eventEmitter.emit(\"library\", [{ type: \"reload-completed\" }])\n\n return this.library\n }\n\n private async reloadUnitManifest(libraryPackage: LibraryPackage): Promise<void> {\n const library = this.library\n if (!library) {\n this.logger.warn(\n `library not loaded, cannot reload unit manifest for package: \"%s\"`,\n libraryPackage.name,\n )\n return\n }\n\n const manifest = await this.readLibraryPackageManifest(libraryPackage)\n const packageJson = await readPackageJSON(libraryPackage.rootPath)\n\n for (const unit of Object.values(library.components)) {\n if (!isUnitModel(unit)) {\n continue\n }\n\n if (unit.source.package !== libraryPackage.name) {\n continue\n }\n\n // TODO: resolve the path\n const relativePath = unit.source.path ? `./dist/${unit.source.path}` : `./dist`\n const sourceHash = manifest?.sourceHashes?.[`${relativePath}/index.js`]\n\n if (!sourceHash) {\n this.logger.warn(`source hash not found for unit: \"%s\"`, unit.type)\n continue\n }\n\n const resolvedSource = this.resolvedUnitSources.get(unit.type)\n\n const newResolvedSource: ResolvedUnitSource = {\n unitType: unit.type,\n sourceHash,\n projectPath: resolve(libraryPackage.rootPath, relativePath),\n allowedDependencies: Object.keys(packageJson.peerDependencies ?? {}),\n }\n\n if (\n resolvedSource?.sourceHash === newResolvedSource.sourceHash &&\n resolvedSource?.projectPath === newResolvedSource.projectPath\n ) {\n continue\n }\n\n this.resolvedUnitSources.set(unit.type, newResolvedSource)\n this.eventEmitter.emit(\"resolvedUnitSource\", newResolvedSource)\n this.logger.trace(`updated source for unit: \"%s\"`, unit.type)\n }\n }\n\n private async ensureLibraryPackagesLoaded(\n names: string[],\n installIfNotFound = false,\n ): Promise<void> {\n const packagesToLoad = names.filter(name => !this.packages.has(name))\n\n if (packagesToLoad.length > 0) {\n await this.loadLibraryPackages(packagesToLoad, installIfNotFound)\n }\n }\n\n private logIgnoredPackage(identifier: string, message: string): void {\n if (this.ignoredPackages.has(identifier)) {\n return\n }\n\n this.logger.debug({ package: identifier }, message)\n this.ignoredPackages.add(identifier)\n }\n\n private isHighstateManagedPackage(packageName: string, packageJson: PackageJson): boolean {\n if (!packageJson.devDependencies?.[\"@highstate/cli\"]) {\n this.logIgnoredPackage(packageName, \"skipping package without @highstate/cli dev dependency\")\n\n return false\n }\n\n const buildScript = packageJson.scripts?.build ?? \"\"\n\n if (!buildScript.includes(\"highstate build\")) {\n this.logIgnoredPackage(\n packageName,\n 'skipping package without \"highstate build\" in build script',\n )\n\n return false\n }\n\n this.ignoredPackages.delete(packageName)\n\n return true\n }\n\n private async registerLibraryPackage(\n packageRootPath: string,\n declaredName?: string,\n existingPackageJson?: PackageJson,\n ): Promise<LibraryPackage | null> {\n let packageJson = existingPackageJson\n\n if (!packageJson) {\n try {\n packageJson = await readPackageJSON(packageRootPath)\n } catch (error) {\n this.logger.debug({ error }, `failed to read package.json at path: \"%s\"`, packageRootPath)\n this.logIgnoredPackage(packageRootPath, \"skipping package without readable package.json\")\n return null\n }\n }\n\n if (!packageJson.name) {\n this.logIgnoredPackage(packageRootPath, \"skipping package without name in package.json\")\n\n return null\n }\n\n if (declaredName && declaredName !== packageJson.name) {\n this.logger.warn(\n {\n declaredName,\n packageJsonName: packageJson.name,\n packageRootPath,\n },\n \"resolved package name does not match declared name\",\n )\n }\n\n const isHighstateManaged = this.isHighstateManagedPackage(packageJson.name, packageJson)\n\n let libraryPackage = this.packages.get(packageJson.name)\n\n if (libraryPackage) {\n libraryPackage.rootPath = packageRootPath\n libraryPackage.isHighstateManaged = isHighstateManaged\n } else {\n libraryPackage = {\n name: packageJson.name,\n rootPath: packageRootPath,\n isHighstateManaged,\n }\n\n this.packages.set(packageJson.name, libraryPackage)\n }\n\n this.ignoredPackages.delete(packageRootPath)\n\n if (\n libraryPackage.isHighstateManaged &&\n this.library &&\n !this.libraryPackages.includes(libraryPackage.name) &&\n libraryPackage.name !== \"@highstate/contract\"\n ) {\n await this.reloadUnitManifest(libraryPackage)\n }\n\n return libraryPackage\n }\n\n private async rebuildLibraryPackage(libraryPackage: LibraryPackage): Promise<void> {\n if (!libraryPackage.isHighstateManaged) {\n this.logIgnoredPackage(\n libraryPackage.name,\n \"skipping rebuild for non Highstate-managed package\",\n )\n\n return\n }\n\n const now = Date.now()\n\n this.logger.info(`rebuilding \"%s\"`, libraryPackage.name)\n await runScript(\"build\", { cwd: libraryPackage.rootPath })\n\n const duration = Date.now() - now\n this.logger.info(`built \"%s\" in %dms`, libraryPackage.name, duration)\n\n if (this.library && !this.libraryPackages.includes(libraryPackage.name)) {\n await this.reloadUnitManifest(libraryPackage)\n }\n }\n\n private async readLibraryPackageManifest(\n libraryPackage: LibraryPackage,\n ): Promise<HighstateManifestJson | undefined> {\n const manifestPath = resolve(libraryPackage.rootPath, \"dist\", \"highstate.manifest.json\")\n\n try {\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as HighstateManifestJson\n\n return manifest\n } catch (error) {\n this.logger.debug(\n { error },\n `failed to read highstate manifest of package: \"%s\"`,\n libraryPackage.name,\n )\n\n return undefined\n }\n }\n\n private async readLibraryContent(libraryPackage: LibraryPackage): Promise<LibraryModel> {\n const contentPath = resolve(libraryPackage.rootPath, \"dist\", \"highstate.library.msgpack\")\n\n try {\n const contentBuffer = await readFile(contentPath)\n const content = decode(contentBuffer) as LibraryModel\n\n return content\n } catch (error) {\n this.logger.debug(\n { error },\n `failed to read highstate library content of package: \"%s\"`,\n libraryPackage.name,\n )\n\n return { components: {}, entities: {} }\n }\n }\n\n private async loadLibraryPackages(names: string[], installIfNotFound = false): Promise<void> {\n this.logger.debug(\"loading library packages: %s\", names.join(\", \"))\n\n const missingPackages: string[] = []\n\n const worker = this.createPackageResolutionWorker({\n packageNames: names,\n importPath: this.importPath,\n })\n\n for await (const [event] of on(worker, \"message\")) {\n const eventData = event as PackageResolutionResponse\n\n if (eventData.type !== \"result\") {\n continue\n }\n\n for (const result of eventData.results) {\n if (result.type === \"success\") {\n const libraryPackage = await this.registerLibraryPackage(\n result.packageRootPath,\n result.packageName,\n )\n\n if (libraryPackage) {\n this.logger.info(`loaded library package: \"%s\"`, libraryPackage.name)\n }\n } else if (result.type === \"not-found\") {\n missingPackages.push(result.packageName)\n } else {\n this.logger.error(\n `failed to load library package \"%s\": %s`,\n result.packageName,\n result.error,\n )\n }\n }\n\n break\n }\n\n if (installIfNotFound && missingPackages.length > 0) {\n this.logger.info(\"installing missing library packages: %s\", missingPackages.join(\", \"))\n await addDependency(missingPackages, { cwd: dirname(this.importPath) })\n await this.loadLibraryPackages(missingPackages)\n }\n }\n\n private async handleFileEvent(path: string): Promise<void> {\n try {\n const libraryPackage = await this.resolveLibraryPackageForPath(path)\n\n if (!libraryPackage) {\n return\n }\n\n if (!libraryPackage.isHighstateManaged) {\n this.logIgnoredPackage(\n libraryPackage.name,\n \"skipping file event for non Highstate-managed package\",\n )\n\n return\n }\n\n if (!this.configBuildOnChanges) {\n return\n }\n\n this.schedulePackageRebuild(libraryPackage.name)\n } catch (error) {\n this.logger.error({ error, path }, \"failed to schedule library package rebuild\")\n }\n }\n\n private async resolveLibraryPackageForPath(path: string): Promise<LibraryPackage | null> {\n const existingPackage = Array.from(this.packages.values())\n .filter(pkg => path === pkg.rootPath || path.startsWith(`${pkg.rootPath}/`))\n .toSorted((a, b) => b.rootPath.length - a.rootPath.length)\n .at(0)\n\n if (existingPackage) {\n return existingPackage\n }\n\n let packageJsonPath: string\n\n try {\n packageJsonPath = await resolvePackageJSON(path)\n } catch (error) {\n this.logger.debug({ error }, `failed to resolve package.json for path: \"%s\"`, path)\n return null\n }\n\n const packageRootPath = dirname(packageJsonPath)\n\n const alreadyLoaded = Array.from(this.packages.values()).find(\n pkg => pkg.rootPath === packageRootPath,\n )\n\n if (alreadyLoaded) {\n return alreadyLoaded\n }\n\n return await this.registerLibraryPackage(packageRootPath)\n }\n\n private schedulePackageRebuild(packageName: string): void {\n const state = this.rebuildStates.get(packageName) ?? { inProgress: false, pending: false }\n\n // if both in progress and pending, discard this request\n if (state.inProgress && state.pending) {\n this.logger.debug(`rebuild in progress and already pending for \"%s\", discarding`, packageName)\n return\n }\n\n // if in progress but no pending, mark as pending\n if (state.inProgress && !state.pending) {\n state.pending = true\n this.rebuildStates.set(packageName, state)\n this.logger.debug(`rebuild in progress, scheduling pending rebuild for \"%s\"`, packageName)\n return\n }\n\n // not in progress, enqueue rebuild\n state.inProgress = true\n this.rebuildStates.set(packageName, state)\n\n void this.buildQueue.add(async () => {\n try {\n await this.executePackageRebuild(packageName)\n } finally {\n state.inProgress = false\n\n if (state.pending) {\n state.pending = false\n this.schedulePackageRebuild(packageName)\n } else {\n this.rebuildStates.delete(packageName)\n }\n }\n })\n }\n\n private async executePackageRebuild(packageName: string): Promise<void> {\n const libraryPackage = this.packages.get(packageName)\n\n if (!libraryPackage) {\n this.logger.warn(`package not found for rebuild: \"%s\"`, packageName)\n return\n }\n\n await this.rebuildLibraryPackage(libraryPackage)\n\n if (this.libraryPackages.includes(libraryPackage.name)) {\n this.logger.info(\"reloading library due to file change in package: %s\", libraryPackage.name)\n await this.reloadLibrary()\n }\n }\n\n private async initialize(): Promise<void> {\n const workspacePackages = await this.collectWorkspacePackages()\n\n if (workspacePackages.length === 0) {\n return\n }\n\n const managedPackageNames = new Set<string>()\n\n await this.lock.acquire(async () => {\n for (const workspacePackage of workspacePackages) {\n const registered = await this.registerLibraryPackage(\n workspacePackage.rootPath,\n workspacePackage.packageJson.name,\n workspacePackage.packageJson,\n )\n\n if (registered?.isHighstateManaged) {\n managedPackageNames.add(registered.name)\n }\n }\n })\n\n if (!this.configBuildOnStartup) {\n return\n }\n\n for (const packageName of managedPackageNames) {\n this.schedulePackageRebuild(packageName)\n }\n }\n\n private async collectWorkspacePackages(): Promise<\n Array<{ rootPath: string; packageJson: PackageJson }>\n > {\n if (this.workspacePatterns.length === 0) {\n this.logger.warn(\n { workspaceRoot: this.workspacePath },\n \"workspace root does not define workspaces; skipping startup builds\",\n )\n\n return []\n }\n\n return await this.expandWorkspacePatterns(this.workspacePath, this.workspacePatterns)\n }\n\n private async expandWorkspacePatterns(\n rootPath: string,\n patterns: string[],\n ): Promise<Array<{ rootPath: string; packageJson: PackageJson }>> {\n const includePatterns = patterns.filter(pattern => !pattern.startsWith(\"!\"))\n const excludePatterns = patterns\n .filter(pattern => pattern.startsWith(\"!\"))\n .map(pattern => pattern.slice(1))\n\n if (includePatterns.length === 0) {\n return []\n }\n\n let matches: string[] = []\n\n try {\n matches = await glob(includePatterns, {\n cwd: rootPath,\n absolute: true,\n dot: false,\n ignore: excludePatterns,\n })\n } catch (error) {\n this.logger.error({ error, rootPath }, \"failed to expand workspace patterns\")\n return []\n }\n\n const results: Array<{ rootPath: string; packageJson: PackageJson }> = []\n const seen = new Set<string>()\n\n for (const match of matches) {\n const packageDir = match.endsWith(\"package.json\") ? dirname(match) : match\n\n if (seen.has(packageDir)) {\n continue\n }\n\n const packageJson = await this.tryReadPackageJson(packageDir)\n\n if (!packageJson) {\n continue\n }\n\n seen.add(packageDir)\n results.push({ rootPath: packageDir, packageJson })\n }\n\n return results\n }\n\n private async tryReadPackageJson(directory: string): Promise<PackageJson | null> {\n try {\n return await readPackageJSON(directory)\n } catch (error) {\n this.logger.trace(\n { error, directory },\n \"failed to read package.json while resolving workspaces\",\n )\n\n return null\n }\n }\n\n private static extractWorkspacePatterns(packageJson: PackageJson): string[] {\n const workspaces = packageJson.workspaces\n\n if (!workspaces) {\n return []\n }\n\n if (Array.isArray(workspaces)) {\n return workspaces\n }\n\n if (\n typeof workspaces === \"object\" &&\n Array.isArray((workspaces as Record<string, unknown>).packages)\n ) {\n return (workspaces as { packages: string[] }).packages\n }\n\n return []\n }\n\n private static async resolveWorkspaceConfig(\n explicitWorkspace: string | undefined,\n projectRoot: string,\n logger: Logger,\n ): Promise<{ root: string; patterns: string[] }> {\n if (explicitWorkspace) {\n const workspaceRoot = resolve(explicitWorkspace)\n\n try {\n const packageJson = await readPackageJSON(workspaceRoot)\n const patterns = LocalLibraryBackend.extractWorkspacePatterns(packageJson)\n\n if (patterns.length === 0) {\n logger.warn(\n { workspaceRoot },\n \"configured workspace does not define workspaces; skipping startup builds\",\n )\n }\n\n return { root: workspaceRoot, patterns }\n } catch (error) {\n logger.warn(\n { error, workspaceRoot },\n \"failed to read configured workspace package.json; skipping startup builds\",\n )\n\n return { root: workspaceRoot, patterns: [] }\n }\n }\n\n const detected = await LocalLibraryBackend.findWorkspaceRootForPath(projectRoot)\n\n if (detected) {\n return detected\n }\n\n logger.warn(\n { projectRoot },\n 'no workspace root with \"workspaces\" field detected; skipping startup builds',\n )\n\n return { root: projectRoot, patterns: [] }\n }\n\n private static async findWorkspaceRootForPath(\n startPath: string,\n ): Promise<{ root: string; patterns: string[] } | null> {\n let current = startPath\n const visited = new Set<string>()\n\n while (!visited.has(current)) {\n visited.add(current)\n\n try {\n const packageJson = await readPackageJSON(current)\n const patterns = LocalLibraryBackend.extractWorkspacePatterns(packageJson)\n\n if (patterns.length > 0) {\n return { root: current, patterns }\n }\n } catch {\n // ignore and continue traversing upwards\n }\n\n const parent = dirname(current)\n\n if (parent === current) {\n break\n }\n\n current = parent\n }\n\n return null\n }\n\n private createLibraryWorker(workerData: WorkerData): Worker {\n const workerPathUrl = importMetaResolve(`@highstate/backend/library-worker`, import.meta.url)\n const workerPath = fileURLToPath(workerPathUrl)\n\n return new Worker(workerPath, { workerData })\n }\n\n private createPackageResolutionWorker(workerData: PackageResolutionWorkerData) {\n const workerPathUrl = importMetaResolve(\n `@highstate/backend/package-resolution-worker`,\n import.meta.url,\n )\n const workerPath = fileURLToPath(workerPathUrl)\n\n return new Worker(workerPath, { workerData })\n }\n\n static async create(config: z.infer<typeof localLibraryBackendConfig>, logger: Logger) {\n const [projectPath] = await resolveMainLocalProject()\n\n const workspaceConfig = await LocalLibraryBackend.resolveWorkspaceConfig(\n config.HIGHSTATE_LIBRARY_BACKEND_LOCAL_WORKSPACE_PATH,\n projectPath,\n logger,\n )\n\n let importPath = config.HIGHSTATE_LIBRARY_BACKEND_LOCAL_IMPORT_PATH\n if (!importPath) {\n importPath = workspaceConfig.root\n }\n\n if (!isAbsolute(importPath)) {\n importPath = resolve(workspaceConfig.root, importPath)\n }\n\n if (!importPath.endsWith(\"package.json\")) {\n importPath = resolve(importPath, \"package.json\")\n }\n\n logger.debug(\n { workspaceRoot: workspaceConfig.root, importPath },\n \"resolved local library backend workspace and import paths\",\n )\n\n const backend = new LocalLibraryBackend(\n config.HIGHSTATE_LIBRARY_BACKEND_LOCAL_LIBRARY_PACKAGES,\n workspaceConfig.root,\n importPath,\n workspaceConfig.patterns,\n config.HIGHSTATE_LIBRARY_BACKEND_LOCAL_BUILD_CONCURRENCY,\n config.HIGHSTATE_LIBRARY_BACKEND_LOCAL_BUILD_ON_STARTUP,\n config.HIGHSTATE_LIBRARY_BACKEND_LOCAL_BUILD_ON_CHANGES,\n logger.child({ backend: \"LibraryBackend\", service: \"LocalLibraryBackend\" }),\n )\n\n void backend\n .initialize()\n .catch(error => logger.error({ error }, \"failed to initialize LocalLibraryBackend\"))\n\n return backend\n }\n}\n","import type { Logger } from \"pino\"\nimport type { LibraryBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { LocalLibraryBackend, localLibraryBackendConfig } from \"./local\"\n\nexport const libraryBackendConfig = z.object({\n HIGHSTATE_LIBRARY_BACKEND_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localLibraryBackendConfig.shape,\n})\n\nexport async function createLibraryBackend(\n config: z.infer<typeof libraryBackendConfig>,\n logger: Logger,\n): Promise<LibraryBackend> {\n switch (config.HIGHSTATE_LIBRARY_BACKEND_TYPE) {\n case \"local\": {\n return await LocalLibraryBackend.create(config, logger)\n }\n }\n}\n","import type { BetterLock as BetterLockType } from \"better-lock/dist/better_lock\"\nimport type { LockBackend } from \"./abstractions\"\nimport { BetterLock } from \"better-lock\"\n\nexport class MemoryLockBackend implements LockBackend {\n private readonly lock: BetterLockType\n\n private constructor() {\n this.lock = new BetterLock()\n }\n\n async acquire<T>(keys: string[], fn: () => Promise<T> | T): Promise<T> {\n return this.lock.acquire(keys, fn)\n }\n\n static create(): LockBackend {\n return new MemoryLockBackend()\n }\n}\n","import type { LockBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { MemoryLockBackend } from \"./memory\"\n\nexport const lockBackendConfig = z.object({\n HIGHSTATE_LOCK_BACKEND_TYPE: z.enum([\"memory\"]).default(\"memory\"),\n})\n\nexport function createLockBackend(config: z.infer<typeof lockBackendConfig>): LockBackend {\n switch (config.HIGHSTATE_LOCK_BACKEND_TYPE) {\n case \"memory\": {\n return MemoryLockBackend.create()\n }\n }\n}\n","import type { LockBackend } from \"./abstractions\"\nimport { join } from \"remeda\"\n\nexport type LockKeyMap = {\n /**\n * Lock for instances and hubs of the project.\n */\n \"project-nodes\": [projectId: string]\n\n /**\n * Locks for the evaluation of the project.\n */\n \"project-evaluation\": [projectId: string]\n\n /**\n * Lock for all instance states of the project.\n */\n \"project-instance-states\": [projectId: string]\n\n /**\n * Lock for a specific instance within a project.\n */\n instance: [projectId: string, instanceId: string]\n\n /**\n * Lock for a specific instance lock within a project.\n */\n \"instance-lock\": [projectId: string, instanceId: string]\n\n /**\n * Lock for a specific artifact within a project.\n */\n artifact: [projectId: string, artifactId: string]\n\n /**\n * Lock for a specific artifact hash within a project.\n */\n \"artifact-hash\": [projectId: string, hash: string]\n\n /**\n * Lock for a specific operation within a project.\n */\n operation: [projectId: string, operationId: string]\n\n /**\n * Lock for a specific api key within a project.\n */\n \"api-key\": [projectId: string, key: string]\n\n /**\n * Lock for a specific worker within a project.\n */\n worker: [workerId: string]\n\n /**\n * Lock for a specific worker image within a project.\n */\n \"worker-image\": [projectId: string, image: string]\n}\n\nexport type LockKey = Readonly<\n {\n [K in keyof LockKeyMap]: [type: K, ...LockKeyMap[K]]\n }[keyof LockKeyMap]\n>\n\nexport class LockManager {\n constructor(private readonly lockBackend: LockBackend) {}\n\n /**\n * Acquires locks for the given keys and executes the function.\n *\n * This method provides a clean interface for acquiring distributed locks across\n * multiple keys and ensures they are properly released after execution.\n *\n * @param keys The keys to acquire locks for.\n * @param fn The function to execute while holding the locks.\n * @returns The result of the executed function.\n */\n public async acquire<T>(keys: LockKey | LockKey[], fn: () => Promise<T> | T): Promise<T> {\n if (typeof keys[0] === \"string\") {\n return this.lockBackend.acquire([keys.join(\":\")], fn)\n }\n\n return this.lockBackend.acquire(keys.map(join(\":\")), fn)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { z } from \"zod\"\nimport type { PubSubBackend } from \"./abstractions\"\nimport { EventEmitter, on } from \"node:events\"\n\nexport class MemoryPubSubBackend implements PubSubBackend {\n private readonly eventEmitter = new EventEmitter()\n\n constructor(private readonly logger: Logger) {}\n\n async subscribe(\n topic: string,\n _schema: z.ZodType,\n signal?: AbortSignal,\n ): Promise<AsyncIterable<unknown>> {\n return this.listen(topic, signal)\n }\n\n private async *listen(topic: string, signal?: AbortSignal): AsyncIterable<unknown> {\n for await (const [event] of on(this.eventEmitter, topic, { signal })) {\n yield event\n }\n }\n\n publish(topic: string, _schema: z.ZodType, message: unknown): Promise<void> {\n this.eventEmitter.emit(topic, message)\n this.logger.trace({ topic, message }, \"published message to topic\")\n\n return Promise.resolve()\n }\n}\n","import type { Logger } from \"pino\"\nimport type { PubSubBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { MemoryPubSubBackend } from \"./memory\"\n\nexport const pubSubBackendConfig = z.object({\n HIGHSTATE_PUBSUB_BACKEND_TYPE: z.enum([\"memory\"]).default(\"memory\"),\n})\n\nexport function createPubSubBackend(\n config: z.infer<typeof pubSubBackendConfig>,\n logger: Logger,\n): PubSubBackend {\n switch (config.HIGHSTATE_PUBSUB_BACKEND_TYPE) {\n case \"memory\": {\n return new MemoryPubSubBackend(logger)\n }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { WorkerVersionLog } from \"../database\"\nimport type { PubSubBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport {\n instanceLockEventSchema,\n instanceStateEventSchema,\n type OperationLog,\n operationEventSchema,\n projectModelEventSchema,\n projectUnlockStateSchema,\n terminalSessionOutputSchema,\n workerUnitRegistrationEventSchema,\n} from \"../shared\"\n\nexport type PubSubEventMap = {\n \"project-unlock-state\": [projectId: string]\n \"instance-state\": [projectId: string]\n \"instance-lock\": [projectId: string]\n \"project-model\": [projectId: string]\n operation: [projectId: string]\n \"active-terminal-session\": [projectId: string, sessionId: string]\n \"operation-instance-log\": [operationId: string, instanceId: string]\n \"worker-unit-registration\": [projectId: string, workerVersionId: string]\n \"worker-version-log\": [projectId: string, workerVersionId: string]\n}\n\nconst eventSchemas = {\n \"project-unlock-state\": projectUnlockStateSchema,\n \"instance-state\": instanceStateEventSchema,\n \"instance-lock\": instanceLockEventSchema,\n \"project-model\": projectModelEventSchema,\n operation: operationEventSchema,\n \"active-terminal-session\": terminalSessionOutputSchema,\n \"operation-instance-log\": z.custom<OperationLog>(),\n \"worker-unit-registration\": workerUnitRegistrationEventSchema,\n \"worker-version-log\": z.custom<WorkerVersionLog>(),\n}\n\ntype PubSubEventSchemas = typeof eventSchemas\n\nexport class PubSubManager {\n constructor(\n private readonly pubsubBackend: PubSubBackend,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Subscribes to a specific topic in the pubsub backend.\n *\n * Stops the iteration if the provided signal is aborted and resumes the control flow of the caller without throwing an error.\n *\n * Will throw an error if the subscription fails to initialize.\n *\n * @param key The event key tuple.\n * @param signal The signal to abort the subscription.\n */\n public async subscribe<K extends keyof PubSubEventMap>(\n key: [type: K, ...PubSubEventMap[K]],\n signal?: AbortSignal,\n ): Promise<AsyncIterable<z.infer<PubSubEventSchemas[K]>>> {\n const topic = key.join(\":\")\n const schema = eventSchemas[key[0]]\n\n const subscription = await this.pubsubBackend.subscribe(topic, schema, signal)\n\n return this.listen(subscription, signal)\n }\n\n private async *listen<TEvent>(\n subscription: AsyncIterable<unknown>,\n signal?: AbortSignal,\n ): AsyncIterable<TEvent> {\n try {\n for await (const event of subscription) {\n yield event as TEvent\n }\n } catch (error) {\n if (signal?.aborted) {\n return\n }\n\n throw error\n }\n }\n\n /**\n * Publishes an event to the pubsub backend.\n *\n * Will never throw an error.\n *\n * @param key The event key tuple.\n * @param message The message to publish.\n */\n public async publish<K extends keyof PubSubEventMap>(\n key: readonly [type: K, ...PubSubEventMap[K]],\n message: z.infer<PubSubEventSchemas[K]>,\n ): Promise<void> {\n const topic = key.join(\":\")\n\n try {\n const schema = eventSchemas[key[0]]\n await this.pubsubBackend.publish(topic, schema, message)\n } catch (error) {\n this.logger.error({ error }, `failed to publish event to topic \"%s\"`, topic)\n }\n }\n\n /**\n * Publishes multiple events to the pubsub backend.\n *\n * @param events An array of events to publish, each containing the event key and message.\n */\n public async publishMany<K extends keyof PubSubEventMap>(\n events: readonly (readonly [\n readonly [type: K, ...PubSubEventMap[K]],\n z.infer<PubSubEventSchemas[K]>,\n ])[],\n ): Promise<void> {\n const promises = events.map(([key, message]) => this.publish(key, message))\n\n await Promise.all(promises)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { ArtifactBackend, ArtifactService } from \"../artifact\"\nimport type { Artifact } from \"../database\"\nimport { createHash } from \"node:crypto\"\nimport { createReadStream, createWriteStream } from \"node:fs\"\nimport { mkdtemp, readdir } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { pipeline } from \"node:stream/promises\"\nimport { type UnitArtifact, unitArtifactId } from \"@highstate/contract\"\n\nexport interface ArtifactEnvironment {\n readPath: string | null\n writePath: string\n}\n\n/**\n * Sets up artifact environment for a runner operation.\n * Downloads all required artifacts to a temporary directory for reading,\n * and creates a separate directory for writing new artifacts.\n */\nexport async function setupArtifactEnvironment(\n projectId: string,\n artifacts: Artifact[],\n artifactBackend: ArtifactBackend,\n tempBasePath: string,\n logger: Logger,\n): Promise<ArtifactEnvironment> {\n // create temporary directory for writing new artifacts using mkdtemp\n const writeDir = await mkdtemp(join(tempBasePath, \"highstate-artifacts-write-\"))\n\n let readDir: string | null = null\n\n if (artifacts.length > 0) {\n // create temporary directory for reading existing artifacts using mkdtemp\n readDir = await mkdtemp(join(tempBasePath, \"highstate-artifacts-read-\"))\n\n logger.debug({\n msg: \"created artifact temp directories\",\n readDir,\n writeDir,\n artifactCount: artifacts.length,\n })\n\n // download all artifacts to read directory\n await Promise.all(\n artifacts.map(async artifact => {\n const artifactPath = join(readDir!, `${artifact.hash}.tgz`)\n const stream = await artifactBackend.retrieve(projectId, artifact.id, artifact.chunkSize)\n\n if (!stream) {\n throw new Error(`artifact not found: ${artifact.hash}`)\n }\n\n const writeStream = createWriteStream(artifactPath)\n await pipeline(stream, writeStream)\n\n logger.debug({ msg: \"downloaded artifact\", id: artifact.id, path: artifactPath })\n }),\n )\n } else {\n logger.debug({\n msg: \"created artifact write directory only\",\n writeDir,\n })\n }\n\n return { readPath: readDir, writePath: writeDir }\n}\n\n/**\n * Collects all artifacts from the write directory and stores them in the artifact backend.\n */\nexport async function collectAndStoreArtifacts(\n writePath: string,\n projectId: string,\n stateId: string,\n artifactManager: ArtifactService,\n declaredArtifacts: UnitArtifact[],\n logger: Logger,\n): Promise<void> {\n try {\n const files = await readdir(writePath)\n const tgzFiles = files.filter(file => file.endsWith(\".tgz\"))\n\n if (tgzFiles.length === 0) {\n logger.debug({ msg: \"no artifacts to collect\", writePath })\n return\n }\n\n const artifactFiles = tgzFiles\n .map(file => {\n const hash = file.replace(\".tgz\", \"\")\n const declaredArtifact = declaredArtifacts.find(artifact => artifact.hash === hash)\n\n if (!declaredArtifact) {\n logger.warn({\n msg: \"artifact file not declared in outputs\",\n file,\n declaredArtifacts,\n })\n return null\n }\n\n return { file, artifact: declaredArtifact }\n })\n .filter(file => file !== null)\n\n await Promise.all(\n artifactFiles.map(async ({ file, artifact }) => {\n const filePath = join(writePath, file)\n\n try {\n const [expectedHash, fileSize] = await getFileSha256(filePath)\n if (expectedHash !== artifact.hash) {\n logger.warn({\n msg: \"artifact hash mismatch\",\n expectedHash,\n gotHash: artifact.hash,\n file: filePath,\n })\n return\n }\n\n await using readStream = createReadStream(filePath)\n\n const storedArtifact = await artifactManager.store(\n projectId,\n expectedHash,\n fileSize,\n artifact.meta ?? { title: `Artifact for \"${stateId}\"` },\n readStream,\n async (tx, storedArtifact) => {\n await tx.instanceState.update({\n where: { id: stateId },\n data: {\n artifacts: {\n connect: { id: storedArtifact.id },\n },\n },\n })\n },\n )\n\n artifact[unitArtifactId] = storedArtifact.id\n\n logger.debug({ msg: \"stored artifact\", hash: expectedHash, file: filePath })\n } catch (error) {\n logger.error({ msg: \"failed to store artifact\", file: filePath, error })\n throw error\n }\n }),\n )\n } catch (error) {\n logger.error({ msg: \"failed to collect artifacts\", writePath, error })\n throw error\n }\n}\n\nexport async function getFileSha256(filePath: string): Promise<[string, number]> {\n await using fileContent = createReadStream(filePath)\n const hash = createHash(\"sha256\")\n let size = 0\n\n for await (const chunk of fileContent) {\n const buffer = chunk as Buffer\n\n hash.update(buffer)\n size += buffer.length\n }\n\n return [hash.digest(\"hex\"), size]\n}\n","/** biome-ignore-all lint/suspicious/noExplicitAny: аничо */\n/** biome-ignore-all lint/complexity/useLiteralKeys: не ори на мать */\n\nimport type { PulumiCommand } from \"@pulumi/pulumi/automation/index.js\"\nimport * as os from \"node:os\"\nimport path from \"node:path\"\nimport { execa } from \"execa\"\n\n/**\n * The extended AbortSignal interface that includes an additional signal\n * to forcefully abort the command.\n */\nexport interface DualAbortSignal extends AbortSignal {\n forceSignal?: AbortSignal\n}\n\nexport async function createForceAbortableCommand(): Promise<PulumiCommand> {\n // @ts-expect-error some symbols are internal, but we still can import them\n const { PulumiCommand, CommandResult, createCommandError } = await import(\n \"@pulumi/pulumi/automation/index.js\"\n )\n\n const command: any = await PulumiCommand.get()\n\n // replicate the run method from PulumiCommand\n command.run = function (\n this: PulumiCommand,\n args: string[],\n cwd: string,\n additionalEnv: { [key: string]: string },\n onOutput?: (data: string) => void,\n onError?: (data: string) => void,\n signal?: DualAbortSignal,\n ): Promise<unknown> {\n // all commands should be run in non-interactive mode.\n // this causes commands to fail rather than prompting for input (and thus hanging indefinitely)\n if (!args.includes(\"--non-interactive\")) {\n args.push(\"--non-interactive\")\n }\n\n // Prepend the folder where the CLI is installed to the path to ensure\n // we pickup the matching bundled plugins.\n if (path.isAbsolute(this.command)) {\n const pulumiBin = path.dirname(this.command)\n const sep = os.platform() === \"win32\" ? \";\" : \":\"\n const envPath = pulumiBin + sep + (additionalEnv[\"PATH\"] || process.env.PATH)\n additionalEnv[\"PATH\"] = envPath\n }\n\n return exec(this.command, args, cwd, additionalEnv, onOutput, onError, signal)\n }\n\n async function exec(\n command: string,\n args: string[],\n cwd?: string,\n additionalEnv?: { [key: string]: string },\n onOutput?: (data: string) => void,\n onError?: (data: string) => void,\n signal?: DualAbortSignal,\n ): Promise<unknown> {\n const unknownErrCode = -2\n\n const env = additionalEnv ? { ...additionalEnv } : undefined\n\n try {\n const proc = execa(command, args, { env, cwd })\n\n if (onError && proc.stderr) {\n proc.stderr.on(\"data\", (data: any) => {\n if (data?.toString) {\n data = data.toString()\n }\n onError(data)\n })\n }\n\n if (onOutput && proc.stdout) {\n proc.stdout.on(\"data\", (data: any) => {\n if (data?.toString) {\n data = data.toString()\n }\n onOutput(data)\n })\n }\n\n if (signal) {\n signal.addEventListener(\"abort\", () => {\n proc.kill(\"SIGINT\")\n })\n\n // custom logic to handle force kill\n if (signal.forceSignal) {\n signal.forceSignal.addEventListener(\"abort\", () => {\n proc.kill(\"SIGKILL\")\n })\n }\n }\n\n const { stdout, stderr, exitCode } = await proc\n const commandResult = new CommandResult(stdout, stderr, exitCode)\n if (exitCode !== 0) {\n throw createCommandError(commandResult)\n }\n\n return commandResult\n } catch (err) {\n const error = err as Error\n throw createCommandError(new CommandResult(\"\", error.message, unknownErrCode, error))\n }\n }\n\n return command as PulumiCommand\n}\n","import type {\n ConfigMap,\n OpMap,\n OpType,\n Stack,\n WhoAmIResult,\n} from \"@pulumi/pulumi/automation/index.js\"\nimport type { Logger } from \"pino\"\nimport type { SecretService } from \"../business\"\nimport { BetterLock } from \"better-lock\"\nimport { AbortError, errorToString, runWithRetryOnError } from \"../common/utils\"\nimport { createForceAbortableCommand } from \"./force-abort\"\n\nexport type RunOptions = {\n projectId: string\n pulumiProjectName: string\n pulumiStackName: string\n envVars?: Record<string, string>\n}\n\nexport type RunLocalOptions = RunOptions & {\n projectPath: string\n stackConfig?: ConfigMap\n}\n\nexport class LocalPulumiHost {\n private lock = new BetterLock()\n\n private constructor(\n private readonly secretService: SecretService,\n private readonly logger: Logger,\n ) {}\n\n async getCurrentUser(): Promise<WhoAmIResult | null> {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n const workspace = await LocalWorkspace.create({})\n\n try {\n return await workspace.whoAmI()\n } catch (error) {\n this.logger.error({ msg: \"failed to get current user\", error })\n\n return null\n }\n }\n\n async runEmpty<T>(\n options: RunOptions,\n fn: (stack: Stack) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n const { projectId, pulumiProjectName, pulumiStackName, envVars } = options\n\n return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n const stack = await LocalWorkspace.createOrSelectStack(\n {\n projectName: pulumiProjectName,\n stackName: pulumiStackName,\n program: () => Promise.resolve(),\n },\n {\n projectSettings: {\n name: pulumiProjectName,\n runtime: \"nodejs\",\n },\n envVars: {\n PULUMI_CONFIG_PASSPHRASE: await this.secretService.getPulumiPassword(projectId),\n PULUMI_K8S_AWAIT_ALL: \"true\",\n PULUMI_DEBUG_PROMISE_LEAKS: \"true\",\n ...envVars,\n },\n pulumiCommand: await createForceAbortableCommand(),\n },\n )\n\n signal?.throwIfAborted()\n\n try {\n return await runWithRetryOnError(\n () => fn(stack),\n error => this.tryUnlockStack(stack, error),\n )\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"canceled\")) {\n throw new AbortError(\"Stack cancelled\", { cause: error })\n }\n\n throw error\n }\n })\n }\n\n async runLocal<T>(\n options: RunLocalOptions,\n fn: (stack: Stack) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n const { projectId, pulumiProjectName, pulumiStackName, projectPath, stackConfig, envVars } =\n options\n\n return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n const stack = await LocalWorkspace.createOrSelectStack(\n {\n stackName: pulumiStackName,\n workDir: projectPath,\n },\n {\n projectSettings: {\n name: pulumiProjectName,\n runtime: {\n name: \"nodejs\",\n options: {\n nodeargs: \"--no-deprecation\",\n },\n },\n main: \"index.js\",\n },\n stackSettings: stackConfig\n ? {\n [pulumiStackName]: {\n config: stackConfig,\n },\n }\n : undefined,\n envVars: {\n PULUMI_CONFIG_PASSPHRASE: await this.secretService.getPulumiPassword(projectId),\n PULUMI_K8S_AWAIT_ALL: \"true\",\n ...envVars,\n },\n pulumiCommand: await createForceAbortableCommand(),\n },\n )\n\n signal?.throwIfAborted()\n\n try {\n return await runWithRetryOnError(\n () => fn(stack),\n error => this.tryUnlockStack(stack, error),\n )\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"canceled\")) {\n throw new AbortError(\"Stack cancelled\", { cause: error })\n }\n\n throw error\n }\n })\n }\n\n async tryUnlockStack(stack: Stack, error: unknown) {\n if (error instanceof Error && error.message.includes(\"the stack is currently locked\")) {\n // TODO: kill the process if the hostname matches the current hostname\n\n this.logger.warn({ stackName: stack.name }, \"unlocking stack\")\n await stack.cancel()\n return true\n }\n\n return false\n }\n\n static create(secretService: SecretService, logger: Logger) {\n return new LocalPulumiHost(secretService, logger.child({ service: \"LocalPulumiHost\" }))\n }\n}\n\nexport function updateResourceCount(opType: OpType, currentCount: number): number {\n switch (opType) {\n case \"same\":\n case \"create\":\n case \"update\":\n case \"replace\":\n case \"create-replacement\":\n case \"import\":\n case \"import-replacement\":\n return currentCount + 1\n\n case \"delete\":\n case \"delete-replaced\":\n case \"discard\":\n case \"discard-replaced\":\n case \"remove-pending-replace\":\n return currentCount - 1\n\n case \"refresh\":\n case \"read-replacement\":\n case \"read\":\n return currentCount\n\n default:\n throw new Error(`Unknown operation type: ${opType as string}`)\n }\n}\n\nexport function calculateTotalResources(opMap: OpMap | undefined): number {\n if (!opMap) {\n return 0 // No operations imply no resources\n }\n\n let total = 0\n\n for (const [op, count] of Object.entries(opMap)) {\n const opType = op as OpType\n const value = count ?? 0\n total = updateResourceCount(opType, value)\n }\n\n return total\n}\n\nexport async function pulumiErrorToString(error: unknown): Promise<string> {\n const { CommandError } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n if (error instanceof CommandError) {\n // biome-ignore lint/complexity/useLiteralKeys: не ори на отца\n const stderr = error[\"commandResult\"].stderr as string\n let diagnosticsStart = stderr.indexOf(\"\\u001b[38;5;13m\\u001b[1mDiagnostics:\")\n\n if (diagnosticsStart === -1) {\n diagnosticsStart = stderr.indexOf(\"Diagnostics:\")\n }\n\n if (diagnosticsStart !== -1) {\n return stderr.slice(diagnosticsStart)\n }\n }\n\n return errorToString(error)\n}\n","/** biome-ignore-all lint/complexity/useLiteralKeys: не ори на меня */\n\nimport type { ConfigMap, OutputMap, Stack } from \"@pulumi/pulumi/automation/index.js\"\nimport type { Logger } from \"pino\"\nimport type { ArtifactBackend, ArtifactService } from \"../artifact\"\nimport type { LibraryBackend, ResolvedUnitSource } from \"../library\"\nimport type {\n OperationType,\n RunnerBackend,\n TypedUnitStateUpdate,\n UnitDestroyOptions,\n UnitOptions,\n UnitStateUpdate,\n UnitUpdateOptions,\n} from \"./abstractions\"\nimport type { DualAbortSignal } from \"./force-abort\"\nimport { EventEmitter, on } from \"node:events\"\nimport { mkdtemp, rm } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\nimport { crc32 } from \"node:zlib\"\nimport {\n getInstanceId,\n HighstateConfigKey,\n type InstanceId,\n instanceStatusFieldSchema,\n unitArtifactId,\n unitArtifactSchema,\n unitPageSchema,\n unitTerminalSchema,\n unitTriggerSchema,\n unitWorkerSchema,\n} from \"@highstate/contract\"\nimport { encode } from \"@msgpack/msgpack\"\nimport { sha256 } from \"@noble/hashes/sha2\"\nimport { ensureDependencyInstalled } from \"nypm\"\nimport { mapValues, omitBy } from \"remeda\"\nimport { z } from \"zod\"\nimport { runWithRetryOnError } from \"../common\"\nimport {\n type ArtifactEnvironment,\n collectAndStoreArtifacts,\n setupArtifactEnvironment,\n} from \"./artifact-env\"\nimport { type LocalPulumiHost, pulumiErrorToString, updateResourceCount } from \"./pulumi\"\n\ntype Events = {\n [K in `update:${string}`]: [UnitStateUpdate]\n}\n\nexport const localRunnerBackendConfig = z.object({\n HIGHSTATE_RUNNER_BACKEND_LOCAL_PRINT_OUTPUT: z.coerce.boolean().default(true),\n HIGHSTATE_RUNNER_BACKEND_LOCAL_CACHE_DIR: z.string().optional(),\n})\n\nexport class LocalRunnerBackend implements RunnerBackend {\n private readonly events = new EventEmitter<Events>()\n\n constructor(\n private readonly printOutput: boolean,\n private readonly cacheDir: string,\n private readonly pulumiProjectHost: LocalPulumiHost,\n private readonly libraryBackend: LibraryBackend,\n private readonly arttifactManager: ArtifactService,\n private readonly artifactBackend: ArtifactBackend,\n private readonly logger: Logger,\n ) {}\n\n async *watch(options: UnitOptions): AsyncIterable<UnitStateUpdate> {\n const stream = on(\n //\n this.events,\n `update:${LocalRunnerBackend.getInstanceId(options)}`,\n { signal: options.signal },\n ) as AsyncIterable<[UnitStateUpdate]>\n\n for await (const [update] of stream) {\n yield update\n\n if (update.type === \"completion\") {\n return\n }\n }\n }\n\n update(options: UnitUpdateOptions): Promise<void> {\n void this.updateWorker(options, false)\n\n return Promise.resolve()\n }\n\n preview(options: UnitUpdateOptions): Promise<void> {\n void this.updateWorker(options, true)\n\n return Promise.resolve()\n }\n\n private async updateWorker(options: UnitUpdateOptions, preview: boolean): Promise<void> {\n const configMap: ConfigMap = {\n [HighstateConfigKey.Config]: { value: JSON.stringify(options.config) },\n [HighstateConfigKey.Secrets]: { value: JSON.stringify(options.secrets), secret: true },\n }\n\n const unitId = LocalRunnerBackend.getInstanceId(options)\n const childLogger = this.logger.child({ unitId })\n\n // create a dedicated temp directory for this unit execution\n let unitTempPath: string | null = null\n let artifactEnv: ArtifactEnvironment | null = null\n\n try {\n // create unit-specific temp directory for better cleanup reliability\n unitTempPath = await mkdtemp(join(tmpdir(), `highstate-unit-${options.stateId}-`))\n childLogger.debug({ msg: \"created unit temp directory\", unitTempPath })\n options.signal?.throwIfAborted()\n\n artifactEnv = await setupArtifactEnvironment(\n options.projectId,\n options.artifacts ?? [],\n this.artifactBackend,\n unitTempPath,\n childLogger,\n )\n options.signal?.throwIfAborted()\n\n const resolvedSource = await this.getResolvedUnitSource(options)\n options.signal?.throwIfAborted()\n\n const envVars: Record<string, string> = {\n HIGHSTATE_CACHE_DIR: this.cacheDir,\n HIGHSTATE_TEMP_PATH: unitTempPath,\n PULUMI_K8S_DELETE_UNREACHABLE: options.deleteUnreachable ? \"true\" : \"\",\n ...options.envVars,\n }\n\n // enable terraform debug logging if debug mode is enabled\n if (options.debug) {\n envVars.TF_LOG = \"DEBUG\"\n }\n\n // add artifact paths if available\n if (artifactEnv.readPath) {\n envVars.HIGHSTATE_ARTIFACT_READ_PATH = artifactEnv.readPath\n }\n envVars.HIGHSTATE_ARTIFACT_WRITE_PATH = artifactEnv.writePath\n\n await this.pulumiProjectHost.runLocal(\n {\n projectId: options.projectId,\n pulumiProjectName: options.instanceType,\n pulumiStackName: LocalRunnerBackend.getStackName(options),\n projectPath: resolvedSource.projectPath,\n stackConfig: configMap,\n envVars,\n },\n async stack => {\n options.signal?.throwIfAborted()\n\n await stack.setAllConfig(configMap)\n options.signal?.throwIfAborted()\n\n let currentResourceCount = 0\n let totalResourceCount = 0\n\n const signal: DualAbortSignal | undefined = options.signal\n if (signal) {\n signal.forceSignal = options.forceSignal\n }\n\n await runWithRetryOnError(\n async () => {\n await stack[preview ? \"preview\" : \"up\"]({\n color: \"always\",\n refresh: options.refresh,\n signal,\n diff: preview,\n debug: options.debug,\n\n onEvent: event => {\n if (event.resourcePreEvent) {\n totalResourceCount = updateResourceCount(\n event.resourcePreEvent.metadata.op,\n totalResourceCount,\n )\n\n this.emitStateUpdate({ type: \"progress\", unitId, totalResourceCount })\n return\n }\n\n if (event.resOutputsEvent) {\n currentResourceCount = updateResourceCount(\n event.resOutputsEvent.metadata.op,\n currentResourceCount,\n )\n\n this.emitStateUpdate({ type: \"progress\", unitId, currentResourceCount })\n return\n }\n },\n\n onOutput: message => {\n this.emitStateUpdate({ type: \"message\", unitId, message })\n\n if (this.printOutput) {\n console.log(message)\n }\n },\n })\n\n const outputs = await stack.outputs()\n const completionUpdate = this.createCompletionStateUpdate(\"update\", unitId, outputs)\n\n if (!preview && outputs[\"$artifacts\"]) {\n const artifacts = z\n .record(z.string(), unitArtifactSchema.array())\n .parse(outputs[\"$artifacts\"].value)\n\n await collectAndStoreArtifacts(\n artifactEnv!.writePath,\n options.projectId,\n options.stateId,\n this.arttifactManager,\n Object.values(artifacts).flat(),\n childLogger,\n )\n\n completionUpdate.exportedArtifactIds = mapValues(artifacts, artifacts => {\n return artifacts.map(artifact => {\n if (artifact[unitArtifactId]) {\n return artifact[unitArtifactId]\n }\n\n throw new Error(\n `Failed to determine artifact ID for artifact with hash ${artifact.hash}`,\n )\n })\n })\n } else if (preview && outputs[\"$artifacts\"]) {\n childLogger.debug({ msg: \"skipping artifact persistence for preview\" })\n }\n\n this.emitStateUpdate(completionUpdate)\n },\n async error => {\n const isUnlocked = await this.pulumiProjectHost.tryUnlockStack(stack, error)\n if (isUnlocked) return true\n\n const isResolved = await this.tryInstallMissingDependencies(\n error,\n resolvedSource.allowedDependencies,\n )\n if (isResolved) return true\n\n return false\n },\n )\n },\n )\n } catch (error) {\n this.emitStateUpdate({\n unitId: unitId,\n type: \"error\",\n message: await pulumiErrorToString(error),\n })\n } finally {\n // clean up unit temp directory as a second layer of reliability\n await this.cleanupTempPath(unitTempPath, unitId, \"update\", this.logger)\n }\n }\n\n async destroy(options: UnitDestroyOptions): Promise<void> {\n void this.destroyWorker(options)\n\n return Promise.resolve()\n }\n\n async deleteState(options: UnitOptions): Promise<void> {\n await this.pulumiProjectHost.runEmpty(\n {\n projectId: options.projectId,\n pulumiProjectName: options.instanceType,\n pulumiStackName: LocalRunnerBackend.getStackName(options),\n },\n async stack => {\n const { StackNotFoundError } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n try {\n await stack.workspace.removeStack(stack.name, { force: true })\n } catch (error) {\n if (error instanceof StackNotFoundError) {\n return\n }\n }\n },\n )\n }\n\n private async destroyWorker(options: UnitDestroyOptions): Promise<void> {\n const unitId = LocalRunnerBackend.getInstanceId(options)\n\n try {\n const resolvedSource = await this.getResolvedUnitSource(options)\n if (!resolvedSource) {\n throw new Error(`Resolved unit source not found for ${options.instanceType}`)\n }\n\n options.signal?.throwIfAborted()\n\n await this.pulumiProjectHost.runLocal(\n {\n projectId: options.projectId,\n pulumiProjectName: options.instanceType,\n pulumiStackName: LocalRunnerBackend.getStackName(options),\n projectPath: resolvedSource.projectPath,\n envVars: {\n HIGHSTATE_CACHE_DIR: this.cacheDir,\n PULUMI_K8S_DELETE_UNREACHABLE: options.deleteUnreachable ? \"true\" : \"\",\n ...(options.debug && { TF_LOG: \"DEBUG\" }),\n },\n },\n async stack => {\n options.signal?.throwIfAborted()\n\n const summary = await stack.workspace.stack()\n let currentResourceCount = summary?.resourceCount ?? 0\n\n this.emitStateUpdate({\n unitId,\n type: \"progress\",\n currentResourceCount,\n totalResourceCount: currentResourceCount,\n })\n\n const signal: DualAbortSignal | undefined = options.signal\n if (signal) {\n signal.forceSignal = options.forceSignal\n }\n\n try {\n await runWithRetryOnError(\n async () => {\n await stack.destroy({\n color: \"always\",\n refresh: options.refresh,\n remove: true,\n signal,\n debug: options.debug,\n\n onEvent: event => {\n if (event.resOutputsEvent) {\n currentResourceCount = updateResourceCount(\n event.resOutputsEvent.metadata.op,\n currentResourceCount,\n )\n\n this.emitStateUpdate({ type: \"progress\", unitId, currentResourceCount })\n return\n }\n },\n\n onOutput: message => {\n this.emitStateUpdate({ type: \"message\", unitId, message })\n\n if (this.printOutput) {\n console.log(message)\n }\n },\n })\n\n await this.emitCompletionStateUpdate(\"destroy\", unitId, stack)\n },\n error => this.pulumiProjectHost.tryUnlockStack(stack, error),\n )\n } catch (error) {\n if (options.forceDeleteState) {\n await stack.workspace.removeStack(stack.name, { force: true })\n } else {\n throw error\n }\n }\n },\n )\n } catch (error) {\n const { StackNotFoundError } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n if (error instanceof StackNotFoundError) {\n this.emitStateUpdate({\n type: \"completion\",\n operationType: \"destroy\",\n unitId,\n outputHash: null,\n message: null,\n })\n return\n }\n\n this.emitStateUpdate({\n type: \"error\",\n unitId: unitId,\n message: await pulumiErrorToString(error),\n })\n }\n }\n\n refresh(options: UnitOptions): Promise<void> {\n void this.refreshWorker(options)\n\n return Promise.resolve()\n }\n\n private async refreshWorker(options: UnitOptions): Promise<void> {\n const unitId = LocalRunnerBackend.getInstanceId(options)\n\n try {\n await this.pulumiProjectHost.runEmpty(\n {\n projectId: options.projectId,\n pulumiProjectName: options.instanceType,\n pulumiStackName: LocalRunnerBackend.getStackName(options),\n },\n async stack => {\n options.signal?.throwIfAborted()\n\n const summary = await stack.workspace.stack()\n options.signal?.throwIfAborted()\n\n let currentResourceCount = 0\n let totalResourceCount = summary?.resourceCount ?? 0\n\n this.emitStateUpdate({\n type: \"progress\",\n unitId,\n\n currentResourceCount,\n totalResourceCount,\n })\n\n await runWithRetryOnError(\n async () => {\n await stack.refresh({\n color: \"always\",\n debug: options.debug,\n\n onEvent: event => {\n if (event.resourcePreEvent) {\n totalResourceCount = updateResourceCount(\n event.resourcePreEvent.metadata.op,\n totalResourceCount,\n )\n\n if (totalResourceCount > currentResourceCount) {\n this.emitStateUpdate({ type: \"progress\", unitId, totalResourceCount })\n }\n return\n }\n\n if (event.resOutputsEvent) {\n currentResourceCount = updateResourceCount(\n event.resOutputsEvent.metadata.op,\n currentResourceCount,\n )\n\n this.emitStateUpdate({ type: \"progress\", unitId, currentResourceCount })\n return\n }\n },\n onOutput: message => {\n this.emitStateUpdate({ type: \"message\", unitId, message })\n\n if (this.printOutput) {\n console.log(message)\n }\n },\n signal: options.signal,\n })\n\n this.emitStateUpdate({\n type: \"completion\",\n operationType: \"refresh\",\n unitId,\n\n // do not emit output-related fields on refresh since they will not change\n // some of them (like artifact files) are not even available on refresh\n })\n },\n error => this.pulumiProjectHost.tryUnlockStack(stack, error),\n )\n },\n )\n } catch (error) {\n this.emitStateUpdate({\n type: \"error\",\n unitId,\n message: await pulumiErrorToString(error),\n })\n }\n }\n\n private createCompletionStateUpdate(\n opType: \"update\" | \"destroy\" | \"refresh\",\n unitId: InstanceId,\n outputs: OutputMap,\n ): TypedUnitStateUpdate<\"completion\"> {\n const unitOutputs = omitBy(outputs, (_, key) => key.startsWith(\"$\"))\n\n return {\n unitId,\n type: \"completion\",\n operationType: opType,\n\n outputHash: crc32(sha256(encode(unitOutputs))),\n\n statusFields: outputs[\"$statusFields\"]\n ? z.array(instanceStatusFieldSchema).parse(outputs[\"$statusFields\"].value)\n : null,\n\n terminals: outputs[\"$terminals\"]\n ? z.array(unitTerminalSchema).parse(outputs[\"$terminals\"].value)\n : null,\n\n pages: outputs[\"$pages\"] ? z.array(unitPageSchema).parse(outputs[\"$pages\"].value) : null,\n\n triggers: outputs[\"$triggers\"]\n ? z.array(unitTriggerSchema).parse(outputs[\"$triggers\"].value)\n : null,\n\n workers: outputs[\"$workers\"]\n ? z.array(unitWorkerSchema).parse(outputs[\"$workers\"].value)\n : null,\n\n secrets: outputs[\"$secrets\"]\n ? z.record(z.string(), z.unknown()).parse(outputs[\"$secrets\"].value)\n : null,\n }\n }\n\n private async emitCompletionStateUpdate(\n opType: OperationType,\n unitId: InstanceId,\n stack: Stack,\n ): Promise<TypedUnitStateUpdate<\"completion\">> {\n const output = await stack.outputs()\n const update = this.createCompletionStateUpdate(opType, unitId, output)\n\n return this.emitStateUpdate(update)\n }\n\n private emitStateUpdate<TUpdate extends UnitStateUpdate>(update: TUpdate): TUpdate {\n this.events.emit(`update:${update.unitId}`, update)\n\n return update\n }\n\n private async cleanupTempPath(\n tempPath: string | null,\n instanceId: string,\n operation: string,\n logger: Logger,\n ): Promise<void> {\n if (!tempPath) {\n return\n }\n\n try {\n await rm(tempPath, { recursive: true, force: true })\n logger.debug({\n msg: `cleaned up unit temp directory for ${operation}`,\n tempPath,\n instanceId,\n })\n } catch (error) {\n logger.warn({\n msg: `failed to cleanup unit temp directory for ${operation}`,\n tempPath,\n instanceId,\n error,\n })\n }\n }\n\n private static getInstanceId(options: UnitOptions) {\n return getInstanceId(options.instanceType, options.instanceName)\n }\n\n private async tryInstallMissingDependencies(\n error: unknown,\n allowedDependencies: string[],\n ): Promise<boolean> {\n if (!(error instanceof Error)) {\n return false\n }\n\n const pattern = /Cannot find module '(.*)'/\n const match = error.message.match(pattern)\n\n if (!match) {\n return false\n }\n\n const packageName = match[1]\n\n if (!allowedDependencies.includes(packageName)) {\n throw new Error(\n `Dependency '${packageName}' was requested to be auto-installed, but it is not allowed. Please add it to the 'peerDependencies' in the package.json of the unit.`,\n )\n }\n\n await ensureDependencyInstalled(packageName)\n return true\n }\n\n private async getResolvedUnitSource(options: UnitOptions): Promise<ResolvedUnitSource> {\n const sources = await this.libraryBackend.getResolvedUnitSources(options.libraryId, [\n options.instanceType,\n ])\n const source = sources.find(source => source.unitType === options.instanceType)\n\n if (!source) {\n throw new Error(`Resolved unit source not found for ${options.instanceType}`)\n }\n\n return source\n }\n\n private static getStackName(options: UnitOptions) {\n return options.stateId\n }\n\n public static create(\n config: z.infer<typeof localRunnerBackendConfig>,\n pulumiProjectHost: LocalPulumiHost,\n libraryBackend: LibraryBackend,\n artifactManager: ArtifactService,\n artifactBackend: ArtifactBackend,\n logger: Logger,\n ): RunnerBackend {\n let cacheDir = config.HIGHSTATE_RUNNER_BACKEND_LOCAL_CACHE_DIR\n if (!cacheDir) {\n const homeDir = process.env.HOME ?? process.env.USERPROFILE\n if (!homeDir) {\n throw new Error(\n \"Failed to determine the home directory, please set HIGHSTATE_BACKEND_RUNNER_LOCAL_CACHE_DIR\",\n )\n }\n\n cacheDir = resolve(homeDir, \".cache\", \"highstate\")\n }\n\n return new LocalRunnerBackend(\n config.HIGHSTATE_RUNNER_BACKEND_LOCAL_PRINT_OUTPUT,\n cacheDir,\n pulumiProjectHost,\n libraryBackend,\n artifactManager,\n artifactBackend,\n logger,\n )\n }\n}\n","import type { Logger } from \"pino\"\nimport type { ArtifactBackend, ArtifactService } from \"../artifact\"\nimport type { SecretService } from \"../business\"\nimport type { LibraryBackend } from \"../library\"\nimport type { RunnerBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { LocalRunnerBackend, localRunnerBackendConfig } from \"./local\"\nimport { LocalPulumiHost } from \"./pulumi\"\n\nexport const runnerBackendConfig = z.object({\n HIGHSTATE_RUNNER_BACKEND_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localRunnerBackendConfig.shape,\n})\n\nexport function createRunnerBackend(\n config: z.infer<typeof runnerBackendConfig>,\n libraryBackend: LibraryBackend,\n artifactManager: ArtifactService,\n artifactBackend: ArtifactBackend,\n secretService: SecretService,\n logger: Logger,\n): RunnerBackend {\n switch (config.HIGHSTATE_RUNNER_BACKEND_TYPE) {\n case \"local\": {\n const localPulumiHost = LocalPulumiHost.create(secretService, logger)\n\n return LocalRunnerBackend.create(\n config,\n localPulumiHost,\n libraryBackend,\n artifactManager,\n artifactBackend,\n logger,\n )\n }\n }\n}\n","export const runScript = `set -e -o pipefail\nread -r data\n\n# Extract env and files as key-value pairs, and command as an array\nenvKeys=($(jq -r '.env | keys[]' <<<\"$data\"))\nfilesKeys=($(jq -r '.files | keys[]' <<<\"$data\"))\ncommandArr=($(jq -r '.command[]' <<<\"$data\"))\ncols=$(jq -r '.screenSize.cols' <<<\"$data\")\nrows=$(jq -r '.screenSize.rows' <<<\"$data\")\n\n# Set environment variables\nfor key in \"\\${envKeys[@]}\"; do\n value=$(jq -r \".env[\\\\\"$key\\\\\"]\" <<<\"$data\")\n export \"$key=$value\"\ndone\n\n# Create files\nfor key in \"\\${filesKeys[@]}\"; do\n contentType=$(jq -r \".files[\\\\\"$key\\\\\"].content.type\" <<<\"$data\")\n \n # Skip artifact type files for now\n if [ \"$contentType\" = \"artifact\" ]; then\n continue\n fi\n \n # Handle embedded content\n if [ \"$contentType\" = \"embedded\" ]; then\n content=$(jq -r \".files[\\\\\"$key\\\\\"].content.value\" <<<\"$data\")\n isBinary=$(jq -r \".files[\\\\\"$key\\\\\"].meta.isBinary // false\" <<<\"$data\")\n mode=$(jq -r \".files[\\\\\"$key\\\\\"].meta.mode // 0\" <<<\"$data\")\n \n mkdir -p \"$(dirname \"$key\")\"\n\n if [ \"$isBinary\" = \"true\" ]; then\n echo \"$content\" | base64 -d > \"$key\"\n else\n echo \"$content\" > \"$key\"\n fi\n\n if [ \"$mode\" -ne 0 ]; then\n chmod $(printf \"%o\" \"$mode\") \"$key\"\n fi\n fi\ndone\n\n# Execute the command, keeping stdin/stdout open and spawnin a new TTY\ncmd=$(printf \"%q \" \"\\${commandArr[@]}\")\nexec script -q -c \"stty cols $cols rows $rows; $cmd\" /dev/null\n`\n","import type { Logger } from \"pino\"\nimport type { TerminalBackend, TerminalRunOptions } from \"./abstractions\"\nimport { mkdir, writeFile } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { resolve } from \"node:path\"\nimport { Readable } from \"node:stream\"\nimport spawn from \"nano-spawn\"\nimport { z } from \"zod\"\nimport { runScript } from \"./run.sh\"\n\nexport const dockerTerminalBackendConfig = z.object({\n HIGHSTATE_TERMINAL_BACKEND_DOCKER_BINARY: z.string().default(\"docker\"),\n HIGHSTATE_TERMINAL_BACKEND_DOCKER_USE_SUDO: z.coerce.boolean().default(false),\n HIGHSTATE_TERMINAL_BACKEND_DOCKER_HOST: z.string().optional(),\n})\n\nexport class DockerTerminalBackend implements TerminalBackend {\n constructor(\n private readonly binary: string,\n private readonly useSudo: boolean,\n private readonly host: string | undefined,\n private readonly logger: Logger,\n ) {}\n\n async run({ spec, stdin, stdout, screenSize, signal }: TerminalRunOptions): Promise<void> {\n const hsTempDir = resolve(tmpdir(), \"highstate\")\n await mkdir(hsTempDir, { recursive: true })\n\n const runScriptPath = resolve(hsTempDir, \"run.sh\")\n await writeFile(runScriptPath, runScript, { mode: 0o755 })\n\n const args = [\n \"run\",\n \"-i\",\n \"-v\",\n `${runScriptPath}:/run.sh:ro`,\n spec.image,\n \"/bin/bash\",\n \"/run.sh\",\n ]\n\n const initData = {\n command: spec.command,\n cwd: spec.cwd,\n env: {\n ...spec.env,\n TERM: \"xterm-256color\",\n },\n files: spec.files ?? {},\n screenSize,\n }\n\n const initDataStream = Readable.from(`${JSON.stringify(initData)}\\n`)\n\n if (this.useSudo) {\n args.unshift(this.binary)\n }\n\n const process = spawn(this.useSudo ? \"sudo\" : this.binary, args, {\n env: {\n DOCKER_HOST: this.host,\n },\n signal,\n })\n\n const childProcess = await process.nodeChildProcess\n\n initDataStream.pipe(childProcess.stdin!, { end: false })\n initDataStream.on(\"end\", () => stdin.pipe(childProcess.stdin!))\n\n childProcess.stdout?.pipe(stdout)\n childProcess.stderr?.pipe(stdout)\n\n if (!childProcess.pid) {\n throw new Error(`Failed to start Docker container without clear response from child process.`)\n }\n\n this.logger.info({ processId: childProcess.pid }, \"process started\")\n\n await process\n }\n\n static create(\n config: z.infer<typeof dockerTerminalBackendConfig>,\n logger: Logger,\n ): DockerTerminalBackend {\n return new DockerTerminalBackend(\n config.HIGHSTATE_TERMINAL_BACKEND_DOCKER_BINARY,\n config.HIGHSTATE_TERMINAL_BACKEND_DOCKER_USE_SUDO,\n config.HIGHSTATE_TERMINAL_BACKEND_DOCKER_HOST,\n logger.child({ backend: \"TerminalBackend\", service: \"DockerTerminalBackend\" }),\n )\n }\n}\n","import type { Logger } from \"pino\"\nimport type { TerminalBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { DockerTerminalBackend, dockerTerminalBackendConfig } from \"./docker\"\n\nexport const terminalBackendConfig = z.object({\n HIGHSTATE_TERMINAL_BACKEND_TYPE: z.enum([\"docker\"]).default(\"docker\"),\n ...dockerTerminalBackendConfig.shape,\n})\n\nexport function createTerminalBackend(\n config: z.infer<typeof terminalBackendConfig>,\n logger: Logger,\n): TerminalBackend {\n switch (config.HIGHSTATE_TERMINAL_BACKEND_TYPE) {\n case \"docker\": {\n return DockerTerminalBackend.create(config, logger)\n }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { ProjectUnlockService } from \"../business\"\nimport type { DatabaseManager, Terminal, TerminalSession } from \"../database\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { TerminalSessionOutput } from \"../shared/models/project/terminal\"\nimport type { ScreenSize, TerminalBackend } from \"./abstractions\"\nimport { PassThrough, type Stream, type Writable } from \"node:stream\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport { isAbortErrorLike } from \"../common\"\nimport { type AsyncBatcher, createAsyncBatcher, toTerminalSessionOutput } from \"../shared\"\n\ntype ManagedTerminal = {\n readonly projectId: string\n\n readonly terminal: Terminal\n readonly session: TerminalSession\n\n readonly abortController: AbortController\n readonly stdin: PassThrough\n readonly stdout: PassThrough\n readonly logBatcher: AsyncBatcher<string>\n\n refCount: number\n started: boolean\n start(screenSize: ScreenSize): void\n}\n\nconst notAttachedTerminalLifetime = 5 * 60 * 1000 // 5 minutes\n\nexport class TerminalManager {\n private readonly managedTerminals = new Map<string, ManagedTerminal>()\n\n private constructor(\n private readonly terminalBackend: TerminalBackend,\n private readonly database: DatabaseManager,\n private readonly pubsubManager: PubSubManager,\n private readonly projectUnlockService: ProjectUnlockService,\n private readonly logger: Logger,\n ) {\n this.projectUnlockService.registerUnlockTask(\n //\n \"mark-finished-terminal-sessions\",\n projectId => this.markFinishedSessions(projectId),\n )\n }\n\n public isSessionActive(sessionId: string): boolean {\n return this.managedTerminals.has(sessionId)\n }\n\n public async *watchSession(\n projectId: string,\n sessionId: string,\n signal?: AbortSignal,\n ): AsyncIterable<TerminalSessionOutput> {\n const managedTerminal = this.managedTerminals.get(sessionId)\n\n // if terminal session is not active, just fetch it, return and stop watching\n if (!managedTerminal) {\n const database = await this.database.forProject(projectId)\n const session = await database.terminalSession.findUnique({\n where: { id: sessionId },\n include: { terminal: true },\n })\n\n if (!session) {\n throw new Error(`Terminal session \"${sessionId}\" not found`)\n }\n\n const terminalSessionOutput: TerminalSessionOutput = {\n ...session,\n meta: session.terminal?.meta,\n }\n\n yield terminalSessionOutput\n return\n }\n\n yield toTerminalSessionOutput(managedTerminal.terminal, managedTerminal.session)\n\n for await (const terminalSession of await this.pubsubManager.subscribe(\n [\"active-terminal-session\", projectId, sessionId],\n signal,\n )) {\n yield terminalSession\n\n if (terminalSession.finishedAt) {\n // terminal session is finished, stop watching\n return\n }\n }\n }\n\n public async createSession(\n projectId: string,\n terminalId: string,\n ): Promise<TerminalSessionOutput> {\n const database = await this.database.forProject(projectId)\n\n // get the terminal info from database\n const terminal = await database.terminal.findUnique({\n where: { id: terminalId },\n })\n\n if (!terminal) {\n throw new Error(`Terminal \"${terminalId}\" not found`)\n }\n\n // create the terminal session in database\n const session = await database.terminalSession.create({\n data: {\n terminalId,\n },\n })\n\n const output = toTerminalSessionOutput(terminal, session)\n\n this.logger.info({ msg: \"terminal session created\", id: output.id })\n\n this.createManagedTerminal(projectId, terminal, session)\n\n return output\n }\n\n public async getOrCreateSession(\n projectId: string,\n terminalId: string,\n newSession = false,\n ): Promise<TerminalSessionOutput> {\n // find if there's already an active session for this terminal\n if (!newSession) {\n for (const managedTerminal of this.managedTerminals.values()) {\n if (\n managedTerminal.projectId === projectId &&\n managedTerminal.session.terminalId === terminalId\n ) {\n return toTerminalSessionOutput(managedTerminal.terminal, managedTerminal.session)\n }\n }\n }\n\n return await this.createSession(projectId, terminalId)\n }\n\n public close(sessionId: string): void {\n this.logger.info({ msg: \"closing terminal session\", id: sessionId })\n\n const managedTerminal = this.managedTerminals.get(sessionId)\n\n if (managedTerminal) {\n managedTerminal.abortController.abort()\n }\n }\n\n public attach(\n sessionId: string,\n stdin: Stream,\n stdout: Writable,\n screenSize: ScreenSize,\n signal: AbortSignal,\n ): void {\n const terminal = this.managedTerminals.get(sessionId)\n if (!terminal) {\n throw new Error(`Terminal session \"${sessionId}\" not found, check if it's still active`)\n }\n\n const handleStdin = (data: unknown) => {\n terminal.stdin.write(data)\n }\n\n const handleStdout = (data: unknown) => {\n stdout.write(data)\n }\n\n terminal.stdout.on(\"data\", handleStdout)\n stdin.on(\"data\", handleStdin)\n\n terminal.refCount += 1\n\n this.logger.info(\n \"terminal attached (sessionId: %s, refCount: %d)\",\n sessionId,\n terminal.refCount,\n )\n\n signal.addEventListener(\"abort\", () => {\n terminal.refCount -= 1\n terminal.stdout.off(\"data\", handleStdout)\n stdin.off(\"data\", handleStdin)\n\n this.logger.info(\n \"terminal detached (sessionId: %s, refCount: %d)\",\n sessionId,\n terminal.refCount,\n )\n })\n\n if (!terminal.started) {\n terminal.start(screenSize)\n terminal.started = true\n }\n }\n\n private createManagedTerminal(\n projectId: string,\n terminal: Terminal,\n session: TerminalSession,\n ): ManagedTerminal {\n const managedTerminal: ManagedTerminal = {\n projectId,\n terminal,\n session,\n\n abortController: new AbortController(),\n stdin: new PassThrough(),\n stdout: new PassThrough(),\n\n logBatcher: createAsyncBatcher(async (entries: string[]) => {\n this.logger.trace({ msg: \"persisting terminal log entries\", count: entries.length })\n\n const database = await this.database.forProject(projectId)\n\n await database.terminalSessionLog.createMany({\n data: entries.map(entry => ({\n id: uuidv7(),\n sessionId: session.id,\n content: entry,\n })),\n })\n }),\n\n refCount: 0,\n started: false,\n\n start: (screenSize: ScreenSize) => {\n void this.terminalBackend\n .run({\n spec: terminal.spec,\n stdin: managedTerminal.stdin,\n stdout: managedTerminal.stdout,\n screenSize,\n signal: managedTerminal.abortController.signal,\n })\n .catch(error => {\n if (isAbortErrorLike(error)) {\n return\n }\n\n this.logger.error({\n msg: \"managed terminal failed\",\n id: managedTerminal.session.id,\n error: error as unknown,\n })\n })\n .finally(() => {\n this.logger.info({ msg: \"managed terminal closed\", id: managedTerminal.session.id })\n this.managedTerminals.delete(managedTerminal.session.id)\n\n managedTerminal.session.finishedAt = new Date()\n\n void this.pubsubManager.publish(\n [\"active-terminal-session\", managedTerminal.projectId, managedTerminal.session.id],\n toTerminalSessionOutput(managedTerminal.terminal, managedTerminal.session),\n )\n\n // update session with finished timestamp\n void this.database.forProject(managedTerminal.projectId).then(database => {\n return database.terminalSession.update({\n where: { id: managedTerminal.session.id },\n data: { finishedAt: managedTerminal.session.finishedAt },\n })\n })\n\n void managedTerminal.logBatcher.flush()\n })\n\n setTimeout(\n () => this.closeTerminalIfNotAttached(managedTerminal),\n notAttachedTerminalLifetime,\n )\n\n this.logger.info({ msg: \"managed terminal created\", id: managedTerminal.session.id })\n },\n }\n\n managedTerminal.stdout.on(\"data\", data => {\n const entry = String(data)\n\n managedTerminal.logBatcher.call(entry)\n })\n\n this.managedTerminals.set(managedTerminal.session.id, managedTerminal)\n\n return managedTerminal\n }\n\n private closeTerminalIfNotAttached(terminal: ManagedTerminal) {\n if (!this.managedTerminals.has(terminal.session.id)) {\n // Already closed\n return\n }\n\n if (terminal.refCount <= 0) {\n this.logger.info({\n msg: \"terminal not attached for too long, closing\",\n id: terminal.session.id,\n })\n\n terminal.abortController.abort()\n this.managedTerminals.delete(terminal.session.id)\n return\n }\n\n setTimeout(() => this.closeTerminalIfNotAttached(terminal), notAttachedTerminalLifetime)\n }\n\n static create(\n terminalBackend: TerminalBackend,\n database: DatabaseManager,\n pubsubManager: PubSubManager,\n projectUnlockService: ProjectUnlockService,\n logger: Logger,\n ): TerminalManager {\n return new TerminalManager(\n terminalBackend,\n database,\n pubsubManager,\n projectUnlockService,\n logger.child({ service: \"TerminalManager\" }),\n )\n }\n\n private async markFinishedSessions(projectId: string): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n // find all sessions without finishedAt timestamp that are not currently managed\n const activeSessions = await database.terminalSession.findMany({\n where: {\n finishedAt: null,\n },\n })\n\n if (activeSessions.length === 0) {\n this.logger.debug({ projectId }, \"no lost terminal sessions found\")\n return\n }\n\n // mark sessions as finished if they're not currently managed\n for (const session of activeSessions) {\n if (this.managedTerminals.has(session.id)) {\n continue\n }\n\n await database.terminalSession.update({\n where: { id: session.id },\n data: { finishedAt: new Date() },\n })\n }\n\n this.logger.debug(\n { projectId, count: activeSessions.length },\n \"marked terminal sessions as finished\",\n )\n }\n}\n","import type { WorkerRunOptions } from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type { WorkerBackend, WorkerRunOptions as WorkerRunBackendOptions } from \"./abstractions\"\nimport { Readable } from \"node:stream\"\nimport spawn from \"nano-spawn\"\nimport { z } from \"zod\"\n\nexport const dockerWorkerBackendConfig = z.object({\n HIGHSTATE_WORKER_BACKEND_DOCKER_BINARY: z.string().default(\"docker\"),\n HIGHSTATE_WORKER_BACKEND_DOCKER_USE_SUDO: z.coerce.boolean().default(false),\n HIGHSTATE_WORKER_BACKEND_DOCKER_HOST: z.string().optional(),\n})\n\nexport class DockerWorkerBackend implements WorkerBackend {\n constructor(\n private readonly binary: string,\n private readonly useSudo: boolean,\n private readonly host: string | undefined,\n private readonly logger: Logger,\n ) {}\n\n async run({\n projectId,\n workerVersionId,\n image,\n apiKey,\n apiPath,\n stdout,\n signal,\n }: WorkerRunBackendOptions): Promise<void> {\n const args = [\"run\", \"-i\", \"-v\", `${apiPath}:/var/run/highstate.sock`, image]\n\n const runOptions: WorkerRunOptions = {\n projectId,\n workerVersionId,\n apiKey,\n apiUrl: \"unix:///var/run/highstate.sock\",\n }\n\n const initDataStream = Readable.from(`${JSON.stringify(runOptions)}\\n`)\n\n if (this.useSudo) {\n args.unshift(this.binary)\n }\n\n const process = spawn(this.useSudo ? \"sudo\" : this.binary, args, {\n env: {\n DOCKER_HOST: this.host,\n },\n signal,\n })\n\n const childProcess = await process.nodeChildProcess\n\n initDataStream.pipe(childProcess.stdin!)\n\n childProcess.stdout?.pipe(stdout)\n childProcess.stderr?.pipe(stdout)\n\n if (!childProcess.pid) {\n throw new Error(`Failed to start Docker container without clear response from child process.`)\n }\n\n this.logger.info({ processId: childProcess.pid }, \"process started\")\n\n await process\n }\n\n static create(config: z.infer<typeof dockerWorkerBackendConfig>, logger: Logger): WorkerBackend {\n return new DockerWorkerBackend(\n config.HIGHSTATE_WORKER_BACKEND_DOCKER_BINARY,\n config.HIGHSTATE_WORKER_BACKEND_DOCKER_USE_SUDO,\n config.HIGHSTATE_WORKER_BACKEND_DOCKER_HOST,\n logger.child({ backend: \"WorkerBackend\", service: \"DockerWorkerBackend\" }),\n )\n }\n}\n","import type { Logger } from \"pino\"\nimport type { WorkerBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { DockerWorkerBackend, dockerWorkerBackendConfig } from \"./docker\"\n\nexport const workerBackendConfig = z.object({\n HIGHSTATE_WORKER_BACKEND_TYPE: z.enum([\"docker\"]).default(\"docker\"),\n ...dockerWorkerBackendConfig.shape,\n})\n\nexport function createWorkerBackend(\n config: z.infer<typeof workerBackendConfig>,\n logger: Logger,\n): WorkerBackend {\n switch (config.HIGHSTATE_WORKER_BACKEND_TYPE) {\n case \"docker\": {\n return DockerWorkerBackend.create(config, logger)\n }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { ApiKeyService, ProjectUnlockService } from \"../business\"\nimport type { DatabaseManager, Worker, WorkerVersion } from \"../database\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { WorkerBackend } from \"./abstractions\"\nimport { PassThrough } from \"node:stream\"\nimport { z } from \"zod\"\nimport { type AsyncBatcher, createAsyncBatcher } from \"../shared\"\n\nexport const workerManagerConfig = z.object({\n HIGHSTATE_WORKER_API_PATH: z.string().default(\"/var/run/highstate.sock\"),\n})\n\ntype RunningWorkerInfo = {\n abortController: AbortController\n projectId: string\n workerVersion: WorkerVersion & { worker: Worker }\n startedAt: Date\n failedAttempts: number\n status: \"starting\" | \"running\"\n logBatcher: AsyncBatcher<{ content: string; isSystem?: boolean }>\n lineBuffer?: string\n}\n\nexport const maxWorkerStartAttempts = 5\n\nexport class WorkerManager {\n constructor(\n readonly config: z.infer<typeof workerManagerConfig>,\n private readonly runtimeId: string,\n private readonly workerBackend: WorkerBackend,\n private readonly projectUnlockService: ProjectUnlockService,\n private readonly apiKeyService: ApiKeyService,\n private readonly database: DatabaseManager,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {\n this.projectUnlockService.registerUnlockTask(\n //\n \"sync-workers\",\n projectId => this.syncWorkers(projectId),\n )\n\n this.projectUnlockService.registerUnlockTask(\n //\n \"clear-worker-logs\",\n projectId => this.clearWorkerLogs(projectId),\n )\n }\n\n private readonly runningWorkers = new Map<string, RunningWorkerInfo>()\n\n private async startWorkerVersion(\n projectId: string,\n workerVersion: WorkerVersion & { worker: Worker },\n restart = false,\n ): Promise<void> {\n const existingInfo = this.runningWorkers.get(workerVersion.id)\n\n // check if already running\n if (existingInfo?.status === \"running\") {\n this.logger.debug(\n { projectId, workerVersionId: workerVersion.id },\n `worker version \"%s\" is already running, skipping start`,\n workerVersion.id,\n )\n return\n }\n\n // calculate attempt number\n const previousFailedAttempts = existingInfo?.failedAttempts ?? 0\n const failedAttempts = restart ? previousFailedAttempts + 1 : 0\n\n // check if max attempts reached\n if (failedAttempts >= maxWorkerStartAttempts) {\n this.logger.debug(\n { projectId, workerVersionId: workerVersion.id },\n `skipping worker version \"%s\" start attempt since maximum attempts reached`,\n workerVersion.id,\n )\n\n await this.writeWorkerLog(\n projectId,\n workerVersion.id,\n `maximum retry attempts (${maxWorkerStartAttempts}) exceeded, marking as error`,\n )\n\n // update status to error in database\n const database = await this.database.forProject(projectId)\n await database.workerVersion.update({\n where: { id: workerVersion.id },\n data: {\n status: \"error\",\n runtimeId: this.runtimeId,\n },\n })\n\n // clean up from running workers map\n if (existingInfo) {\n existingInfo.logBatcher && void existingInfo.logBatcher.flush()\n this.runningWorkers.delete(workerVersion.id)\n }\n\n return\n }\n\n // regenerate API token\n const apiKey = await this.apiKeyService.regenerateToken(projectId, workerVersion.apiKeyId)\n const stdout = new PassThrough()\n\n await this.writeWorkerLog(\n projectId,\n workerVersion.id,\n `starting worker container, attempt ${failedAttempts + 1}/${maxWorkerStartAttempts}`,\n )\n\n const database = await this.database.forProject(projectId)\n\n const logBatcher = createAsyncBatcher(\n async (entries: Array<{ content: string; isSystem?: boolean }>) => {\n this.logger.trace({ msg: \"persisting worker log entries\", count: entries.length })\n\n for (const entry of entries) {\n const log = await database.workerVersionLog.create({\n data: {\n workerVersionId: workerVersion.id,\n content: entry.content,\n isSystem: entry.isSystem ?? false,\n },\n })\n\n this.pubsubManager.publish([\"worker-version-log\", projectId, workerVersion.id], log)\n }\n },\n )\n\n const abortController = new AbortController()\n\n // create tracking info first\n const info: RunningWorkerInfo = {\n abortController,\n projectId,\n workerVersion,\n startedAt: new Date(),\n failedAttempts,\n status: \"starting\",\n logBatcher,\n lineBuffer: \"\",\n }\n\n // update tracking info\n this.runningWorkers.set(workerVersion.id, info)\n\n // buffer for incomplete lines\n stdout.on(\"data\", chunk => {\n const text = (info.lineBuffer || \"\") + String(chunk)\n const lines = text.split(\"\\n\")\n\n // keep the last incomplete line in the buffer\n info.lineBuffer = lines.pop() || \"\"\n\n // process complete lines\n for (const line of lines) {\n if (line.trim()) {\n logBatcher.call({ content: line, isSystem: false })\n }\n }\n })\n\n // flush any remaining buffered line on close\n stdout.on(\"end\", () => {\n if (info.lineBuffer?.trim()) {\n logBatcher.call({ content: info.lineBuffer, isSystem: false })\n info.lineBuffer = \"\"\n }\n })\n\n // update worker version status in database\n await database.workerVersion.update({\n where: { id: workerVersion.id },\n data: {\n status: \"starting\",\n runtimeId: this.runtimeId,\n },\n })\n\n void this.workerBackend\n .run({\n projectId,\n workerVersionId: workerVersion.id,\n image: `${workerVersion.worker.identity}@sha256:${workerVersion.digest}`,\n apiPath: this.config.HIGHSTATE_WORKER_API_PATH,\n apiKey: apiKey.token,\n stdout,\n signal: abortController.signal,\n })\n // regardless the exit reason, we want to restart the worker if it has remaining attempts\n .finally(async () => {\n const info = this.runningWorkers.get(workerVersion.id)\n\n if (info) {\n // flush any remaining line buffer\n if (info.lineBuffer?.trim()) {\n info.logBatcher.call({ content: info.lineBuffer, isSystem: false })\n info.lineBuffer = \"\"\n }\n\n void info.logBatcher.flush()\n\n // only log if it wasn't a manual stop\n if (!info.abortController.signal.aborted) {\n await this.writeWorkerLog(\n projectId,\n workerVersion.id,\n `worker container exited unexpectedly`,\n )\n }\n }\n\n // attempt restart if not manually aborted\n if (!info?.abortController.signal.aborted) {\n void this.startWorkerVersion(projectId, workerVersion, true)\n }\n })\n }\n\n private async writeWorkerLog(\n projectId: string,\n workerVersionId: string,\n message: string,\n ): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n const log = await database.workerVersionLog.create({\n data: {\n workerVersionId,\n content: message,\n isSystem: true, // runtime logs are always system logs\n },\n })\n\n this.pubsubManager.publish([\"worker-version-log\", projectId, workerVersionId], log)\n }\n\n async setWorkerRunning(projectId: string, workerVersionId: string): Promise<void> {\n const info = this.runningWorkers.get(workerVersionId)\n if (!info) {\n this.logger.warn(\n { projectId, workerVersionId },\n `worker version \"%s\" not found in running workers`,\n workerVersionId,\n )\n return\n }\n\n await this.writeWorkerLog(\n projectId,\n workerVersionId,\n `worker container started successfully and connected to runtime`,\n )\n\n info.status = \"running\"\n info.failedAttempts = 0\n\n // update worker version status in database\n const database = await this.database.forProject(projectId)\n await database.workerVersion.update({\n where: { id: workerVersionId },\n data: {\n status: \"running\",\n runtimeId: this.runtimeId,\n },\n })\n\n this.logger.debug(\n { projectId, workerVersionId },\n `worker version \"%s\" is now running in project \"%s\"`,\n workerVersionId,\n projectId,\n )\n }\n\n private async stopWorkerVersion(workerVersionId: string, reason = \"manual stop\"): Promise<void> {\n const info = this.runningWorkers.get(workerVersionId)\n if (!info) {\n this.logger.warn(\n { workerVersionId },\n `worker version \"%s\" is not running, cannot stop`,\n workerVersionId,\n )\n return\n }\n\n await this.writeWorkerLog(\n info.projectId,\n workerVersionId,\n `stopping worker container: ${reason}`,\n )\n\n info.abortController.abort()\n void info.logBatcher.flush()\n this.runningWorkers.delete(workerVersionId)\n\n // update worker version status in database\n const database = await this.database.forProject(info.projectId)\n await database.workerVersion.update({\n where: { id: workerVersionId },\n data: {\n status: \"stopped\",\n runtimeId: this.runtimeId,\n },\n })\n\n this.logger.debug(\n { projectId: info.projectId, workerVersionId },\n `stopped worker version \"%s\"`,\n workerVersionId,\n )\n }\n\n async restartWorkerVersion(projectId: string, workerVersionId: string): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n // verify the worker version exists and belongs to this runtime\n const workerVersion = await database.workerVersion.findFirst({\n where: {\n id: workerVersionId,\n runtimeId: this.runtimeId,\n },\n include: {\n worker: true,\n },\n })\n\n if (!workerVersion) {\n this.logger.warn(\n { projectId, workerVersionId },\n `cannot restart worker version \"%s\" - not found or not owned by this runtime`,\n workerVersionId,\n )\n return\n }\n\n const existingInfo = this.runningWorkers.get(workerVersionId)\n\n await this.writeWorkerLog(projectId, workerVersionId, `restart requested by user`)\n\n if (existingInfo) {\n // stop the existing worker\n this.logger.debug(\n { projectId, workerVersionId },\n `stopping worker version \"%s\" for restart`,\n workerVersionId,\n )\n\n await this.writeWorkerLog(\n projectId,\n workerVersionId,\n `stopping current container for restart`,\n )\n\n existingInfo.abortController.abort()\n void existingInfo.logBatcher.flush()\n this.runningWorkers.delete(workerVersionId)\n } else {\n await this.writeWorkerLog(\n projectId,\n workerVersionId,\n `worker was not running, starting fresh`,\n )\n }\n\n // reset failed attempts and start fresh\n void this.startWorkerVersion(projectId, workerVersion, false)\n }\n\n async syncWorkers(projectId: string): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n // get all worker versions that exist (ones without registrations are already deleted)\n const workerVersions = await database.workerVersion.findMany({\n include: {\n worker: true,\n apiKey: true,\n },\n })\n\n // track which worker versions should be running\n const activeVersionIds = new Set(workerVersions.map(v => v.id))\n\n // stop workers that no longer exist in database\n for (const [versionId, info] of this.runningWorkers) {\n if (info.projectId !== projectId) continue\n\n if (!activeVersionIds.has(versionId)) {\n await this.stopWorkerVersion(versionId, \"worker version removed from database\")\n }\n }\n\n // start workers that aren't running\n for (const version of workerVersions) {\n if (!this.runningWorkers.has(version.id)) {\n void this.startWorkerVersion(projectId, version)\n }\n }\n\n this.logger.debug(\n { projectId, workerVersionCount: workerVersions.length },\n `synced %s worker versions for project \"%s\"`,\n workerVersions.length,\n projectId,\n )\n }\n\n private async clearWorkerLogs(projectId: string): Promise<void> {\n // keep only the last 1000 logs per worker version\n const database = await this.database.forProject(projectId)\n\n const workerVersions = await database.workerVersion.findMany({ select: { id: true } })\n\n for (const version of workerVersions) {\n const logsToDelete = await database.workerVersionLog.findMany({\n where: { workerVersionId: version.id },\n orderBy: { id: \"desc\" },\n skip: 1000,\n select: { id: true },\n })\n\n if (logsToDelete.length === 0) continue\n\n await database.workerVersionLog.deleteMany({\n where: { id: { in: logsToDelete.map(l => l.id) } },\n })\n }\n }\n}\n","import { z } from \"zod\"\nimport { artifactBackendConfig } from \"./artifact\"\nimport { projectUnlockServiceConfig } from \"./business\"\nimport { codebaseConfig } from \"./common\"\nimport { databaseConfig } from \"./database\"\nimport { libraryBackendConfig } from \"./library\"\nimport { lockBackendConfig } from \"./lock\"\nimport { pubSubBackendConfig } from \"./pubsub\"\nimport { runnerBackendConfig } from \"./runner\"\nimport { terminalBackendConfig } from \"./terminal\"\nimport { workerBackendConfig, workerManagerConfig } from \"./worker\"\n\nconst loggerConfig = z.object({\n HIGHSTATE_LOG_LEVEL: z.enum([\"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"]).default(\"info\"),\n})\n\nconst configSchema = z.object({\n ...codebaseConfig.shape,\n ...databaseConfig.shape,\n ...pubSubBackendConfig.shape,\n ...lockBackendConfig.shape,\n ...libraryBackendConfig.shape,\n ...projectUnlockServiceConfig.shape,\n ...runnerBackendConfig.shape,\n ...terminalBackendConfig.shape,\n ...workerBackendConfig.shape,\n ...workerManagerConfig.shape,\n ...artifactBackendConfig.shape,\n ...loggerConfig.shape,\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nexport async function loadConfig(\n env: NodeJS.ProcessEnv = process.env,\n useDotenv = true,\n): Promise<Config> {\n if (useDotenv) {\n await import(\"dotenv/config\")\n }\n\n try {\n return configSchema.parse(env)\n } catch (error) {\n throw new Error(\"Failed to parse backend configuration\", { cause: error })\n }\n}\n","import type { Logger } from \"pino\"\nimport type { InstanceStateService, ProjectModelService } from \"../business\"\nimport type { LibraryBackend } from \"../library\"\nimport {\n type ComponentModel,\n type InstanceId,\n type InstanceInput,\n type InstanceModel,\n isUnitModel,\n} from \"@highstate/contract\"\nimport { BetterLock } from \"better-lock\"\nimport { mapValues, unique } from \"remeda\"\nimport {\n type InputHashNode,\n type InputHashOutput,\n InputHashResolver,\n InputResolver,\n type InputResolverNode,\n type InstanceState,\n isTransientInstanceOperationStatus,\n type LibraryModel,\n type ProjectOutput,\n type ResolvedInstanceInput,\n type StableInstanceInput,\n} from \"../shared\"\n\nexport class OperationContext {\n private readonly instanceMap = new Map<InstanceId, InstanceModel>()\n private readonly instanceChildrenMap = new Map<InstanceId, InstanceModel[]>()\n private readonly ghostInstanceIds = new Set<InstanceId>()\n\n private readonly stateIdMap = new Map<string, InstanceId>()\n private readonly stateMap = new Map<InstanceId, InstanceState>()\n private readonly dependentStateIdMap = new Map<InstanceId, Set<InstanceId>>()\n private readonly stateChildIdMap = new Map<InstanceId, InstanceId[]>()\n\n public readonly unitSourceHashMap = new Map<string, number>()\n\n public inputResolver!: InputResolver\n public readonly inputResolverNodes = new Map<string, InputResolverNode>()\n\n public inputHashResolver!: InputHashResolver\n public readonly inputHashNodes = new Map<string, InputHashNode>()\n private readonly inputHashResolverLock = new BetterLock()\n\n private readonly resolvedInstanceInputs = new Map<\n string,\n Record<InstanceId, ResolvedInstanceInput[]>\n >()\n\n private constructor(\n public readonly project: ProjectOutput,\n public readonly library: LibraryModel,\n private readonly logger: Logger,\n ) {}\n\n public getInstance(instanceId: InstanceId): InstanceModel {\n const instance = this.instanceMap.get(instanceId)\n if (!instance) {\n throw new Error(`Instance with ID ${instanceId} not found in the operation context`)\n }\n\n return instance\n }\n\n public isGhostInstance(instanceId: InstanceId): boolean {\n return this.ghostInstanceIds.has(instanceId)\n }\n\n public getInstanceIds(): IterableIterator<InstanceId> {\n return this.instanceMap.keys()\n }\n\n public getInstanceChildren(instanceId: InstanceId): InstanceModel[] {\n return this.instanceChildrenMap.get(instanceId) ?? []\n }\n\n public getStateChildIds(instanceId: InstanceId): InstanceId[] {\n return this.stateChildIdMap.get(instanceId) ?? []\n }\n\n public getResolvedInputs(\n instanceId: InstanceId,\n ): Record<string, ResolvedInstanceInput[]> | undefined {\n return this.resolvedInstanceInputs.get(instanceId)\n }\n\n public setState(state: InstanceState): void {\n this.stateMap.set(state.instanceId, state)\n this.stateIdMap.set(state.id, state.instanceId)\n\n if (state.parentInstanceId) {\n let children = this.stateChildIdMap.get(state.parentInstanceId)\n if (!children) {\n children = []\n this.stateChildIdMap.set(state.parentInstanceId, children)\n }\n\n children.push(state.instanceId)\n }\n\n // traverse resolvedInputs to build dependency relationships\n if (state.resolvedInputs) {\n for (const inputGroup of Object.values(state.resolvedInputs)) {\n for (const input of inputGroup) {\n const instanceId = this.stateIdMap.get(input.stateId)\n if (!instanceId) {\n this.logger.warn(\n `cannot add dependent state for unknown input state ID: ${input.stateId}`,\n )\n continue\n }\n\n this.addDependentState(state.instanceId, instanceId)\n }\n }\n }\n }\n\n public serializeResolvedInputs(\n resolvedInputs: Record<string, InstanceInput[]>,\n ): Record<string, StableInstanceInput[]> {\n return mapValues(resolvedInputs, inputs =>\n inputs.map(input => {\n const state = this.getState(input.instanceId)\n\n return {\n stateId: state.id,\n output: input.output,\n }\n }),\n )\n }\n\n private addDependentState(instanceId: InstanceId, dependencyId: InstanceId): void {\n let dependentStates = this.dependentStateIdMap.get(dependencyId)\n\n if (!dependentStates) {\n dependentStates = new Set<InstanceId>()\n this.dependentStateIdMap.set(dependencyId, dependentStates)\n }\n\n dependentStates.add(instanceId)\n }\n\n public getState(instanceId: InstanceId): InstanceState {\n const state = this.stateMap.get(instanceId)\n if (!state) {\n throw new Error(`Instance state for \"${instanceId}\" not found in the operation context`)\n }\n\n return state\n }\n\n public getDependentStates(instanceId: InstanceId): InstanceState[] {\n const dependentStateIds = this.dependentStateIdMap.get(instanceId)\n if (!dependentStateIds) {\n return []\n }\n\n return Array.from(dependentStateIds)\n .map(id => this.stateMap.get(id))\n .filter((state): state is InstanceState => !!state)\n }\n\n public getDependencies(instanceId: InstanceId): InstanceModel[] {\n const resolvedInputs = this.resolvedInstanceInputs.get(instanceId)\n if (!resolvedInputs) {\n return []\n }\n\n const dependencies: InstanceModel[] = []\n\n for (const inputGroup of Object.values(resolvedInputs)) {\n for (const resolvedInput of inputGroup) {\n if (resolvedInput.input.instanceId && resolvedInput.input.instanceId !== instanceId) {\n dependencies.push(this.getInstance(resolvedInput.input.instanceId))\n }\n }\n }\n\n return dependencies\n }\n\n private addInstance(instance: InstanceModel, isGhost = false): void {\n if (this.instanceMap.has(instance.id)) {\n throw new Error(`Found multiple instances with the same ID: ${instance.id}`)\n }\n\n if (!(instance.type in this.library.components)) {\n this.logger.warn(\n `ignoring instance \"${instance.id}\" because its type \"${instance.type}\" is not in the library`,\n )\n return\n }\n\n this.instanceMap.set(instance.id, instance)\n\n if (isGhost) {\n this.ghostInstanceIds.add(instance.id)\n }\n\n if (instance.parentId) {\n let children = this.instanceChildrenMap.get(instance.parentId)\n if (!children) {\n children = []\n this.instanceChildrenMap.set(instance.parentId, children)\n }\n\n children.push(instance)\n }\n }\n\n private getSourceHashIfApplicable(\n instance: InstanceModel,\n component: ComponentModel,\n ): number | undefined {\n if (isUnitModel(component)) {\n return this.unitSourceHashMap.get(instance.type)\n }\n\n return undefined\n }\n\n public getUpToDateInputHashOutput(instance: InstanceModel): Promise<InputHashOutput> {\n return this.inputHashResolverLock.acquire(async () => {\n const component = this.library.components[instance.type]\n\n this.inputHashNodes.set(instance.id, {\n instance,\n component,\n resolvedInputs: this.resolvedInstanceInputs.get(instance.id)!,\n state: this.stateMap.get(instance.id),\n sourceHash: this.getSourceHashIfApplicable(instance, component),\n })\n\n this.inputHashResolver.invalidateSingle(instance.id)\n await this.inputHashResolver.process()\n\n return this.inputHashResolver.requireOutput(instance.id)\n })\n }\n\n public setStates(states: InstanceState[]): void {\n for (const state of states) {\n this.setState(state)\n }\n }\n\n /**\n * Gets a map of instance IDs to state IDs for dependencies of the given instance.\n *\n * @param instanceId The instance ID to get the state ID map for.\n * @returns A map of instance IDs to state IDs.\n */\n public getInstanceIdToStateIdMap(instanceId: InstanceId): Record<InstanceId, string> {\n const map: Record<InstanceId, string> = {}\n const dependencies = this.getDependencies(instanceId).map(i => i.id)\n\n for (const dep of dependencies) {\n const state = this.getState(dep)\n map[dep] = state.id\n }\n\n return map\n }\n\n getUnfinishedOperationStates(): InstanceState[] {\n const unfinishedStates: InstanceState[] = []\n for (const state of this.stateMap.values()) {\n if (isTransientInstanceOperationStatus(state.lastOperationState?.status)) {\n unfinishedStates.push(state)\n }\n }\n\n return unfinishedStates\n }\n\n public static async load(\n projectId: string,\n libraryBackend: LibraryBackend,\n instanceStateService: InstanceStateService,\n projectModelService: ProjectModelService,\n logger: Logger,\n ): Promise<OperationContext> {\n const [{ instances, virtualInstances, hubs, ghostInstances }, project] =\n await projectModelService.getProjectModel(projectId, {\n includeVirtualInstances: true,\n includeGhostInstances: true,\n })\n\n const [library, states] = await Promise.all([\n libraryBackend.loadLibrary(project.libraryId),\n instanceStateService.getInstanceStates(projectId, {\n includeEvaluationState: true,\n includeParentInstanceId: true,\n }),\n ])\n\n const context = new OperationContext(\n project,\n library,\n logger.child({ service: \"OperationContext\" }),\n )\n\n // prepare instances\n for (const instance of instances) {\n context.addInstance(instance)\n }\n\n for (const instance of ghostInstances) {\n context.addInstance(instance, true)\n }\n\n for (const instance of virtualInstances) {\n const contextInstance = context.instanceMap.get(instance.id)\n\n if (contextInstance) {\n // use evaluated inputs and outputs for real instances from their virtual counterparts\n contextInstance.inputs = instance.resolvedInputs\n contextInstance.outputs = instance.outputs\n contextInstance.resolvedOutputs = instance.resolvedOutputs\n } else if (instance.parentId) {\n // always use resolved inputs for virtual instances\n instance.inputs = instance.resolvedInputs\n context.addInstance(instance)\n } else {\n context.logger.warn(\n `ignoring virtual instance \"${instance.id}\" because it is not in the project or is not a part of known composite instance`,\n )\n }\n }\n\n const unitSources = await libraryBackend.getResolvedUnitSources(\n project.libraryId,\n unique(Array.from(context.instanceMap.values()).map(i => i.type)),\n )\n\n for (const unitSource of unitSources) {\n context.unitSourceHashMap.set(unitSource.unitType, unitSource.sourceHash)\n }\n\n context.setStates(states)\n\n // prepare input resolver\n for (const instance of context.instanceMap.values()) {\n context.inputResolverNodes.set(`instance:${instance.id}`, {\n kind: \"instance\",\n instance,\n component: library.components[instance.type],\n })\n }\n\n for (const hub of hubs) {\n context.inputResolverNodes.set(`hub:${hub.id}`, { kind: \"hub\", hub })\n }\n\n context.inputResolver = new InputResolver(context.inputResolverNodes, logger)\n context.inputResolver.addAllNodesToWorkset()\n\n await context.inputResolver.process()\n\n // resolve inputs for all instances and pass outputs to input hash resolver\n for (const instance of context.instanceMap.values()) {\n const output = context.inputResolver.requireOutput(`instance:${instance.id}`)\n if (output.kind !== \"instance\") {\n throw new Error(\"Unexpected output kind\")\n }\n\n context.resolvedInstanceInputs.set(instance.id, output.resolvedInputs)\n\n if (instance.kind === \"unit\") {\n const component = context.library.components[instance.type]\n\n context.inputHashNodes.set(instance.id, {\n instance,\n component,\n resolvedInputs: output.resolvedInputs,\n state: context.stateMap.get(instance.id),\n sourceHash: context.getSourceHashIfApplicable(instance, component),\n })\n }\n }\n\n // prepare input hash resolver\n context.inputHashResolver = new InputHashResolver(context.inputHashNodes, logger)\n context.inputHashResolver.addAllNodesToWorkset()\n\n await context.inputHashResolver.process()\n\n return context\n }\n}\n","import type { InstanceId, InstanceModel } from \"@highstate/contract\"\nimport type {\n InstanceState,\n OperationOptions,\n OperationPhase,\n OperationPhaseInstance,\n OperationType,\n} from \"../shared\"\nimport type { OperationContext } from \"./operation-context\"\nimport { isVirtualGhostInstance } from \"../shared\"\n\ntype CompositeType = \"unknown\" | \"compositional\" | \"substantive\"\ntype InclusionReason =\n | \"explicit\"\n | \"dependency\"\n | \"dependent_cascade\"\n | \"composite_child\"\n | \"parent_composite\"\n | \"ghost_cleanup\"\n\ninterface WorkState {\n included: Map<InstanceId, InclusionReason>\n compositeTypes: Map<InstanceId, CompositeType>\n pendingWork: Set<InstanceId>\n changed: boolean\n // track relationships for message generation\n dependencyRequiredBy: Map<InstanceId, InstanceId> // dependency -> dependent\n childTriggeringParent: Map<InstanceId, InstanceId> // parent -> child that caused inclusion\n forceFlags: Map<InstanceId, \"dependencies\" | \"children\"> // track force reasons\n}\n\nexport function createOperationPlan(\n context: OperationContext,\n type: OperationType,\n requestedInstanceIds: string[],\n options: OperationOptions,\n): OperationPhase[] {\n if (options.forceUpdateDependencies && options.ignoreDependencies) {\n throw new Error(\n \"Operation options are invalid: forceUpdateDependencies and ignoreDependencies cannot both be enabled.\",\n )\n }\n\n if (type === \"preview\") {\n if (requestedInstanceIds.length !== 1) {\n throw new Error(\"Preview operations can only target a single instance\")\n }\n\n const instanceId = requestedInstanceIds[0] as InstanceId\n const instance = context.getInstance(instanceId)\n\n if (instance.kind !== \"unit\") {\n throw new Error(`Preview is not supported for composite instance \"${instanceId}\"`)\n }\n\n return [\n {\n type: \"preview\",\n instances: [\n {\n id: instanceId,\n parentId: instance.parentId,\n message: \"explicitly requested\",\n },\n ],\n },\n ]\n }\n\n // initialize work state\n const workState: WorkState = {\n included: new Map(),\n compositeTypes: new Map(),\n pendingWork: new Set(),\n changed: true,\n dependencyRequiredBy: new Map(),\n childTriggeringParent: new Map(),\n forceFlags: new Map(),\n }\n\n // seed with explicit requests\n for (const instanceId of requestedInstanceIds) {\n workState.included.set(instanceId as InstanceId, \"explicit\")\n workState.pendingWork.add(instanceId as InstanceId)\n }\n\n // work loop - iterate until stabilized\n let iteration = 0\n while (workState.changed && iteration < 100) {\n iteration++\n workState.changed = false\n\n const workItems = Array.from(workState.pendingWork)\n workState.pendingWork.clear()\n\n for (const instanceId of workItems) {\n processInstance(instanceId, workState, context, options, type)\n }\n\n // ensure all instances get at least one chance to be processed\n if (iteration === 1) {\n for (const instanceId of context.getInstanceIds()) {\n if (!workState.pendingWork.has(instanceId) && !workItems.includes(instanceId)) {\n workState.pendingWork.add(instanceId)\n workState.changed = true\n }\n }\n }\n }\n\n if (iteration >= 100) {\n throw new Error(`Operation plan creation did not converge after 100 iterations`)\n }\n\n // create ordered phases\n return createOrderedPhases(workState, context, type, options)\n}\n\nfunction processInstance(\n instanceId: InstanceId,\n workState: WorkState,\n context: OperationContext,\n options: OperationOptions,\n operationType: OperationType,\n): void {\n const instance = context.getInstance(instanceId)\n\n // update composite classification\n updateCompositeClassification(instance, workState, context)\n\n // apply operation-specific inclusion rules\n if (operationType === \"update\" || operationType === \"preview\") {\n processUpdateInclusions(instance, workState, context, options)\n }\n if (operationType === \"refresh\") {\n processRefreshInclusions(instance, workState, context, options)\n }\n if (operationType === \"destroy\" || operationType === \"recreate\") {\n processDestroyInclusions(instance, workState, context, options)\n }\n\n // propagate to related instances\n propagateToRelated(instance, workState)\n}\n\nfunction updateCompositeClassification(\n instance: ReturnType<OperationContext[\"getInstance\"]>,\n workState: WorkState,\n context: OperationContext,\n): void {\n if (instance.kind !== \"composite\") {\n return\n }\n\n const currentType = workState.compositeTypes.get(instance.id) ?? \"unknown\"\n let newType: CompositeType = \"unknown\"\n const inclusionReason = workState.included.get(instance.id)\n\n // check if explicitly requested\n if (inclusionReason === \"explicit\") {\n newType = \"substantive\"\n }\n\n if (workState.included.has(instance.id) && inclusionReason !== \"explicit\") {\n // check if any children are included due to external dependencies\n const children = context.getInstanceChildren(instance.id)\n let hasExternalDependencyChildren = false\n for (const child of children) {\n const reason = workState.included.get(child.id)\n if (reason === \"dependency\" || reason === \"dependent_cascade\") {\n // check if this dependency is external to this composite\n const requiredBy = workState.dependencyRequiredBy.get(child.id)\n if (requiredBy) {\n const requiredByInstance = context.getInstance(requiredBy)\n // if the requiring instance is not a child of this composite, it's external\n if (requiredByInstance.parentId !== instance.id) {\n hasExternalDependencyChildren = true\n break\n }\n }\n }\n }\n\n newType = hasExternalDependencyChildren ? \"substantive\" : \"compositional\"\n }\n\n // if classification changed, mark for re-processing\n if (newType !== currentType) {\n workState.compositeTypes.set(instance.id, newType)\n workState.pendingWork.add(instance.id)\n workState.changed = true\n\n // re-process children when parent classification changes\n const children = context.getInstanceChildren(instance.id)\n for (const child of children) {\n workState.pendingWork.add(child.id)\n }\n }\n}\n\nfunction processUpdateInclusions(\n instance: InstanceModel,\n workState: WorkState,\n context: OperationContext,\n options: OperationOptions,\n): void {\n // check if should be included as composite child\n if (instance.parentId) {\n // check if this instance is a descendant of any substantive composite\n const substantiveAncestor = findSubstantiveAncestor(instance.parentId, workState, context)\n\n if (substantiveAncestor) {\n const isInstanceOutdated = isOutdated(instance, context)\n const shouldInclude =\n options.forceUpdateChildren ||\n (!options.allowPartialCompositeInstanceUpdate && isInstanceOutdated)\n\n if (shouldInclude && !workState.included.has(instance.id)) {\n const state = context.getState(instance.id)\n if (!isVirtualGhostInstance(state)) {\n include(instance.id, \"composite_child\", workState, {\n forceFlag: options.forceUpdateChildren ? \"children\" : undefined,\n })\n }\n }\n }\n }\n\n // process dependencies if this instance is included\n if (workState.included.has(instance.id)) {\n const dependencies = context.getDependencies(instance.id)\n for (const depInstance of dependencies) {\n if (options.ignoreDependencies) {\n continue\n }\n\n const shouldInclude = options.forceUpdateDependencies || isOutdated(depInstance, context)\n\n if (shouldInclude && !workState.included.has(depInstance.id)) {\n include(depInstance.id, \"dependency\", workState, {\n requiredBy: instance.id,\n forceFlag: options.forceUpdateDependencies ? \"dependencies\" : undefined,\n })\n }\n }\n }\n}\n\nfunction processRefreshInclusions(\n instance: InstanceModel,\n workState: WorkState,\n context: OperationContext,\n options: OperationOptions,\n): void {\n // check if should be included as composite child\n if (instance.parentId) {\n // check if this instance is a descendant of any substantive composite\n const substantiveAncestor = findSubstantiveAncestor(instance.parentId, workState, context)\n\n if (substantiveAncestor) {\n const isInstanceOutdated = isOutdated(instance, context)\n const shouldInclude =\n options.forceUpdateChildren ||\n (!options.allowPartialCompositeInstanceUpdate && isInstanceOutdated)\n\n if (shouldInclude && !workState.included.has(instance.id)) {\n include(instance.id, \"composite_child\", workState, {\n forceFlag: options.forceUpdateChildren ? \"children\" : undefined,\n })\n }\n }\n }\n\n // process dependencies if this instance is included\n // key difference: only include dependencies if forced, not if outdated\n if (workState.included.has(instance.id)) {\n const dependencies = context.getDependencies(instance.id)\n for (const depInstance of dependencies) {\n if (options.ignoreDependencies) {\n continue\n }\n\n const shouldInclude = options.forceUpdateDependencies\n\n if (shouldInclude && !workState.included.has(depInstance.id)) {\n include(depInstance.id, \"dependency\", workState, {\n requiredBy: instance.id,\n forceFlag: options.forceUpdateDependencies ? \"dependencies\" : undefined,\n })\n }\n }\n }\n}\n\nfunction processDestroyInclusions(\n instance: InstanceModel,\n workState: WorkState,\n context: OperationContext,\n options: OperationOptions,\n): void {\n // check if should be included as composite child\n if (instance.parentId) {\n const parentType = workState.compositeTypes.get(instance.parentId)\n if (parentType === \"substantive\" && !workState.included.has(instance.id)) {\n // all children of substantive composites being destroyed must be included\n // when partial destruction is disabled\n if (!options.allowPartialCompositeInstanceDestruction) {\n include(instance.id, \"composite_child\", workState)\n }\n }\n }\n\n // process dependents if this instance is included and cascade enabled\n if (workState.included.has(instance.id) && options.destroyDependentInstances) {\n const dependentStates = context.getDependentStates(instance.id)\n\n for (const dependentState of dependentStates) {\n if (!workState.included.has(dependentState.instanceId)) {\n include(dependentState.instanceId, \"dependent_cascade\", workState, {\n requiredBy: instance.id,\n })\n }\n }\n }\n}\n\nfunction propagateToRelated(instance: InstanceModel, workState: WorkState): void {\n // check if this instance should propagate upward\n // composites included as \"parent_composite\" should not propagate upward (compositional boundary)\n if (instance.kind === \"composite\") {\n const inclusionReason = workState.included.get(instance.id)\n if (inclusionReason === \"parent_composite\") {\n // compositional boundary - don't propagate upward\n return\n }\n }\n\n // propagate upward to parent if instance is included\n if (\n workState.included.has(instance.id) &&\n instance.parentId &&\n !workState.included.has(instance.parentId)\n ) {\n include(instance.parentId, \"parent_composite\", workState, {\n triggeringChild: instance.id,\n })\n }\n}\n\nfunction findSubstantiveAncestor(\n instanceId: InstanceId,\n workState: WorkState,\n context: OperationContext,\n): InstanceId | null {\n let currentId: InstanceId | undefined = instanceId\n\n // walk up the parent chain looking for a substantive composite\n while (currentId) {\n const compositeType = workState.compositeTypes.get(currentId)\n if (compositeType === \"substantive\") {\n return currentId\n }\n\n const instance = context.getInstance(currentId)\n currentId = instance.parentId\n }\n\n return null\n}\n\nfunction include(\n instanceId: InstanceId,\n reason: InclusionReason,\n workState: WorkState,\n context?: {\n requiredBy?: InstanceId\n triggeringChild?: InstanceId\n forceFlag?: \"dependencies\" | \"children\"\n },\n): void {\n const existing = workState.included.get(instanceId)\n if (existing) {\n return\n }\n\n workState.included.set(instanceId, reason)\n workState.pendingWork.add(instanceId)\n workState.changed = true\n\n // track relationships for message generation\n if (context?.requiredBy) {\n workState.dependencyRequiredBy.set(instanceId, context.requiredBy)\n }\n if (context?.triggeringChild) {\n workState.childTriggeringParent.set(instanceId, context.triggeringChild)\n }\n if (context?.forceFlag) {\n workState.forceFlags.set(instanceId, context.forceFlag)\n }\n}\n\nfunction createOrderedPhases(\n workState: WorkState,\n context: OperationContext,\n type: OperationType,\n options: OperationOptions,\n): OperationPhase[] {\n const phases: OperationPhase[] = []\n const includedIds = Array.from(workState.included.keys())\n\n if (type === \"update\" || type === \"preview\" || type === \"refresh\") {\n // filter instances that actually need updating\n const instancesNeedingUpdate = includedIds.filter(id => {\n const instance = context.getInstance(id)\n const inclusionReason = workState.included.get(id)\n\n // always include if outdated or forced\n if (isOutdated(instance, context)) return true\n if (inclusionReason === \"dependency\" && options.forceUpdateDependencies) return true\n if (inclusionReason === \"composite_child\" && options.forceUpdateChildren) return true\n\n // include explicit requests, but composites only if they have non-ghost children\n if (inclusionReason === \"explicit\") {\n if (instance.kind === \"composite\") {\n // for composites, only include if they have non-ghost children that need updating\n const children = context.getInstanceChildren(id)\n return children.some(child => {\n if (!workState.included.has(child.id)) return false\n const childState = context.getState(child.id)\n return !isVirtualGhostInstance(childState)\n })\n }\n return true\n }\n\n // include parent composites only if they have children needing updates\n if (inclusionReason === \"parent_composite\") {\n const children = context.getInstanceChildren(id)\n return children.some(\n child =>\n workState.included.has(child.id) &&\n workState.included.get(child.id) !== \"parent_composite\",\n )\n }\n\n // include other types (dependency, composite_child, etc.)\n return true\n })\n\n const updateInstances = topologicalSort(instancesNeedingUpdate, context, false)\n .map(id => createPhaseInstance(id, context, workState))\n .filter(inst => inst !== null) as OperationPhaseInstance[]\n\n if (updateInstances.length > 0) {\n const phaseType = type === \"refresh\" ? \"refresh\" : \"update\"\n phases.push({ type: phaseType, instances: updateInstances })\n }\n\n // handle ghost cleanup for updates (but not for refresh operations)\n if (type !== \"refresh\") {\n const compositesNeedingGhostCleanup = new Set<InstanceId>()\n for (const instanceId of includedIds) {\n const instance = context.getInstance(instanceId)\n if (instance.kind !== \"composite\") continue\n\n const compositeType = workState.compositeTypes.get(instanceId)\n if (compositeType !== \"substantive\") continue\n\n // check if this composite has ghost children\n const children = context.getInstanceChildren(instanceId)\n const hasGhostChildren = children.some(child => {\n const state = context.getState(child.id)\n return isVirtualGhostInstance(state)\n })\n\n if (hasGhostChildren) {\n compositesNeedingGhostCleanup.add(instanceId)\n }\n }\n const ghostInstances = findGhostCleanup(context, compositesNeedingGhostCleanup)\n\n if (ghostInstances.length > 0) {\n const ghostInstanceMap = new Map<InstanceId, OperationPhaseInstance>(\n ghostInstances.map(instance => [instance.id, instance]),\n )\n\n const sortedGhosts = topologicalSort(\n ghostInstances.map(g => g.id),\n context,\n true,\n )\n .map(id => {\n const ghostInstance = ghostInstanceMap.get(id)\n\n if (ghostInstance?.message === \"ghost cleanup\") {\n return ghostInstance\n }\n\n return createPhaseInstance(id, context, workState)\n })\n .filter((instance): instance is OperationPhaseInstance => instance !== null)\n\n if (sortedGhosts.length > 0) {\n phases.push({ type: \"destroy\", instances: sortedGhosts })\n }\n }\n }\n }\n\n if (type === \"destroy\") {\n const destroyInstances = topologicalSort(includedIds, context, true)\n .map(id => createPhaseInstance(id, context, workState))\n .filter(inst => inst !== null) as OperationPhaseInstance[]\n\n if (destroyInstances.length > 0) {\n phases.push({ type: \"destroy\", instances: destroyInstances })\n }\n }\n\n if (type === \"recreate\") {\n const destroyInstances = topologicalSort(includedIds, context, true)\n .map(id => createPhaseInstance(id, context, workState))\n .filter(inst => inst !== null) as OperationPhaseInstance[]\n\n const updateInstances = topologicalSort(includedIds, context, false)\n .map(id => createPhaseInstance(id, context, workState))\n .filter(inst => inst !== null) as OperationPhaseInstance[]\n\n if (destroyInstances.length > 0) {\n phases.push({ type: \"destroy\", instances: destroyInstances })\n }\n if (updateInstances.length > 0) {\n phases.push({ type: \"update\", instances: updateInstances })\n }\n }\n\n return phases\n}\n\nfunction createPhaseInstance(\n instanceId: InstanceId,\n context: OperationContext,\n workState?: WorkState,\n): OperationPhaseInstance | null {\n const instance = context.getInstance(instanceId)\n let message = \"included in operation\" // fallback\n\n if (workState) {\n const inclusionReason = workState.included.get(instanceId)\n const requiredBy = workState.dependencyRequiredBy.get(instanceId)\n const triggeringChild = workState.childTriggeringParent.get(instanceId)\n const forceFlag = workState.forceFlags.get(instanceId)\n const instanceState = context.getState(instanceId)\n\n message = generateContextualMessage(\n context,\n instanceId,\n inclusionReason,\n instanceState,\n requiredBy,\n triggeringChild,\n forceFlag,\n )\n }\n\n return {\n id: instanceId,\n parentId: instance.parentId,\n message,\n }\n}\n\nfunction generateContextualMessage(\n context: OperationContext,\n instanceId: InstanceId,\n inclusionReason: InclusionReason | undefined,\n instanceState?: InstanceState,\n requiredBy?: InstanceId,\n triggeringChild?: InstanceId,\n forceFlag?: \"dependencies\" | \"children\",\n): string {\n function getInstanceStateType(\n state?: InstanceState,\n ): \"failed\" | \"undeployed\" | \"changed\" | \"up-to-date\" {\n if (!state) return \"undeployed\"\n if (state.status === \"failed\") return \"failed\"\n if (state.status === \"undeployed\") return \"undeployed\"\n\n const instance = context.getInstance(instanceId)\n\n // composites are containers and cannot be changed/outdated\n if (instance.kind === \"composite\") {\n return \"up-to-date\"\n }\n\n // check if changed by using same logic as isOutdated (for units only)\n const { inputHash: expectedHash } = context.inputHashResolver.requireOutput(instanceId)\n if (state.inputHash !== expectedHash) return \"changed\"\n\n return \"up-to-date\"\n }\n\n const stateType = getInstanceStateType(instanceState)\n\n switch (inclusionReason) {\n case \"explicit\":\n return \"explicitly requested\"\n\n case \"dependency\":\n if (forceFlag === \"dependencies\") {\n return `required by \"${requiredBy}\" (forced by options)`\n }\n switch (stateType) {\n case \"failed\":\n return `failed and required by \"${requiredBy}\"`\n case \"undeployed\":\n return `undeployed and required by \"${requiredBy}\"`\n case \"changed\":\n return `changed and required by \"${requiredBy}\"`\n default:\n return `required by \"${requiredBy}\"`\n }\n\n case \"dependent_cascade\":\n return `dependent of destroyed \"${requiredBy}\"`\n\n case \"composite_child\":\n if (forceFlag === \"children\") {\n return \"child of included parent (forced by options)\"\n }\n switch (stateType) {\n case \"failed\":\n return \"failed and child of included parent\"\n case \"undeployed\":\n return \"undeployed and child of included parent\"\n case \"changed\":\n return \"changed and child of included parent\"\n default:\n return \"child of included parent\"\n }\n\n case \"parent_composite\":\n return `parent of included child \"${triggeringChild}\"`\n\n case \"ghost_cleanup\":\n return \"ghost cleanup\"\n\n default:\n return \"included in operation\"\n }\n}\n\nfunction findGhostCleanup(\n context: OperationContext,\n compositesNeedingGhostCleanup: Set<InstanceId>,\n): OperationPhaseInstance[] {\n const ghosts: OperationPhaseInstance[] = []\n\n // find ghost instances and their parent composites that need cleanup\n for (const instanceId of compositesNeedingGhostCleanup) {\n const instance = context.getInstance(instanceId)\n if (instance.kind !== \"composite\") continue\n\n // add the composite itself for destroy if needed\n ghosts.push({\n id: instanceId,\n parentId: instance.parentId,\n message: \"included in operation\",\n })\n\n // find ghost children\n const children = context.getInstanceChildren(instanceId)\n for (const child of children) {\n const state = context.getState(child.id)\n if (isVirtualGhostInstance(state)) {\n ghosts.push({\n id: child.id,\n parentId: child.parentId,\n message: \"ghost cleanup\",\n })\n }\n }\n }\n\n return ghosts\n}\n\nfunction isOutdated(instance: InstanceModel, context: OperationContext): boolean {\n // composite instances cannot be outdated - they are containers, not deployable units\n if (instance.kind === \"composite\") {\n return false\n }\n\n const state = context.getState(instance.id)\n\n if (state.status === \"failed\" || state.status === \"undeployed\") {\n return true\n }\n\n // check if input hash has changed by comparing with expected hash from resolver\n const { inputHash: expectedHash } = context.inputHashResolver.requireOutput(instance.id)\n return state.inputHash !== expectedHash\n}\n\nfunction topologicalSort(\n instanceIds: InstanceId[],\n context: OperationContext,\n reverse: boolean,\n): InstanceId[] {\n // simple topological sort implementation\n const visited = new Set<InstanceId>()\n const result: InstanceId[] = []\n const visiting = new Set<InstanceId>()\n\n function visit(instanceId: InstanceId): void {\n if (visiting.has(instanceId)) {\n // circular dependency detected - skip for now\n return\n }\n if (visited.has(instanceId)) {\n return\n }\n\n visiting.add(instanceId)\n\n const related = reverse\n ? context.getDependentStates(instanceId).map(state => state.instanceId)\n : context.getDependencies(instanceId).map(dep => dep.id)\n for (const relatedId of related) {\n if (instanceIds.includes(relatedId)) {\n visit(relatedId)\n }\n }\n\n visiting.delete(instanceId)\n visited.add(instanceId)\n result.push(instanceId)\n }\n\n for (const instanceId of instanceIds) {\n visit(instanceId)\n }\n\n return result\n}\n","import type { InstanceId } from \"@highstate/contract\"\nimport type { InstanceStateService, UpdateOperationStateOptions } from \"../business\"\nimport type { InstanceOperationStatus } from \"../database\"\nimport type { OperationContext } from \"./operation-context\"\nimport { EventEmitter, on } from \"node:events\"\nimport { mapValues } from \"remeda\"\nimport {\n type InstanceStatus,\n isTransientInstanceOperationStatus,\n type OperationPhase,\n type OperationPhaseType,\n type ProjectOutput,\n} from \"../shared\"\n\ntype AbortControllerPair = {\n abortController: AbortController\n forceAbortController: AbortController\n}\n\nexport class OperationWorkset {\n readonly abortController = new AbortController()\n private readonly forceAbortController = new AbortController()\n\n readonly instanceAbortControllers = new Map<string, AbortControllerPair>()\n\n private readonly lockedStateIds = new Set<string>()\n private readonly lockEventEmitter = new EventEmitter()\n private currentPhaseIndex = -1\n\n currentPhase!: OperationPhaseType\n allAffectedInstanceIds!: ReadonlySet<InstanceId>\n allAffectedStateIds!: ReadonlySet<string>\n phaseAffectedInstanceIds!: ReadonlySet<InstanceId>\n\n constructor(\n readonly project: ProjectOutput,\n readonly operationId: string,\n readonly phases: OperationPhase[],\n private readonly context: OperationContext,\n private readonly instanceStateService: InstanceStateService,\n ) {\n const affectedInstanceIds = new Set<InstanceId>()\n const affectedStateIds = new Set<string>()\n\n for (const phase of phases) {\n for (const instance of phase.instances) {\n affectedInstanceIds.add(instance.id)\n\n const state = this.context.getState(instance.id)\n affectedStateIds.add(state.id)\n }\n }\n\n this.allAffectedInstanceIds = affectedInstanceIds\n this.allAffectedStateIds = affectedStateIds\n\n // we will basically create one listener per affected instance\n this.lockEventEmitter.setMaxListeners(this.allAffectedInstanceIds.size)\n }\n\n hasRemainingPhases(): boolean {\n return this.currentPhaseIndex < this.phases.length - 1\n }\n\n getLockedStateIds(): Iterable<string> {\n return this.lockedStateIds\n }\n\n isLastPhaseForInstance(instanceId: InstanceId): boolean {\n if (!this.hasRemainingPhases()) {\n return true\n }\n\n // TODO: create instance id sets for each phase on initialization to speed this up\n for (let i = this.currentPhaseIndex + 1; i < this.phases.length; i++) {\n if (this.phases[i].instances.find(i => i.id === instanceId)) {\n return false\n }\n }\n\n return true\n }\n\n nextPhase(): void {\n if (!this.hasRemainingPhases()) {\n throw new Error(\"No remaining phases\")\n }\n\n this.currentPhaseIndex++\n this.currentPhase = this.phases[this.currentPhaseIndex].type\n\n this.phaseAffectedInstanceIds = new Set(\n this.phases[this.currentPhaseIndex].instances.map(i => i.id),\n )\n }\n\n async waitForInstanceLock(stateId: string, signal: AbortSignal): Promise<void> {\n if (this.lockedStateIds.has(stateId)) {\n return\n }\n\n for await (const _ of on(this.lockEventEmitter, stateId, { signal })) {\n return\n }\n }\n\n markInstanceLocked(stateId: string): void {\n this.lockedStateIds.add(stateId)\n this.lockEventEmitter.emit(stateId)\n }\n\n markInstanceUnlocked(stateId: string): void {\n this.lockedStateIds.delete(stateId)\n }\n\n async setupOperationStates(): Promise<void> {\n const patches = await this.instanceStateService.createOperationStates(\n this.project.id,\n Array.from(this.allAffectedInstanceIds).map(instanceId => {\n const instance = this.context.getInstance(instanceId)\n const state = this.context.getState(instanceId)\n\n const resolvedInputs = mapValues(\n //\n this.context.getResolvedInputs(instance.id) ?? {},\n inputs => inputs.map(input => input.input),\n )\n\n const serializedResolvedInputs = this.context.serializeResolvedInputs(resolvedInputs)\n\n return [\n {\n stateId: state.id,\n operationId: this.operationId,\n status: \"pending\",\n model: instance,\n resolvedInputs: serializedResolvedInputs,\n },\n {\n // preview runs still provision a pulumi stack; keep \"attempted\" so a later destroy removes it\n status: state.status === \"undeployed\" ? \"attempted\" : state.status,\n model: instance,\n resolvedInputs: serializedResolvedInputs,\n },\n ]\n }),\n )\n\n for (const patch of patches) {\n const state = this.context.getState(patch.instanceId!)\n Object.assign(state, patch)\n }\n }\n\n async updateState(instanceId: InstanceId, options: UpdateOperationStateOptions): Promise<void> {\n const state = this.context.getState(instanceId)\n\n const patch = await this.instanceStateService.updateOperationState(\n this.project.id,\n state.id,\n this.operationId,\n options,\n )\n\n Object.assign(state, patch)\n\n if (state.parentInstanceId && this.currentPhase !== \"preview\") {\n // TODO: update all updates in single transaction\n await this.recalculateCompositeInstanceState(state.parentInstanceId)\n }\n }\n\n getAffectedCompositeChildren(instanceId: InstanceId): InstanceId[] {\n if (this.currentPhase === \"destroy\") {\n // when destroying, only consider children fixed in the state\n return this.context\n .getStateChildIds(instanceId)\n .filter(child => this.phaseAffectedInstanceIds.has(child))\n }\n\n // for other phases, consider all children defined in the model\n return this.context\n .getInstanceChildren(instanceId)\n .map(child => child.id)\n .filter(childId => this.phaseAffectedInstanceIds.has(childId))\n }\n\n private async recalculateCompositeInstanceState(instanceId: InstanceId): Promise<void> {\n const state = this.context.getState(instanceId)\n\n let currentResourceCount = 0\n let totalResourceCount = 0\n let knownTotalResourceCount = 0\n\n const children = this.context.getStateChildIds(instanceId)\n for (const childId of children) {\n const child = this.context.getState(childId)\n\n if (child?.lastOperationState?.currentResourceCount != null) {\n currentResourceCount += child.lastOperationState.currentResourceCount\n }\n\n if (child?.lastOperationState?.totalResourceCount != null) {\n totalResourceCount += child.lastOperationState.totalResourceCount\n knownTotalResourceCount += 1\n }\n }\n\n // extrapolate total resource count for other resources without total resource count\n const averageTotalResourceCount =\n knownTotalResourceCount > 0 ? Math.round(totalResourceCount / knownTotalResourceCount) : 0\n\n const notKnownTotalResourceCount = children.length - knownTotalResourceCount\n totalResourceCount += notKnownTotalResourceCount * averageTotalResourceCount\n\n const finalTotalResourceCount =\n this.currentPhase === \"destroy\" && state.lastOperationState?.totalResourceCount\n ? // do not override totalResourceCount with lower values when destroying instances\n Math.max(totalResourceCount, state.lastOperationState.totalResourceCount)\n : totalResourceCount\n\n await this.updateState(instanceId, {\n operationState: {\n status:\n !state.lastOperationState?.status ||\n // do not override final statuses\n isTransientInstanceOperationStatus(state.lastOperationState.status)\n ? this.getTransientStatusByOperationPhase()\n : state.lastOperationState.status,\n currentResourceCount,\n totalResourceCount: finalTotalResourceCount,\n },\n })\n }\n\n getPhaseParentId(instanceId: InstanceId): InstanceId | null {\n if (this.currentPhase === \"destroy\") {\n // when destroying, only consider parent fixed in the state\n return this.context.getState(instanceId).parentInstanceId ?? null\n }\n\n // for other phases, consider parent defined in the model\n return this.context.getInstance(instanceId).parentId ?? null\n }\n\n getTransientStatusByOperationPhase(): InstanceOperationStatus {\n switch (this.currentPhase) {\n case \"preview\":\n return \"previewing\"\n case \"update\":\n return \"updating\"\n case \"destroy\":\n return \"destroying\"\n case \"refresh\":\n return \"refreshing\"\n }\n }\n\n getStableStatusByOperationPhase(): InstanceOperationStatus {\n switch (this.currentPhase) {\n case \"preview\":\n return \"previewed\"\n case \"update\":\n return \"updated\"\n case \"destroy\":\n return \"destroyed\"\n case \"refresh\":\n return \"refreshed\"\n }\n }\n\n getNextStableInstanceStatus(instanceId: InstanceId): InstanceStatus {\n const state = this.context.getState(instanceId)\n\n switch (this.currentPhase) {\n case \"preview\":\n return state.status // do not change instance status when previewing\n case \"update\":\n return \"deployed\"\n case \"destroy\":\n return \"undeployed\"\n case \"refresh\":\n return state.status // do not change instance status when refreshing\n }\n }\n\n setupAbortControllersForAllInstances(): void {\n for (const instanceId of this.allAffectedInstanceIds) {\n this.setupInstanceAbortControllers(instanceId)\n }\n }\n\n private setupInstanceAbortControllers(instanceId: InstanceId): AbortControllerPair {\n const existingPair = this.instanceAbortControllers.get(instanceId)\n if (existingPair) {\n return existingPair\n }\n\n // create abort controllers and setup them to abort when the operation is aborted\n const abortController = new AbortController()\n this.abortController.signal.addEventListener(\"abort\", () => abortController.abort())\n\n abortController.signal.addEventListener(\"abort\", () => {\n // notify frontend that the instance is being cancelled\n this.updateState(instanceId, { operationState: { status: \"cancelling\" } })\n })\n\n const forceAbortController = new AbortController()\n this.forceAbortController.signal.addEventListener(\"abort\", () => forceAbortController.abort())\n\n const pair: AbortControllerPair = { abortController, forceAbortController }\n this.instanceAbortControllers.set(instanceId, pair)\n\n // abort if the parent instance is cancelled\n const children = this.context.getInstanceChildren(instanceId)\n for (const child of children) {\n const childPair = this.setupInstanceAbortControllers(child.id)\n\n abortController.signal.addEventListener(\"abort\", () => childPair.abortController.abort())\n\n forceAbortController.signal.addEventListener(\"abort\", () =>\n childPair.forceAbortController.abort(),\n )\n }\n\n return pair\n }\n\n cancelInstance(instanceId: InstanceId, allowForceAbort = true): void {\n const abortControllerPair = this.instanceAbortControllers.get(instanceId)\n if (!abortControllerPair) {\n throw new Error(`No abort controller found for instance \"${instanceId}\"`)\n }\n\n const { abortController, forceAbortController } = abortControllerPair\n\n // first try to cancel the operation gracefully\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n return\n }\n\n if (!allowForceAbort) {\n return\n }\n\n // then try to force cancel the operation\n if (!forceAbortController.signal.aborted) {\n forceAbortController.abort()\n return\n }\n }\n\n cancel(): void {\n if (!this.abortController.signal.aborted) {\n this.abortController.abort()\n return\n }\n\n // then try to force cancel the operation\n if (!this.forceAbortController.signal.aborted) {\n this.forceAbortController.abort()\n return\n }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { ArtifactService } from \"../artifact\"\nimport type {\n InstanceLockService,\n InstanceStatePatch,\n InstanceStateService,\n OperationService,\n ProjectModelService,\n SecretService,\n UnitExtraService,\n} from \"../business\"\nimport type { Operation, OperationUpdateInput, Project } from \"../database\"\nimport type { LibraryBackend } from \"../library\"\nimport type { RunnerBackend, TypedUnitStateUpdate, UnitStateUpdate } from \"../runner\"\nimport {\n type InstanceId,\n type InstanceModel,\n parseInstanceId,\n type TriggerInvocation,\n type UnitConfig,\n type UnitInputReference,\n type VersionedName,\n} from \"@highstate/contract\"\nimport { createId } from \"@paralleldrive/cuid2\"\nimport { mapValues } from \"remeda\"\nimport { AbortError, errorToString, isAbortErrorLike, waitForAbort } from \"../common\"\nimport {\n type InstanceState,\n isTransientInstanceOperationStatus,\n type OperationPhase,\n PromiseTracker,\n type ResolvedInstanceInput,\n waitAll,\n} from \"../shared\"\nimport { OperationContext } from \"./operation-context\"\nimport { createOperationPlan } from \"./operation-plan\"\nimport { OperationWorkset } from \"./operation-workset\"\n\nexport class RuntimeOperation {\n private readonly instancePromiseMap = new Map<InstanceId, Promise<void>>()\n private readonly promiseTracker = new PromiseTracker()\n\n private workset!: OperationWorkset\n private context!: OperationContext\n\n private readonly unlockToken = createId()\n\n constructor(\n private readonly project: Project,\n private readonly operation: Operation,\n private readonly runnerBackend: RunnerBackend,\n private readonly libraryBackend: LibraryBackend,\n private readonly artifactService: ArtifactService,\n private readonly instanceLockService: InstanceLockService,\n private readonly operationService: OperationService,\n private readonly secretService: SecretService,\n private readonly instanceStateService: InstanceStateService,\n private readonly projectModelService: ProjectModelService,\n private readonly unitExtraService: UnitExtraService,\n private readonly logger: Logger,\n ) {}\n\n cancel(): void {\n this.workset.cancel()\n this.tryMarkOperationCancelling()\n }\n\n cancelInstance(instanceId: InstanceId): void {\n this.workset.cancelInstance(instanceId)\n this.tryMarkOperationCancelling()\n }\n\n private tryMarkOperationCancelling(): void {\n if (this.operation.status === \"pending\" || this.operation.status === \"running\") {\n this.operation.status = \"cancelling\"\n this.promiseTracker.track(this.updateOperation({ status: this.operation.status }))\n }\n }\n\n async operateSafe(): Promise<void> {\n try {\n await this.operate()\n\n // ensure that all promises are resolved\n await this.promiseTracker.waitForAll()\n } catch (error) {\n if (isAbortErrorLike(error)) {\n this.logger.info(\"the operation was cancelled\")\n\n await this.updateOperation({ status: \"cancelled\" })\n return\n }\n\n this.logger.error({ error }, \"an error occurred while running the operation\")\n\n await this.updateOperation({ status: \"failed\" })\n await this.writeOperationLog(errorToString(error))\n } finally {\n try {\n this.promiseTracker.track(this.ensureInstancesUnlocked())\n this.promiseTracker.track(this.ensureOperationStatesFinalized())\n\n // ensure that all promises are resolved even if the operation failed\n await this.promiseTracker.waitForAll()\n } catch (error) {\n this.logger.error(\n { error },\n \"one of the tracked promises failed after the operation failed\",\n )\n }\n }\n }\n\n private async operate(): Promise<void> {\n this.logger.info(\"starting operation\")\n\n // 1. create the context for the operation\n this.context = await OperationContext.load(\n this.project.id,\n this.libraryBackend,\n this.instanceStateService,\n this.projectModelService,\n this.logger,\n )\n\n // 2. create the plan for the operation (or use provided one)\n let plan: OperationPhase[]\n if (this.operation.phases) {\n plan = this.operation.phases\n } else {\n plan = createOperationPlan(\n this.context,\n this.operation.type,\n this.operation.requestedInstanceIds,\n this.operation.options,\n )\n\n // persist the generated plan\n await this.updateOperation({ phases: plan })\n }\n\n // 3. create the workset to track the state of the operation\n this.workset = new OperationWorkset(\n this.project,\n this.operation.id,\n plan,\n this.context,\n this.instanceStateService,\n )\n\n // 4. create operation states in datbase for all affected instances in all phases\n await this.workset.setupOperationStates()\n\n // 5. setup abort controllers for all affected instances in all phases\n this.workset.setupAbortControllersForAllInstances()\n\n // 6. progressively lock instances and launch them as they get locked\n this.launchLockAcquisitionSequence()\n\n // 7. run the operation\n await this.processOperation()\n }\n\n private async updateOperation(patch: OperationUpdateInput): Promise<void> {\n Object.assign(this.operation, patch)\n await this.operationService.updateOperation(this.project.id, this.operation.id, patch)\n }\n\n private async writeOperationLog(message: string): Promise<void> {\n this.promiseTracker.track(\n this.operationService.appendLog(this.project.id, this.operation.id, null, message),\n )\n }\n\n private launchLockAcquisitionSequence(): void {\n this.promiseTracker.track(\n this.instanceLockService.lockInstances(\n this.project.id,\n Array.from(this.workset.allAffectedStateIds),\n {\n title: \"Operation Lock\",\n description: `The instance is locked for the ${this.operation.type} operation \"${this.operation.id}\".`,\n icon: \"mdi:cog-sync\",\n },\n async (_tx, newlyLockedStateIds) => {\n // trigger all newly locked instances to start their processing\n for (const stateId of newlyLockedStateIds) {\n this.workset.markInstanceLocked(stateId)\n }\n },\n true, // allow partial locks to allow independent branches to run\n this.workset.abortController.signal,\n 60_000, // wait up to 60 seconds for unlock events before retrying\n this.unlockToken,\n ),\n )\n }\n\n private async processOperation(): Promise<void> {\n const errors: string[] = []\n\n while (this.workset.hasRemainingPhases()) {\n this.workset.nextPhase()\n this.instancePromiseMap.clear()\n\n // lauch all instances in this phase\n for (const instanceId of this.workset.phaseAffectedInstanceIds) {\n const instance = this.context.getInstance(instanceId)\n const state = this.context.getState(instanceId)\n const promise = this.getInstancePromiseForOperation(instance, state)\n\n this.instancePromiseMap.set(instanceId, promise)\n this.promiseTracker.track(promise)\n }\n\n // wait for all instances in this phase to complete\n await this.promiseTracker.waitForAll()\n\n this.logger.info(`phase \"%s\" completed`, this.workset.currentPhase)\n }\n\n if (errors.length > 0) {\n this.operation.status = \"failed\"\n\n this.operationService.appendLog(\n this.project.id,\n this.operation.id,\n null,\n `Operation failed with the following errors:\\n${errors.join(\"\\n\")}`,\n )\n } else {\n this.operation.status = \"completed\"\n }\n\n await this.operationService.markOperationFinished(\n this.project.id,\n this.operation.id,\n this.operation.status,\n )\n\n this.logger.info(\"operation completed\")\n }\n\n private getInstancePromiseForOperation(\n instance: InstanceModel,\n state: InstanceState,\n ): Promise<void> {\n if (instance.kind === \"unit\") {\n return this.getUnitPromise(instance, state)\n }\n\n return this.getCompositePromise(instance)\n }\n\n private getUnitPromise(instance: InstanceModel, state: InstanceState): Promise<void> {\n switch (this.workset.currentPhase) {\n case \"update\": {\n return this.updateUnit(instance, state)\n }\n case \"destroy\": {\n return this.destroyUnit(instance, state)\n }\n case \"refresh\": {\n return this.refreshUnit(instance, state)\n }\n case \"preview\": {\n return this.previewUnit(instance, state)\n }\n }\n }\n\n private previewUnit(instance: InstanceModel, state: InstanceState): Promise<void> {\n return this.getInstancePromise(instance.id, async (logger, signal, forceSignal) => {\n signal.throwIfAborted()\n\n if (this.operation.status === \"failing\") {\n throw new AbortError(\"The operation is failing, aborting preview branch\")\n }\n\n logger.info(\"previewing unit\")\n\n await this.workset.updateState(instance.id, {\n operationState: {\n status: \"previewing\",\n startedAt: new Date(),\n },\n })\n\n signal.throwIfAborted()\n\n const secrets = await this.secretService.getInstanceSecretValues(this.project.id, state.id)\n signal.throwIfAborted()\n\n const config = this.prepareUnitConfig(instance, secrets)\n const artifactIds = this.collectArtifactIdsForInstance(instance)\n const artifacts = await this.artifactService.getArtifactsByIds(this.project.id, artifactIds)\n\n logger.debug({ count: artifactIds.length }, \"artifact ids collected for preview\")\n\n await this.runnerBackend.preview({\n projectId: this.project.id,\n libraryId: this.project.libraryId,\n stateId: state.id,\n instanceType: instance.type,\n instanceName: instance.name,\n config,\n refresh: this.operation.options.refresh,\n secrets,\n artifacts,\n signal,\n forceSignal,\n debug: this.operation.options.debug,\n })\n\n await this.watchStateStream(state, instance.type, instance.name, logger)\n logger.info(\"unit preview completed\")\n })\n }\n\n private getCompositePromise(instance: InstanceModel): Promise<void> {\n return this.getInstancePromise(instance.id, async logger => {\n let instanceState: InstanceStatePatch | undefined\n\n // set parent ID on update operation\n if (this.workset.currentPhase === \"update\") {\n if (instance.parentId) {\n const parentState = this.context.getState(instance.parentId)\n instanceState = { parentId: parentState.id }\n } else {\n instanceState = { parentId: null }\n }\n }\n\n await this.workset.updateState(instance.id, {\n operationState: {\n status: this.workset.getTransientStatusByOperationPhase(),\n startedAt: new Date(),\n },\n instanceState,\n })\n\n const children = this.workset.getAffectedCompositeChildren(instance.id)\n const childPromises: Promise<void>[] = []\n\n if (children.length) {\n logger.info(\"running %s children\", children.length)\n } else {\n logger.warn(\"no affected children found for composite component\")\n }\n\n for (const child of children) {\n logger.debug(`waiting for child \"%s\"`, child)\n\n const instance = this.context.getInstance(child)\n const state = this.context.getState(child)\n const promise = this.getInstancePromiseForOperation(instance, state)\n\n childPromises.push(promise)\n }\n\n await waitAll(childPromises)\n\n logger.debug(\"all children completed\")\n\n // update the instance and operation state after all children are completed in last phase\n if (this.workset.isLastPhaseForInstance(instance.id)) {\n await this.workset.updateState(instance.id, {\n operationState: {\n status: this.workset.getStableStatusByOperationPhase(),\n finishedAt: new Date(),\n },\n instanceState: {\n status: this.workset.getNextStableInstanceStatus(instance.id),\n },\n })\n }\n })\n }\n\n private updateUnit(instance: InstanceModel, state: InstanceState): Promise<void> {\n return this.getInstancePromise(instance.id, async (logger, signal, forceSignal) => {\n await Promise.race([\n this.updateUnitDependencies(instance.id, logger),\n\n // to immediately abort the operation if requested\n waitForAbort(signal),\n ])\n\n signal.throwIfAborted()\n\n if (this.operation.status === \"failing\") {\n throw new AbortError(\"The operation is failing, aborting current branch (still not failed)\")\n }\n\n // Runtime short-circuit:\n // If this instance's own config has not changed and none of its dependencies outputs changed,\n // we can skip execution even if the full inputHash changed due to upstream config-only changes.\n //\n // Do not short-circuit when the caller requested side effects that require a real engine run or the instance was explicitly requested.\n if (\n state.status === \"deployed\" &&\n state.selfHash != null &&\n state.dependencyOutputHash != null &&\n // ignore explicitly requested updates\n !this.operation.requestedInstanceIds.includes(instance.id) &&\n // ignore when side effects are requested\n !this.operation.options.refresh &&\n !this.operation.options.deleteUnreachableResources &&\n !this.operation.options.forceUpdateDependencies\n ) {\n const expected = await this.context.getUpToDateInputHashOutput(instance)\n\n if (\n expected.selfHash === state.selfHash &&\n expected.dependencyOutputHash === state.dependencyOutputHash\n ) {\n logger.info(\"skipping unit update (short-circuit: no effective changes)\")\n\n const now = new Date()\n\n await this.workset.updateState(instance.id, {\n operationState: {\n status: \"skipped\",\n startedAt: now,\n finishedAt: now,\n },\n instanceState: {\n inputHash: expected.inputHash,\n },\n })\n\n return\n }\n }\n\n logger.info(\"updating unit\")\n\n await this.workset.updateState(instance.id, {\n operationState: {\n status: \"updating\",\n startedAt: new Date(),\n },\n })\n\n signal.throwIfAborted()\n\n const secrets = await this.secretService.getInstanceSecretValues(this.project.id, state.id)\n\n signal.throwIfAborted()\n\n const config = this.prepareUnitConfig(instance, secrets)\n\n // collect artifacts authorized for this instance\n const artifactIds = this.collectArtifactIdsForInstance(instance)\n const artifacts = await this.artifactService.getArtifactsByIds(this.project.id, artifactIds)\n\n logger.debug({ count: artifactIds.length }, \"artifact ids collected from dependencies\")\n\n await this.runnerBackend.update({\n projectId: this.project.id,\n libraryId: this.project.libraryId,\n stateId: state.id,\n instanceType: instance.type,\n instanceName: instance.name,\n config,\n refresh: this.operation.options.refresh,\n deleteUnreachable: this.operation.options.deleteUnreachableResources,\n secrets,\n artifacts,\n signal,\n forceSignal,\n debug: this.operation.options.debug,\n })\n\n await this.watchStateStream(state, instance.type, instance.name, logger)\n logger.info(\"unit updated\")\n })\n }\n\n private async updateUnitDependencies(instanceId: InstanceId, logger: Logger): Promise<void> {\n try {\n const dependencies = this.context.getDependencies(instanceId)\n const dependencyPromises: Promise<void>[] = []\n\n for (const dependency of dependencies) {\n if (!this.workset.phaseAffectedInstanceIds.has(dependency.id)) {\n // skip dependencies that are not affected by the operation\n continue\n }\n\n const state = this.context.getState(dependency.id)\n\n logger.debug(`waiting for dependency \"%s\"`, dependency.id)\n dependencyPromises.push(this.getInstancePromiseForOperation(dependency, state))\n }\n\n await waitAll(dependencyPromises)\n\n if (dependencies.length > 0) {\n logger.info(\"all dependencies completed\")\n }\n } catch (error) {\n // abort the instance if any dependency fails\n throw new AbortError(\"One of the dependencies failed\", { cause: error })\n }\n }\n\n private async processBeforeDestroyTriggers(\n instance: InstanceModel,\n state: InstanceState,\n logger: Logger,\n signal: AbortSignal,\n forceSignal: AbortSignal,\n ): Promise<void> {\n if (!this.operation.options.invokeDestroyTriggers) {\n logger.debug(\"destroy triggers are disabled for the operation\")\n return\n }\n\n const allTriggers = await this.unitExtraService.getInstanceTriggers(this.project.id, state.id)\n\n const beforeDestroyTriggers = allTriggers.filter(\n trigger => trigger.spec.type === \"before-destroy\",\n )\n\n if (beforeDestroyTriggers.length === 0) {\n return\n }\n\n const invokedTriggers = beforeDestroyTriggers.map(trigger => ({\n name: trigger.name,\n }))\n\n await this.workset.updateState(instance.id, {\n operationState: { status: \"processing_triggers\" },\n })\n\n logger.info(\"updating unit to process before-destroy triggers...\")\n\n const secrets = await this.secretService.getInstanceSecretValues(this.project.id, state.id)\n\n await this.runnerBackend.update({\n projectId: this.project.id,\n stateId: state.id,\n libraryId: this.project.libraryId,\n instanceType: instance.type,\n instanceName: instance.name,\n config: this.prepareUnitConfig(instance, secrets, invokedTriggers),\n refresh: this.operation.options.refresh,\n deleteUnreachable: this.operation.options.deleteUnreachableResources,\n secrets,\n signal,\n forceSignal,\n debug: this.operation.options.debug,\n })\n\n logger.debug(\"unit update requested\")\n\n await this.watchStateStream(state, instance.type, instance.name, logger)\n logger.debug(\"before-destroy triggers processed\")\n }\n\n private async destroyUnit(instance: InstanceModel, state: InstanceState): Promise<void> {\n return this.getInstancePromise(instance.id, async (logger, signal, forceSignal) => {\n const dependentPromises: Promise<void>[] = []\n const dependents = this.context.getDependentStates(instance.id)\n\n for (const dependent of dependents) {\n if (!this.workset.phaseAffectedInstanceIds.has(dependent.instanceId)) {\n // skip dependents that are not affected by the operation\n continue\n }\n\n const instance = this.context.getInstance(dependent.instanceId)\n dependentPromises.push(this.getInstancePromiseForOperation(instance, dependent))\n }\n\n await Promise.race([\n waitAll(dependentPromises),\n\n // to immediately abort the operation if requested\n waitForAbort(signal),\n ])\n\n signal.throwIfAborted()\n\n if (this.operation.status === \"failing\") {\n throw new AbortError(\"The operation is failing, aborting current branch (still not failed)\")\n }\n\n await this.processBeforeDestroyTriggers(instance, state, logger, signal, forceSignal)\n signal.throwIfAborted()\n\n logger.info(\"destroying unit...\")\n\n await this.workset.updateState(instance.id, {\n operationState: {\n status: \"destroying\",\n startedAt: new Date(),\n },\n })\n\n const [type, name] = parseInstanceId(instance.id)\n\n await this.runnerBackend.destroy({\n projectId: this.project.id,\n stateId: state.id,\n libraryId: this.project.libraryId,\n instanceType: type,\n instanceName: name,\n refresh: this.operation.options.refresh,\n signal,\n forceSignal,\n deleteUnreachable: this.operation.options.deleteUnreachableResources,\n forceDeleteState: this.operation.options.forceDeleteState,\n debug: this.operation.options.debug,\n })\n\n logger.debug(\"destroy request sent\")\n\n await this.watchStateStream(state, type, name, logger)\n\n logger.info(\"unit destroyed\")\n })\n }\n\n private async refreshUnit(instance: InstanceModel, state: InstanceState): Promise<void> {\n return this.getInstancePromise(instance.id, async (logger, signal, forceSignal) => {\n await this.workset.updateState(instance.id, {\n operationState: {\n status: \"refreshing\",\n startedAt: new Date(),\n },\n })\n\n logger.info(\"refreshing unit...\")\n\n const [type, name] = parseInstanceId(instance.id)\n\n await this.runnerBackend.refresh({\n projectId: this.project.id,\n stateId: state.id,\n libraryId: this.project.libraryId,\n instanceType: type,\n instanceName: name,\n signal,\n forceSignal,\n debug: this.operation.options.debug,\n })\n\n logger.debug(\"unit refresh requested\")\n\n await this.watchStateStream(state, type, name, logger)\n logger.info(\"unit refreshed\")\n })\n }\n\n private async watchStateStream(\n state: InstanceState,\n instanceType: VersionedName,\n instanceName: string,\n logger: Logger,\n ): Promise<void> {\n const stream = this.runnerBackend.watch({\n projectId: this.project.id,\n stateId: state.id,\n libraryId: this.project.libraryId,\n instanceType,\n instanceName,\n debug: this.operation.options.debug,\n })\n\n let update: UnitStateUpdate | undefined\n\n for await (update of stream) {\n try {\n await this.handleUnitStateUpdate(update, state)\n } catch (error) {\n logger.error({ error }, \"failed to handle unit state update\")\n }\n\n if (update.type === \"error\") {\n // rethrow the error to stop the execution of dependent units\n throw new Error(\n `An error occurred while processing the unit \"${update.unitId}\": ${update.message}`,\n )\n }\n\n if (update.type === \"completion\") {\n return\n }\n }\n\n throw new Error(\n \"The unit state stream was closed without a completion update or it was not handled properly.\",\n )\n }\n\n private prepareUnitConfig(\n instance: InstanceModel,\n secrets: Record<string, unknown>,\n invokedTriggers: TriggerInvocation[] = [],\n ): UnitConfig {\n const resolvedInputs = this.context.getResolvedInputs(instance.id)\n\n return {\n instanceId: instance.id,\n args: instance.args ?? {},\n inputs: mapValues(resolvedInputs ?? {}, (input, inputName) =>\n input.map(value => this.getUnitInputRef(inputName, value)),\n ),\n invokedTriggers,\n secretNames: Object.keys(secrets),\n stateIdMap: this.context.getInstanceIdToStateIdMap(instance.id),\n importBasePath: this.libraryBackend.importPath,\n }\n }\n\n private getUnitInputRef(inputName: string, input: ResolvedInstanceInput): UnitInputReference {\n const instance = this.context.getInstance(input.input.instanceId)\n const component = this.context.library.components[instance.type]\n\n const outputSpec = component.outputs[input.input.output]\n if (!outputSpec) {\n throw new Error(\n `Output \"${input.input.output}\" is not defined on component \"${instance.type}\"`,\n )\n }\n\n const entity = this.context.library.entities[outputSpec.type]\n if (!entity) {\n throw new Error(`Entity type \"${outputSpec.type}\" is not defined in the library`)\n }\n\n // if output type matches input type or extends it, return simple reference, no transformation needed\n if (input.type === outputSpec.type || entity.extensions?.includes(input.type)) {\n return {\n instanceId: input.input.instanceId,\n output: input.input.output,\n }\n }\n\n // otherwise, find matching inclusion to perform transformation\n const inclusion = entity.inclusions?.find(inc => inc.type === input.type)\n if (!inclusion) {\n throw new Error(\n `Cannot use output \"${input.input.output}\" of type \"${outputSpec.type}\" from instance \"${input.input.instanceId}\" for input \"${inputName}\" of type \"${input.type}\": no matching inclusion found in entity \"${entity.type}\"`,\n )\n }\n\n return {\n instanceId: input.input.instanceId,\n output: input.input.output,\n inclusion,\n }\n }\n\n private async handleUnitStateUpdate(\n update: UnitStateUpdate,\n state: InstanceState,\n ): Promise<void> {\n switch (update.type) {\n case \"message\":\n this.handleUnitMessage(update, state)\n return\n case \"progress\":\n await this.handleUnitProgress(update)\n return\n case \"error\":\n await this.handleUnitError(update, state)\n return\n case \"completion\":\n await this.handleUnitCompletion(update, state)\n return\n }\n }\n\n private handleUnitMessage(update: TypedUnitStateUpdate<\"message\">, state: InstanceState): void {\n this.operationService.appendLog(this.project.id, this.operation.id, state.id, update.message)\n }\n\n private async handleUnitProgress(update: TypedUnitStateUpdate<\"progress\">): Promise<void> {\n await this.workset.updateState(update.unitId, {\n operationState: {\n currentResourceCount: update.currentResourceCount,\n totalResourceCount: update.totalResourceCount,\n },\n })\n }\n\n private async handleUnitError(\n update: TypedUnitStateUpdate<\"error\">,\n state: InstanceState,\n ): Promise<void> {\n await this.workset.updateState(update.unitId, {\n instanceState:\n this.operation.type === \"preview\"\n ? // do not change instance status in preview mode\n undefined\n : {\n // keep \"deployed\" status for initially deployed instances even if the operation was failed or cancelled\n status: state.status === \"deployed\" ? \"deployed\" : \"failed\",\n },\n operationState: {\n status: isAbortErrorLike(update.message) ? \"cancelled\" : \"failed\",\n finishedAt: new Date(),\n },\n })\n }\n\n private async handleUnitCompletion(\n update: TypedUnitStateUpdate<\"completion\">,\n state: InstanceState,\n ): Promise<void> {\n if (this.operation.type === \"preview\") {\n await this.workset.updateState(update.unitId, {\n operationState: {\n status: this.workset.getStableStatusByOperationPhase(),\n finishedAt: new Date(),\n },\n })\n return\n }\n\n const instance = this.context.getInstance(update.unitId)\n\n const data: InstanceStatePatch = {\n status: this.workset.getNextStableInstanceStatus(instance.id),\n statusFields: update.statusFields ?? null,\n }\n\n const artifactIds = update.exportedArtifactIds\n ? Object.values(update.exportedArtifactIds).flat()\n : []\n\n if (update.operationType !== \"destroy\") {\n // давайте еще больше усложним и без того сложную штуку\n // set output hash before calculating input hash to capture up-to-date output hash for dependencies\n state.outputHash = update.outputHash ?? null\n\n // recalculate the input and output hashes for the instance\n const { selfHash, inputHash, dependencyOutputHash } =\n await this.context.getUpToDateInputHashOutput(instance)\n\n data.selfHash = selfHash\n data.inputHash = inputHash\n data.dependencyOutputHash = dependencyOutputHash\n data.outputHash = update.outputHash\n\n data.exportedArtifactIds = update.exportedArtifactIds\n\n // also update the parent ID\n if (instance.parentId) {\n const parentState = this.context.getState(instance.parentId)\n data.parentId = parentState.id\n } else {\n data.parentId = null\n }\n } else {\n data.selfHash = null\n data.inputHash = null\n data.dependencyOutputHash = null\n data.outputHash = null\n data.parentId = null\n data.model = null\n data.resolvedInputs = null\n data.exportedArtifactIds = null\n }\n\n // update the operation state\n await this.workset.updateState(instance.id, {\n // TODO: honestly, it is not correct\n // may be we should track operation phases separately\n // or introduce status like \"destroyed-before-recreation\" (quite ugly though)\n operationState: {\n status: this.workset.getStableStatusByOperationPhase(),\n finishedAt: new Date(),\n },\n\n // do not write instance state for non-last phases of the instance\n instanceState: this.workset.isLastPhaseForInstance(instance.id) ? data : undefined,\n\n // also do not write unit extra data for non-last phases of the instance\n unitExtra: this.workset.isLastPhaseForInstance(instance.id)\n ? {\n pages: update.pages ?? [],\n terminals: update.terminals ?? [],\n triggers: update.triggers ?? [],\n workers: update.workers ?? [],\n secrets: update.secrets ?? {},\n artifactIds,\n }\n : undefined,\n })\n\n if (\n update.operationType === \"destroy\" &&\n this.workset.isLastPhaseForInstance(instance.id) &&\n this.context.isGhostInstance(instance.id)\n ) {\n this.instanceStateService.publishGhostInstanceDeletion(this.project.id, [instance.id])\n }\n }\n\n private getInstancePromise(\n instanceId: InstanceId,\n fn: (logger: Logger, signal: AbortSignal, forceSignal: AbortSignal) => Promise<void>,\n ): Promise<void> {\n let instancePromise = this.instancePromiseMap.get(instanceId)\n if (instancePromise) {\n return instancePromise\n }\n\n // \"pending\" -> \"running\" if at least one instance is running\n if (this.operation.status === \"pending\") {\n this.operation.status = \"running\"\n this.promiseTracker.track(this.updateOperation({ status: this.operation.status }))\n }\n\n const state = this.context.getState(instanceId)\n\n const logger = this.logger.child({ instanceId }, { msgPrefix: `[${instanceId}] ` })\n const abortControllerPair = this.workset.instanceAbortControllers.get(instanceId)\n if (!abortControllerPair) {\n throw new Error(`Abort controllers for instance \"${instanceId}\" are not initialized`)\n }\n\n const { abortController, forceAbortController } = abortControllerPair\n\n instancePromise = this.workset\n .waitForInstanceLock(state.id, abortController.signal)\n .then(() => fn(logger, abortController.signal, forceAbortController.signal))\n .catch(error => {\n if (this.operation.status !== \"failing\") {\n // report the failing status of the operation\n this.operation.status = \"failing\"\n this.promiseTracker.track(this.updateOperation({ status: this.operation.status }))\n }\n\n if (isTransientInstanceOperationStatus(state.lastOperationState?.status)) {\n // if the underlying method did not correctly update the instance status, do it here\n this.promiseTracker.track(\n this.workset.updateState(instanceId, {\n operationState: {\n status: isAbortErrorLike(error) ? \"cancelled\" : \"failed\",\n finishedAt: new Date(),\n },\n instanceState: {\n // keep \"deployed\" status for initially deployed instances even if the operation was failed or cancelled\n status: state.status === \"deployed\" ? \"deployed\" : \"failed\",\n },\n }),\n )\n\n this.promiseTracker.track(\n this.operationService.appendLog(\n this.project.id,\n this.operation.id,\n state.id,\n errorToString(error),\n ),\n )\n }\n\n // rethrow the error\n throw error\n })\n .finally(() => {\n if (!this.workset.isLastPhaseForInstance(instanceId)) {\n // do not finalize the instance if it has more phases to run\n return\n }\n\n this.instancePromiseMap.delete(instanceId)\n\n // TODO: ideally we should defer unlocking until all direct dependents are completed,\n // to ensure that they are received expected inputs from this instance\n this.promiseTracker.track(\n this.instanceLockService\n .unlockInstances(this.project.id, [state.id], this.unlockToken)\n .then(() => this.workset.markInstanceUnlocked(state.id)),\n )\n\n this.logger.debug(`promise for instance \"%s\" completed`, instanceId)\n })\n\n this.instancePromiseMap.set(instanceId, instancePromise)\n this.logger.trace(`created new promise for instance \"%s\"`, instanceId)\n\n return instancePromise\n }\n\n private async ensureInstancesUnlocked(): Promise<void> {\n const lockedStateIds = Array.from(this.workset.getLockedStateIds())\n if (lockedStateIds.length === 0) {\n return\n }\n\n this.logger.warn(\"unlocking %d locked instances before shutting down\", lockedStateIds.length)\n\n await this.instanceLockService.unlockInstances(\n this.project.id,\n lockedStateIds,\n this.unlockToken,\n )\n }\n\n private async ensureOperationStatesFinalized(): Promise<void> {\n const unfinishedStates = this.context.getUnfinishedOperationStates()\n if (unfinishedStates.length === 0) {\n return\n }\n\n for (const state of unfinishedStates) {\n await this.workset.updateState(state.instanceId, {\n operationState: {\n status: \"failed\",\n finishedAt: new Date(),\n },\n instanceState: {\n status: state.status === \"deployed\" ? \"deployed\" : \"failed\",\n },\n })\n\n this.logger.warn(`finalized operation state for unfinished instance \"%s\"`, state.instanceId)\n }\n }\n\n /**\n * Collects artifact IDs from dependencies based on the direct connections\n * from instance inputs to dependency outputs.\n */\n private collectArtifactIdsForInstance(instance: InstanceModel): string[] {\n const artifactIds = new Set<string>()\n const instanceInputs = this.context.getResolvedInputs(instance.id) ?? {}\n\n for (const inputs of Object.values(instanceInputs)) {\n for (const input of inputs) {\n const dependencyState = this.context.getState(input.input.instanceId)\n if (!dependencyState.exportedArtifactIds) {\n continue\n }\n\n const outputKey = input.input.output\n const outputArtifactIds = dependencyState.exportedArtifactIds[outputKey]\n if (!outputArtifactIds) {\n continue\n }\n\n for (const hash of outputArtifactIds) {\n artifactIds.add(hash)\n }\n }\n }\n\n return Array.from(artifactIds)\n }\n}\n","import type { InstanceId } from \"@highstate/contract\"\nimport type { Logger } from \"pino\"\nimport type {\n InstanceLockService,\n InstanceStateService,\n OperationService,\n ProjectModelService,\n ProjectUnlockService,\n SecretService,\n UnitExtraService,\n} from \"../business\"\nimport type { ArtifactService } from \"../business/artifact\"\nimport type { DatabaseManager, Operation, Project } from \"../database\"\nimport type { LibraryBackend } from \"../library\"\nimport type { RunnerBackend } from \"../runner\"\nimport {\n finalOperationStatuses,\n type OperationLaunchInput,\n type OperationPhase,\n type OperationPlanInput,\n operationOptionsSchema,\n} from \"../shared\"\nimport { finalInstanceOperationStatuses } from \"../shared/models/project/state\"\nimport { RuntimeOperation } from \"./operation\"\nimport { OperationContext } from \"./operation-context\"\nimport { createOperationPlan } from \"./operation-plan\"\n\nexport class OperationManager {\n constructor(\n private readonly runnerBackend: RunnerBackend,\n private readonly libraryBackend: LibraryBackend,\n private readonly artifactService: ArtifactService,\n private readonly instanceLockService: InstanceLockService,\n private readonly projectUnlockService: ProjectUnlockService,\n private readonly operationService: OperationService,\n private readonly secretService: SecretService,\n private readonly instanceStateService: InstanceStateService,\n private readonly projectModelService: ProjectModelService,\n private readonly unitExtraService: UnitExtraService,\n private readonly database: DatabaseManager,\n private readonly logger: Logger,\n ) {\n this.projectUnlockService.registerUnlockTask(\n //\n \"recover-system-state\",\n projectId => this.recoverSystemState(projectId),\n )\n }\n\n private readonly runtimeOperations = new Map<string, RuntimeOperation>()\n\n /**\n * Plans the project operation without executing it.\n *\n * @param request The operation request to plan.\n * @returns The planned phases for the operation.\n */\n async plan(request: OperationPlanInput): Promise<OperationPhase[]> {\n this.logger.info({ request }, \"planning operation\")\n\n const project = await this.database.backend.project.findUnique({\n where: { id: request.projectId },\n })\n\n if (!project) {\n throw new Error(`Project with ID \"${request.projectId}\" not found`)\n }\n\n const context = await OperationContext.load(\n request.projectId,\n this.libraryBackend,\n this.instanceStateService,\n this.projectModelService,\n this.logger,\n )\n\n const options = operationOptionsSchema.parse(request.options ?? {})\n\n return createOperationPlan(context, request.type, request.instanceIds, options)\n }\n\n /**\n * Launches the project operation.\n *\n * @param request The operation request to launch.\n */\n async launch(request: OperationLaunchInput): Promise<Operation> {\n const options = operationOptionsSchema.parse(request.options ?? {})\n\n const operation = await this.operationService.createOperation(\n request.projectId,\n request.meta,\n request.type,\n request.instanceIds,\n options,\n )\n\n this.logger.info({ operation }, \"launching operation\")\n\n const project = await this.database.backend.project.findUnique({\n where: { id: request.projectId },\n })\n\n if (!project) {\n throw new Error(`Project with ID \"${request.projectId}\" not found`)\n }\n\n this.startOperation(project, operation)\n\n return operation\n }\n\n /**\n * Cancels the current operation.\n * Does nothing if no operation is running.\n */\n cancel(operationId: string): void {\n const runtimeOperation = this.runtimeOperations.get(operationId)\n if (runtimeOperation) {\n runtimeOperation.cancel()\n }\n }\n\n cancelInstance(operationId: string, instanceId: InstanceId): void {\n const runtimeOperation = this.runtimeOperations.get(operationId)\n if (runtimeOperation) {\n runtimeOperation.cancelInstance(instanceId)\n }\n }\n\n private startOperation(project: Project, operation: Operation): void {\n const runtimeOperation = new RuntimeOperation(\n project,\n operation,\n this.runnerBackend,\n this.libraryBackend,\n this.artifactService,\n this.instanceLockService,\n this.operationService,\n this.secretService,\n this.instanceStateService,\n this.projectModelService,\n this.unitExtraService,\n this.logger.child({ operationId: operation.id }),\n )\n\n this.runtimeOperations.set(operation.id, runtimeOperation)\n void runtimeOperation.operateSafe().finally(() => this.runtimeOperations.delete(operation.id))\n }\n\n private async recoverSystemState(projectId: string): Promise<void> {\n const database = await this.database.forProject(projectId)\n\n await database.$transaction(async tx => {\n // 1. process lost operations\n const activeOperations = await tx.operation.findMany({\n where: {\n status: {\n not: {\n in: finalOperationStatuses,\n },\n },\n },\n })\n\n if (activeOperations.length > 0) {\n // mark all lost operations as failed\n for (const operation of activeOperations) {\n await tx.operation.update({\n where: { id: operation.id },\n data: {\n status: \"failed\",\n finishedAt: new Date(),\n },\n })\n\n void this.operationService.appendLog(\n projectId,\n operation.id,\n null,\n \"Operation was interrupted\",\n )\n }\n\n this.logger.warn(\n { projectId, operationCount: activeOperations.length },\n \"marked %s lost operations as failed\",\n activeOperations.length,\n )\n }\n\n // 2. cleanup orphaned locks\n const existingLocks = await tx.instanceLock.findMany({\n select: { stateId: true },\n })\n\n if (existingLocks.length > 0) {\n const stateIds = existingLocks.map(lock => lock.stateId)\n await tx.instanceLock.deleteMany({\n where: {\n stateId: {\n in: stateIds,\n },\n },\n })\n\n for (const lock of existingLocks) {\n this.logger.warn({ projectId, stateId: lock.stateId }, \"removed orphaned lock\")\n }\n\n this.logger.info(\n { projectId, lockCount: existingLocks.length },\n \"cleaned up %s locks\",\n existingLocks.length,\n )\n }\n\n // 3. reset instances with transient status\n const instancesToReset = await tx.instanceOperationState.findMany({\n where: {\n status: {\n not: {\n in: finalInstanceOperationStatuses,\n },\n },\n },\n select: {\n stateId: true,\n status: true,\n },\n })\n\n if (instancesToReset.length > 0) {\n // log each instance being reset\n for (const instance of instancesToReset) {\n this.logger.warn(\n { projectId, stateId: instance.stateId, previousStatus: instance.status },\n \"resetting instance with transient status from %s to failed\",\n instance.status,\n )\n }\n\n // reset operation states that were being processed by lost operations\n const result = await tx.instanceOperationState.updateMany({\n where: {\n status: {\n not: {\n in: finalInstanceOperationStatuses,\n },\n },\n },\n data: {\n status: \"failed\",\n finishedAt: new Date(),\n },\n })\n\n this.logger.info(\n { projectId, resetOperationCount: result.count },\n \"reset %s operation states\",\n result.count,\n )\n }\n\n // Step 4: reset attempted instance states\n const attemptedResult = await tx.instanceState.updateMany({\n where: {\n status: \"attempted\",\n },\n data: {\n status: \"failed\",\n },\n })\n\n if (attemptedResult.count > 0) {\n this.logger.info(\n { projectId, resetAttemptedCount: attemptedResult.count },\n \"reset %s attempted instance states\",\n attemptedResult.count,\n )\n }\n })\n }\n}\n","import type { ProjectUnlockBackend } from \"./abstractions\"\n\nexport class MemoryProjectUnlockBackend implements ProjectUnlockBackend {\n private readonly masterKeys = new Map<string, Buffer>()\n\n checkProjectUnlocked(projectId: string): Promise<boolean> {\n return Promise.resolve(this.masterKeys.has(projectId))\n }\n\n getProjectMasterKey(projectId: string): Promise<Buffer | null> {\n const masterKey = this.masterKeys.get(projectId)\n\n return Promise.resolve(masterKey ?? null)\n }\n\n lockProject(projectId: string): Promise<void> {\n this.masterKeys.delete(projectId)\n\n return Promise.resolve()\n }\n\n unlockProject(projectId: string, masterKey: Buffer): Promise<void> {\n this.masterKeys.set(projectId, masterKey)\n\n return Promise.resolve()\n }\n}\n","import type { RunnerBackend } from \"./runner\"\nimport { createId } from \"@paralleldrive/cuid2\"\nimport { type Logger, pino } from \"pino\"\nimport { type ArtifactBackend, ArtifactService, createArtifactBackend } from \"./artifact\"\nimport {\n ApiKeyService,\n BackendUnlockService,\n InstanceLockService,\n InstanceStateService,\n OperationService,\n ProjectModelService,\n ProjectService,\n ProjectUnlockService,\n SecretService,\n SettingsService,\n TerminalSessionService,\n UnitExtraService,\n WorkerService,\n} from \"./business\"\nimport { ProjectEvaluationSubsystem } from \"./business/evaluation\"\nimport { type Config, loadConfig } from \"./config\"\nimport {\n createBackendDatabaseBackend,\n createProjectDatabaseBackend,\n type DatabaseManager,\n DatabaseManagerImpl,\n} from \"./database\"\nimport { createLibraryBackend, type LibraryBackend } from \"./library\"\nimport { createLockBackend, type LockBackend, LockManager } from \"./lock\"\nimport { OperationManager } from \"./orchestrator\"\nimport { createProjectModelBackends, type ProjectModelBackend } from \"./project-model\"\nimport { createPubSubBackend, type PubSubBackend, PubSubManager } from \"./pubsub\"\nimport { createRunnerBackend } from \"./runner\"\nimport { createTerminalBackend, type TerminalBackend, TerminalManager } from \"./terminal\"\nimport { MemoryProjectUnlockBackend, type ProjectUnlockBackend } from \"./unlock\"\nimport { createWorkerBackend, type WorkerBackend, WorkerManager } from \"./worker\"\n\nexport type Services = {\n /**\n * The runtime ID of this backend.\n *\n * Generated on each start and used to track terminals and workers running by this backend.\n */\n readonly runtimeId: string\n\n readonly logger: Logger\n\n readonly database: DatabaseManager\n\n readonly projectUnlockBackend: ProjectUnlockBackend\n\n readonly pubsubBackend: PubSubBackend\n readonly pubsubManager: PubSubManager\n\n readonly lockBackend: LockBackend\n readonly lockManager: LockManager\n\n readonly libraryBackend: LibraryBackend\n readonly runnerBackend: RunnerBackend\n\n readonly projectModelBackends: Record<string, ProjectModelBackend>\n readonly projectEvaluationSubsystem: ProjectEvaluationSubsystem\n\n readonly operationManager: OperationManager\n\n readonly terminalBackend: TerminalBackend\n readonly terminalManager: TerminalManager\n readonly terminalSessionService: TerminalSessionService\n\n readonly workerBackend: WorkerBackend\n readonly workerManager: WorkerManager\n\n readonly artifactBackend: ArtifactBackend\n\n // business services\n readonly backendUnlockService: BackendUnlockService\n readonly instanceLockService: InstanceLockService\n readonly projectUnlockService: ProjectUnlockService\n readonly operationService: OperationService\n readonly instanceStateService: InstanceStateService\n readonly secretService: SecretService\n readonly apiKeyService: ApiKeyService\n readonly workerService: WorkerService\n readonly projectModelService: ProjectModelService\n readonly projectService: ProjectService\n readonly artifactService: ArtifactService\n readonly settingsService: SettingsService\n readonly unitExtraService: UnitExtraService\n}\n\nexport interface CreateServicesOptions {\n /**\n * The config to use. If not provided, it will be loaded from the environment.\n */\n readonly config?: Config\n\n /**\n * The already created services to use. If the particular service is not provided, it will be created.\n */\n readonly services?: Partial<Services>\n}\n\nexport async function createServices({\n config,\n services: {\n runtimeId,\n logger,\n\n database,\n projectUnlockBackend,\n\n pubsubBackend,\n pubsubManager,\n\n lockBackend,\n lockManager,\n\n libraryBackend,\n runnerBackend,\n\n projectModelBackends,\n projectEvaluationSubsystem,\n\n operationManager,\n\n terminalBackend,\n terminalManager,\n\n workerBackend,\n workerManager,\n\n artifactBackend,\n artifactService,\n\n // business services\n backendUnlockService,\n instanceLockService,\n projectUnlockService,\n operationService,\n secretService,\n terminalSessionService: sessionService,\n instanceStateService,\n apiKeyService,\n workerService,\n projectService,\n projectModelService,\n settingsService,\n unitExtraService,\n } = {},\n}: CreateServicesOptions = {}): Promise<Services> {\n runtimeId ??= createId()\n config ??= await loadConfig()\n\n logger ??= pino({ level: config.HIGHSTATE_LOG_LEVEL, errorKey: \"error\" })\n\n projectUnlockBackend ??= new MemoryProjectUnlockBackend()\n\n const backendDatabaseBackend = await createBackendDatabaseBackend(config, logger)\n const projectDatabaseBackend = await createProjectDatabaseBackend(config, logger)\n\n database ??= new DatabaseManagerImpl(\n backendDatabaseBackend,\n projectUnlockBackend,\n projectDatabaseBackend,\n config,\n logger,\n )\n\n pubsubBackend ??= createPubSubBackend(config, logger)\n pubsubManager ??= new PubSubManager(pubsubBackend, logger)\n\n lockBackend ??= createLockBackend(config)\n lockManager ??= new LockManager(lockBackend)\n\n libraryBackend ??= await createLibraryBackend(config, logger)\n\n artifactBackend ??= await createArtifactBackend(config, database, logger)\n artifactService ??= new ArtifactService(database, artifactBackend, logger)\n\n backendUnlockService ??= new BackendUnlockService(\n database,\n logger.child({ service: \"BackendUnlockService\" }),\n )\n\n secretService ??= new SecretService(\n database,\n pubsubManager,\n libraryBackend,\n logger.child({ service: \"SecretService\" }),\n )\n sessionService ??= new TerminalSessionService(database)\n\n runnerBackend ??= createRunnerBackend(\n config,\n libraryBackend,\n artifactService,\n artifactBackend,\n secretService,\n logger,\n )\n\n projectModelBackends ??= await createProjectModelBackends(database, logger)\n\n instanceLockService ??= new InstanceLockService(\n database,\n pubsubManager,\n logger.child({ service: \"InstanceLockService\" }),\n )\n\n projectUnlockService ??= new ProjectUnlockService(\n database,\n pubsubManager,\n projectUnlockBackend,\n config,\n logger.child({ service: \"StateUnlockService\" }),\n )\n\n operationService ??= new OperationService(\n database,\n pubsubManager,\n logger.child({ service: \"OperationService\" }),\n )\n\n apiKeyService ??= new ApiKeyService(database, logger.child({ service: \"ApiKeyService\" }))\n\n terminalBackend ??= createTerminalBackend(config, logger)\n terminalManager ??= TerminalManager.create(\n terminalBackend,\n database,\n pubsubManager,\n projectUnlockService,\n logger,\n )\n\n workerBackend ??= createWorkerBackend(config, logger)\n workerManager ??= new WorkerManager(\n config,\n runtimeId,\n workerBackend,\n projectUnlockService,\n apiKeyService,\n database,\n pubsubManager,\n logger,\n )\n\n workerService ??= new WorkerService(\n database,\n workerManager,\n pubsubManager,\n logger.child({ service: \"WorkerService\" }),\n )\n\n unitExtraService ??= new UnitExtraService(database)\n settingsService ??= new SettingsService(database)\n\n instanceStateService ??= new InstanceStateService(\n database,\n pubsubManager,\n runnerBackend,\n workerService,\n artifactService,\n unitExtraService,\n secretService,\n logger.child({ service: \"InstanceService\" }),\n )\n\n projectModelService ??= new ProjectModelService(\n database,\n libraryBackend,\n instanceStateService,\n projectModelBackends,\n projectUnlockService,\n logger.child({ service: \"ProjectModelService\" }),\n )\n\n projectEvaluationSubsystem ??= new ProjectEvaluationSubsystem(\n database,\n libraryBackend,\n projectModelService,\n pubsubManager,\n projectUnlockService,\n logger,\n )\n\n projectService ??= new ProjectService(\n database,\n projectUnlockService,\n projectEvaluationSubsystem,\n projectModelService,\n projectModelBackends,\n libraryBackend,\n pubsubManager,\n logger.child({ service: \"ProjectService\" }),\n )\n\n operationManager ??= new OperationManager(\n runnerBackend,\n libraryBackend,\n artifactService,\n instanceLockService,\n projectUnlockService,\n operationService,\n secretService,\n instanceStateService,\n projectModelService,\n unitExtraService,\n database,\n logger,\n )\n\n logger.info(\"services created\")\n\n return {\n runtimeId,\n logger,\n\n database,\n\n projectUnlockBackend,\n\n pubsubBackend,\n pubsubManager,\n\n lockBackend,\n lockManager,\n\n libraryBackend,\n runnerBackend,\n\n projectModelBackends,\n projectEvaluationSubsystem,\n\n operationManager,\n\n terminalBackend,\n terminalManager,\n\n workerBackend,\n workerManager,\n\n artifactBackend,\n artifactService,\n\n // business services\n backendUnlockService,\n instanceLockService,\n projectUnlockService,\n operationService,\n instanceStateService,\n secretService,\n terminalSessionService: sessionService,\n apiKeyService,\n workerService,\n projectService,\n projectModelService,\n settingsService,\n unitExtraService,\n }\n}\n\nlet sharedServicesPromise: Promise<Services> | undefined\n\nexport function getSharedServices(options: CreateServicesOptions = {}): Promise<Services> {\n if (!sharedServicesPromise) {\n sharedServicesPromise = createServices(options)\n }\n\n return sharedServicesPromise\n}\n\n/**\n * Disposes all the services that implement `Symbol.dispose` or `Symbol.asyncDispose`.\n *\n * Must only be called once when the backend is shutting down and when no other code is using the services.\n *\n * @param services The services to dispose\n */\nexport async function disposeServices(services: Services): Promise<void> {\n const promises: Promise<unknown>[] = []\n\n for (const [key, service] of Object.entries(services)) {\n if (typeof service !== \"object\" || service === null) {\n continue\n }\n\n if (Symbol.dispose in service) {\n // sync dispose\n try {\n ;(service as Disposable)[Symbol.dispose]()\n } catch (error) {\n services.logger.error({ error }, `failed to dispose service \"%s\"`, key)\n }\n }\n\n if (Symbol.asyncDispose in service) {\n // async dispose\n const disposeAsync = async () => {\n try {\n await (service as AsyncDisposable)[Symbol.asyncDispose]()\n } catch (error) {\n services.logger.error({ error }, `failed to async dispose service \"%s\"`, key)\n }\n }\n\n promises.push(disposeAsync())\n }\n }\n\n await Promise.all(promises)\n}\n"]}