@highstate/backend 0.9.14 → 0.9.16

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 (144) hide show
  1. package/dist/chunk-RCB4AFGD.js +159 -0
  2. package/dist/chunk-RCB4AFGD.js.map +1 -0
  3. package/dist/chunk-WHALQHEZ.js +2017 -0
  4. package/dist/chunk-WHALQHEZ.js.map +1 -0
  5. package/dist/highstate.manifest.json +3 -3
  6. package/dist/index.js +6146 -2174
  7. package/dist/index.js.map +1 -1
  8. package/dist/library/worker/main.js +51 -159
  9. package/dist/library/worker/main.js.map +1 -1
  10. package/dist/shared/index.js +159 -43
  11. package/package.json +25 -7
  12. package/src/artifact/abstractions.ts +46 -0
  13. package/src/artifact/encryption.ts +69 -0
  14. package/src/artifact/factory.ts +36 -0
  15. package/src/artifact/index.ts +3 -0
  16. package/src/artifact/local.ts +142 -0
  17. package/src/business/api-key.ts +65 -0
  18. package/src/business/artifact.ts +288 -0
  19. package/src/business/backend-unlock.ts +10 -0
  20. package/src/business/index.ts +9 -0
  21. package/src/business/instance-lock.ts +124 -0
  22. package/src/business/instance-state.ts +292 -0
  23. package/src/business/operation.ts +251 -0
  24. package/src/business/project-unlock.ts +242 -0
  25. package/src/business/secret.ts +187 -0
  26. package/src/business/worker.ts +161 -0
  27. package/src/common/index.ts +2 -1
  28. package/src/common/performance.ts +44 -0
  29. package/src/common/tree.ts +33 -0
  30. package/src/common/utils.ts +40 -1
  31. package/src/config.ts +14 -10
  32. package/src/hotstate/abstractions.ts +48 -0
  33. package/src/hotstate/factory.ts +17 -0
  34. package/src/{secret → hotstate}/index.ts +1 -0
  35. package/src/hotstate/manager.ts +192 -0
  36. package/src/hotstate/memory.ts +100 -0
  37. package/src/hotstate/validation.ts +101 -0
  38. package/src/index.ts +2 -1
  39. package/src/library/abstractions.ts +10 -23
  40. package/src/library/factory.ts +2 -2
  41. package/src/library/local.ts +89 -102
  42. package/src/library/worker/evaluator.ts +14 -47
  43. package/src/library/worker/loader.lite.ts +41 -0
  44. package/src/library/worker/main.ts +14 -65
  45. package/src/library/worker/protocol.ts +8 -24
  46. package/src/lock/abstractions.ts +6 -0
  47. package/src/lock/factory.ts +15 -0
  48. package/src/{workspace → lock}/index.ts +1 -0
  49. package/src/lock/manager.ts +82 -0
  50. package/src/lock/memory.ts +19 -0
  51. package/src/orchestrator/manager.ts +131 -82
  52. package/src/orchestrator/operation-workset.ts +188 -77
  53. package/src/orchestrator/operation.ts +975 -284
  54. package/src/project/abstractions.ts +20 -7
  55. package/src/project/factory.ts +1 -1
  56. package/src/project/index.ts +0 -1
  57. package/src/project/local.ts +73 -17
  58. package/src/project/manager.ts +272 -131
  59. package/src/pubsub/abstractions.ts +13 -0
  60. package/src/pubsub/factory.ts +19 -0
  61. package/src/pubsub/index.ts +3 -0
  62. package/src/pubsub/local.ts +36 -0
  63. package/src/pubsub/manager.ts +100 -0
  64. package/src/pubsub/validation.ts +33 -0
  65. package/src/runner/abstractions.ts +135 -68
  66. package/src/runner/artifact-env.ts +160 -0
  67. package/src/runner/factory.ts +20 -5
  68. package/src/runner/force-abort.ts +117 -0
  69. package/src/runner/local.ts +281 -372
  70. package/src/{common → runner}/pulumi.ts +86 -37
  71. package/src/services.ts +193 -35
  72. package/src/shared/index.ts +3 -11
  73. package/src/shared/models/backend/index.ts +3 -0
  74. package/src/shared/models/backend/project.ts +63 -0
  75. package/src/shared/models/backend/unlock-method.ts +20 -0
  76. package/src/shared/models/base.ts +151 -0
  77. package/src/shared/models/errors.ts +5 -0
  78. package/src/shared/models/index.ts +4 -0
  79. package/src/shared/models/project/api-key.ts +62 -0
  80. package/src/shared/models/project/artifact.ts +113 -0
  81. package/src/shared/models/project/component.ts +45 -0
  82. package/src/shared/models/project/index.ts +14 -0
  83. package/src/shared/{project.ts → models/project/instance.ts} +12 -0
  84. package/src/shared/models/project/lock.ts +91 -0
  85. package/src/shared/{operation.ts → models/project/operation.ts} +43 -8
  86. package/src/shared/models/project/page.ts +57 -0
  87. package/src/shared/models/project/secret.ts +112 -0
  88. package/src/shared/models/project/service-account.ts +22 -0
  89. package/src/shared/models/project/state.ts +432 -0
  90. package/src/shared/models/project/terminal.ts +99 -0
  91. package/src/shared/models/project/trigger.ts +56 -0
  92. package/src/shared/models/project/unlock-method.ts +31 -0
  93. package/src/shared/models/project/worker.ts +105 -0
  94. package/src/shared/resolvers/graph-resolver.ts +74 -13
  95. package/src/shared/resolvers/index.ts +5 -0
  96. package/src/shared/resolvers/input-hash.ts +53 -15
  97. package/src/shared/resolvers/input.ts +1 -9
  98. package/src/shared/resolvers/registry.ts +7 -2
  99. package/src/shared/resolvers/state.ts +12 -0
  100. package/src/shared/resolvers/validation.ts +61 -20
  101. package/src/shared/{async-batcher.ts → utils/async-batcher.ts} +13 -1
  102. package/src/shared/utils/hash.ts +6 -0
  103. package/src/shared/utils/index.ts +3 -0
  104. package/src/shared/utils/promise-tracker.ts +23 -0
  105. package/src/state/abstractions.ts +330 -101
  106. package/src/state/encryption.ts +59 -0
  107. package/src/state/factory.ts +3 -5
  108. package/src/state/index.ts +3 -0
  109. package/src/state/keyring.ts +22 -0
  110. package/src/state/local/backend.ts +299 -0
  111. package/src/state/local/collection.ts +342 -0
  112. package/src/state/local/index.ts +2 -0
  113. package/src/state/manager.ts +804 -18
  114. package/src/state/repository/index.ts +2 -0
  115. package/src/state/repository/repository.index.ts +193 -0
  116. package/src/state/repository/repository.ts +458 -0
  117. package/src/terminal/{shared.ts → abstractions.ts} +3 -3
  118. package/src/terminal/docker.ts +18 -14
  119. package/src/terminal/factory.ts +3 -3
  120. package/src/terminal/index.ts +1 -1
  121. package/src/terminal/manager.ts +134 -80
  122. package/src/terminal/run.sh.ts +22 -10
  123. package/src/worker/abstractions.ts +42 -0
  124. package/src/worker/docker.ts +83 -0
  125. package/src/worker/factory.ts +20 -0
  126. package/src/worker/index.ts +3 -0
  127. package/src/worker/manager.ts +139 -0
  128. package/dist/chunk-C2TJAQAD.js +0 -937
  129. package/dist/chunk-C2TJAQAD.js.map +0 -1
  130. package/dist/chunk-WXDYCRTT.js +0 -234
  131. package/dist/chunk-WXDYCRTT.js.map +0 -1
  132. package/src/library/worker/loader.ts +0 -114
  133. package/src/preferences/shared.ts +0 -1
  134. package/src/project/lock.ts +0 -39
  135. package/src/secret/abstractions.ts +0 -59
  136. package/src/secret/factory.ts +0 -22
  137. package/src/secret/local.ts +0 -152
  138. package/src/shared/state.ts +0 -270
  139. package/src/shared/terminal.ts +0 -13
  140. package/src/state/local.ts +0 -612
  141. package/src/workspace/abstractions.ts +0 -41
  142. package/src/workspace/factory.ts +0 -14
  143. package/src/workspace/local.ts +0 -54
  144. /package/src/shared/{library.ts → models/backend/library.ts} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/secret/abstractions.ts","../src/secret/factory.ts","../src/secret/local.ts","../src/library/factory.ts","../src/library/local.ts","../src/config.ts","../src/project/factory.ts","../src/project/local.ts","../src/project/lock.ts","../src/project/manager.ts","../src/terminal/factory.ts","../src/terminal/docker.ts","../src/terminal/run.sh.ts","../src/terminal/manager.ts","../../../node_modules/nanoid/index.js","../../../node_modules/nanoid/url-alphabet/index.js","../src/runner/abstractions.ts","../src/runner/factory.ts","../src/runner/local.ts","../src/state/factory.ts","../src/state/local.ts","../src/state/manager.ts","../src/workspace/factory.ts","../src/workspace/local.ts","../src/orchestrator/manager.ts","../src/orchestrator/operation.ts","../src/orchestrator/operation-workset.ts","../src/services.ts"],"sourcesContent":["export class SecretAccessDeniedError extends Error {\n constructor(projectId: string, key: string) {\n super(`Access to the secrets of component \"${projectId}.${key}\" is denied.`)\n }\n}\n\nexport interface SecretBackend {\n /**\n * Check if the state and secrets of the project are locked.\n * The backend may not implement this method.\n *\n * @param projectId The ID of the project.\n * @param signal The signal to abort the operation.\n *\n * @returns `true` if the project is locked, `false` if the project is unlocked.\n */\n isLocked?(projectId: string, signal?: AbortSignal): Promise<boolean>\n\n /**\n * Unlock the state and secrets of the project.\n * The backend may not implement this method.\n *\n * @param projectId The ID of the project.\n * @param password The password to unlock the secrets.\n * @param signal The signal to abort the operation.\n *\n * @returns `true` if the project is unlocked, `false` if the password is incorrect.\n */\n unlock?(projectId: string, password: string, signal?: AbortSignal): Promise<boolean>\n\n /**\n * Get the secrets of the component.\n *\n * @param projectId The ID of the project.\n * @param instanceId The ID of the instance.\n * @param signal The signal to abort the operation.\n *\n * @returns A record of secret key-value pairs or `null` if the secrets are not found.\n * @throws {SecretAccessDeniedError} If access to the secrets is denied.\n */\n get(projectId: string, instanceId: string, signal?: AbortSignal): Promise<Record<string, unknown>>\n\n /**\n * Set the secrets of the component.\n *\n * @param projectId The ID of the project.\n * @param instanceId The ID of the instance.\n * @param values The record of secret key-value pairs.\n * @param signal The signal to abort the operation.\n *\n * @throws {SecretAccessDeniedError} If access to the secrets is denied.\n */\n set(\n projectId: string,\n instanceId: string,\n values: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<void>\n}\n","import type { SecretBackend } from \"./abstractions\"\nimport type { LocalPulumiHost } from \"../common\"\nimport type { Logger } from \"pino\"\nimport { z } from \"zod\"\nimport { LocalSecretBackend, localSecretBackendConfig } from \"./local\"\n\nexport const secretBackendConfig = z.object({\n HIGHSTATE_BACKEND_SECRET_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localSecretBackendConfig.shape,\n})\n\nexport function createSecretBackend(\n config: z.infer<typeof secretBackendConfig>,\n localPulumiHost: LocalPulumiHost,\n logger: Logger,\n): Promise<SecretBackend> {\n switch (config.HIGHSTATE_BACKEND_SECRET_TYPE) {\n case \"local\": {\n return LocalSecretBackend.create(config, localPulumiHost, logger)\n }\n }\n}\n","import type { SecretBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport { mapKeys, mapValues, pickBy } from \"remeda\"\nimport { z } from \"zod\"\nimport { LocalPulumiHost, resolveMainLocalProject, stringToValue, valueToString } from \"../common\"\n\nexport const localSecretBackendConfig = z.object({\n HIGHSTATE_BACKEND_SECRET_PROJECT_PATH: z.string().optional(),\n HIGHSTATE_BACKEND_SECRET_PROJECT_NAME: z.string().optional(),\n})\n\n/**\n * The backend for storing secrets in the local Pulumi project.\n * It is the simplest backend and should be used for development and single-user projects.\n */\nexport class LocalSecretBackend implements SecretBackend {\n private constructor(\n private readonly projectPath: string,\n private readonly projectName: string,\n private readonly pulumiProjectHost: LocalPulumiHost,\n private readonly logger: Logger,\n ) {\n this.logger.debug({ msg: \"initialized\", projectPath, projectName })\n }\n\n isLocked(projectId: string): Promise<boolean> {\n return Promise.resolve(!this.pulumiProjectHost.hasPassword(projectId))\n }\n\n async unlock(projectId: string, password: string, signal?: AbortSignal): Promise<boolean> {\n this.pulumiProjectHost.setPassword(projectId, password)\n\n try {\n // try to run a command to check if the password is correct\n await this.pulumiProjectHost.runLocal(\n {\n projectId,\n pulumiProjectName: this.projectName,\n pulumiStackName: projectId,\n projectPath: this.projectPath,\n },\n async stack => {\n this.logger.debug({ projectId }, \"checking password\")\n\n await stack.info(true)\n },\n signal,\n )\n\n return true\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"incorrect passphrase\")) {\n this.logger.debug({ projectId, error }, \"incorrect passphrase\")\n\n this.pulumiProjectHost.removePassword(projectId)\n return false\n }\n }\n\n throw error\n }\n }\n\n get(\n projectId: string,\n instanceId: string,\n signal?: AbortSignal,\n ): Promise<Record<string, unknown>> {\n return this.pulumiProjectHost.runLocal(\n {\n projectId,\n pulumiProjectName: this.projectName,\n pulumiStackName: projectId,\n projectPath: this.projectPath,\n },\n async stack => {\n this.logger.debug({ projectId, instanceId }, \"getting secrets\")\n\n const config = await stack.getAllConfig()\n signal?.throwIfAborted()\n\n const prefix = this.getPrefix(projectId, instanceId)\n const secrets = pickBy(config, (_, key) => key.startsWith(prefix))\n const trimmedSecrets = mapKeys(secrets, key => key.slice(prefix.length))\n\n return mapValues(trimmedSecrets, value => stringToValue(value.value))\n },\n signal,\n )\n }\n\n set(\n projectId: string,\n instanceId: string,\n values: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<void> {\n return this.pulumiProjectHost.runLocal(\n {\n projectId,\n pulumiProjectName: this.projectName,\n pulumiStackName: projectId,\n projectPath: this.projectPath,\n },\n async stack => {\n this.logger.debug({ projectId, instanceId }, \"setting secrets\")\n\n const componentSecrets = mapValues(\n mapKeys(values, key => `${this.getPrefix(projectId, instanceId)}${key}`),\n value => ({\n value: valueToString(value),\n secret: true,\n }),\n )\n\n const config = await stack.getAllConfig()\n signal?.throwIfAborted()\n\n Object.assign(config, componentSecrets)\n\n await stack.setAllConfig(config)\n },\n signal,\n )\n }\n\n private getPrefix(projectId: string, instanceId: string) {\n // replace all semicolons with dashes since extra semicolons are not allowed in Pulumi config keys\n instanceId = instanceId.replace(/:/g, \"_\")\n\n return `${this.projectName}:${projectId}/${instanceId}/`\n }\n\n static async create(\n config: z.infer<typeof localSecretBackendConfig>,\n pulumiProjectHost: LocalPulumiHost,\n logger: Logger,\n ) {\n const [projectPath, projectName] = await resolveMainLocalProject(\n config.HIGHSTATE_BACKEND_SECRET_PROJECT_PATH,\n config.HIGHSTATE_BACKEND_SECRET_PROJECT_NAME,\n )\n\n return new LocalSecretBackend(\n projectPath,\n projectName,\n pulumiProjectHost,\n logger.child({ backend: \"SecretBackend\", service: \"LocalSecretBackend\" }),\n )\n }\n}\n","import type { LibraryBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport { z } from \"zod\"\nimport { LocalLibraryBackend, localLibraryBackendConfig } from \"./local\"\n\nexport const libraryBackendConfig = z.object({\n HIGHSTATE_BACKEND_LIBRARY_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_BACKEND_LIBRARY_TYPE) {\n case \"local\": {\n return await LocalLibraryBackend.create(config, logger)\n }\n }\n}\n","import type {\n InstanceEvaluationResult,\n LibraryBackend,\n ModuleEvaluationResult,\n ResolvedUnitSource,\n} from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport type {\n PackageResolutionResponse,\n PackageResolutionWorkerData,\n} from \"./package-resolution-worker\"\nimport type { WorkerRequest, WorkerResponse } from \"./worker/protocol\"\nimport { fileURLToPath } from \"node:url\"\nimport { EventEmitter, on } from \"node:events\"\nimport { Worker } from \"node:worker_threads\"\nimport { resolve } from \"node:path\"\nimport { readFile } from \"node:fs/promises\"\nimport { type InstanceModel, isUnitModel } from \"@highstate/contract\"\nimport Watcher from \"watcher\"\nimport { BetterLock } from \"better-lock\"\nimport { resolve as importMetaResolve } from \"import-meta-resolve\"\nimport { z } from \"zod\"\nimport { readPackageJSON } from \"pkg-types\"\nimport { runScript, installDependencies, addDependency } from \"nypm\"\nimport { flatMap, groupBy, map, pipe, unique } from \"remeda\"\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_BACKEND_LIBRARY_LOCAL_PACKAGES: stringArrayType.default(\"@highstate/library\"),\n HIGHSTATE_BACKEND_LIBRARY_LOCAL_WATCH_PATHS: stringArrayType.optional(),\n})\n\ninterface Events {\n library: [LibraryUpdate[]]\n resolvedUnitSource: [ResolvedUnitSource]\n}\n\ntype HighstateManifestJson = {\n sourceHashes?: Record<string, string>\n}\n\ntype LibraryPackage = {\n name: string\n rootPath: string\n dependencies: Set<string>\n dependents: Set<string>\n}\n\nexport class LocalLibraryBackend implements LibraryBackend {\n private readonly watcher: Watcher\n\n private readonly lock = new BetterLock()\n private readonly eventEmitter = new EventEmitter<Events>()\n\n private library: LibraryModel | null = null\n private worker: Worker | null = null\n\n private readonly packages = new Map<string, LibraryPackage>()\n private readonly resolvedUnitSources = new Map<string, ResolvedUnitSource>()\n\n private constructor(\n private readonly libraryPackages: string[],\n watchPaths: string[],\n private readonly logger: Logger,\n ) {\n this.watcher = new Watcher(watchPaths, {\n recursive: true,\n ignoreInitial: true,\n ignore: /\\.git|node_modules|dist/,\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 () => {\n const [library] = await this.getLibrary()\n\n return library\n })\n }\n\n async *watchLibrary(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(unitTypes: string[]): 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(signal?: AbortSignal): 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 allInstances: InstanceModel[],\n resolvedInputs: Record<string, Record<string, ResolvedInstanceInput[]>>,\n instanceIds: string[],\n ): Promise<InstanceEvaluationResult[]> {\n return await this.lock.acquire(async () => {\n this.logger.info(\"evaluating %d composite instances\", instanceIds.length)\n\n const [, worker] = await this.getLibrary()\n worker.postMessage({\n type: \"evaluate-composite-instances\",\n allInstances,\n resolvedInputs,\n instanceIds,\n } satisfies WorkerRequest)\n\n this.logger.debug(\"evaluation request sent\")\n\n const { results } = await this.getResult(worker, \"instance-evaluation-results\")\n return results\n })\n }\n\n async evaluateModules(modulePaths: string[]): Promise<ModuleEvaluationResult> {\n return await this.lock.acquire(async () => {\n this.logger.info({ msg: \"evaluating modules\", modulePaths })\n\n const [, worker] = await this.getLibrary()\n worker.postMessage({\n type: \"evaluate-modules\",\n modulePaths,\n } satisfies WorkerRequest)\n\n this.logger.debug(\"evaluation request sent\")\n\n const { result } = await this.getResult(worker, \"module-evaluation-result\")\n return result\n })\n }\n\n private async getResult<TType extends WorkerResponse[\"type\"]>(\n worker: Worker,\n expectedType: TType,\n ): Promise<WorkerResponse & { type: TType }> {\n for await (const [event] of on(worker, \"message\")) {\n const eventData = event as WorkerResponse\n\n if (eventData.type === \"error\") {\n throw new Error(`Worker error: ${eventData.error}`)\n }\n\n if (eventData.type !== expectedType) {\n throw new Error(\n `Unexpected response message type \"${eventData.type}\", expected \"${expectedType}\"`,\n )\n }\n\n return eventData as WorkerResponse & { type: TType }\n }\n\n throw new Error(\"Worker ended without sending any response\")\n }\n\n private async getLibrary(): Promise<[LibraryModel, Worker]> {\n if (this.library && this.worker) {\n return [this.library, this.worker]\n }\n\n return await this.reloadLibrary()\n }\n\n private async reloadLibrary(): Promise<[LibraryModel, Worker]> {\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 this.worker = this.createLibraryWorker({\n modulePaths: this.libraryPackages,\n logLevel: \"warn\",\n })\n\n for await (const [event] of on(this.worker, \"message\")) {\n const eventData = event as {\n type: string\n library: LibraryModel\n error?: string\n }\n\n if (eventData.type === \"error\") {\n throw new Error(`Worker error: ${eventData.error}`)\n }\n\n if (eventData.type !== \"library\") {\n throw new Error(`Unexpected message type '${eventData.type}', expected 'library'`)\n }\n\n const updates = diffLibraries(\n this.library ?? { components: {}, entities: {} },\n eventData.library,\n )\n\n this.eventEmitter.emit(\"library\", updates)\n this.library = eventData.library\n\n this.logger.info(\"library reloaded\")\n\n this.eventEmitter.emit(\"library\", [{ type: \"reload-completed\" }])\n\n return [this.library, this.worker]\n }\n\n throw new Error(\"Worker ended without sending library model\")\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.debug(`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 async rebuildLibraryPackage(\n libraryPackage: LibraryPackage,\n installDeps = false,\n updateDeps = false,\n rebuiltPackages = new Set<string>(),\n ): Promise<void> {\n if (rebuiltPackages.has(libraryPackage.name)) {\n return\n }\n\n rebuiltPackages.add(libraryPackage.name)\n\n if (installDeps) {\n this.logger.info(`installing dependencies for package \"${libraryPackage.name}\"`)\n await installDependencies({ cwd: libraryPackage.rootPath })\n }\n\n if (updateDeps) {\n await this.updateLibraryPackageDependencies(libraryPackage)\n }\n\n this.logger.info(`rebuilding library package \"${libraryPackage.name}\" via build script`)\n await runScript(\"build\", { cwd: libraryPackage.rootPath })\n\n if (this.libraryPackages.includes(libraryPackage.name)) {\n await this.reloadLibrary()\n } else {\n await this.reloadUnitManifest(libraryPackage)\n }\n\n await this.rebuildLibraryPackageDependents(libraryPackage, rebuiltPackages)\n }\n\n private async updateLibraryPackageDependencies(libraryPackage: LibraryPackage): Promise<void> {\n const packageJson = await readPackageJSON(libraryPackage.rootPath)\n const parsedName = LocalLibraryBackend.parseDependencyName(libraryPackage.name)\n\n const dependencyPackageNames = pipe(\n [packageJson.dependencies, packageJson.devDependencies, packageJson.peerDependencies],\n flatMap(deps => Object.keys(deps ?? {})),\n unique(),\n map(LocalLibraryBackend.parseDependencyName),\n )\n\n const sameScopeDependencies = dependencyPackageNames.filter(\n dep => dep.scope === parsedName.scope && dep.name !== parsedName.name,\n )\n\n await this.ensureLibraryPackagesLoaded(sameScopeDependencies.map(dep => dep.name))\n\n for (const dependency of sameScopeDependencies) {\n const dependencyPackage = this.packages.get(dependency.name)\n if (!dependencyPackage) {\n this.logger.warn(`dependency package not found for graph update: \"%s\"`, dependency.name)\n continue\n }\n\n libraryPackage.dependencies.add(dependency.name)\n dependencyPackage.dependents.add(libraryPackage.name)\n }\n }\n\n private async rebuildLibraryPackageDependents(\n libraryPackage: LibraryPackage,\n rebuiltPackages = new Set<string>(),\n ): Promise<void> {\n const promises: Promise<void>[] = []\n\n for (const dependent of libraryPackage.dependents) {\n const dependentPackage = this.packages.get(dependent)\n if (!dependentPackage) {\n this.logger.warn(`dependent package not found for rebuild: \"%s\"`, dependent)\n continue\n }\n\n promises.push(this.rebuildLibraryPackage(dependentPackage, false, false, rebuiltPackages))\n }\n\n await Promise.all(promises)\n }\n\n private static parseDependencyName(this: void, dependency: string) {\n if (dependency.startsWith(\"@\")) {\n const parts = dependency.split(\"/\")\n\n return {\n name: dependency,\n scope: parts[0],\n }\n }\n\n return {\n name: dependency,\n scope: null,\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 loadLibraryPackages(names: string[], installIfNotFound = false): Promise<void> {\n this.logger.info(\"loading library packages: %s\", names.join(\", \"))\n\n const missingPackages: string[] = []\n const packagesToUpdate: LibraryPackage[] = []\n\n const worker = this.createPackageResolutionWorker({ packageNames: names })\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: LibraryPackage = {\n name: result.packageName,\n rootPath: result.packageRootPath,\n dependencies: new Set(),\n dependents: new Set(),\n }\n\n this.packages.set(result.packageName, libraryPackage)\n packagesToUpdate.push(libraryPackage)\n\n this.logger.info(`loaded library package: \"%s\"`, result.packageName)\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 for (const libraryPackage of packagesToUpdate) {\n await this.updateLibraryPackageDependencies(libraryPackage)\n\n if (!this.libraryPackages.includes(libraryPackage.name)) {\n await this.reloadUnitManifest(libraryPackage)\n }\n }\n\n if (installIfNotFound && missingPackages.length > 0) {\n this.logger.info(\"installing missing library packages: %s\", missingPackages.join(\", \"))\n await addDependency(missingPackages)\n await this.loadLibraryPackages(missingPackages)\n }\n }\n\n private async handleFileEvent(path: string): Promise<void> {\n await this.lock.acquire(async () => {\n const libraryPackage = this.packages.values().find(pkg => path.startsWith(pkg.rootPath))\n\n if (libraryPackage) {\n await this.rebuildLibraryPackage(libraryPackage)\n }\n })\n }\n\n private createLibraryWorker(workerData: Record<string, unknown>) {\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 let watchPaths = config.HIGHSTATE_BACKEND_LIBRARY_LOCAL_WATCH_PATHS\n if (!watchPaths) {\n const [projectPath] = await resolveMainLocalProject()\n watchPaths = [resolve(projectPath, \"packages\")]\n }\n\n return new LocalLibraryBackend(\n config.HIGHSTATE_BACKEND_LIBRARY_LOCAL_PACKAGES,\n watchPaths,\n logger.child({ backend: \"LibraryBackend\", service: \"LocalLibraryBackend\" }),\n )\n }\n}\n","import { z } from \"zod\"\nimport { libraryBackendConfig } from \"./library\"\nimport { projectBackendConfig } from \"./project\"\nimport { secretBackendConfig } from \"./secret\"\nimport { terminalBackendConfig } from \"./terminal\"\nimport { runnerBackendConfig } from \"./runner\"\nimport { stateBackendConfig } from \"./state\"\nimport { workspaceBackendConfig } from \"./workspace\"\n\nconst loggerConfig = z.object({\n HIGHSTATE_BACKEND_LOGGER_NAME: z.string().default(\"highstate-backend\"),\n\n HIGHSTATE_BACKEND_LOGGER_LEVEL: z\n .enum([\"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"])\n .default(\"info\"),\n})\n\nconst configSchema = z.object({\n ...libraryBackendConfig.shape,\n ...projectBackendConfig.shape,\n ...secretBackendConfig.shape,\n ...stateBackendConfig.shape,\n ...runnerBackendConfig.shape,\n ...terminalBackendConfig.shape,\n ...workspaceBackendConfig.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 return configSchema.parse(env)\n}\n","import { z } from \"zod\"\nimport { localProjectBackendConfig, LocalProjectBackend } from \"./local\"\n\nexport const projectBackendConfig = z.object({\n HIGHSTATE_BACKEND_PROJECT_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localProjectBackendConfig.shape,\n})\n\nexport function createProjectBackend(config: z.infer<typeof projectBackendConfig>) {\n return LocalProjectBackend.create(config)\n}\n","import type { ProjectBackend, ProjectModel } from \"./abstractions\"\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\"\nimport { resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport {\n getInstanceId,\n type HubInput,\n type InstanceInput,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { stringify, parse } from \"yaml\"\nimport {\n type HubModel,\n type HubModelPatch,\n hubModelSchema,\n type InstanceModelPatch,\n instanceModelSchema,\n} from \"../shared\"\nimport { resolveMainLocalProject } from \"../common\"\n\nexport const localProjectBackendConfig = z.object({\n HIGHSTATE_BACKEND_PROJECT_PROJECTS_DIR: z.string().optional(),\n})\n\nconst projectModelSchema = z.object({\n instances: z.record(instanceModelSchema),\n hubs: z.record(hubModelSchema),\n})\n\n/**\n * A project backend that stores the projects locally on disk.\n *\n * By default, the projects are stored in the `projects` directory near the \"package.json\" file.\n */\nexport class LocalProjectBackend implements ProjectBackend {\n constructor(private readonly projectsDir: string) {}\n\n async getProjectIds(): Promise<string[]> {\n try {\n const files = await readdir(this.projectsDir)\n\n return files.filter(file => file.endsWith(\".yaml\")).map(file => file.replace(/\\.yaml$/, \"\"))\n } catch (error) {\n throw new Error(\"Failed to get project names\", { cause: error })\n }\n }\n\n async getProject(projectId: string): Promise<ProjectModel> {\n try {\n const project = await this.loadProject(projectId)\n\n return {\n instances: Object.values(project.instances),\n hubs: Object.values(project.hubs),\n }\n } catch (error) {\n throw new Error(\"Failed to get project instances\", { cause: error })\n }\n }\n\n async createProject(projectId: string): Promise<void> {\n try {\n await this.withProject(projectId, () => {\n // Create an empty project\n return { instances: {}, hubs: {} }\n })\n } catch (error) {\n throw new Error(\"Failed to create project\", { cause: error })\n }\n }\n\n async createInstance(projectId: string, instance: InstanceModel): Promise<InstanceModel> {\n try {\n return await this.withProject(projectId, project => {\n if (project.instances[instance.id]) {\n throw new Error(`Instance ${instance.id} already exists`)\n }\n\n project.instances[instance.id] = instance\n return instance\n })\n } catch (error) {\n throw new Error(\"Failed to create project instance\", { cause: error })\n }\n }\n\n async updateInstance(\n projectId: string,\n instanceId: string,\n patch: InstanceModelPatch,\n ): Promise<InstanceModel> {\n try {\n return await this.withInstance(projectId, instanceId, instance => {\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 return instance\n })\n } catch (error) {\n throw new Error(\"Failed to update project instance\", { cause: error })\n }\n }\n\n async deleteInstance(projectId: string, instanceId: string): Promise<void> {\n try {\n await this.withProject(projectId, project => {\n if (!project.instances[instanceId]) {\n throw new Error(`Instance ${instanceId} not found`)\n }\n\n delete project.instances[instanceId]\n\n // Delete all inputs of instances that reference deleted instance\n for (const otherInstance of Object.values(project.instances)) {\n if (!otherInstance.inputs) {\n continue\n }\n\n this.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 Object.values(project.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 } catch (error) {\n throw new Error(\"Failed to delete project instance\", { cause: error })\n }\n }\n\n private 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 async renameInstance(\n projectId: string,\n instanceId: string,\n newName: string,\n ): Promise<InstanceModel> {\n try {\n return await this.withProject(projectId, project => {\n // Rename the instance\n const instance = project.instances[instanceId]\n if (!instance) {\n throw new Error(`Instance ${instanceId} not found`)\n }\n\n const newInstanceId = getInstanceId(instance.type, newName)\n if (project.instances[newInstanceId]) {\n throw new Error(`Instance ${newInstanceId} already exists`)\n }\n\n delete project.instances[instanceId]\n instance.id = newInstanceId\n instance.name = newName\n project.instances[newInstanceId] = instance\n\n // Update all references to the instance from other instances\n for (const otherInstance of Object.values(project.instances)) {\n for (const inputs of Object.values(otherInstance.inputs ?? {})) {\n this.renameInstanceReferences(inputs, instanceId, instance.id)\n }\n }\n\n // Update all references to the instance from hubs\n for (const hub of Object.values(project.hubs)) {\n this.renameInstanceReferences(hub.inputs ?? [], instanceId, instance.id)\n }\n\n return instance\n })\n } catch (error) {\n throw new Error(\"Failed to rename project instance\", { cause: error })\n }\n }\n\n private renameInstanceReferences(\n inputs: InstanceInput[],\n instanceId: string,\n newInstanceId: string,\n ): void {\n for (const input of inputs) {\n if (input.instanceId === instanceId) {\n input.instanceId = newInstanceId\n }\n }\n }\n\n async createHub(projectId: string, hub: HubModel): Promise<HubModel> {\n try {\n return await this.withProject(projectId, project => {\n if (project.hubs[hub.id]) {\n throw new Error(`Hub ${hub.id} already exists`)\n }\n\n project.hubs[hub.id] = hub\n return hub\n })\n } catch (error) {\n throw new Error(\"Failed to create project hub\", { cause: error })\n }\n }\n\n async updateHub(projectId: string, hubId: string, patch: HubModelPatch): Promise<HubModel> {\n try {\n return await this.withProject(projectId, project => {\n const hub = project.hubs[hubId]\n if (!hub) {\n throw new Error(`Hub ${hubId} not found`)\n }\n\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 return hub\n })\n } catch (error) {\n throw new Error(\"Failed to update project hub\", { cause: error })\n }\n }\n\n async deleteHub(projectId: string, hubId: string): Promise<void> {\n try {\n await this.withProject(projectId, project => {\n if (!project.hubs[hubId]) {\n throw new Error(`Hub ${hubId} not found`)\n }\n\n delete project.hubs[hubId]\n\n // Delete all inputs of instances that reference deleted hub\n for (const instance of Object.values(project.instances)) {\n if (instance.hubInputs) {\n this.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(\n input => input.hubId !== hubId,\n )\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 Object.values(project.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 } catch (error) {\n throw new Error(\"Failed to delete project hub\", { cause: error })\n }\n }\n\n private 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 private getProjectPath(projectId: string) {\n return `${this.projectsDir}/${projectId}.yaml`\n }\n\n private async loadProject(projectId: string) {\n const projectPath = this.getProjectPath(projectId)\n\n try {\n const content = await readFile(projectPath, \"utf-8\")\n\n return projectModelSchema.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(projectId: string, project: z.infer<typeof projectModelSchema>) {\n const projectPath = this.getProjectPath(projectId)\n const content = stringify(project, undefined, 2)\n\n await writeFile(projectPath, content)\n }\n\n private async withInstance<T>(\n projectId: string,\n instanceId: string,\n callback: (instance: InstanceModel) => T,\n ): Promise<T> {\n return await this.withProject(projectId, project => {\n const instance = project.instances[instanceId]\n if (!instance) {\n throw new Error(`Instance ${instanceId} not found`)\n }\n\n return callback(instance)\n })\n }\n\n private async withProject<T>(\n projectId: string,\n callback: (project: z.infer<typeof projectModelSchema>) => T,\n ): Promise<T> {\n const project = await this.loadProject(projectId)\n\n const result = callback(project)\n await this.writeProject(projectId, project)\n\n return result\n }\n\n public static async create(config: z.infer<typeof localProjectBackendConfig>) {\n let projectsPath = config.HIGHSTATE_BACKEND_PROJECT_PROJECTS_DIR\n if (!projectsPath) {\n const [mainProjectPath] = await resolveMainLocalProject()\n projectsPath = resolve(mainProjectPath, \"projects\")\n }\n\n await mkdir(projectsPath, { recursive: true })\n\n return new LocalProjectBackend(projectsPath)\n }\n}\n","import type { BetterLock as BetterLockType } from \"better-lock/dist/better_lock\"\nimport { BetterLock } from \"better-lock\"\n\nexport class ProjectLock {\n constructor(private readonly lock: BetterLockType, private readonly projectId: string) {}\n\n canImmediatelyAcquireLock(instanceId: string): boolean {\n return this.lock.canAcquire(`${this.projectId}/${instanceId}`)\n }\n\n canImmediatelyAcquireLocks(instanceIds: string[]): boolean {\n for (const instanceId of instanceIds) {\n if (!this.canImmediatelyAcquireLock(instanceId)) {\n return false\n }\n }\n\n return true\n }\n\n lockInstance<T>(instanceId: string, fn: () => Promise<T>): Promise<T> {\n return this.lock.acquire(`${this.projectId}/${instanceId}`, fn)\n }\n\n lockInstances<T>(instanceIds: string[], fn: () => Promise<T>): Promise<T> {\n return this.lock.acquire(\n instanceIds.map(id => `${this.projectId}/${id}`),\n fn,\n )\n }\n}\n\nexport class ProjectLockManager {\n private readonly lock = new BetterLock()\n\n getLock(projectId: string) {\n return new ProjectLock(this.lock, projectId)\n }\n}\n","import type { StateBackend, StateManager } from \"../state\"\nimport type { ProjectBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport type { LibraryBackend } from \"../library\"\nimport type { ProjectLockManager } from \"./lock\"\nimport { EventEmitter, on } from \"node:events\"\nimport { isUnitModel, type InstanceModel } from \"@highstate/contract\"\nimport {\n type InputResolverNode,\n type InputHashNode,\n type InstanceModelPatch,\n type LibraryUpdate,\n createInstanceState,\n type CompositeInstance,\n type ResolvedInstanceInput,\n type HubModel,\n InputResolver,\n InputHashResolver,\n} from \"../shared\"\n\ntype CompositeInstanceEvent =\n | {\n type: \"evaluation-started\"\n instanceId: string\n }\n | {\n type: \"updated\"\n instance: CompositeInstance\n }\n | {\n type: \"deleted\"\n instanceId: string\n }\n | {\n type: \"failed\"\n instanceId: string\n }\n\ntype CompositeInstanceEvents = {\n [K in string]: [CompositeInstanceEvent]\n}\n\nexport type FullProjectModel = {\n instances: InstanceModel[]\n hubs: HubModel[]\n compositeInstances: CompositeInstance[]\n}\n\nexport class ProjectManager {\n private constructor(\n private readonly projectBackend: ProjectBackend,\n private readonly stateBackend: StateBackend,\n private readonly libraryBackend: LibraryBackend,\n private readonly projectLockManager: ProjectLockManager,\n private readonly stateManager: StateManager,\n private readonly logger: Logger,\n ) {\n void this.watchLibraryChanges()\n }\n\n private readonly compositeInstanceEE = new EventEmitter<CompositeInstanceEvents>()\n\n async *watchCompositeInstances(\n projectId: string,\n signal?: AbortSignal,\n ): AsyncIterable<CompositeInstanceEvent> {\n for await (const [children] of on(this.compositeInstanceEE, projectId, {\n signal,\n })) {\n yield children\n }\n }\n\n /**\n * Loads the full info of a project, including instances, hubs, and composite instances.\n *\n * Also filters out instances that are not in the library.\n *\n * @param projectId The ID of the project to load.\n */\n async getProject(projectId: string): Promise<FullProjectModel> {\n const [{ instances, hubs }, compositeInstances, library] = await Promise.all([\n this.projectBackend.getProject(projectId),\n this.stateBackend.getCompositeInstances(projectId),\n this.libraryBackend.loadLibrary(),\n ])\n\n const filteredInstances = instances.filter(instance => instance.type in library.components)\n const filteredCompositeInstances = compositeInstances\n .filter(instance => instance.instance.type in library.components)\n .map(instance => ({\n ...instance,\n children: instance.children.filter(child => child.type in library.components),\n }))\n\n return {\n instances: filteredInstances,\n hubs,\n compositeInstances: filteredCompositeInstances,\n }\n }\n\n async createInstance(projectId: string, instance: InstanceModel): Promise<InstanceModel> {\n const createdInstance = await this.projectBackend.createInstance(projectId, instance)\n await this.evaluateChangedCompositeInstances(projectId)\n\n return createdInstance\n }\n\n async updateInstance(\n projectId: string,\n instanceId: string,\n patch: InstanceModelPatch,\n ): Promise<InstanceModel> {\n const instance = await this.projectBackend.updateInstance(projectId, instanceId, patch)\n await this.evaluateChangedCompositeInstances(projectId)\n\n return instance\n }\n\n async renameInstance(\n projectId: string,\n instanceId: string,\n newName: string,\n ): Promise<InstanceModel> {\n const instance = await this.projectBackend.renameInstance(projectId, instanceId, newName)\n await this.evaluateChangedCompositeInstances(projectId)\n\n return instance\n }\n\n async deleteInstance(projectId: string, instanceId: string): Promise<void> {\n await Promise.all([\n this.projectBackend.deleteInstance(projectId, instanceId),\n this.stateBackend.clearCompositeInstances(projectId, [instanceId]),\n ])\n }\n\n private async evaluateChangedCompositeInstances(projectId: string): Promise<void> {\n const { inputHashResolver, instances, library, evaluatedInputHashes } =\n await this.prepareResolvers(projectId)\n\n inputHashResolver.addAllNodesToWorkset()\n await inputHashResolver.process()\n\n const instanceIds = instances\n .filter(instance => !isUnitModel(library.components[instance.type]))\n .filter(\n instance =>\n evaluatedInputHashes[instance.id] !==\n inputHashResolver.requireOutput(instance.id).inputHash,\n )\n .map(instance => instance.id)\n\n await this.projectLockManager.getLock(projectId).lockInstances(instanceIds, async () => {\n this.logger.debug({ instanceIds }, \"evaluating composite instances\")\n\n for (const instanceId of instanceIds) {\n this.compositeInstanceEE.emit(projectId, { type: \"evaluation-started\", instanceId })\n }\n\n const [\n { instances, resolvedInputs, stateMap, inputHashResolver },\n topLevelCompositeChildrenIds,\n ] = await Promise.all([\n this.prepareResolvers(projectId),\n this.stateBackend.getTopLevelCompositeChildrenIds(projectId, instanceIds),\n ])\n\n const results = await this.libraryBackend.evaluateCompositeInstances(\n instances,\n resolvedInputs,\n instanceIds,\n )\n\n const newStates = results.map(result => {\n const existingState = stateMap.get(result.instanceId)\n const newState = existingState ?? createInstanceState(result.instanceId)\n\n newState.evaluationError = result.success ? null : result.error\n\n return newState\n })\n\n inputHashResolver.addAllNodesToWorkset()\n await inputHashResolver.process()\n\n const compositeInstances = results\n .filter(result => result.success)\n .flatMap(result =>\n result.compositeInstances.map(instance => ({\n ...instance,\n inputHash:\n // only store inputHash for top-level composite instances\n instance.instance.id === result.instanceId\n ? inputHashResolver.requireOutput(instance.instance.id).inputHash\n : \"\",\n })),\n )\n\n const newTopLevelCompositeChildrenIds = Object.fromEntries(\n results\n .filter(result => result.success)\n .map(result => [\n result.instanceId,\n result.compositeInstances\n .filter(instance => instance.instance.id !== result.instanceId)\n .map(instance => instance.instance.id),\n ]),\n )\n\n const deletedCompositeInstanceIds = new Set(\n Object.values(topLevelCompositeChildrenIds).flat(),\n )\n\n for (const childInstanceId of Object.values(newTopLevelCompositeChildrenIds).flat()) {\n deletedCompositeInstanceIds.delete(childInstanceId)\n }\n\n await Promise.all([\n this.stateBackend.clearCompositeInstances(\n projectId,\n Array.from(deletedCompositeInstanceIds),\n ),\n this.stateBackend.putTopLevelCompositeChildrenIds(\n projectId,\n newTopLevelCompositeChildrenIds,\n ),\n ])\n\n for (const state of newStates) {\n this.stateManager.emitStatePatch(projectId, state)\n\n if (state.evaluationError) {\n this.logger.error(\n { projectId, instanceId: state.id, error: state.evaluationError },\n \"instance evaluation failed\",\n )\n\n this.compositeInstanceEE.emit(projectId, {\n type: \"failed\",\n instanceId: state.id,\n })\n }\n }\n\n for (const instance of compositeInstances) {\n this.compositeInstanceEE.emit(projectId, { type: \"updated\", instance })\n }\n\n for (const instanceId of deletedCompositeInstanceIds) {\n this.compositeInstanceEE.emit(projectId, { type: \"deleted\", instanceId })\n }\n\n const promises: Promise<void>[] = []\n\n if (newStates.length > 0) {\n promises.push(this.stateBackend.putInstanceStates(projectId, newStates))\n }\n\n if (compositeInstances.length > 0) {\n promises.push(this.stateBackend.putCompositeInstances(projectId, compositeInstances))\n }\n\n this.logger.info(\n { projectId },\n \"instance evaluation completed, %d instances persisted\",\n compositeInstances.length,\n )\n\n this.logger.debug(\n { compositeInstanceIds: compositeInstances.map(instance => instance.instance.id) },\n \"persisted composite instances\",\n )\n\n await Promise.all(promises)\n })\n }\n\n private async prepareResolvers(projectId: string) {\n const [{ instances, hubs }, states, library, evaluatedInputHashes] = await Promise.all([\n this.projectBackend.getProject(projectId),\n this.stateBackend.getAllInstanceStates(projectId),\n this.libraryBackend.loadLibrary(),\n this.stateBackend.getCompositeInstanceInputHashes(projectId),\n ])\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 inputHashInputs = new Map<string, InputHashNode>()\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 let sourceHash: string | undefined\n if (isUnitModel(library.components[instance.type])) {\n const resolvedUnits = await this.libraryBackend.getResolvedUnitSources([instance.type])\n const resolvedUnit = resolvedUnits.find(unit => unit.unitType === instance.type)\n\n if (resolvedUnit) {\n sourceHash = resolvedUnit.sourceHash\n } else {\n this.logger.warn(`resolved unit source not found for type \"%s\"`, instance.type)\n sourceHash = undefined\n }\n }\n\n inputHashInputs.set(instance.id, {\n instance,\n component: library.components[instance.type],\n resolvedInputs: output.resolvedInputs,\n state: stateMap.get(instance.id),\n sourceHash,\n })\n\n resolvedInputs[instance.id] = output.resolvedInputs\n }\n\n const inputHashResolver = new InputHashResolver(inputHashInputs, this.logger)\n\n return {\n inputHashInputs,\n inputHashResolver,\n library,\n instances: filteredInstances,\n stateMap,\n resolvedInputs,\n evaluatedInputHashes,\n }\n }\n\n private async watchLibraryChanges(): Promise<void> {\n for await (const updates of this.libraryBackend.watchLibrary()) {\n try {\n await this.handleLibraryUpdates(updates)\n } catch (error) {\n this.logger.error({ error }, \"failed to handle library updates\")\n }\n }\n }\n\n private async handleLibraryUpdates(updates: LibraryUpdate[]): Promise<void> {\n const changedComponents = new Set<string>()\n const library = await this.libraryBackend.loadLibrary()\n\n // TODO: handle entity updates\n\n for (const update of updates) {\n switch (update.type) {\n case \"component-updated\":\n changedComponents.add(update.component.type)\n break\n case \"component-removed\":\n changedComponents.add(update.componentType)\n break\n }\n }\n\n if (changedComponents.size === 0) {\n return\n }\n\n this.logger.info(\n { changedComponents },\n \"library components changed, updating composite instances\",\n )\n\n const projects = await this.projectBackend.getProjectIds()\n for (const projectId of projects) {\n const { instances } = await this.prepareResolvers(projectId)\n\n const filteredInstances = instances.filter(\n instance =>\n changedComponents.has(instance.type) &&\n library.components[instance.type] &&\n !isUnitModel(library.components[instance.type]),\n )\n\n this.logger.info(\n { projectId, filteredInstanceIds: filteredInstances.map(instance => instance.id) },\n \"updating composite instances for project\",\n )\n\n try {\n await this.evaluateChangedCompositeInstances(projectId)\n } catch (error) {\n this.logger.error({ error }, \"failed to evaluate composite instances\")\n }\n }\n }\n\n static create(\n projectBackend: ProjectBackend,\n stateBackend: StateBackend,\n libraryBackend: LibraryBackend,\n projectLockManager: ProjectLockManager,\n stateManager: StateManager,\n logger: Logger,\n ): ProjectManager {\n return new ProjectManager(\n projectBackend,\n stateBackend,\n libraryBackend,\n projectLockManager,\n stateManager,\n logger.child({ service: \"ProjectManager\" }),\n )\n }\n}\n","import type { Logger } from \"pino\"\nimport type { TerminalBackend } from \"./shared\"\nimport { z } from \"zod\"\nimport { DockerTerminalBackend, dockerTerminalBackendConfig } from \"./docker\"\n\nexport const terminalBackendConfig = z.object({\n HIGHSTATE_BACKEND_TERMINAL_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_BACKEND_TERMINAL_TYPE) {\n case \"docker\": {\n return DockerTerminalBackend.create(config, logger)\n }\n }\n}\n","import type { TerminalRunOptions, TerminalBackend } from \"./shared\"\nimport type { Logger } from \"pino\"\nimport { Readable } from \"node:stream\"\nimport { tmpdir } from \"node:os\"\nimport { resolve } from \"node:path\"\nimport { mkdir, writeFile } from \"node:fs/promises\"\nimport { z } from \"zod\"\nimport spawn from \"nano-spawn\"\nimport { runScript } from \"./run.sh\"\n\nexport const dockerTerminalBackendConfig = z.object({\n HIGHSTATE_BACKEND_TERMINAL_DOCKER_BINARY: z.string().default(\"docker\"),\n HIGHSTATE_BACKEND_TERMINAL_DOCKER_USE_SUDO: z.coerce.boolean().default(false),\n HIGHSTATE_BACKEND_TERMINAL_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({ factory, 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 factory.image,\n \"/bin/bash\",\n \"/run.sh\",\n ]\n\n const initData = {\n command: factory.command,\n cwd: factory.cwd,\n env: {\n ...factory.env,\n TERM: \"xterm-256color\",\n },\n files: factory.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 this.logger.info({ pid: 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_BACKEND_TERMINAL_DOCKER_BINARY,\n config.HIGHSTATE_BACKEND_TERMINAL_DOCKER_USE_SUDO,\n config.HIGHSTATE_BACKEND_TERMINAL_DOCKER_HOST,\n logger.child({ backend: \"TerminalBackend\", service: \"DockerTerminalBackend\" }),\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 isBinary=$(jq -r \".files[\\\\\"$key\\\\\"].isBinary // false\" <<<\"$data\")\n content=$(jq -r \".files[\\\\\"$key\\\\\"].content\" <<<\"$data\")\n mode=$(jq -r \".files[\\\\\"$key\\\\\"].mode // 0\" <<<\"$data\")\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\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 { ScreenSize, TerminalBackend } from \"./shared\"\nimport type { Logger } from \"pino\"\nimport type { StateBackend, TerminalHistoryEntry } from \"../state\"\nimport type { RunnerBackend } from \"../runner\"\nimport { PassThrough, type Stream, type Writable } from \"node:stream\"\nimport { EventEmitter, on } from \"node:events\"\nimport { parseInstanceId } from \"@highstate/contract\"\nimport { nanoid } from \"nanoid\"\nimport { type InstanceTerminal, type TerminalSession, createAsyncBatcher } from \"../shared\"\nimport { isAbortErrorLike } from \"../common\"\n\ntype ManagedTerminal = {\n readonly session: TerminalSession\n readonly abortController: AbortController\n readonly stdin: PassThrough\n readonly stdout: PassThrough\n\n refCount: number\n started: boolean\n start(screenSize: ScreenSize): void\n}\n\ntype TerminalEvents = {\n [sessionId: string]: [terminal: TerminalSession]\n}\n\nconst notAttachedTerminalLifetime = 5 * 60 * 1000 // 5 minutes\n\nexport class TerminalManager {\n private readonly managedTerminals = new Map<string, ManagedTerminal>()\n private readonly existingSessions = new Map<string, TerminalSession>()\n private readonly terminalEE = new EventEmitter<TerminalEvents>()\n\n private constructor(\n private readonly terminalBackend: TerminalBackend,\n private readonly stateBackend: StateBackend,\n private readonly runnerBackend: RunnerBackend,\n private readonly logger: Logger,\n ) {\n void this.markFinishedSessions()\n }\n\n public isSessionActive(sessionId: string): boolean {\n return this.managedTerminals.has(sessionId)\n }\n\n public async *watchSession(\n projectId: string,\n instanceId: string,\n sessionId: string,\n signal?: AbortSignal,\n ): AsyncIterable<TerminalSession> {\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 session = await this.stateBackend.getTerminalSession(projectId, instanceId, sessionId)\n\n if (!session) {\n throw new Error(`Terminal session \"${sessionId}\" not found`)\n }\n\n yield session\n return\n }\n\n yield managedTerminal.session\n\n for await (const [terminalSession] of on(this.terminalEE, sessionId, {\n signal,\n }) as AsyncIterable<[TerminalSession]>) {\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 instanceId: string,\n terminalName: string,\n ): Promise<TerminalSession> {\n const [instanceType, instanceName] = parseInstanceId(instanceId)\n\n const factory = await this.runnerBackend.getTerminalFactory(\n { projectId, instanceType, instanceName },\n terminalName,\n )\n\n if (!factory) {\n throw new Error(\n `Terminal factory for instance \"${instanceId}\" with name \"${terminalName}\" not found`,\n )\n }\n\n const terminalSession: TerminalSession = {\n id: nanoid(),\n projectId,\n instanceId,\n terminalName,\n terminalTitle: factory.title,\n createdAt: new Date(),\n }\n\n await this.stateBackend.putTerminalSession(projectId, instanceId, terminalSession)\n this.logger.info({ msg: \"terminal session created\", id: terminalSession.id })\n\n this.createManagedTerminal(factory, terminalSession)\n\n return terminalSession\n }\n\n public async getOrCreateSession(\n projectId: string,\n instanceId: string,\n terminalName: string,\n ): Promise<TerminalSession> {\n const existingSession = this.existingSessions.get(`${projectId}:${instanceId}.${terminalName}`)\n\n if (existingSession) {\n return existingSession\n }\n\n return await this.createSession(projectId, instanceId, terminalName)\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 async updateActiveTerminalSessions(): Promise<void> {\n await this.stateBackend.putActiveTerminalSessions(\n Array.from(this.managedTerminals.values()).map(t => t.session),\n )\n }\n\n private createManagedTerminal(\n factory: InstanceTerminal,\n terminalSession: TerminalSession,\n ): ManagedTerminal {\n const managedTerminal: ManagedTerminal = {\n session: terminalSession,\n abortController: new AbortController(),\n stdin: new PassThrough(),\n stdout: new PassThrough(),\n\n refCount: 0,\n started: false,\n\n start: (screenSize: ScreenSize) => {\n void this.terminalBackend\n .run({\n factory,\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 this.existingSessions.delete(\n `${managedTerminal.session.projectId}:${managedTerminal.session.instanceId}.${managedTerminal.session.terminalName}`,\n )\n\n managedTerminal.session.finishedAt = new Date()\n this.terminalEE.emit(managedTerminal.session.id, managedTerminal.session)\n\n void this.stateBackend.putTerminalSession(\n managedTerminal.session.projectId,\n managedTerminal.session.instanceId,\n managedTerminal.session,\n )\n\n void this.updateActiveTerminalSessions()\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 void this.persistHistory.call([terminalSession.id, entry])\n })\n\n this.managedTerminals.set(managedTerminal.session.id, managedTerminal)\n this.existingSessions.set(\n `${managedTerminal.session.projectId}:${managedTerminal.session.instanceId}.${managedTerminal.session.terminalName}`,\n managedTerminal.session,\n )\n\n void this.updateActiveTerminalSessions()\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 this.existingSessions.delete(\n `${terminal.session.projectId}:${terminal.session.instanceId}.${terminal.session.terminalName}`,\n )\n return\n }\n\n setTimeout(() => this.closeTerminalIfNotAttached(terminal), notAttachedTerminalLifetime)\n }\n\n static create(\n terminalBackend: TerminalBackend,\n stateBackend: StateBackend,\n runnerBackend: RunnerBackend,\n logger: Logger,\n ): TerminalManager {\n return new TerminalManager(\n terminalBackend,\n stateBackend,\n runnerBackend,\n logger.child({ service: \"TerminalManager\" }),\n )\n }\n\n private persistHistory = createAsyncBatcher(async (entries: TerminalHistoryEntry[]) => {\n this.logger.trace({ msg: \"persisting history entries\", count: entries.length })\n\n // TODO: buffer entries and save them as lines\n\n await this.stateBackend.appendTerminalSessionHistory(entries)\n })\n\n private async markFinishedSessions(): Promise<void> {\n const sessions = await this.stateBackend.getActiveTerminalSessions()\n\n for (const session of sessions) {\n await this.stateBackend.putTerminalSession(session.projectId, session.instanceId, {\n ...session,\n finishedAt: new Date(),\n })\n }\n\n await this.updateActiveTerminalSessions()\n }\n}\n","import { webcrypto as crypto } from 'node:crypto'\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nfunction fillPool(bytes) {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.getRandomValues(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.getRandomValues(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nexport function random(bytes) {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nexport function customRandom(alphabet, defaultSize, getRandom) {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport function customAlphabet(alphabet, size = 21) {\n return customRandom(alphabet, size, random)\n}\nexport function nanoid(size = 21) {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += scopedUrlAlphabet[pool[i] & 63]\n }\n return id\n}\n","export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","import type {\n InstancePageBlock,\n InstanceState,\n InstanceStateUpdate,\n InstanceStatus,\n InstanceTerminal,\n} from \"../shared\"\n\nexport type RunnerBaseOptions = {\n /**\n * The HighState project ID.\n */\n projectId: string\n\n /**\n * The type of the instance to run.\n */\n instanceType: string\n\n /**\n * The name of the instance to run.\n */\n instanceName: string\n\n /**\n * The signal to abort the operation.\n */\n signal?: AbortSignal\n}\n\nexport type InstanceUpdateOptions = RunnerBaseOptions & {\n /**\n * The configuration of the stack.\n */\n config: Record<string, string>\n\n /**\n * The values of the secrets.\n */\n secrets: Record<string, string>\n\n /**\n * Whether to refresh the state before updating.\n */\n refresh?: boolean\n}\n\nexport type InstanceDestroyOptions = RunnerBaseOptions & {\n /**\n * Whether to refresh the state before updating.\n */\n refresh?: boolean\n\n /**\n * Whether to delete the unreachable resources (e.g. k8s resources in unreachable clusters).\n */\n deleteUnreachable?: boolean\n\n /**\n * Delete the stack state even if the destroy operation fails.\n */\n forceDeleteState?: boolean\n}\n\nexport type InstanceWatchOptions = RunnerBaseOptions & {\n /**\n * The final statuses to watch.\n * If the instance reaches one of these statuses, it should return the current state and exit.\n */\n finalStatuses?: InstanceStatus[]\n}\n\nexport class InvalidInstanceStatusError extends Error {\n constructor(\n public readonly currentStatus: InstanceStatus,\n public readonly expectedStatuses: InstanceStatus[],\n ) {\n const expectedString = expectedStatuses.join(\", \")\n super(`The current state is \"${currentStatus}\", but it should be one of \"${expectedString}\".`)\n }\n}\n\nexport interface RunnerBackend {\n /**\n * Watches the instance state.\n *\n * Returns the async iterable of the instance state patches.\n * The fields with `undefined` values should be ignored, and the fields with `null` values should be removed.\n */\n watch(options: InstanceWatchOptions): AsyncIterable<InstanceStateUpdate>\n\n /**\n * Gets the actual state of the instance.\n */\n getState(options: RunnerBaseOptions): Promise<InstanceState>\n\n /**\n * Gets the content of the page.\n */\n getPageContent(options: RunnerBaseOptions, pageName: string): Promise<InstancePageBlock[] | null>\n\n /**\n * Gets the content of the file.\n */\n getFileContent(options: RunnerBaseOptions, fileName: string): Promise<string | null>\n\n /**\n * Gets the terminal factory.\n */\n getTerminalFactory(\n options: RunnerBaseOptions,\n terminalName: string,\n ): Promise<InstanceTerminal | null>\n\n /**\n * Updates the instance.\n *\n * The operation must only be aborted by the signal, not even when the connection is closed.\n * If the instance is already updating, it should exit immediately.\n * If the instance is running another operation, it should throw an error.\n */\n update(options: InstanceUpdateOptions): Promise<void>\n\n /**\n * Previews the instance update without actually applying the changes.\n *\n * The operation must only be aborted by the signal, not even when the connection is closed.\n * If the instance is already updating, it should exit immediately.\n * If the instance is running another operation, it should throw an error.\n */\n preview(options: InstanceUpdateOptions): Promise<void>\n\n /**\n * Destroys the instance.\n *\n * The operation must only be aborted by the signal, not even when the connection is closed.\n * If the instance is not created, it should exit immediately.\n * If the instance is running another operation, it should throw an error.\n */\n destroy(options: InstanceDestroyOptions): Promise<void>\n\n /**\n * Refreshes the instance.\n *\n * The operation must only be aborted by the signal, not even when the connection is closed.\n * If the instance is not created, it should exit immediately.\n * If the instance is running another operation, it should throw an error.\n * If the instance is not running, it should exit immediately.\n */\n refresh(options: RunnerBaseOptions): Promise<void>\n}\n","import type { RunnerBackend } from \"./abstractions\"\nimport type { LocalPulumiHost } from \"../common\"\nimport type { LibraryBackend } from \"../library\"\nimport { z } from \"zod\"\nimport { LocalRunnerBackend, localRunnerBackendConfig } from \"./local\"\n\nexport const runnerBackendConfig = z.object({\n HIGHSTATE_BACKEND_RUNNER_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localRunnerBackendConfig.shape,\n})\n\nexport function createRunnerBackend(\n config: z.infer<typeof runnerBackendConfig>,\n pulumiProjectHost: LocalPulumiHost,\n libraryBackend: LibraryBackend,\n): RunnerBackend {\n switch (config.HIGHSTATE_BACKEND_RUNNER_TYPE) {\n case \"local\": {\n return LocalRunnerBackend.create(config, pulumiProjectHost, libraryBackend)\n }\n }\n}\n","import type { ConfigMap, Stack } from \"@pulumi/pulumi/automation\"\nimport type { LibraryBackend, ResolvedUnitSource } from \"../library\"\nimport { EventEmitter, on } from \"node:events\"\nimport { resolve } from \"node:path\"\nimport { getInstanceId } from \"@highstate/contract\"\nimport { ensureDependencyInstalled } from \"nypm\"\nimport { mapValues, omit, pick, pickBy } from \"remeda\"\nimport { z } from \"zod\"\nimport { sha256 } from \"crypto-hash\"\nimport { errorToString, LocalPulumiHost, runWithRetryOnError, updateResourceCount } from \"../common\"\nimport {\n createInstanceState,\n instanceFileSchema,\n instancePageSchema,\n instanceStatusFieldSchema,\n instanceTerminalSchema,\n instanceTriggerSchema,\n type InstancePageBlock,\n type InstanceState,\n type InstanceStateUpdate,\n type InstanceStatus,\n type InstanceTerminal,\n} from \"../shared\"\nimport {\n type RunnerBackend,\n type RunnerBaseOptions,\n type InstanceUpdateOptions,\n type InstanceWatchOptions,\n InvalidInstanceStatusError,\n type InstanceDestroyOptions,\n} from \"./abstractions\"\n\ntype Events = {\n [K in `state:${string}`]: [Partial<InstanceState>]\n}\n\nexport const localRunnerBackendConfig = z.object({\n HIGHSTATE_BACKEND_RUNNER_LOCAL_SKIP_STATE_CHECK: z.boolean({ coerce: true }).default(false),\n HIGHSTATE_BACKEND_RUNNER_LOCAL_PRINT_OUTPUT: z.boolean({ coerce: true }).default(true),\n HIGHSTATE_BACKEND_RUNNER_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 skipStateCheck: boolean,\n private readonly printOutput: boolean,\n private readonly cacheDir: string,\n private readonly pulumiProjectHost: LocalPulumiHost,\n private readonly libraryBackend: LibraryBackend,\n ) {}\n\n async *watch(options: InstanceWatchOptions): AsyncIterable<InstanceStateUpdate> {\n const stream = on(\n //\n this.events,\n `state:${LocalRunnerBackend.getInstanceId(options)}`,\n { signal: options.signal },\n ) as AsyncIterable<[InstanceStateUpdate]>\n\n for await (const [statePatch] of stream) {\n yield statePatch\n\n if (statePatch.status && options.finalStatuses?.includes(statePatch.status)) {\n return\n }\n }\n }\n\n getState(options: RunnerBaseOptions): Promise<InstanceState> {\n return this.pulumiProjectHost.runEmpty(\n {\n projectId: options.projectId,\n pulumiProjectName: options.instanceType,\n pulumiStackName: LocalRunnerBackend.getStackName(options),\n },\n async stack => {\n const info = await stack.info()\n const instanceId = getInstanceId(options.instanceType, options.instanceName)\n\n if (!info) {\n return createInstanceState(instanceId)\n }\n\n if (info.result === \"failed\") {\n return createInstanceState(instanceId, \"error\")\n }\n\n if (info.result !== \"succeeded\") {\n return createInstanceState(instanceId, \"unknown\")\n }\n\n const summary = await stack.workspace.stack()\n const resourceCount = summary?.resourceCount\n\n if (!resourceCount) {\n return createInstanceState(instanceId, \"not_created\")\n }\n\n return createInstanceState(instanceId, \"created\", {\n currentResourceCount: resourceCount,\n totalResourceCount: resourceCount,\n })\n },\n )\n }\n\n getTerminalFactory(\n options: RunnerBaseOptions,\n terminalName: string,\n ): Promise<InstanceTerminal | null> {\n return this.pulumiProjectHost.runEmpty(\n {\n projectId: options.projectId,\n pulumiProjectName: options.instanceType,\n pulumiStackName: LocalRunnerBackend.getStackName(options),\n },\n async stack => {\n const outputs = await stack.outputs()\n\n if (!outputs[\"$terminals\"]) {\n return null\n }\n\n const terminals = z.array(instanceTerminalSchema).parse(outputs[\"$terminals\"].value)\n const terminal = terminals.find(t => t.name === terminalName)\n\n if (!terminal) {\n return null\n }\n\n return terminal\n },\n )\n }\n\n getPageContent(\n options: RunnerBaseOptions,\n pageName: string,\n ): Promise<InstancePageBlock[] | null> {\n return this.pulumiProjectHost.runEmpty(\n {\n projectId: options.projectId,\n pulumiProjectName: options.instanceType,\n pulumiStackName: LocalRunnerBackend.getStackName(options),\n },\n async stack => {\n const outputs = await stack.outputs()\n\n if (!outputs[\"$pages\"]) {\n return null\n }\n\n const pages = z.array(instancePageSchema).parse(outputs[\"$pages\"].value)\n const page = pages.find(p => p.name === pageName)\n\n if (!page) {\n return null\n }\n\n return page.content\n },\n )\n }\n\n getFileContent(options: RunnerBaseOptions, fileName: string): Promise<string | null> {\n return this.pulumiProjectHost.runEmpty(\n {\n projectId: options.projectId,\n pulumiProjectName: options.instanceType,\n pulumiStackName: LocalRunnerBackend.getStackName(options),\n },\n async stack => {\n const outputs = await stack.outputs()\n\n if (!outputs[\"$files\"]) {\n return null\n }\n\n const files = z.array(instanceFileSchema).parse(outputs[\"$files\"].value)\n const file = files.find(f => f.meta.name === fileName)\n\n if (!file) {\n return null\n }\n\n return file.content\n },\n )\n }\n\n async update(options: InstanceUpdateOptions): Promise<void> {\n const currentStatus = await this.validateStatus(options, [\n \"not_created\",\n \"updating\",\n \"created\",\n \"error\",\n ])\n\n if (currentStatus === \"updating\") {\n return\n }\n\n const configMap: ConfigMap = {\n ...mapValues(options.config, value => ({ value })),\n ...mapValues(options.secrets, value => ({ value, secret: true })),\n }\n\n void this.updateWorker(options, configMap, false)\n }\n\n async preview(options: InstanceUpdateOptions): Promise<void> {\n const currentStatus = await this.validateStatus(options, [\n \"not_created\",\n \"previewing\",\n \"created\",\n \"error\",\n ])\n\n if (currentStatus === \"previewing\") {\n return\n }\n\n const configMap: ConfigMap = {\n ...mapValues(options.config, value => ({ value })),\n ...mapValues(options.secrets, value => ({ value, secret: true })),\n }\n\n void this.updateWorker(options, configMap, true)\n }\n\n private async updateWorker(\n options: InstanceUpdateOptions,\n configMap: ConfigMap,\n preview: boolean,\n ): Promise<void> {\n const instanceId = LocalRunnerBackend.getInstanceId(options)\n\n try {\n const resolvedSource = await this.getResolvedUnitSource(options.instanceType)\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 HIGHSTATE_CACHE_DIR: this.cacheDir,\n },\n },\n async stack => {\n await this.setStackConfig(stack, configMap)\n\n const summary = await stack.workspace.stack()\n\n let currentResourceCount = 0\n const initialTotalResourceCount = summary?.resourceCount ?? 0\n\n this.updateState({\n id: instanceId,\n status: preview ? \"previewing\" : \"updating\",\n currentResourceCount,\n totalResourceCount: initialTotalResourceCount,\n })\n\n let totalResourceCount = 0\n\n await runWithRetryOnError(\n async () => {\n await stack[preview ? \"preview\" : \"up\"]({\n color: \"always\",\n refresh: options.refresh,\n signal: options.signal,\n diff: preview,\n\n onEvent: event => {\n if (event.resourcePreEvent) {\n totalResourceCount = updateResourceCount(\n event.resourcePreEvent.metadata.op,\n totalResourceCount,\n )\n\n if (totalResourceCount > initialTotalResourceCount) {\n this.updateState({ id: instanceId, totalResourceCount })\n }\n return\n }\n\n if (event.resOutputsEvent) {\n currentResourceCount = updateResourceCount(\n event.resOutputsEvent.metadata.op,\n currentResourceCount,\n )\n\n this.updateState({ id: instanceId, currentResourceCount })\n return\n }\n },\n\n onOutput: message => {\n this.updateState({ id: instanceId, logLine: message })\n\n if (this.printOutput) {\n console.log(message)\n }\n },\n })\n\n const extraOutputs = await this.getExtraOutputsStatePatch(stack)\n\n this.updateState({\n id: instanceId,\n status: \"created\",\n totalResourceCount: currentResourceCount,\n ...extraOutputs,\n })\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.updateState({\n id: instanceId,\n status: \"error\",\n error: errorToString(error),\n })\n }\n }\n\n private async setStackConfig(stack: Stack, configMap: ConfigMap): Promise<void> {\n const currentConfig = await stack.getAllConfig()\n const currentConfigKeys = Object.keys(currentConfig)\n\n await stack.removeAllConfig(currentConfigKeys)\n await stack.setAllConfig(configMap)\n }\n\n async destroy(options: InstanceDestroyOptions): Promise<void> {\n const currentStatus = await this.validateStatus(options, [\n \"not_created\",\n \"destroying\",\n \"created\",\n \"error\",\n ])\n\n if (currentStatus === \"destroying\") {\n return\n }\n\n void this.destroyWorker(options)\n }\n\n private async destroyWorker(options: InstanceDestroyOptions): Promise<void> {\n const instanceId = LocalRunnerBackend.getInstanceId(options)\n\n try {\n const resolvedSource = await this.getResolvedUnitSource(options.instanceType)\n if (!resolvedSource) {\n throw new Error(`Resolved unit source not found for ${options.instanceType}`)\n }\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 },\n },\n async stack => {\n const summary = await stack.workspace.stack()\n let currentResourceCount = summary?.resourceCount ?? 0\n\n this.updateState({\n id: instanceId,\n status: \"destroying\",\n currentResourceCount,\n totalResourceCount: currentResourceCount,\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: options.signal,\n\n onEvent: event => {\n if (event.resOutputsEvent) {\n currentResourceCount = updateResourceCount(\n event.resOutputsEvent.metadata.op,\n currentResourceCount,\n )\n\n this.updateState({ id: instanceId, currentResourceCount })\n return\n }\n },\n\n onOutput: message => {\n this.updateState({ id: instanceId, logLine: message })\n\n if (this.printOutput) {\n console.log(message)\n }\n },\n })\n\n const extraOutputs = await this.getExtraOutputsStatePatch(stack)\n\n this.updateState({\n id: instanceId,\n status: \"not_created\",\n totalResourceCount: currentResourceCount,\n ...extraOutputs,\n })\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\n this.updateState({\n id: instanceId,\n status: \"not_created\",\n totalResourceCount: 0,\n currentResourceCount: 0,\n statusFields: [],\n pages: [],\n files: [],\n terminals: [],\n triggers: [],\n })\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.updateState({\n id: instanceId,\n status: \"not_created\",\n totalResourceCount: 0,\n currentResourceCount: 0,\n statusFields: [],\n pages: [],\n files: [],\n terminals: [],\n triggers: [],\n })\n return\n }\n\n this.updateState({\n id: instanceId,\n status: \"error\",\n error: errorToString(error),\n })\n }\n }\n\n async refresh(options: RunnerBaseOptions): Promise<void> {\n const currentStatus = await this.validateStatus(options, [\n \"not_created\",\n \"created\",\n \"refreshing\",\n \"error\",\n ])\n\n if (currentStatus === \"refreshing\") {\n return\n }\n\n void this.refreshWorker(options)\n }\n\n private async refreshWorker(options: RunnerBaseOptions): Promise<void> {\n const instanceId = 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 const summary = await stack.workspace.stack()\n\n let currentResourceCount = 0\n let totalResourceCount = summary?.resourceCount ?? 0\n\n this.updateState({\n id: instanceId,\n status: \"refreshing\",\n currentResourceCount,\n totalResourceCount,\n })\n\n await runWithRetryOnError(\n async () => {\n await stack.refresh({\n color: \"always\",\n onEvent: event => {\n if (event.resourcePreEvent) {\n totalResourceCount = updateResourceCount(\n event.resourcePreEvent.metadata.op,\n totalResourceCount,\n )\n\n this.updateState({ id: instanceId, totalResourceCount })\n return\n }\n\n if (event.resOutputsEvent) {\n currentResourceCount = updateResourceCount(\n event.resOutputsEvent.metadata.op,\n currentResourceCount,\n )\n\n this.updateState({ id: instanceId, currentResourceCount })\n return\n }\n },\n onOutput: message => {\n this.updateState({ id: instanceId, logLine: message })\n\n if (this.printOutput) {\n console.log(message)\n }\n },\n signal: options.signal,\n })\n\n const extraOutputs = await this.getExtraOutputsStatePatch(stack)\n\n this.updateState({\n id: instanceId,\n status: \"created\",\n totalResourceCount: currentResourceCount,\n ...extraOutputs,\n })\n },\n error => this.pulumiProjectHost.tryUnlockStack(stack, error),\n )\n },\n )\n } catch (error) {\n this.updateState({\n id: instanceId,\n status: \"error\",\n error: errorToString(error),\n })\n }\n }\n\n private async getExtraOutputsStatePatch(stack: Stack) {\n const outputs = await stack.outputs()\n const patch: Omit<InstanceStateUpdate, \"id\"> = {}\n\n if (outputs[\"$status\"]) {\n patch.statusFields = z.array(instanceStatusFieldSchema).parse(outputs[\"$status\"].value)\n } else {\n patch.statusFields = []\n }\n\n if (outputs[\"$pages\"]) {\n const pages = z.array(instancePageSchema).parse(outputs[\"$pages\"].value)\n\n patch.pages = pages.map(page => omit(page, [\"content\"]))\n } else {\n patch.pages = []\n }\n\n if (outputs[\"$files\"]) {\n const files = z.array(instanceFileSchema).parse(outputs[\"$files\"].value)\n\n patch.files = files.map(file => file.meta)\n } else {\n patch.files = []\n }\n\n if (outputs[\"$terminals\"]) {\n const terminals = z.array(instanceTerminalSchema).parse(outputs[\"$terminals\"].value)\n\n patch.terminals = terminals.map(terminal => pick(terminal, [\"name\", \"title\", \"description\"]))\n } else {\n patch.terminals = []\n }\n\n if (outputs[\"$triggers\"]) {\n patch.triggers = z.array(instanceTriggerSchema).parse(outputs[\"$triggers\"].value)\n } else {\n patch.triggers = []\n }\n\n if (outputs[\"$secrets\"]) {\n patch.secrets = pickBy(\n z.record(z.string().nullish()).parse(outputs[\"$secrets\"].value),\n v => !!v,\n ) as Record<string, string>\n } else {\n patch.secrets = null\n }\n\n patch.outputHash = await sha256(JSON.stringify(outputs))\n\n return patch\n }\n\n private updateState(patch: InstanceStateUpdate) {\n this.events.emit(`state:${patch.id}`, patch)\n }\n\n private async validateStatus(\n options: RunnerBaseOptions,\n expectedStatuses: InstanceStatus[],\n ): Promise<InstanceStatus | undefined> {\n if (this.skipStateCheck) {\n return\n }\n\n const existingState = await this.getState(options)\n\n if (!existingState) {\n return\n }\n\n if (!expectedStatuses.includes(existingState.status)) {\n throw new InvalidInstanceStatusError(existingState.status, expectedStatuses)\n }\n\n return existingState.status\n }\n\n private static getInstanceId(options: RunnerBaseOptions) {\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(instanceType: string): Promise<ResolvedUnitSource> {\n const sources = await this.libraryBackend.getResolvedUnitSources([instanceType])\n const source = sources.find(source => source.unitType === instanceType)\n\n if (!source) {\n throw new Error(`Resolved unit source not found for ${instanceType}`)\n }\n\n return source\n }\n\n private static getStackName(options: RunnerBaseOptions) {\n return `${options.projectId}_${options.instanceName}`\n }\n\n public static create(\n config: z.infer<typeof localRunnerBackendConfig>,\n pulumiProjectHost: LocalPulumiHost,\n libraryBackend: LibraryBackend,\n ): RunnerBackend {\n let cacheDir = config.HIGHSTATE_BACKEND_RUNNER_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_BACKEND_RUNNER_LOCAL_SKIP_STATE_CHECK,\n config.HIGHSTATE_BACKEND_RUNNER_LOCAL_PRINT_OUTPUT,\n cacheDir,\n pulumiProjectHost,\n libraryBackend,\n )\n }\n}\n","import type { StateBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport type { LocalPulumiHost } from \"../common\"\nimport { z } from \"zod\"\nimport { LocalStateBackend, localStateBackendConfig } from \"./local\"\n\nexport const stateBackendConfig = z.object({\n HIGHSTATE_BACKEND_STATE_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localStateBackendConfig.shape,\n})\n\nexport function createStateBackend(\n config: z.infer<typeof stateBackendConfig>,\n localPulumiHost: LocalPulumiHost,\n logger: Logger,\n): Promise<StateBackend> {\n switch (config.HIGHSTATE_BACKEND_STATE_TYPE) {\n case \"local\": {\n return LocalStateBackend.create(config, localPulumiHost, logger)\n }\n }\n}\n","import type { ClassicLevel } from \"classic-level\"\nimport type { AbstractSublevel, AbstractValueIteratorOptions } from \"abstract-level\"\nimport type { Logger } from \"pino\"\nimport { resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport { uuidv7 } from \"uuidv7\"\nimport {\n type ProjectOperation,\n type InstanceState,\n projectOperationSchema,\n instanceStateSchema,\n isFinalOperationStatus,\n type TerminalSession,\n terminalSessionSchema,\n compositeInstanceSchema,\n type CompositeInstance,\n} from \"../shared\"\nimport { LocalPulumiHost } from \"../common\"\nimport { type LogEntry, type StateBackend, type TerminalHistoryEntry } from \"./abstractions\"\n\nexport const localStateBackendConfig = z.object({\n HIGHSTATE_BACKEND_STATE_LOCAL_DIR: z.string().optional(),\n})\n\ntype Sublevel<TValue = unknown> = AbstractSublevel<\n ClassicLevel<string, unknown>,\n string | Buffer<ArrayBufferLike> | Uint8Array<ArrayBufferLike>,\n string,\n TValue\n>\n\n/**\n * A state backend that stores the state in a local LevelDB database.\n *\n * It uses the following structure:\n *\n * - `activeOperations/{operationId}` - all active operations, denormalized from `projects/{projectId}/operations`;\n * - `activeTerminalSessionIds` - the IDs of the active terminal sessions;\n *\n * - `projects/{projectId}/operations/{operationId}` - the operations of the project;\n * - `projects/{projectId}/instanceStates/{instanceId}` - the latest states of the instances of the project;\n * - `projects/{projectId}/compositeInstances/{instanceId}` - all evaluated composite instances of the project;\n * - `projects/{projectId}/compositeInstanceInputHashes/{instanceId}` - the input hashes of the composite instances, can be fetched independently;\n * - `projects/{projectId}/topLevelCompositeChildrenIds/{instanceId}` - the IDs of the composite children of the top-level composite instance;\n * - `projects/{projectId}/instances/{instanceId}/terminalSessions/{sessionId}` - the terminal sessions of the instances;\n *\n * - `operations/{operationId}/instanceStates/{instanceID}` - the states of the instances affected by the operation (at the moment of the operation completion);\n * - `operations/{operationId}/instances/{instanceID}/logs/{logId}` - the logs of the instances affected by the operation, logId is a UUIDv7;\n *\n * - `terminalSessions/{sessionId}/history/{lineId}` - the history lines of the terminal session, lineId is a UUIDv7;\n */\nexport class LocalStateBackend implements StateBackend {\n constructor(\n private readonly db: ClassicLevel<string, unknown>,\n private readonly logger: Logger,\n ) {\n this.logger.debug({ msg: \"initialized\", dbLocation: db.location })\n }\n\n async getActiveOperations(): Promise<ProjectOperation[]> {\n const sublevel = this.getActiveOperationsSublevel()\n\n return this.getAllSublevelItems(sublevel, projectOperationSchema)\n }\n\n async getOperations(projectId: string, beforeOperationId?: string): Promise<ProjectOperation[]> {\n const sublevel = this.getProjectOperationsSublevel(projectId)\n const pageSize = 10\n\n return await this.getAllSublevelItems(sublevel, projectOperationSchema, pageSize, {\n lt: beforeOperationId,\n reverse: true,\n })\n }\n\n async getAllInstanceStates(projectId: string): Promise<InstanceState[]> {\n const sublevel = this.getProjectInstanceStatesSublevel(projectId)\n\n return await this.getAllSublevelItems(sublevel, instanceStateSchema)\n }\n\n async getInstanceState(projectId: string, instanceID: string): Promise<InstanceState | null> {\n const sublevel = this.getProjectInstanceStatesSublevel(projectId)\n\n return await this.getSublevelItem(sublevel, instanceStateSchema, instanceID)\n }\n\n async getInstanceStates(projectId: string, instanceIds: string[]): Promise<InstanceState[]> {\n const sublevel = this.getProjectInstanceStatesSublevel(projectId)\n\n return await this.getSublevelItems(sublevel, instanceStateSchema, instanceIds)\n }\n\n async getAffectedInstanceStates(operationId: string): Promise<InstanceState[]> {\n const sublevel = this.getOperationInstanceStatesSublevel(operationId)\n\n return await this.getAllSublevelItems(sublevel, instanceStateSchema)\n }\n\n async getInstanceLogs(operationId: string, instanceId: string): Promise<string[]> {\n const sublevel = this.getOperationInstanceLogsSublevel(operationId, instanceId)\n\n return await Array.fromAsync(sublevel.values())\n }\n\n async putOperation(operation: ProjectOperation): Promise<void> {\n this.validateItem(projectOperationSchema, operation)\n\n const operationsSublevel = this.getProjectOperationsSublevel(operation.projectId)\n const activeOperationsSublevel = this.getActiveOperationsSublevel()\n\n if (!isFinalOperationStatus(operation.status)) {\n // if the operation is not completed or failed, it is active,\n // so we put it to the active operations sublevel as well\n await this.db.batch([\n { type: \"put\", key: operation.id, value: operation, sublevel: operationsSublevel },\n { type: \"put\", key: operation.id, value: operation, sublevel: activeOperationsSublevel },\n ])\n } else {\n // otherwise, we put it only to the operations sublevel\n // and ensure it is not in the active operations\n await this.db.batch([\n { type: \"put\", key: operation.id, value: operation, sublevel: operationsSublevel },\n { type: \"del\", key: operation.id, sublevel: activeOperationsSublevel },\n ])\n }\n }\n\n async putAffectedInstanceStates(\n projectId: string,\n operationId: string,\n states: InstanceState[],\n ): Promise<void> {\n this.validateArray(instanceStateSchema, states)\n\n const operationInstanceStatesSublevel = this.getOperationInstanceStatesSublevel(operationId)\n const projectInstanceStatesSublevel = this.getProjectInstanceStatesSublevel(projectId)\n\n await this.db.batch(\n // put the states to both the operation and project sublevels\n // denormalization is cool\n // this separation is also necessary because the instance states can be updated without operations\n states.flatMap(state => [\n {\n // always put the state to the operation sublevel for history\n type: \"put\",\n key: state.id,\n value: state,\n sublevel: operationInstanceStatesSublevel,\n },\n {\n type: state.status === \"not_created\" ? \"del\" : \"put\",\n key: state.id,\n value: state,\n sublevel: projectInstanceStatesSublevel,\n },\n ]),\n )\n }\n\n async putInstanceStates(projectId: string, states: InstanceState[]): Promise<void> {\n this.validateArray(instanceStateSchema, states)\n\n const sublevel = this.getProjectInstanceStatesSublevel(projectId)\n\n await sublevel.batch(\n // as i told before, we update the instance states without operations\n // this method is used when upstream instance state changes are detected\n states.map(state => ({\n type: state.status === \"not_created\" ? \"del\" : \"put\",\n key: state.id,\n value: state,\n })),\n )\n }\n\n async appendInstanceLogs(operationId: string, logs: LogEntry[]): Promise<void> {\n const sublevels = new Map<string, Sublevel<string>>()\n for (const [instanceId] of logs) {\n if (sublevels.has(instanceId)) {\n continue\n }\n\n const sublevel = this.getOperationInstanceLogsSublevel(operationId, instanceId)\n sublevels.set(instanceId, sublevel)\n }\n\n await this.db.batch(\n logs.map(([instanceID, line]) => ({\n type: \"put\",\n key: uuidv7(),\n value: line,\n sublevel: sublevels.get(instanceID)!,\n })),\n )\n }\n\n async getCompositeInstances(\n projectId: string,\n signal?: AbortSignal,\n ): Promise<CompositeInstance[]> {\n const sublevel = this.getProjectCompositeInstancesSublevel(projectId)\n\n return await this.getAllSublevelItems(\n //\n sublevel,\n compositeInstanceSchema,\n undefined,\n { signal },\n )\n }\n\n async getCompositeInstance(\n projectId: string,\n instanceId: string,\n ): Promise<CompositeInstance | null> {\n const sublevel = this.getProjectCompositeInstancesSublevel(projectId)\n\n return this.getSublevelItem(sublevel, compositeInstanceSchema, instanceId)\n }\n\n async getCompositeInstanceInputHashes(projectId: string): Promise<Record<string, string>> {\n const sublevel = this.getProjectCompositeInstanceInputHashesSublevel(projectId)\n\n const result: Record<string, string> = {}\n for await (const [key, value] of sublevel.iterator()) {\n result[key] = value\n }\n\n return result\n }\n\n async putCompositeInstances(projectId: string, instances: CompositeInstance[]): Promise<void> {\n this.validateArray(compositeInstanceSchema, instances)\n\n const sublevel = this.getProjectCompositeInstancesSublevel(projectId)\n const inputHashesSublevel = this.getProjectCompositeInstanceInputHashesSublevel(projectId)\n\n await this.db.batch(\n instances.flatMap(instance => [\n {\n type: \"put\",\n key: instance.instance.id,\n value: compositeInstanceSchema.parse(instance),\n sublevel: sublevel,\n },\n {\n type: \"put\",\n key: instance.instance.id,\n value: instance.inputHash ?? \"\",\n sublevel: inputHashesSublevel,\n },\n ]),\n )\n }\n\n async clearCompositeInstances(projectId: string, instanceIds: string[]): Promise<void> {\n const sublevel = this.getProjectCompositeInstancesSublevel(projectId)\n const inputHashesSublevel = this.getProjectCompositeInstanceInputHashesSublevel(projectId)\n\n await this.db.batch(\n instanceIds.flatMap(instanceId => [\n { type: \"del\", key: instanceId, sublevel },\n { type: \"del\", key: instanceId, sublevel: inputHashesSublevel },\n ]),\n )\n }\n\n async getTopLevelCompositeChildrenIds(\n projectId: string,\n instanceIds: string[],\n ): Promise<Record<string, string[]>> {\n const sublevel = this.getProjectCompositeChildrenIdsSublevel(projectId)\n const items = await sublevel.getMany(instanceIds)\n const schema = z.array(z.string()).optional()\n\n const result: Record<string, string[]> = {}\n for (let i = 0; i < items.length; i++) {\n const instanceId = instanceIds[i]\n const childrenIds = schema.parse(items[i])\n\n result[instanceId] = childrenIds ?? []\n }\n\n return result\n }\n\n async putTopLevelCompositeChildrenIds(\n projectId: string,\n childrenIds: Record<string, string[]>,\n ): Promise<void> {\n const sublevel = this.getProjectCompositeChildrenIdsSublevel(projectId)\n const schema = z.array(z.string()).optional()\n\n await sublevel.batch(\n Object.entries(childrenIds).map(([instanceId, ids]) => ({\n type: \"put\",\n key: instanceId,\n value: schema.parse(ids),\n })),\n )\n }\n\n async getActiveTerminalSessions(): Promise<TerminalSession[]> {\n const data = await this.db.get(\"activeTerminalSessionIds\", { valueEncoding: \"json\" })\n\n return data ? z.array(terminalSessionSchema).parse(data) : []\n }\n\n putActiveTerminalSessions(sessions: TerminalSession[]): Promise<void> {\n this.validateArray(terminalSessionSchema, sessions)\n\n return this.db.put(\"activeTerminalSessionIds\", sessions, { valueEncoding: \"json\" })\n }\n\n async getTerminalSession(\n projectId: string,\n instanceId: string,\n sessionId: string,\n ): Promise<TerminalSession | null> {\n const sublevel = this.getTerminalSessionsSublevel(projectId, instanceId)\n\n return await this.getSublevelItem(sublevel, terminalSessionSchema, sessionId)\n }\n\n async getTerminalSessions(projectId: string, instanceId: string): Promise<TerminalSession[]> {\n const sublevel = this.getTerminalSessionsSublevel(projectId, instanceId)\n\n return await this.getAllSublevelItems(sublevel, terminalSessionSchema)\n }\n\n async getLastTerminalSession(\n projectId: string,\n instanceId: string,\n sessionId: string,\n ): Promise<TerminalSession | null> {\n const sublevel = this.getTerminalSessionsSublevel(projectId, instanceId)\n\n return await this.getSublevelItem(sublevel, terminalSessionSchema, sessionId)\n }\n\n async putTerminalSession(\n projectId: string,\n instanceId: string,\n session: TerminalSession,\n ): Promise<void> {\n this.validateItem(terminalSessionSchema, session)\n\n const sublevel = this.getTerminalSessionsSublevel(projectId, instanceId)\n await sublevel.put(session.id, session)\n }\n\n async getTerminalSessionHistory(sessionId: string): Promise<string[]> {\n const sublevel = this.getTerminalSessionHistorySublevel(sessionId)\n\n return await Array.fromAsync(sublevel.values())\n }\n\n async appendTerminalSessionHistory(lines: TerminalHistoryEntry[]): Promise<void> {\n const sublevels = new Map<string, Sublevel<string>>()\n for (const [sessionId] of lines) {\n if (sublevels.has(sessionId)) {\n continue\n }\n\n const sublevel = this.getTerminalSessionHistorySublevel(sessionId)\n sublevels.set(sessionId, sublevel)\n }\n\n await this.db.batch(\n lines.map(([sessionId, line]) => ({\n type: \"put\",\n key: uuidv7(),\n value: line,\n sublevel: sublevels.get(sessionId)!,\n })),\n )\n }\n\n private async getAllSublevelItems<TSchema extends z.ZodType>(\n sublevel: Sublevel,\n schema: TSchema,\n limit?: number,\n options?: AbstractValueIteratorOptions<string, unknown>,\n ): Promise<z.infer<TSchema>[]> {\n const result: z.infer<TSchema>[] = []\n const iterator = options ? sublevel.iterator(options) : sublevel.iterator()\n const invalidKeys: string[] = []\n\n for await (const [key, value] of iterator) {\n const parseResult = schema.safeParse(value)\n\n if (!parseResult.success) {\n this.logger.warn({\n msg: \"failed to parse item, it will be deleted\",\n error: parseResult.error,\n sublevel: sublevel.prefix,\n key,\n })\n\n invalidKeys.push(key)\n continue\n }\n\n result.push(parseResult.data as z.infer<TSchema>)\n if (limit && result.length >= limit) {\n break\n }\n }\n\n if (invalidKeys.length > 0) {\n this.logger.info({\n msg: \"deleting invalid items\",\n sublevel: sublevel.prefix,\n keyCount: invalidKeys.length,\n })\n\n await sublevel.batch(invalidKeys.map(key => ({ type: \"del\", key })))\n }\n\n return result\n }\n\n private async getSublevelItem<TSchema extends z.ZodType>(\n sublevel: Sublevel,\n schema: TSchema,\n key: string,\n ): Promise<z.infer<TSchema> | null> {\n const value = await sublevel.get(key)\n\n if (!value) {\n return null\n }\n\n const parseResult = schema.safeParse(value)\n\n if (!parseResult.success) {\n this.logger.warn({\n msg: \"failed to parse item, it will be deleted\",\n error: parseResult.error,\n sublevel: sublevel.prefix,\n key,\n })\n\n await sublevel.del(key)\n return null\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return parseResult.data as z.infer<TSchema>\n }\n\n private async getSublevelItems<TSchema extends z.ZodType>(\n sublevel: Sublevel,\n schema: TSchema,\n keys: string[],\n ): Promise<z.infer<TSchema>[]> {\n const result: z.infer<TSchema>[] = []\n const invalidKeys: string[] = []\n\n for (const key of keys) {\n const value = await sublevel.get(key)\n\n if (!value) {\n continue\n }\n\n const parseResult = schema.safeParse(value)\n\n if (!parseResult.success) {\n this.logger.warn({\n msg: \"failed to parse item, it will be deleted\",\n error: parseResult.error,\n sublevel: sublevel.prefix,\n key,\n })\n\n invalidKeys.push(key)\n continue\n }\n\n result.push(parseResult.data as z.infer<TSchema>)\n }\n\n if (invalidKeys.length > 0) {\n this.logger.info({\n msg: \"deleting invalid items\",\n sublevel: sublevel.prefix,\n keyCount: invalidKeys.length,\n })\n\n await sublevel.batch(invalidKeys.map(key => ({ type: \"del\", key })))\n }\n\n return result\n }\n\n private validateItem<TSchema extends z.ZodType>(schema: TSchema, item: z.infer<TSchema>): void {\n const parseResult = schema.safeParse(item)\n\n if (!parseResult.success) {\n this.logger.error({\n msg: \"failed to validate item\",\n error: parseResult.error,\n item,\n })\n\n throw new Error(`Failed to validate item: ${parseResult.error.errors[0].message}`, {\n cause: parseResult.error,\n })\n }\n }\n\n private validateArray<TSchema extends z.ZodType>(\n schema: TSchema,\n items: z.infer<TSchema>[],\n ): void {\n for (const item of items) {\n this.validateItem(schema, item)\n }\n }\n\n private getActiveOperationsSublevel(): Sublevel {\n return this.getJsonSublevel(\"activeOperations\")\n }\n\n private getProjectOperationsSublevel(projectId: string): Sublevel {\n return this.getJsonSublevel(`projects/${projectId}/operations`)\n }\n\n private getProjectCompositeInstancesSublevel(projectId: string): Sublevel {\n return this.getJsonSublevel(`projects/${projectId}/compositeInstances`)\n }\n\n private getProjectCompositeInstanceInputHashesSublevel(projectId: string): Sublevel<string> {\n return this.getStringSublevel(`projects/${projectId}/compositeInstanceInputHashes`)\n }\n\n private getProjectCompositeChildrenIdsSublevel(projectId: string): Sublevel {\n return this.getJsonSublevel(`projects/${projectId}/topLevelCompositeChildrenIds`)\n }\n\n private getProjectInstanceStatesSublevel(projectId: string): Sublevel {\n return this.getJsonSublevel(`projects/${projectId}/instanceStates`)\n }\n\n private getOperationInstanceStatesSublevel(operationId: string): Sublevel {\n return this.getJsonSublevel(`operations/${operationId}/instanceStates`)\n }\n\n private getOperationInstanceLogsSublevel(\n operationId: string,\n instanceId: string,\n ): Sublevel<string> {\n return this.getStringSublevel(`operations/${operationId}/instances/${instanceId}/logs`)\n }\n\n private getTerminalSessionsSublevel(projectId: string, instanceId: string): Sublevel {\n return this.getJsonSublevel(`projects/${projectId}/instances/${instanceId}/terminalSessions`)\n }\n\n private getTerminalSessionHistorySublevel(sessionId: string): Sublevel<string> {\n return this.getStringSublevel(`terminalSessions/${sessionId}/history`)\n }\n\n private getStringSublevel(path: string): Sublevel<string> {\n return this.db.sublevel<string, string>(path, { valueEncoding: \"utf8\" })\n }\n\n private getJsonSublevel(path: string): Sublevel {\n return this.db.sublevel<string, unknown>(path, { valueEncoding: \"json\" })\n }\n\n static async create(\n config: z.infer<typeof localStateBackendConfig>,\n localPulumiHost: LocalPulumiHost,\n logger: Logger,\n ): Promise<StateBackend> {\n const childLogger = logger.child({ backend: \"StateBackend\", service: \"LocalStateBackend\" })\n\n let location = config.HIGHSTATE_BACKEND_STATE_LOCAL_DIR\n if (!location) {\n const currentUser = await localPulumiHost.getCurrentUser()\n\n if (!currentUser) {\n throw new Error(\n \"The pulumi state is not specified, please run `pulumi login` or specify the state location manually before restarting the service\",\n )\n }\n\n if (!currentUser.url) {\n throw new Error(\n \"The pulumi user does not have a URL, please specify the state location manually\",\n )\n }\n\n const path = currentUser.url.replace(\"file://\", \"\").replace(\"~\", process.env.HOME!)\n location = resolve(path, \".pulumi\", \".highstate\")\n\n childLogger.debug({\n msg: \"auto-detected state location\",\n pulumiStateUrl: currentUser.url,\n location,\n })\n }\n\n const { ClassicLevel } = await import(\"classic-level\")\n const db = new ClassicLevel<string, unknown>(location)\n\n return new LocalStateBackend(db, childLogger)\n }\n}\n","import type { InstanceState } from \"../shared\"\nimport EventEmitter, { on } from \"node:events\"\n\nexport type StateEvents = Record<string, [Partial<InstanceState>]>\n\nexport class StateManager {\n private readonly stateEE = new EventEmitter<StateEvents>()\n\n /**\n * Watches for all instance state changes in the project.\n *\n * @param projectId The project ID to watch.\n * @param signal The signal to abort the operation.\n */\n public async *watchInstanceStates(\n projectId: string,\n signal?: AbortSignal,\n ): AsyncIterable<Partial<InstanceState>> {\n for await (const [state] of on(this.stateEE, projectId, { signal })) {\n yield state\n }\n }\n\n /**\n * Emits a state patch for the instance in the project.\n *\n * @param projectId The project ID to emit the state patch for.\n * @param patch The state patch to emit.\n */\n public emitStatePatch(projectId: string, patch: Partial<InstanceState>): void {\n this.stateEE.emit(projectId, patch)\n }\n}\n","import type { WorkspaceBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { LocalWorkspaceBackend, localWorkspaceBackendConfig } from \"./local\"\n\nexport const workspaceBackendConfig = z.object({\n HIGHSTATE_BACKEND_WORKSPACE_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localWorkspaceBackendConfig.shape,\n})\n\nexport function createWorkspaceBackend(\n config: z.infer<typeof workspaceBackendConfig>,\n): Promise<WorkspaceBackend> {\n return LocalWorkspaceBackend.create(config)\n}\n","import type { ClassicLevel } from \"classic-level\"\nimport type { WorkspaceBackend } from \"./abstractions\"\nimport { homedir } from \"node:os\"\nimport { resolve } from \"node:path\"\nimport { z } from \"zod\"\n\nexport const localWorkspaceBackendConfig = z.object({\n HIGHSTATE_BACKEND_WORKSPACE_LOCAL_DIR: z.string().optional(),\n})\n\nexport class LocalWorkspaceBackend implements WorkspaceBackend {\n constructor(private readonly db: ClassicLevel<string, unknown>) {}\n\n async getWorkspaceLayout(): Promise<unknown> {\n return await this.db.get(\"layout\")\n }\n\n async setWorkspaceLayout(layout: unknown): Promise<void> {\n await this.db.put(\"layout\", layout)\n }\n\n async getProjectViewport(projectId: string): Promise<unknown> {\n return await this.db.get(`viewports/projects/${projectId}`)\n }\n\n async setProjectViewport(projectId: string, viewport: unknown): Promise<void> {\n await this.db.put(`viewports/projects/${projectId}`, viewport)\n }\n\n async getInstanceViewport(projectId: string, instanceId: string): Promise<unknown> {\n return await this.db.get(`viewports/instances/${projectId}/${instanceId}`)\n }\n\n async setInstanceViewport(\n projectId: string,\n instanceId: string,\n viewport: unknown,\n ): Promise<void> {\n await this.db.put(`viewports/instances/${projectId}/${instanceId}`, viewport)\n }\n\n static async create(config: z.infer<typeof localWorkspaceBackendConfig>) {\n let location = config.HIGHSTATE_BACKEND_WORKSPACE_LOCAL_DIR\n if (!location) {\n const home = homedir()\n location = resolve(home, \".highstate/workspace\")\n }\n\n const { ClassicLevel } = await import(\"classic-level\")\n const db = new ClassicLevel<string, unknown>(location, { valueEncoding: \"json\" })\n\n return new LocalWorkspaceBackend(db)\n }\n}\n","import type { LibraryBackend } from \"../library\"\nimport type { ProjectBackend, ProjectLockManager } from \"../project\"\nimport type { RunnerBackend } from \"../runner\"\nimport type { SecretBackend } from \"../secret\"\nimport type { StateBackend, StateManager } from \"../state\"\nimport type { Logger } from \"pino\"\nimport { EventEmitter, on } from \"node:events\"\nimport { uuidv7 } from \"uuidv7\"\nimport { type ProjectOperation, type ProjectOperationRequest } from \"../shared\"\nimport { RuntimeOperation } from \"./operation\"\n\nexport type OperationEvents = Record<string, [ProjectOperation]>\nexport type InstanceLogsEvents = Record<string, [string]>\n\nexport class OperationManager {\n constructor(\n private readonly runnerBackend: RunnerBackend,\n private readonly stateBackend: StateBackend,\n private readonly libraryBackend: LibraryBackend,\n private readonly projectBackend: ProjectBackend,\n private readonly secretBackend: SecretBackend,\n private readonly projectLockManager: ProjectLockManager,\n private readonly stateManager: StateManager,\n private readonly logger: Logger,\n ) {}\n\n private readonly operationEE = new EventEmitter<OperationEvents>()\n private readonly instanceLogsEE = new EventEmitter<InstanceLogsEvents>()\n\n private readonly runtimeOperations = new Map<string, RuntimeOperation>()\n\n /**\n * Watches for all project operations in the project.\n *\n * @param projectId The project ID to watch.\n * @param signal The signal to abort the operation.\n */\n public async *watchOperations(\n projectId: string,\n signal?: AbortSignal,\n ): AsyncIterable<ProjectOperation> {\n for await (const [operation] of on(this.operationEE, projectId, { signal })) {\n yield operation\n }\n }\n\n /**\n * Watches for logs of the instance in the operation.\n *\n * @param operationId The operation ID to watch.\n * @param instanceId The instance ID to watch.\n * @param signal The signal to abort the operation.\n */\n async *watchInstanceLogs(\n operationId: string,\n instanceId: string,\n signal?: AbortSignal,\n ): AsyncIterable<string> {\n const eventKey = `${operationId}/${instanceId}`\n for await (const [log] of on(this.instanceLogsEE, eventKey, { signal })) {\n yield log\n }\n }\n\n /**\n * Launches the project operation.\n *\n * @param request The operation request to launch.\n */\n async launch(request: ProjectOperationRequest): Promise<ProjectOperation> {\n const operation: ProjectOperation = {\n id: uuidv7(),\n projectId: request.projectId,\n type: request.type,\n requestedInstanceIds: request.instanceIds,\n instanceIdsToUpdate: [],\n instanceIdsToDestroy: [],\n status: \"pending\",\n options: {\n forceUpdateDependencies: request.options?.forceUpdateDependencies ?? false,\n forceUpdateChildren: request.options?.forceUpdateChildren ?? false,\n destroyDependentInstances: request.options?.destroyDependentInstances ?? true,\n invokeDestroyTriggers: request.options?.invokeDestroyTriggers ?? false,\n deleteUnreachableResources: request.options?.deleteUnreachableResources ?? false,\n forceDeleteState: request.options?.forceDeleteState ?? false,\n refresh: request.options?.refresh ?? false,\n },\n error: null,\n startedAt: Date.now(),\n completedAt: null,\n }\n\n this.logger.info({ operation }, \"launching operation\")\n\n await this.stateBackend.putOperation(operation)\n\n this.startOperation(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 private startOperation(operation: ProjectOperation): void {\n const runtimeOperation = new RuntimeOperation(\n operation,\n this.runnerBackend,\n this.stateBackend,\n this.libraryBackend,\n this.projectBackend,\n this.secretBackend,\n this.projectLockManager.getLock(operation.projectId),\n this.stateManager,\n this.operationEE,\n this.instanceLogsEE,\n this.logger.child({ service: \"RuntimeOperation\", 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 static async create(\n runnerBackend: RunnerBackend,\n stateBackend: StateBackend,\n libraryBackend: LibraryBackend,\n projectBackend: ProjectBackend,\n secretBackend: SecretBackend,\n projectLockManager: ProjectLockManager,\n stateManager: StateManager,\n logger: Logger,\n ) {\n const operator = new OperationManager(\n runnerBackend,\n stateBackend,\n libraryBackend,\n projectBackend,\n secretBackend,\n projectLockManager,\n stateManager,\n logger.child({ service: \"OperationManager\" }),\n )\n\n // relaunch all active operations\n const activeOperations = await stateBackend.getActiveOperations()\n\n for (const operation of activeOperations) {\n logger.info({ msg: \"relaunching operation\", operationId: operation.id })\n\n // operator.startOperation(operation)\n\n // cancel the operation for now\n operation.status = \"cancelled\"\n await stateBackend.putOperation(operation)\n }\n\n return operator\n }\n}\n","import type { LibraryBackend } from \"../library\"\nimport type { LogEntry, StateBackend, StateManager } from \"../state\"\nimport type { ProjectBackend, ProjectLock } from \"../project\"\nimport type { SecretBackend } from \"../secret\"\nimport type { RunnerBackend } from \"../runner\"\nimport type { InstanceLogsEvents, OperationEvents } from \"./manager\"\nimport type { EventEmitter } from \"node:events\"\nimport type { Logger } from \"pino\"\nimport { isUnitModel, parseInstanceId, type InstanceModel } from \"@highstate/contract\"\nimport { mapValues } from \"remeda\"\nimport {\n type InstanceState,\n type InstanceStateUpdate,\n type ProjectOperation,\n type InstanceTriggerInvocation,\n createInstanceState,\n createAsyncBatcher,\n} from \"../shared\"\nimport {\n errorToString,\n isAbortError,\n isAbortErrorLike,\n tryWrapAbortErrorLike,\n valueToString,\n} from \"../common\"\nimport { OperationWorkset, type OperationPhase } from \"./operation-workset\"\n\nexport class RuntimeOperation {\n private readonly abortController = new AbortController()\n private readonly instancePromiseMap = new Map<string, Promise<void>>()\n private workset!: OperationWorkset\n\n private currentPhase!: OperationPhase\n\n constructor(\n private readonly operation: ProjectOperation,\n private readonly runnerBackend: RunnerBackend,\n private readonly stateBackend: StateBackend,\n private readonly libraryBackend: LibraryBackend,\n private readonly projectBackend: ProjectBackend,\n private readonly secretBackend: SecretBackend,\n private readonly projectLock: ProjectLock,\n private readonly stateManager: StateManager,\n private readonly operationEE: EventEmitter<OperationEvents>,\n private readonly instanceLogsEE: EventEmitter<InstanceLogsEvents>,\n private readonly logger: Logger,\n ) {}\n\n async operateSafe(): Promise<void> {\n try {\n await this.operate()\n } catch (error) {\n if (isAbortError(error)) {\n this.logger.info(\"the operation was cancelled\")\n this.operation.status = \"cancelled\"\n\n await this.updateOperation()\n return\n }\n\n this.logger.error({ msg: \"an error occurred while running the operation\", error })\n\n this.operation.status = \"failed\"\n this.operation.error = errorToString(error)\n\n await this.updateOperation()\n } finally {\n await Promise.all([\n this.persistStates.flush(),\n this.persistLogs.flush(),\n this.persistSecrets.flush(),\n ])\n\n this.logger.debug(\"operation finished, all entries persisted\")\n }\n }\n\n private async operate(): Promise<void> {\n this.logger.info(\"starting operation\")\n let lockInstanceIds: string[]\n\n // keep recalculating the workset until we can acquire the locks and actually start the operation\n while (true) {\n this.workset = await OperationWorkset.load(\n this.operation,\n this.projectBackend,\n this.libraryBackend,\n this.stateBackend,\n this.stateManager,\n this.logger,\n this.abortController.signal,\n )\n\n lockInstanceIds = this.workset.getLockInstanceIds()\n\n if (this.projectLock.canImmediatelyAcquireLocks(lockInstanceIds)) {\n break\n }\n\n this.logger.info(\"waiting for locks to be available\")\n\n await this.projectLock.lockInstances(lockInstanceIds, () => Promise.resolve())\n }\n\n try {\n // actually acquire the locks and start the operation\n await this.projectLock.lockInstances(lockInstanceIds, () => this.processOperation())\n } finally {\n if (this.operation.type === \"preview\") {\n // stream initial states for preview operations\n this.workset.emitAffectedInitialStates()\n }\n }\n }\n\n private async processOperation(): Promise<void> {\n this.operation.instanceIdsToUpdate = this.workset.operation.instanceIdsToUpdate\n this.operation.instanceIdsToDestroy = this.workset.operation.instanceIdsToDestroy\n\n this.logger.info(\n {\n instanceIdsToUpdate: this.operation.instanceIdsToUpdate,\n instanceIdsToDestroy: this.operation.instanceIdsToDestroy,\n },\n \"operation started\",\n )\n\n const phases = this.getOperationPhases()\n\n for (const phase of phases) {\n this.currentPhase = phase\n\n const promises: Promise<void>[] = []\n for (const instanceId of this.workset.getAffectedInstanceIds(phase)) {\n const parentId = this.workset.getParentId(instanceId, phase)\n if (parentId && this.workset.isAffected(parentId, phase)) {\n // do not call the operation for child instances of affected composites,\n // they will be called by their parent instance\n continue\n }\n\n promises.push(this.getInstancePromiseForOperation(instanceId))\n }\n\n this.logger.info(`all operations for phase \"%s\" started`, phase)\n this.operation.status = \"running\"\n await this.updateOperation()\n\n await Promise.all(promises)\n\n this.logger.info(`all operations for phase \"%s\" completed`, phase)\n }\n\n this.operation.status = \"completed\"\n this.operation.error = null\n await this.updateOperation()\n\n this.logger.info(\"operation completed\")\n }\n\n cancel() {\n this.logger.info(\"cancelling operation\")\n this.abortController.abort()\n }\n\n private getInstancePromiseForOperation(instanceId: string): Promise<void> {\n const [instanceType] = parseInstanceId(instanceId)\n const component = this.workset.library.components[instanceType]\n\n if (isUnitModel(component)) {\n return this.getUnitPromise(instanceId)\n }\n\n return this.getCompositePromise(instanceId)\n }\n\n private getOperationPhases(): OperationPhase[] {\n switch (this.operation.type) {\n case \"update\": {\n if (this.operation.instanceIdsToDestroy.length > 0) {\n return [\"destroy\", \"update\"]\n }\n\n return [\"update\"]\n }\n case \"preview\":\n return [\"update\"]\n case \"recreate\":\n return [\"destroy\", \"update\"]\n case \"destroy\":\n return [\"destroy\"]\n case \"refresh\":\n return [\"refresh\"]\n }\n }\n\n private async getUnitPromise(instanceId: string): Promise<void> {\n switch (this.currentPhase) {\n case \"update\": {\n return this.updateUnit(instanceId)\n }\n case \"destroy\": {\n return this.destroyUnit(instanceId)\n }\n case \"refresh\": {\n return this.refreshUnit(instanceId)\n }\n }\n }\n\n private async getCompositePromise(instanceId: string): Promise<void> {\n const logger = this.logger.child({ instanceId })\n\n return this.getInstancePromise(instanceId, async () => {\n const state = this.workset.getState(instanceId) ?? createInstanceState(instanceId)\n const instance = this.workset.getInstanceOrUndefined(instanceId)\n\n this.updateInstanceState({\n ...state,\n parentId: instance?.parentId,\n latestOperationId: this.operation.id,\n status: \"pending\",\n error: null,\n })\n\n const children = this.workset.getAffectedCompositeChildren(instanceId, this.currentPhase)\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 if (\n !this.operation.options.forceUpdateChildren &&\n !this.workset.isAffected(child.id, this.currentPhase)\n ) {\n // skip children that are not affected by the operation\n continue\n }\n\n logger.debug(`waiting for child: \"%s\"`, child.id)\n childPromises.push(this.getInstancePromiseForOperation(child.id))\n }\n\n try {\n await Promise.all(childPromises)\n\n if (children.length > 0) {\n logger.info(\"all children completed\")\n }\n\n this.updateInstanceState({\n id: instanceId,\n status: this.operation.type === \"destroy\" ? \"not_created\" : \"created\",\n inputHash: instance ? await this.workset.getUpToDateInputHash(instance) : undefined,\n })\n } catch (error) {\n if (isAbortErrorLike(error)) {\n this.workset.restoreInitialStatus(instanceId)\n return\n }\n\n this.updateInstanceState({\n id: instanceId,\n status: \"error\",\n error: errorToString(error),\n })\n }\n })\n }\n\n private updateUnit(instanceId: string): Promise<void> {\n return this.getInstancePromise(instanceId, async logger => {\n const instance = this.workset.getInstance(instanceId)\n\n this.updateInstanceState({\n id: instance.id,\n parentId: instance.parentId,\n latestOperationId: this.operation.id,\n status: \"pending\",\n error: null,\n currentResourceCount: 0,\n })\n\n let dependencyIds: string[] = []\n try {\n dependencyIds = await this.updateUnitDependencies(instance, logger)\n } catch (error) {\n // restore the initial status of the instance if one of the dependencies failed\n this.workset.restoreInitialStatus(instance.id)\n throw error\n }\n\n logger.info(\"updating unit\")\n\n const secrets = await this.secretBackend.get(this.operation.projectId, instance.id)\n this.abortController.signal.throwIfAborted()\n\n logger.debug(\"secrets loaded\", { count: Object.keys(secrets).length })\n\n await this.runnerBackend[this.operation.type === \"preview\" ? \"preview\" : \"update\"]({\n projectId: this.operation.projectId,\n instanceType: instance.type,\n instanceName: instance.name,\n config: this.prepareUnitConfig(instance),\n refresh: this.operation.options.refresh,\n secrets: mapValues(secrets, value => valueToString(value)),\n signal: this.abortController.signal,\n })\n\n logger.debug(\"unit update requested\")\n\n const stream = this.runnerBackend.watch({\n projectId: this.operation.projectId,\n instanceType: instance.type,\n instanceName: instance.name,\n finalStatuses: [\"created\", \"error\"],\n })\n\n await this.watchStateStream(stream)\n\n const inputHash = await this.workset.getUpToDateInputHash(instance)\n\n this.updateInstanceState({\n id: instance.id,\n inputHash,\n dependencyIds,\n })\n\n logger.debug(\"input hash after update\", { inputHash })\n logger.info(\"unit updated\")\n })\n }\n\n private async updateUnitDependencies(instance: InstanceModel, logger: Logger): Promise<string[]> {\n try {\n const dependencies = this.getInstanceDependencies(instance)\n const dependencyPromises: Promise<void>[] = []\n\n for (const dependency of dependencies) {\n if (!this.operation.instanceIdsToUpdate.includes(dependency.id)) {\n // skip dependencies that are not affected by the operation\n continue\n }\n\n logger.debug(`waiting for dependency: ${dependency.id}`)\n dependencyPromises.push(this.getInstancePromiseForOperation(dependency.id))\n }\n\n await Promise.all(dependencyPromises)\n\n if (dependencies.length > 0) {\n logger.info(\"all dependencies completed\")\n }\n\n return dependencies.map(dependency => dependency.id)\n } catch (error) {\n // restore the initial status of the instance if one of the dependencies failed\n this.workset.restoreInitialStatus(instance.id)\n throw error\n }\n }\n\n private async processBeforeDestroyTriggers(state: InstanceState, logger: Logger): Promise<void> {\n if (!this.operation.options.invokeDestroyTriggers) {\n logger.debug(\"destroy triggers are disabled for the operation\")\n return\n }\n\n const instance = this.workset.getInstance(state.id)\n\n const triggers = state.triggers.filter(trigger => trigger.spec.type === \"before-destroy\")\n if (triggers.length === 0) {\n return\n }\n\n const invokedTriggers = triggers.map(trigger => ({ name: trigger.name }))\n\n logger.info(\"updating unit to process before-destroy triggers...\")\n\n const secrets = await this.secretBackend.get(\n this.operation.projectId,\n instance.id,\n this.abortController.signal,\n )\n\n await this.runnerBackend.update({\n projectId: this.operation.projectId,\n instanceType: instance.type,\n instanceName: instance.name,\n config: this.prepareUnitConfig(instance, invokedTriggers),\n refresh: this.operation.options.refresh,\n secrets: mapValues(secrets, value => valueToString(value)),\n signal: this.abortController.signal,\n })\n\n logger.debug(\"unit update requested\")\n\n const stream = this.runnerBackend.watch({\n projectId: this.operation.projectId,\n instanceType: instance.type,\n instanceName: instance.name,\n finalStatuses: [\"created\", \"error\"],\n })\n\n await this.watchStateStream(stream)\n\n logger.debug(\"before-destroy triggers processed\")\n }\n\n private async destroyUnit(instanceId: string): Promise<void> {\n return this.getInstancePromise(instanceId, async logger => {\n this.updateInstanceState({\n id: instanceId,\n latestOperationId: this.operation.id,\n status: \"pending\",\n error: null,\n })\n\n const state = this.workset.getState(instanceId)\n if (!state) {\n logger.warn(\"state not found for unit, but destroy was requested\")\n return\n }\n\n const dependentPromises: Promise<void>[] = []\n const dependents = this.workset.getDependentStates(state.id)\n\n for (const dependent of dependents) {\n dependentPromises.push(this.getInstancePromiseForOperation(dependent.id))\n }\n\n await Promise.all(dependentPromises)\n this.abortController.signal.throwIfAborted()\n\n await this.processBeforeDestroyTriggers(state, logger)\n\n logger.info(\"destroying unit...\")\n\n const [type, name] = parseInstanceId(instanceId)\n\n await this.runnerBackend.destroy({\n projectId: this.operation.projectId,\n instanceType: type,\n instanceName: name,\n refresh: this.operation.options.refresh,\n signal: this.abortController.signal,\n deleteUnreachable: this.operation.options.deleteUnreachableResources,\n forceDeleteState: this.operation.options.forceDeleteState,\n })\n\n this.logger.debug(\"destroy request sent\")\n\n const stream = this.runnerBackend.watch({\n projectId: this.operation.projectId,\n instanceType: type,\n instanceName: name,\n finalStatuses: [\"not_created\", \"error\"],\n })\n\n await this.watchStateStream(stream)\n this.logger.info(\"unit destroyed\")\n })\n }\n\n private async refreshUnit(instanceId: string) {\n const logger = this.logger.child({ instanceId })\n\n return this.getInstancePromise(instanceId, async () => {\n this.updateInstanceState({\n id: instanceId,\n latestOperationId: this.operation.id,\n status: \"refreshing\",\n currentResourceCount: 0,\n totalResourceCount: 0,\n })\n\n logger.info(\"refreshing unit...\")\n\n const [type, name] = parseInstanceId(instanceId)\n\n await this.runnerBackend.refresh({\n projectId: this.operation.projectId,\n instanceType: type,\n instanceName: name,\n signal: this.abortController.signal,\n })\n\n logger.debug(\"unit refresh requested\")\n\n const stream = this.runnerBackend.watch({\n projectId: this.operation.projectId,\n instanceType: type,\n instanceName: name,\n finalStatuses: [\"created\", \"error\"],\n })\n\n await this.watchStateStream(stream)\n logger.info(\"unit refreshed\")\n })\n }\n\n private async watchStateStream(stream: AsyncIterable<InstanceStateUpdate>) {\n let statePatch: InstanceStateUpdate | undefined\n for await (statePatch of stream) {\n if (statePatch.status === \"not_created\" && this.operation.type === \"recreate\") {\n // do not stream \"not_created\" status for recreate operation to improve UX\n continue\n }\n\n this.updateInstanceState(statePatch)\n }\n\n if (!statePatch) {\n throw new Error(\"The stream ended without emitting any state.\")\n }\n\n if (statePatch.status === \"error\") {\n throw tryWrapAbortErrorLike(\n new Error(`The operation on unit \"${statePatch.id}\" failed: ${statePatch.error}`),\n )\n }\n }\n\n private prepareUnitConfig(\n instance: InstanceModel,\n invokedTriggers: InstanceTriggerInvocation[] = [],\n ): Record<string, string> {\n const config: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(instance.args ?? {})) {\n config[key] = valueToString(value)\n }\n\n const instanceInputs = this.workset.resolvedInstanceInputs.get(instance.id) ?? {}\n\n for (const [key, value] of Object.entries(instanceInputs)) {\n config[`input.${key}`] = JSON.stringify(value.map(input => input.input))\n }\n\n config[\"$invokedTriggers\"] = JSON.stringify(invokedTriggers)\n\n return config\n }\n\n private async updateOperation(): Promise<void> {\n this.operationEE.emit(this.operation.projectId, this.operation)\n await this.stateBackend.putOperation(this.operation)\n }\n\n private updateInstanceState(patch: InstanceStateUpdate): void {\n if (!patch.id) {\n throw new Error(\"The ID of the instance state is required.\")\n }\n\n if (patch.logLine) {\n // recursively persist logs for instance and all parent instances\n\n let instance: InstanceModel | null = this.workset.getInstance(patch.id)\n\n for (;;) {\n this.persistLogs.call([instance.id, patch.logLine])\n this.instanceLogsEE.emit(`${this.operation.id}/${instance.id}`, patch.logLine)\n\n if (!instance.parentId) {\n break\n }\n\n instance = this.workset.getInstance(instance.parentId)\n }\n return\n }\n\n const state = this.workset.updateState(patch, this.currentPhase)\n\n // do not persist anyting for preview operations\n if (this.operation.type !== \"preview\") {\n this.persistStates.call(state)\n\n if (patch.secrets) {\n this.persistSecrets.call([patch.id, patch.secrets])\n }\n }\n }\n\n private getInstancePromise(\n instanceId: string,\n fn: (logger: Logger) => Promise<void>,\n ): Promise<void> {\n let instancePromise = this.instancePromiseMap.get(instanceId)\n if (instancePromise) {\n return instancePromise\n }\n\n const logger = this.logger.child({ instanceId }, { msgPrefix: `[${instanceId}] ` })\n\n instancePromise = fn(logger).finally(() => this.instancePromiseMap.delete(instanceId))\n this.instancePromiseMap.set(instanceId, instancePromise)\n\n return instancePromise\n }\n\n private getInstanceDependencies(instance: InstanceModel): InstanceModel[] {\n const dependencies: InstanceModel[] = []\n const instanceInputs = this.workset.resolvedInstanceInputs.get(instance.id) ?? {}\n\n for (const inputs of Object.values(instanceInputs)) {\n for (const input of inputs) {\n const dependency = this.workset.getInstance(input.input.instanceId)\n\n dependencies.push(dependency)\n }\n }\n\n return dependencies\n }\n\n private persistStates = createAsyncBatcher(async (states: InstanceState[]) => {\n this.logger.debug({ msg: \"persisting states\", count: states.length })\n\n await this.stateBackend.putAffectedInstanceStates(\n this.operation.projectId,\n this.operation.id,\n states,\n )\n })\n\n private persistLogs = createAsyncBatcher(async (entries: LogEntry[]) => {\n this.logger.trace({ msg: \"persisting logs\", count: entries.length })\n\n await this.stateBackend.appendInstanceLogs(this.operation.id, entries)\n })\n\n private persistSecrets = createAsyncBatcher(\n async (entries: [string, Record<string, string>][]) => {\n this.logger.debug({ msg: \"persisting secrets\", count: entries.length })\n\n // TODO: may be batched (and patched without reading)\n for (const [instanceId, secrets] of entries) {\n const existingSecrets = await this.secretBackend.get(this.operation.projectId, instanceId)\n\n Object.assign(existingSecrets, secrets)\n\n await this.secretBackend.set(this.operation.projectId, instanceId, existingSecrets)\n }\n },\n )\n}\n","import type { LibraryBackend } from \"../library\"\nimport type { ProjectBackend } from \"../project\"\nimport type { StateBackend, StateManager } from \"../state\"\nimport type { Logger } from \"pino\"\nimport {\n isUnitModel,\n parseInstanceId,\n type ComponentModel,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { unique } from \"remeda\"\nimport { BetterLock } from \"better-lock\"\nimport {\n applyPartialInstanceState,\n createInstanceState,\n createInstanceStatePatch,\n InputHashResolver,\n InputResolver,\n type InputHashNode,\n type InputResolverNode,\n type InstanceState,\n type InstanceStateUpdate,\n type InstanceStatus,\n type LibraryModel,\n type ProjectOperation,\n type ResolvedInstanceInput,\n} from \"../shared\"\n\nexport type OperationPhase = \"update\" | \"destroy\" | \"refresh\"\n\nexport class OperationWorkset {\n private readonly instanceIdsToUpdate = new Set<string>()\n private readonly instanceIdsToDestroy = new Set<string>()\n\n private readonly instanceMap = new Map<string, InstanceModel>()\n private readonly instanceChildrenMap = new Map<string, InstanceModel[]>()\n\n private readonly initialStateMap = new Map<string, InstanceState>()\n private readonly stateMap = new Map<string, InstanceState>()\n private readonly dependentStateIdMap = new Map<string, Set<string>>()\n private readonly stateChildIdMap = new Map<string, string[]>()\n\n private readonly unitSourceHashMap = new Map<string, string>()\n\n private inputResolver!: InputResolver\n private readonly inputResolverNodes = new Map<string, InputResolverNode>()\n\n private inputHashResolver!: InputHashResolver\n private readonly inputHashNodes = new Map<string, InputHashNode>()\n private readonly inputHashResolverLock = new BetterLock()\n\n public readonly resolvedInstanceInputs = new Map<\n string,\n Record<string, ResolvedInstanceInput[]>\n >()\n\n private constructor(\n public readonly operation: ProjectOperation,\n public readonly library: LibraryModel,\n private readonly stateManager: StateManager,\n private readonly logger: Logger,\n ) {}\n\n public getInstance(instanceId: string): InstanceModel {\n const instance = this.instanceMap.get(instanceId)\n if (!instance) {\n throw new Error(`Instance with ID ${instanceId} not found in the operation workset`)\n }\n\n return instance\n }\n\n public getAffectedInstanceIds(phase: OperationPhase): string[] {\n if (phase === \"destroy\") {\n return Array.from(this.instanceIdsToDestroy)\n }\n\n return Array.from(this.instanceIdsToUpdate)\n }\n\n public getInstanceOrUndefined(instanceId: string): InstanceModel | undefined {\n return this.instanceMap.get(instanceId)\n }\n\n public isAffected(instanceId: string, phase: OperationPhase): boolean {\n if (phase === \"destroy\") {\n return this.instanceIdsToDestroy.has(instanceId)\n }\n\n return this.instanceIdsToUpdate.has(instanceId)\n }\n\n public updateState(update: InstanceStateUpdate, phase: OperationPhase): InstanceState {\n const finalState = applyPartialInstanceState(this.stateMap, update)\n this.stateManager.emitStatePatch(this.operation.projectId, createInstanceStatePatch(update))\n\n if (finalState.parentId) {\n this.recalculateCompositeInstanceState(finalState.parentId, phase)\n }\n\n return finalState\n }\n\n public setState(state: InstanceState): void {\n this.stateMap.set(state.id, state)\n this.initialStateMap.set(state.id, state)\n\n if (state.parentId) {\n let children = this.stateChildIdMap.get(state.parentId)\n if (!children) {\n children = []\n this.stateChildIdMap.set(state.parentId, children)\n }\n\n children.push(state.id)\n }\n\n for (const dependencyId of state.dependencyIds) {\n this.addDependentState(state.id, dependencyId)\n }\n }\n\n private addDependentState(instanceId: string, dependencyId: string): void {\n let dependentStates = this.dependentStateIdMap.get(dependencyId)\n\n if (!dependentStates) {\n dependentStates = new Set<string>()\n this.dependentStateIdMap.set(dependencyId, dependentStates)\n }\n\n dependentStates.add(instanceId)\n }\n\n public restoreInitialStatus(instanceId: string): void {\n const state = this.stateMap.get(instanceId)\n const initialState = this.initialStateMap.get(instanceId)\n\n if (!state || !initialState) {\n this.logger.warn(\n `cannot reset status for instance \"${instanceId}\" because it is not in the state map`,\n )\n return\n }\n\n this.stateMap.set(instanceId, { ...initialState, status: initialState.status })\n }\n\n public emitAffectedInitialStates(): void {\n for (const state of this.initialStateMap.values()) {\n if (this.instanceIdsToUpdate.has(state.id)) {\n this.stateManager.emitStatePatch(this.operation.projectId, state)\n }\n }\n }\n\n public getAffectedCompositeChildren(instanceId: string, phase: OperationPhase): InstanceModel[] {\n const children = this.instanceChildrenMap.get(instanceId)\n if (!children) {\n return []\n }\n\n if (phase === \"destroy\") {\n return children.filter(child => this.instanceIdsToDestroy.has(child.id))\n }\n\n return children.filter(child => this.instanceIdsToUpdate.has(child.id))\n }\n\n public getState(instanceId: string): InstanceState | undefined {\n return this.stateMap.get(instanceId)\n }\n\n public getParentId(instanceId: string, phase: OperationPhase): string | null {\n if (phase === \"destroy\") {\n const state = this.stateMap.get(instanceId)\n if (!state) {\n return null\n }\n\n return state.parentId\n }\n\n const instance = this.getInstance(instanceId)\n\n return instance.parentId ?? null\n }\n\n public getDependentStates(instanceId: string): 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 private recalculateCompositeInstanceState(instanceId: string, phase: OperationPhase): void {\n const state = this.stateMap.get(instanceId) ?? createInstanceState(instanceId)\n let currentResourceCount = 0\n let totalResourceCount = 0\n\n const children = this.stateChildIdMap.get(instanceId) ?? []\n for (const childId of children) {\n const child = this.stateMap.get(childId)\n\n if (child?.currentResourceCount) {\n currentResourceCount += child.currentResourceCount\n }\n\n if (child?.totalResourceCount) {\n totalResourceCount += child.totalResourceCount\n }\n }\n\n const updatedState = {\n ...state,\n status: OperationWorkset.getStatusByOperationPhase(phase),\n currentResourceCount,\n totalResourceCount,\n }\n\n this.stateMap.set(instanceId, updatedState)\n this.stateManager.emitStatePatch(this.operation.projectId, updatedState)\n\n if (state.parentId) {\n this.recalculateCompositeInstanceState(state.parentId, phase)\n }\n }\n\n private addInstance(instance: InstanceModel): 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 (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 async calculateInstanceIdsToUpdate(): Promise<void> {\n const traverse = async (instanceId: string) => {\n if (this.instanceIdsToUpdate.has(instanceId)) {\n return\n }\n\n const instance = this.instanceMap.get(instanceId)\n if (!instance) {\n return\n }\n\n const instanceInputs = this.resolvedInstanceInputs.get(instance.id) ?? {}\n\n for (const inputs of Object.values(instanceInputs)) {\n for (const input of inputs) {\n await traverse(input.input.instanceId)\n }\n }\n\n const state = this.stateMap.get(instance.id)\n const { inputHash: expectedInputHash } = this.inputHashResolver.requireOutput(instance.id)\n\n if (this.operation.options.forceUpdateDependencies) {\n this.instanceIdsToUpdate.add(instanceId)\n return\n }\n\n if (state?.status !== \"created\" || state.inputHash !== expectedInputHash) {\n this.instanceIdsToUpdate.add(instanceId)\n }\n }\n\n // 1. extend affected instance IDs with their not-created or not-up-to-date dependencies (only for \"update\" operations)\n for (const instanceId of this.operation.requestedInstanceIds) {\n if (this.operation.type === \"update\") {\n await traverse(instanceId)\n }\n\n this.instanceIdsToUpdate.add(instanceId)\n }\n\n // 2. extend affected instance IDs with the children of the affected composite instances\n const compositeInstanceQueue = Array.from(this.instanceIdsToUpdate)\n while (compositeInstanceQueue.length > 0) {\n const childId = compositeInstanceQueue.pop()!\n const children = this.instanceChildrenMap.get(childId) ?? []\n\n for (const child of children) {\n compositeInstanceQueue.push(child.id)\n\n if (this.operation.options.forceUpdateChildren) {\n this.instanceIdsToUpdate.add(child.id)\n continue\n }\n\n const state = this.stateMap.get(child.id)\n const { inputHash: expectedInputHash } = this.inputHashResolver.requireOutput(child.id)\n\n if (state?.status !== \"created\" || state.inputHash !== expectedInputHash) {\n this.instanceIdsToUpdate.add(child.id)\n }\n }\n }\n\n // 3. detect composite instance children and include their parents (recursively)\n for (const instanceId of this.instanceIdsToUpdate) {\n let instance = this.instanceMap.get(instanceId)\n while (instance?.parentId) {\n this.instanceIdsToUpdate.add(instance.parentId)\n instance = this.instanceMap.get(instance.parentId)\n }\n }\n\n this.operation.instanceIdsToUpdate = Array.from(this.instanceIdsToUpdate)\n }\n\n private calculateInstanceIdsToDestroy() {\n const traverse = (instanceKey: string) => {\n if (this.instanceIdsToDestroy.has(instanceKey)) {\n return\n }\n\n const state = this.stateMap.get(instanceKey)\n if (!state || state.status === \"not_created\") {\n return\n }\n\n const dependentIds = this.dependentStateIdMap.get(instanceKey) ?? []\n\n for (const dependentId of dependentIds) {\n traverse(dependentId)\n this.instanceIdsToDestroy.add(dependentId)\n }\n }\n\n if (this.operation.type === \"destroy\" || this.operation.type === \"recreate\") {\n // 1.a. extend affected instance IDs with their created dependents (if not forbidden by the operation options)\n for (const instanceId of this.operation.requestedInstanceIds) {\n const instance = this.instanceMap.get(instanceId)\n if (!instance) {\n throw new Error(`Instance not found: ${instanceId}`)\n }\n\n if (this.operation.options.destroyDependentInstances) {\n traverse(instance.id)\n }\n\n this.instanceIdsToDestroy.add(instanceId)\n }\n } else if (this.operation.type === \"update\") {\n // 1.b. find all children instances of the affected to-update instances which are in the state map, but not in the instance map\n // in other words, this code cleans up child instances which are not produced by composite instances anymore\n\n for (const instanceId of this.operation.instanceIdsToUpdate) {\n const [type] = parseInstanceId(instanceId)\n const component = this.library.components[type]\n\n if (!component || isUnitModel(component)) {\n // ignore non-composite instances\n continue\n }\n\n const childrenQueue = [...(this.stateChildIdMap.get(instanceId) ?? [])]\n\n while (childrenQueue.length > 0) {\n const childId = childrenQueue.pop()!\n if (!this.instanceMap.has(childId)) {\n this.instanceIdsToDestroy.add(childId)\n }\n\n childrenQueue.push(...(this.stateChildIdMap.get(childId) ?? []))\n }\n }\n } else {\n return\n }\n\n // 2. extend affected instance IDs with the children of the affected composite instances\n const compositeInstanceQueue = Array.from(this.instanceIdsToDestroy)\n while (compositeInstanceQueue.length > 0) {\n const childId = compositeInstanceQueue.pop()!\n const children = this.stateChildIdMap.get(childId) ?? []\n\n for (const child of children) {\n compositeInstanceQueue.push(child)\n this.instanceIdsToDestroy.add(child)\n }\n }\n\n // 3. detect composite instance children and include their parents (recursively)\n for (const instanceId of this.instanceIdsToDestroy) {\n let state = this.stateMap.get(instanceId)\n while (state?.parentId) {\n this.instanceIdsToDestroy.add(state.parentId)\n state = this.stateMap.get(state.parentId)\n }\n }\n\n this.operation.instanceIdsToDestroy = Array.from(this.instanceIdsToDestroy)\n }\n\n private getSourceHashIfApplicable(\n instance: InstanceModel,\n component: ComponentModel,\n ): string | undefined {\n if (isUnitModel(component)) {\n return this.unitSourceHashMap.get(instance.type)\n }\n\n return undefined\n }\n\n private static getStatusByOperationPhase(phase: OperationPhase): InstanceStatus {\n switch (phase) {\n case \"update\":\n return \"updating\"\n case \"destroy\":\n return \"destroying\"\n case \"refresh\":\n return \"refreshing\"\n }\n }\n\n public async getUpToDateInputHash(instance: InstanceModel): Promise<string> {\n return await 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.invalidate(instance.id)\n await this.inputHashResolver.process()\n\n const { inputHash } = this.inputHashResolver.requireOutput(instance.id)\n return inputHash\n })\n }\n\n public getLockInstanceIds(): string[] {\n return Array.from(this.instanceIdsToUpdate.union(this.instanceIdsToDestroy))\n }\n\n public static async load(\n operation: ProjectOperation,\n projectBackend: ProjectBackend,\n libraryBackend: LibraryBackend,\n stateBackend: StateBackend,\n stateManager: StateManager,\n logger: Logger,\n signal: AbortSignal,\n ): Promise<OperationWorkset> {\n const [library, project, compositeInstances, states] = await Promise.all([\n libraryBackend.loadLibrary(signal),\n projectBackend.getProject(operation.projectId, signal),\n stateBackend.getCompositeInstances(operation.projectId, signal),\n stateBackend.getAllInstanceStates(operation.projectId, signal),\n ])\n\n const workset = new OperationWorkset(\n operation,\n library,\n stateManager,\n logger.child({ operationId: operation.id, service: \"OperationWorkset\" }),\n )\n\n // prepare instances\n for (const instance of project.instances) {\n workset.addInstance(instance)\n }\n\n for (const instance of compositeInstances) {\n const worksetInstance = workset.instanceMap.get(instance.instance.id)\n\n if (worksetInstance) {\n worksetInstance.outputs = instance.instance.outputs\n worksetInstance.resolvedOutputs = instance.instance.resolvedOutputs\n } else if (instance.instance.parentId) {\n workset.addInstance(instance.instance)\n } else {\n workset.logger.warn(\n `ignoring instance \"${instance.instance.id}\" from composite instance state because it is not in the project or is not a part of known composite instance`,\n )\n continue\n }\n\n for (const child of instance.children) {\n if (!workset.instanceMap.has(child.id)) {\n workset.addInstance(child)\n }\n }\n }\n\n const unitSources = await libraryBackend.getResolvedUnitSources(\n unique(Array.from(workset.instanceMap.values().map(i => i.type))),\n )\n\n for (const unitSource of unitSources) {\n workset.unitSourceHashMap.set(unitSource.unitType, unitSource.sourceHash)\n }\n\n for (const state of states) {\n if (!workset.instanceMap.has(state.id)) {\n workset.logger.warn(\n `ignoring instance \"${state.id}\" from state because it is not in the project or is not a part of a composite instance`,\n )\n continue\n }\n\n workset.setState(state)\n }\n\n // prepare input resolver\n for (const instance of workset.instanceMap.values()) {\n workset.inputResolverNodes.set(`instance:${instance.id}`, {\n kind: \"instance\",\n instance,\n component: library.components[instance.type],\n })\n }\n\n for (const hub of project.hubs) {\n workset.inputResolverNodes.set(`hub:${hub.id}`, { kind: \"hub\", hub })\n }\n\n workset.inputResolver = new InputResolver(workset.inputResolverNodes, logger)\n workset.inputResolver.addAllNodesToWorkset()\n\n await workset.inputResolver.process()\n\n // resolve inputs for all instances and pass outputs to input hash resolver\n for (const instance of workset.instanceMap.values()) {\n const output = workset.inputResolver.requireOutput(`instance:${instance.id}`)\n if (output.kind !== \"instance\") {\n throw new Error(\"Unexpected output kind\")\n }\n\n workset.resolvedInstanceInputs.set(instance.id, output.resolvedInputs)\n\n const component = workset.library.components[instance.type]\n\n workset.inputHashNodes.set(instance.id, {\n instance,\n component,\n resolvedInputs: output.resolvedInputs,\n state: workset.stateMap.get(instance.id),\n sourceHash: workset.getSourceHashIfApplicable(instance, component),\n })\n }\n\n // prepare input hash resolver\n workset.inputHashResolver = new InputHashResolver(workset.inputHashNodes, logger)\n workset.inputHashResolver.addAllNodesToWorkset()\n\n await workset.inputHashResolver.process()\n\n if (operation.type !== \"destroy\") {\n await workset.calculateInstanceIdsToUpdate()\n }\n\n workset.calculateInstanceIdsToDestroy()\n\n return workset\n }\n}\n","import type { RunnerBackend } from \"./runner\"\nimport { pino, type Logger } from \"pino\"\nimport { createWorkspaceBackend, type WorkspaceBackend } from \"./workspace\"\nimport { createStateBackend, StateManager, type StateBackend } from \"./state\"\nimport { type Config, loadConfig } from \"./config\"\nimport { type LibraryBackend, createLibraryBackend } from \"./library\"\nimport { OperationManager } from \"./orchestrator\"\nimport {\n type ProjectBackend,\n ProjectLockManager,\n ProjectManager,\n createProjectBackend,\n} from \"./project\"\nimport { createRunnerBackend } from \"./runner\"\nimport { type SecretBackend, createSecretBackend } from \"./secret\"\nimport { type TerminalBackend, TerminalManager, createTerminalBackend } from \"./terminal\"\nimport { LocalPulumiHost } from \"./common\"\n\nexport type Services = {\n readonly logger: Logger\n readonly libraryBackend: LibraryBackend\n readonly secretBackend: SecretBackend\n readonly runnerBackend: RunnerBackend\n readonly projectBackend: ProjectBackend\n readonly projectManager: ProjectManager\n readonly stateBackend: StateBackend\n readonly stateManager: StateManager\n readonly operationManager: OperationManager\n readonly terminalBackend: TerminalBackend\n readonly terminalManager: TerminalManager\n readonly workspaceBackend: WorkspaceBackend\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 logger,\n libraryBackend,\n secretBackend,\n runnerBackend,\n projectBackend,\n projectManager,\n stateBackend,\n stateManager,\n operationManager,\n terminalBackend,\n terminalManager,\n workspaceBackend,\n } = {},\n}: CreateServicesOptions = {}): Promise<Services> {\n config ??= await loadConfig()\n\n logger ??= pino({\n name: config.HIGHSTATE_BACKEND_LOGGER_NAME,\n level: config.HIGHSTATE_BACKEND_LOGGER_LEVEL,\n errorKey: \"error\",\n })\n\n const localPulumiHost = LocalPulumiHost.create(logger)\n const projectLockManager = new ProjectLockManager()\n\n stateManager ??= new StateManager()\n\n libraryBackend ??= await createLibraryBackend(config, logger)\n secretBackend ??= await createSecretBackend(config, localPulumiHost, logger)\n stateBackend ??= await createStateBackend(config, localPulumiHost, logger)\n runnerBackend ??= createRunnerBackend(config, localPulumiHost, libraryBackend)\n projectBackend ??= await createProjectBackend(config)\n\n terminalBackend ??= createTerminalBackend(config, logger)\n terminalManager ??= TerminalManager.create(terminalBackend, stateBackend, runnerBackend, logger)\n\n operationManager ??= await OperationManager.create(\n runnerBackend,\n stateBackend,\n libraryBackend,\n projectBackend,\n secretBackend,\n projectLockManager,\n stateManager,\n logger,\n )\n\n projectManager ??= ProjectManager.create(\n projectBackend,\n stateBackend,\n libraryBackend,\n projectLockManager,\n stateManager,\n logger,\n )\n\n workspaceBackend ??= await createWorkspaceBackend(config)\n\n logger.info(\"services created\")\n\n return {\n logger,\n libraryBackend,\n secretBackend,\n runnerBackend,\n projectBackend,\n projectManager,\n stateBackend,\n stateManager,\n operationManager,\n terminalBackend,\n terminalManager,\n workspaceBackend,\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"],"mappings":"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","names":["z","z","z","z","z","z","z","z","readFile","resolve","z","z","readFile","resolve","z","BetterLock","EventEmitter","on","isUnitModel","EventEmitter","on","isUnitModel","instances","inputHashResolver","z","resolve","mkdir","writeFile","z","runScript","z","resolve","mkdir","writeFile","runScript","process","z","EventEmitter","on","EventEmitter","on","z","EventEmitter","on","resolve","getInstanceId","mapValues","pickBy","z","z","EventEmitter","on","getInstanceId","mapValues","pickBy","source","resolve","z","z","resolve","z","z","resolve","z","EventEmitter","on","z","resolve","z","z","z","EventEmitter","on","uuidv7","isUnitModel","parseInstanceId","mapValues","isUnitModel","parseInstanceId","unique","BetterLock","BetterLock","parseInstanceId","isUnitModel","unique","parseInstanceId","isUnitModel","mapValues","EventEmitter","on","uuidv7"]}
1
+ {"version":3,"sources":["../src/library/factory.ts","../src/library/local.ts","../src/config.ts","../src/project/factory.ts","../src/project/local.ts","../src/project/manager.ts","../src/terminal/factory.ts","../src/terminal/docker.ts","../src/terminal/run.sh.ts","../src/terminal/manager.ts","../src/runner/factory.ts","../src/runner/local.ts","../src/runner/pulumi.ts","../src/runner/force-abort.ts","../src/runner/artifact-env.ts","../src/state/abstractions.ts","../src/state/factory.ts","../src/state/local/collection.ts","../src/state/local/backend.ts","../src/state/manager.ts","../src/state/encryption.ts","../src/state/repository/repository.ts","../src/state/repository/repository.index.ts","../src/state/keyring.ts","../src/artifact/factory.ts","../src/artifact/local.ts","../src/artifact/encryption.ts","../src/business/artifact.ts","../src/pubsub/factory.ts","../src/pubsub/local.ts","../src/pubsub/manager.ts","../src/lock/factory.ts","../src/lock/memory.ts","../src/lock/manager.ts","../src/hotstate/factory.ts","../src/hotstate/memory.ts","../src/hotstate/manager.ts","../src/worker/factory.ts","../src/worker/docker.ts","../src/worker/manager.ts","../src/orchestrator/manager.ts","../src/orchestrator/operation.ts","../src/orchestrator/operation-workset.ts","../src/services.ts","../src/business/api-key.ts","../src/business/backend-unlock.ts","../src/business/instance-lock.ts","../src/business/instance-state.ts","../src/business/operation.ts","../src/business/project-unlock.ts","../src/business/secret.ts","../src/business/worker.ts"],"sourcesContent":["import type { LibraryBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\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 { InstanceEvaluationResult, LibraryBackend, ResolvedUnitSource } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport type {\n PackageResolutionResponse,\n PackageResolutionWorkerData,\n} from \"./package-resolution-worker\"\nimport type { WorkerData, WorkerResponse } from \"./worker/protocol\"\nimport { fileURLToPath } from \"node:url\"\nimport { EventEmitter, on } from \"node:events\"\nimport { Worker } from \"node:worker_threads\"\nimport { resolve } from \"node:path\"\nimport { readFile } from \"node:fs/promises\"\nimport { type InstanceModel, isUnitModel } from \"@highstate/contract\"\nimport Watcher from \"watcher\"\nimport { BetterLock } from \"better-lock\"\nimport { resolve as importMetaResolve } from \"import-meta-resolve\"\nimport { z } from \"zod\"\nimport { readPackageJSON } from \"pkg-types\"\nimport { runScript, installDependencies, addDependency } from \"nypm\"\nimport { flatMap, groupBy, map, pipe, unique } from \"remeda\"\nimport { decode } from \"@msgpack/msgpack\"\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_PACKAGES: stringArrayType.default(\"@highstate/library\"),\n HIGHSTATE_LIBRARY_BACKEND_LOCAL_WATCH_PATHS: stringArrayType.optional(),\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 dependencies: Set<string>\n dependents: Set<string>\n}\n\nexport class LocalLibraryBackend implements LibraryBackend {\n private readonly watcher: Watcher\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\n private constructor(\n private readonly libraryPackages: string[],\n watchPaths: string[],\n private readonly logger: Logger,\n ) {\n this.watcher = new Watcher(watchPaths, {\n recursive: true,\n ignoreInitial: true,\n ignore: /\\.git|node_modules|dist/,\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 () => {\n return await this.getLibrary()\n })\n }\n\n async *watchLibrary(_libraryId: string, signal?: AbortSignal): AsyncIterable<LibraryUpdate[]> {\n // For local backend, we ignore libraryId since there's only one library\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 local backend, we ignore libraryId since there's only one library\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 instanceIds: string[],\n ): Promise<InstanceEvaluationResult[]> {\n this.logger.info(\"evaluating %d composite instances\", instanceIds.length)\n\n const worker = this.createLibraryWorker({\n libraryModulePaths: this.libraryPackages,\n allInstances,\n resolvedInputs,\n instanceIds,\n })\n\n for await (const [event] of on(worker, \"message\")) {\n const eventData = event as WorkerResponse\n\n if (eventData.type === \"error\") {\n throw new Error(`Worker error: ${eventData.error}`)\n }\n\n this.logger.info(\"composite instances evaluated successfully\")\n return eventData.results\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.debug(`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 async rebuildLibraryPackage(\n libraryPackage: LibraryPackage,\n installDeps = false,\n updateDeps = false,\n rebuiltPackages = new Set<string>(),\n ): Promise<void> {\n if (rebuiltPackages.has(libraryPackage.name)) {\n return\n }\n\n rebuiltPackages.add(libraryPackage.name)\n\n if (installDeps) {\n this.logger.info(`installing dependencies for package \"${libraryPackage.name}\"`)\n await installDependencies({ cwd: libraryPackage.rootPath })\n }\n\n if (updateDeps) {\n await this.updateLibraryPackageDependencies(libraryPackage)\n }\n\n this.logger.info(`rebuilding library package \"${libraryPackage.name}\" via build script`)\n await runScript(\"build\", { cwd: libraryPackage.rootPath })\n\n if (!this.libraryPackages.includes(libraryPackage.name)) {\n await this.reloadUnitManifest(libraryPackage)\n }\n\n await this.rebuildLibraryPackageDependents(libraryPackage, rebuiltPackages)\n }\n\n private async updateLibraryPackageDependencies(libraryPackage: LibraryPackage): Promise<void> {\n const packageJson = await readPackageJSON(libraryPackage.rootPath)\n const parsedName = LocalLibraryBackend.parseDependencyName(libraryPackage.name)\n\n const dependencyPackageNames = pipe(\n [packageJson.dependencies, packageJson.peerDependencies],\n flatMap(deps => Object.keys(deps ?? {})),\n unique(),\n map(LocalLibraryBackend.parseDependencyName),\n )\n\n const sameScopeDependencies = dependencyPackageNames.filter(\n dep => dep.scope === parsedName.scope && dep.name !== parsedName.name,\n )\n\n await this.ensureLibraryPackagesLoaded(sameScopeDependencies.map(dep => dep.name))\n\n for (const dependency of sameScopeDependencies) {\n const dependencyPackage = this.packages.get(dependency.name)\n if (!dependencyPackage) {\n this.logger.warn(`dependency package not found for graph update: \"%s\"`, dependency.name)\n continue\n }\n\n libraryPackage.dependencies.add(dependency.name)\n dependencyPackage.dependents.add(libraryPackage.name)\n }\n }\n\n private async rebuildLibraryPackageDependents(\n libraryPackage: LibraryPackage,\n rebuiltPackages = new Set<string>(),\n ): Promise<void> {\n const promises: Promise<void>[] = []\n\n for (const dependent of libraryPackage.dependents) {\n const dependentPackage = this.packages.get(dependent)\n if (!dependentPackage) {\n this.logger.warn(`dependent package not found for rebuild: \"%s\"`, dependent)\n continue\n }\n\n promises.push(this.rebuildLibraryPackage(dependentPackage, false, false, rebuiltPackages))\n }\n\n await Promise.all(promises)\n }\n\n private static parseDependencyName(this: void, dependency: string) {\n if (dependency.startsWith(\"@\")) {\n const parts = dependency.split(\"/\")\n\n return {\n name: dependency,\n scope: parts[0],\n }\n }\n\n return {\n name: dependency,\n scope: null,\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 const packagesToUpdate: LibraryPackage[] = []\n\n const worker = this.createPackageResolutionWorker({ packageNames: names })\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: LibraryPackage = {\n name: result.packageName,\n rootPath: result.packageRootPath,\n dependencies: new Set(),\n dependents: new Set(),\n }\n\n this.packages.set(result.packageName, libraryPackage)\n packagesToUpdate.push(libraryPackage)\n\n this.logger.info(`loaded library package: \"%s\"`, result.packageName)\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 for (const libraryPackage of packagesToUpdate) {\n await this.updateLibraryPackageDependencies(libraryPackage)\n\n if (\n !this.libraryPackages.includes(libraryPackage.name) &&\n libraryPackage.name !== \"@highstate/contract\"\n ) {\n await this.reloadUnitManifest(libraryPackage)\n }\n }\n\n if (installIfNotFound && missingPackages.length > 0) {\n this.logger.info(\"installing missing library packages: %s\", missingPackages.join(\", \"))\n await addDependency(missingPackages)\n await this.loadLibraryPackages(missingPackages)\n }\n }\n\n private async handleFileEvent(path: string): Promise<void> {\n await this.lock.acquire(async () => {\n const libraryPackage = this.packages.values().find(pkg => path.startsWith(pkg.rootPath))\n\n if (!libraryPackage) {\n return\n }\n\n const builtPackages = new Set<string>()\n await this.rebuildLibraryPackage(libraryPackage, false, false, builtPackages)\n\n if (this.libraryPackages.some(pkg => builtPackages.has(pkg))) {\n this.logger.info(\"reloading library due to file change in package: %s\", libraryPackage.name)\n await this.reloadLibrary()\n }\n })\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 let watchPaths = config.HIGHSTATE_LIBRARY_BACKEND_LOCAL_WATCH_PATHS\n if (!watchPaths) {\n const [projectPath] = await resolveMainLocalProject()\n watchPaths = [resolve(projectPath, \"packages\")]\n }\n\n return new LocalLibraryBackend(\n config.HIGHSTATE_LIBRARY_BACKEND_LOCAL_PACKAGES,\n watchPaths,\n logger.child({ backend: \"LibraryBackend\", service: \"LocalLibraryBackend\" }),\n )\n }\n}\n","import { z } from \"zod\"\nimport { libraryBackendConfig } from \"./library\"\nimport { projectBackendConfig } from \"./project\"\nimport { terminalBackendConfig } from \"./terminal\"\nimport { runnerBackendConfig } from \"./runner\"\nimport { stateBackendConfig, stateManagerConfig } from \"./state\"\nimport { artifactBackendConfig } from \"./artifact\"\nimport { pubSubBackendConfig } from \"./pubsub\"\nimport { lockBackendConfig } from \"./lock\"\nimport { hotStateBackendConfig } from \"./hotstate\"\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 ...hotStateBackendConfig.shape,\n ...pubSubBackendConfig.shape,\n ...lockBackendConfig.shape,\n ...libraryBackendConfig.shape,\n ...projectBackendConfig.shape,\n ...stateBackendConfig.shape,\n ...stateManagerConfig.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 return configSchema.parse(env)\n}\n","import { z } from \"zod\"\nimport { localProjectBackendConfig, LocalProjectBackend } from \"./local\"\n\nexport const projectBackendConfig = z.object({\n HIGHSTATE_PROJECT_BACKEND_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localProjectBackendConfig.shape,\n})\n\nexport function createProjectBackend(config: z.infer<typeof projectBackendConfig>) {\n return LocalProjectBackend.create(config)\n}\n","import type { ProjectBackend } from \"./abstractions\"\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\"\nimport { resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport {\n getInstanceId,\n type HubInput,\n type InstanceInput,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { stringify, parse } from \"yaml\"\nimport { BetterLock } from \"better-lock\"\nimport {\n type HubModel,\n type HubModelPatch,\n hubModelSchema,\n type InstanceModelPatch,\n instanceModelSchema,\n type Project,\n type ProjectModel,\n} from \"../shared\"\nimport { resolveMainLocalProject } from \"../common\"\n\nexport const localProjectBackendConfig = z.object({\n HIGHSTATE_PROJECT_BACKEND_LOCAL_DIR: z.string().optional(),\n})\n\nconst localProjectDataSchema = z.object({\n libraryId: z.string().optional(),\n instances: z.record(instanceModelSchema),\n hubs: z.record(hubModelSchema),\n})\n\n/**\n * A project backend that stores the projects locally on disk.\n *\n * By default, the projects are stored in the `projects` directory near the \"package.json\" file.\n */\nexport class LocalProjectBackend implements ProjectBackend {\n private readonly lock = new BetterLock()\n\n constructor(private readonly projectsDir: string) {}\n\n async getProjectIds(): Promise<string[]> {\n try {\n const files = await readdir(this.projectsDir)\n\n return files.filter(file => file.endsWith(\".yaml\")).map(file => file.replace(/\\.yaml$/, \"\"))\n } catch (error) {\n throw new Error(\"Failed to get project names\", { cause: error })\n }\n }\n\n async getProjectInfo(projectId: string): Promise<Project> {\n try {\n const project = await this.loadProject(projectId)\n\n return {\n id: projectId,\n meta: {},\n libraryId: project.libraryId ?? \"local\",\n }\n } catch (error) {\n throw new Error(\"Failed to get project info\", { cause: error })\n }\n }\n\n async getProject(projectId: string): Promise<ProjectModel> {\n try {\n const project = await this.loadProject(projectId)\n\n return {\n instances: Object.values(project.instances),\n hubs: Object.values(project.hubs),\n }\n } catch (error) {\n throw new Error(\"Failed to get project instances\", { cause: error })\n }\n }\n\n async createProject(projectId: string, libraryId: string = \"local\"): Promise<void> {\n try {\n // validate libraryId for local backend\n if (libraryId !== \"local\") {\n throw new Error(`Local backend only supports libraryId \"local\", got \"${libraryId}\"`)\n }\n\n await this.withProject(projectId, () => {\n // Create an empty project\n return { libraryId, instances: {}, hubs: {} }\n })\n } catch (error) {\n throw new Error(\"Failed to create project\", { cause: error })\n }\n }\n\n async createInstance(projectId: string, instance: InstanceModel): Promise<InstanceModel> {\n try {\n return await this.withProject(projectId, project => {\n if (project.instances[instance.id]) {\n throw new Error(`Instance ${instance.id} already exists`)\n }\n\n project.instances[instance.id] = instance\n return instance\n })\n } catch (error) {\n throw new Error(\"Failed to create project instance\", { cause: error })\n }\n }\n\n async updateInstance(\n projectId: string,\n instanceId: string,\n patch: InstanceModelPatch,\n ): Promise<InstanceModel> {\n try {\n return await this.withInstance(projectId, instanceId, instance => {\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 return instance\n })\n } catch (error) {\n throw new Error(\"Failed to update project instance\", { cause: error })\n }\n }\n\n async deleteInstance(projectId: string, instanceId: string): Promise<void> {\n try {\n await this.withProject(projectId, project => {\n if (!project.instances[instanceId]) {\n throw new Error(`Instance ${instanceId} not found`)\n }\n\n delete project.instances[instanceId]\n\n // Delete all inputs of instances that reference deleted instance\n for (const otherInstance of Object.values(project.instances) as InstanceModel[]) {\n if (!otherInstance.inputs) {\n continue\n }\n\n this.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 Object.values(project.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 } catch (error) {\n throw new Error(\"Failed to delete project instance\", { cause: error })\n }\n }\n\n private 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 async renameInstance(\n projectId: string,\n instanceId: string,\n newName: string,\n ): Promise<InstanceModel> {\n try {\n return await this.withProject(projectId, project => {\n // Rename the instance\n const instance = project.instances[instanceId]\n if (!instance) {\n throw new Error(`Instance ${instanceId} not found`)\n }\n\n const newInstanceId = getInstanceId(instance.type, newName)\n if (project.instances[newInstanceId]) {\n throw new Error(`Instance ${newInstanceId} already exists`)\n }\n\n delete project.instances[instanceId]\n instance.id = newInstanceId\n instance.name = newName\n project.instances[newInstanceId] = instance\n\n // Update all references to the instance from other instances\n for (const otherInstance of Object.values(project.instances) as InstanceModel[]) {\n for (const inputs of Object.values(otherInstance.inputs ?? {})) {\n this.renameInstanceReferences(inputs, instanceId, instance.id)\n }\n }\n\n // Update all references to the instance from hubs\n for (const hub of Object.values(project.hubs)) {\n this.renameInstanceReferences(hub.inputs ?? [], instanceId, instance.id)\n }\n\n return instance\n })\n } catch (error) {\n throw new Error(\"Failed to rename project instance\", { cause: error })\n }\n }\n\n private renameInstanceReferences(\n inputs: InstanceInput[],\n instanceId: string,\n newInstanceId: string,\n ): void {\n for (const input of inputs) {\n if (input.instanceId === instanceId) {\n input.instanceId = newInstanceId\n }\n }\n }\n\n async createHub(projectId: string, hub: HubModel): Promise<HubModel> {\n try {\n return await this.withProject(projectId, project => {\n if (project.hubs[hub.id]) {\n throw new Error(`Hub ${hub.id} already exists`)\n }\n\n project.hubs[hub.id] = hub\n return hub\n })\n } catch (error) {\n throw new Error(\"Failed to create project hub\", { cause: error })\n }\n }\n\n async updateHub(projectId: string, hubId: string, patch: HubModelPatch): Promise<HubModel> {\n try {\n return await this.withProject(projectId, project => {\n const hub = project.hubs[hubId]\n if (!hub) {\n throw new Error(`Hub ${hubId} not found`)\n }\n\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 return hub\n })\n } catch (error) {\n throw new Error(\"Failed to update project hub\", { cause: error })\n }\n }\n\n async deleteHub(projectId: string, hubId: string): Promise<void> {\n try {\n await this.withProject(projectId, project => {\n if (!project.hubs[hubId]) {\n throw new Error(`Hub ${hubId} not found`)\n }\n\n delete project.hubs[hubId]\n\n // Delete all inputs of instances that reference deleted hub\n for (const instance of Object.values(project.instances) as InstanceModel[]) {\n if (instance.hubInputs) {\n this.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(\n input => input.hubId !== hubId,\n )\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 Object.values(project.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 } catch (error) {\n throw new Error(\"Failed to delete project hub\", { cause: error })\n }\n }\n\n async createManyNodes(\n projectId: string,\n instances: InstanceModel[],\n hubs: HubModel[],\n ): Promise<void> {\n try {\n await this.withProject(projectId, project => {\n // Ensure that instances and hubs do not conflict with existing ones\n for (const instance of instances) {\n if (project.instances[instance.id]) {\n throw new Error(`Instance ${instance.id} already exists`)\n }\n project.instances[instance.id] = instance\n }\n\n for (const hub of hubs) {\n if (project.hubs[hub.id]) {\n throw new Error(`Hub ${hub.id} already exists`)\n }\n project.hubs[hub.id] = hub\n }\n\n return {}\n })\n } catch (error) {\n throw new Error(\"Failed to create many nodes in project\", { cause: error })\n }\n }\n\n private 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 private getProjectPath(projectId: string) {\n return `${this.projectsDir}/${projectId}.yaml`\n }\n\n private async loadProject(projectId: string) {\n const projectPath = this.getProjectPath(projectId)\n\n try {\n const content = await readFile(projectPath, \"utf-8\")\n\n return localProjectDataSchema.parse(parse(content))\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return { libraryId: \"local\", instances: {}, hubs: {} }\n }\n\n throw error\n }\n }\n\n private async writeProject(projectId: string, project: z.infer<typeof localProjectDataSchema>) {\n const projectPath = this.getProjectPath(projectId)\n const content = stringify(project, undefined, 2)\n\n await writeFile(projectPath, content)\n }\n\n private async withInstance<T>(\n projectId: string,\n instanceId: string,\n callback: (instance: InstanceModel) => T,\n ): Promise<T> {\n return await this.withProject(projectId, project => {\n const instance = project.instances[instanceId]\n if (!instance) {\n throw new Error(`Instance ${instanceId} not found`)\n }\n\n return callback(instance)\n })\n }\n\n private async withProject<T>(\n projectId: string,\n callback: (project: z.infer<typeof localProjectDataSchema>) => T,\n ): Promise<T> {\n return await this.lock.acquire(projectId, async () => {\n const project = await this.loadProject(projectId)\n\n const result = callback(project)\n await this.writeProject(projectId, project)\n\n return result\n })\n }\n\n public static async create(config: z.infer<typeof localProjectBackendConfig>) {\n let projectsPath = config.HIGHSTATE_PROJECT_BACKEND_LOCAL_DIR\n if (!projectsPath) {\n const [mainProjectPath] = await resolveMainLocalProject()\n projectsPath = resolve(mainProjectPath, \"projects\")\n }\n\n await mkdir(projectsPath, { recursive: true })\n\n return new LocalProjectBackend(projectsPath)\n }\n}\n","import type { StateManager } from \"../state\"\nimport type { ProjectBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport type { InstanceEvaluationResult, LibraryBackend } from \"../library\"\nimport type { InstanceLockService } from \"../business\"\nimport type { PubSubManager } from \"../pubsub\"\nimport { randomUUID } from \"node:crypto\"\nimport { isUnitModel, type InstanceModel } from \"@highstate/contract\"\nimport {\n type InputResolverNode,\n type InputHashNode,\n type InstanceModelPatch,\n type CompositeInstance,\n type ResolvedInstanceInput,\n type HubModel,\n type LibraryUpdate,\n InputResolver,\n InputHashResolver,\n} from \"../shared\"\nimport { renderTree, type TreeNode } from \"../common\"\n\nexport type FullProjectModel = {\n libraryId: string\n instances: InstanceModel[]\n hubs: HubModel[]\n compositeInstances: CompositeInstance[]\n}\n\nexport class ProjectManager {\n private readonly watchedLibraries = new Set<string>()\n private readonly libraryWatchers = new Map<string, AbortController>()\n\n private constructor(\n private readonly projectBackend: ProjectBackend,\n private readonly libraryBackend: LibraryBackend,\n private readonly stateManager: StateManager,\n private readonly instanceLockService: InstanceLockService,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Loads the full info of a project, including instances, hubs, and composite instances.\n *\n * Also filters out instances that are not in the library.\n *\n * @param projectId The ID of the project to load.\n */\n async getProject(projectId: string): Promise<FullProjectModel> {\n const [projectInfo, project] = await Promise.all([\n this.projectBackend.getProjectInfo(projectId),\n this.projectBackend.getProject(projectId),\n ])\n\n // Ensure we're watching this library for changes\n this.ensureLibraryWatched(projectInfo.libraryId)\n\n const [compositeInstances, library] = await Promise.all([\n this.stateManager.getCompositeInstanceRepository(projectId).getAllItems(),\n this.libraryBackend.loadLibrary(projectInfo.libraryId),\n ])\n\n const filteredInstances = project.instances.filter(\n instance => instance.type in library.components,\n )\n const filteredCompositeInstances = compositeInstances\n .filter(instance => instance.instance.type in library.components)\n .map(instance => ({\n ...instance,\n children: instance.children.filter(child => child.type in library.components),\n }))\n\n return {\n libraryId: projectInfo.libraryId,\n instances: filteredInstances,\n hubs: project.hubs,\n compositeInstances: filteredCompositeInstances,\n }\n }\n\n async createInstance(projectId: string, instance: InstanceModel): Promise<InstanceModel> {\n const createdInstance = await this.projectBackend.createInstance(projectId, instance)\n await this.evaluateChangedCompositeInstances(projectId)\n\n return createdInstance\n }\n\n async updateInstance(\n projectId: string,\n instanceId: string,\n patch: InstanceModelPatch,\n ): Promise<InstanceModel> {\n const instance = await this.projectBackend.updateInstance(projectId, instanceId, patch)\n // await this.evaluateChangedCompositeInstances(projectId)\n\n return instance\n }\n\n async renameInstance(\n projectId: string,\n instanceId: string,\n newName: string,\n ): Promise<InstanceModel> {\n const instance = await this.projectBackend.renameInstance(projectId, instanceId, newName)\n await this.evaluateChangedCompositeInstances(projectId)\n\n return instance\n }\n\n async deleteInstance(projectId: string, instanceId: string): Promise<void> {\n await Promise.all([\n this.projectBackend.deleteInstance(projectId, instanceId),\n this.stateManager.getCompositeInstanceRepository(projectId).delete(instanceId),\n ])\n }\n\n async createManyNodes(\n projectId: string,\n instances: InstanceModel[],\n hubs: HubModel[],\n ): Promise<void> {\n await this.projectBackend.createManyNodes(projectId, instances, hubs)\n }\n\n private async evaluateChangedCompositeInstances(projectId: string): Promise<void> {\n const { inputHashResolver, instances, library, evaluatedInputHashes } =\n await this.prepareResolvers(projectId)\n\n inputHashResolver.addAllNodesToWorkset()\n await inputHashResolver.process()\n\n const instanceIds = instances\n .filter(instance => !isUnitModel(library.components[instance.type]))\n .filter(\n instance =>\n evaluatedInputHashes[instance.id] !==\n inputHashResolver.requireOutput(instance.id).inputHash,\n )\n .map(instance => instance.id)\n\n await this.instanceLockService.tryLockInstances(\n projectId,\n instanceIds,\n {\n title: \"Composite Instance Evaluation\",\n description: \"This instance is now being evaluated\",\n icon: \"logos:typescript-icon-round\",\n },\n {\n type: \"evaluation\",\n evaluationId: randomUUID(),\n },\n )\n\n try {\n this.logger.debug({ instanceIds }, \"evaluating composite instances\")\n\n for (const instanceId of instanceIds) {\n void this.pubsubManager.publish(`instance:state:patch:${projectId}`, {\n patch: {\n id: instanceId,\n evaluationStatus: {\n status: \"evaluating\",\n },\n },\n })\n }\n\n const [\n { instances, resolvedInputs, stateMap, inputHashResolver, libraryId },\n existingCompositeInstances,\n ] = await Promise.all([\n this.prepareResolvers(projectId),\n this.stateManager.getCompositeInstanceRepository(projectId).getAllRecord(),\n ])\n\n // Get child instance IDs for the instances being re-evaluated\n const oldChildInstanceIds = new Set(\n existingCompositeInstances\n .filter(ci => instanceIds.includes(ci.instance.id))\n .flatMap(ci => ci.childCompositeInstanceIds ?? []),\n )\n\n const results = await this.libraryBackend.evaluateCompositeInstances(\n libraryId,\n instances,\n resolvedInputs,\n instanceIds,\n )\n\n const newStates = results.map(result => {\n const existingState = stateMap.get(result.instanceId)\n const newState = existingState ?? { id: result.instanceId }\n\n newState.evaluationStatus = result.success\n ? { status: \"evaluated\", message: ProjectManager.createSuccessEvaluationMessage(result) }\n : { status: \"error\", message: result.error }\n\n return newState\n })\n\n inputHashResolver.addAllNodesToWorkset()\n await inputHashResolver.process()\n\n const compositeInstances = results\n .filter(result => result.success)\n .flatMap(result =>\n result.compositeInstances.map(instance => ({\n ...instance,\n id: instance.instance.id,\n inputHash:\n // only store inputHash for top-level composite instances\n instance.instance.id === result.instanceId\n ? inputHashResolver.requireOutput(instance.instance.id).inputHash\n : \"\",\n // only store childCompositeInstanceIds for top-level composite instances\n childCompositeInstanceIds:\n instance.instance.id === result.instanceId\n ? result.compositeInstances\n .filter(ci => ci.instance.id !== result.instanceId)\n .map(ci => ci.instance.id)\n : undefined,\n })),\n )\n\n const newChildInstanceIds = new Set(\n results\n .filter(result => result.success)\n .flatMap(result =>\n result.compositeInstances\n .filter(instance => instance.instance.id !== result.instanceId)\n .map(instance => instance.instance.id),\n ),\n )\n\n const deletedCompositeInstanceIds = new Set<string>()\n\n // Find child instances that were deleted (existed before but don't exist now)\n for (const oldChildId of oldChildInstanceIds) {\n if (!newChildInstanceIds.has(oldChildId)) {\n deletedCompositeInstanceIds.add(oldChildId)\n }\n }\n\n await this.stateManager\n .getCompositeInstanceRepository(projectId)\n .deleteMany(Array.from(deletedCompositeInstanceIds))\n\n for (const state of newStates) {\n void this.pubsubManager.publish(`instance:state:patch:${projectId}`, { patch: state })\n\n if (state.evaluationStatus?.status === \"error\") {\n this.logger.error(\n { projectId, instanceId: state.id },\n `evaluation error for instance \"%s\": %s`,\n state.evaluationStatus.message,\n )\n }\n }\n\n for (const instance of compositeInstances) {\n void this.pubsubManager.publish(`composite-instance:${projectId}`, {\n type: \"updated\",\n instance,\n })\n }\n\n for (const instanceId of deletedCompositeInstanceIds) {\n void this.pubsubManager.publish(`composite-instance:${projectId}`, {\n type: \"deleted\",\n instanceId,\n })\n }\n\n const promises: Promise<void>[] = []\n\n if (newStates.length > 0) {\n promises.push(this.stateManager.getInstanceStateRepository(projectId).putMany(newStates))\n }\n\n if (compositeInstances.length > 0) {\n promises.push(\n this.stateManager.getCompositeInstanceRepository(projectId).putMany(compositeInstances),\n )\n }\n\n this.logger.info(\n { projectId },\n \"instance evaluation completed, %d instances persisted\",\n compositeInstances.length,\n )\n\n this.logger.debug(\n { compositeInstanceIds: compositeInstances.map(instance => instance.instance.id) },\n \"persisted composite instances\",\n )\n\n await Promise.all(promises)\n } finally {\n // TODO: implement detecting of lost evaluation locks\n await this.instanceLockService.unlockInstancesUnconditionally(projectId, instanceIds)\n }\n }\n\n private async prepareResolvers(projectId: string) {\n const [projectInfo, { instances, hubs }, states] = await Promise.all([\n this.projectBackend.getProjectInfo(projectId),\n this.projectBackend.getProject(projectId),\n this.stateManager.getInstanceStateRepository(projectId).getAllItems(),\n ])\n\n const library = await this.libraryBackend.loadLibrary(projectInfo.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 inputHashInputs = new Map<string, InputHashNode>()\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 let sourceHash: string | undefined\n if (isUnitModel(library.components[instance.type])) {\n const resolvedUnits = await this.libraryBackend.getResolvedUnitSources(\n projectInfo.libraryId,\n [instance.type],\n )\n const resolvedUnit = resolvedUnits.find(unit => unit.unitType === instance.type)\n\n if (resolvedUnit) {\n sourceHash = resolvedUnit.sourceHash\n } else {\n this.logger.warn(`resolved unit source not found for type \"%s\"`, instance.type)\n sourceHash = undefined\n }\n }\n\n inputHashInputs.set(instance.id, {\n instance,\n component: library.components[instance.type],\n resolvedInputs: output.resolvedInputs,\n state: stateMap.get(instance.id),\n sourceHash,\n })\n\n resolvedInputs[instance.id] = output.resolvedInputs\n }\n\n const inputHashResolver = new InputHashResolver(inputHashInputs, this.logger)\n\n return {\n inputHashInputs,\n inputHashResolver,\n library,\n libraryId: projectInfo.libraryId,\n instances: filteredInstances,\n stateMap,\n resolvedInputs,\n }\n }\n\n /**\n * Ensures a library is being watched for changes.\n * Called when a project using this library is accessed.\n */\n private ensureLibraryWatched(libraryId: string): void {\n if (this.watchedLibraries.has(libraryId)) {\n return\n }\n\n this.watchedLibraries.add(libraryId)\n const abortController = new AbortController()\n this.libraryWatchers.set(libraryId, abortController)\n\n this.logger.debug({ libraryId }, \"starting library watcher\")\n\n // Start watching this library in the background\n void this.watchSingleLibrary(libraryId, abortController.signal)\n }\n\n /**\n * Watches a single library for changes and handles updates.\n */\n private async watchSingleLibrary(libraryId: string, signal: AbortSignal): Promise<void> {\n try {\n for await (const updates of this.libraryBackend.watchLibrary(libraryId, signal)) {\n try {\n await this.handleLibraryUpdates(libraryId, updates)\n } catch (error) {\n this.logger.error({ error, libraryId }, \"failed to handle library updates\")\n }\n }\n } catch (error) {\n if (signal.aborted) {\n this.logger.debug({ libraryId }, \"library watcher stopped\")\n } else {\n this.logger.error({ error, libraryId }, \"library watcher failed\")\n }\n } finally {\n this.watchedLibraries.delete(libraryId)\n this.libraryWatchers.delete(libraryId)\n }\n }\n\n private async handleLibraryUpdates(libraryId: string, updates: LibraryUpdate[]): Promise<void> {\n const changedComponents = new Set<string>()\n\n for (const update of updates) {\n switch (update.type) {\n case \"component-updated\":\n changedComponents.add(update.component.type)\n break\n case \"component-removed\":\n changedComponents.add(update.componentType)\n break\n // Handle entity updates if needed\n case \"entity-updated\":\n case \"entity-removed\":\n // Entity updates don't directly affect composite instance evaluation\n break\n }\n }\n\n if (changedComponents.size === 0) {\n return\n }\n\n this.logger.info(\n { libraryId, changedComponents: Array.from(changedComponents) },\n \"library components changed, updating composite instances for affected projects\",\n )\n\n // Get all projects and find those using this libraryId\n const allProjectIds = await this.projectBackend.getProjectIds()\n\n for (const projectId of allProjectIds) {\n try {\n // Check if this project uses the changed library\n const projectInfo = await this.projectBackend.getProjectInfo(projectId)\n if (projectInfo.libraryId !== libraryId) {\n continue // Skip projects that don't use this library\n }\n\n // Load the updated library for filtering\n const library = await this.libraryBackend.loadLibrary(libraryId)\n const { instances } = await this.prepareResolvers(projectId)\n\n const affectedInstances = instances.filter(\n instance =>\n changedComponents.has(instance.type) &&\n library.components[instance.type] &&\n !isUnitModel(library.components[instance.type]),\n )\n\n if (affectedInstances.length > 0) {\n this.logger.info(\n {\n projectId,\n libraryId,\n affectedInstanceIds: affectedInstances.map(instance => instance.id),\n },\n \"updating composite instances for project due to library changes\",\n )\n\n await this.evaluateChangedCompositeInstances(projectId)\n }\n } catch (error) {\n this.logger.error(\n { error, projectId, libraryId },\n \"failed to evaluate composite instances for project during library update\",\n )\n }\n }\n }\n\n /**\n * Cleanup method to stop all library watchers.\n * Should be called when the ProjectManager is being shut down.\n */\n dispose(): void {\n for (const [libraryId, abortController] of this.libraryWatchers.entries()) {\n this.logger.debug({ libraryId }, \"stopping library watcher\")\n abortController.abort()\n }\n this.libraryWatchers.clear()\n this.watchedLibraries.clear()\n }\n\n static create(\n projectBackend: ProjectBackend,\n libraryBackend: LibraryBackend,\n stateManager: StateManager,\n instanceLockService: InstanceLockService,\n pubsubManager: PubSubManager,\n logger: Logger,\n ): ProjectManager {\n return new ProjectManager(\n projectBackend,\n libraryBackend,\n stateManager,\n instanceLockService,\n pubsubManager,\n logger.child({ service: \"ProjectManager\" }),\n )\n }\n\n static createSuccessEvaluationMessage(\n result: InstanceEvaluationResult & { success: true },\n ): string {\n const treeNodes = new Map<string, TreeNode>()\n\n // the order of composite instances are guaranteed to be topologically sorted\n for (const compositeInstance of result.compositeInstances) {\n const node: TreeNode = {\n text: compositeInstance.id,\n children: [],\n }\n\n treeNodes.set(compositeInstance.id, node)\n\n const parentNode = compositeInstance.instance.parentId\n ? treeNodes.get(compositeInstance.instance.parentId)\n : undefined\n\n if (parentNode) {\n parentNode.children.push(node)\n }\n\n for (const child of compositeInstance.children) {\n const childNode: TreeNode = {\n text: child.id,\n children: [],\n }\n\n node.children.push(childNode)\n treeNodes.set(child.id, childNode)\n }\n }\n\n // get the root node\n const rootNode = treeNodes.get(result.instanceId)\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 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 { TerminalRunOptions, TerminalBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport { Readable } from \"node:stream\"\nimport { tmpdir } from \"node:os\"\nimport { resolve } from \"node:path\"\nimport { mkdir, writeFile } from \"node:fs/promises\"\nimport { z } from \"zod\"\nimport spawn from \"nano-spawn\"\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","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 { ScreenSize, TerminalBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { ProjectUnlockService } from \"../business\"\nimport type { StateManager } from \"../state\"\nimport { PassThrough, type Stream, type Writable } from \"node:stream\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport {\n type TerminalSession,\n type TerminalSpec,\n createAsyncBatcher,\n type AsyncBatcher,\n} from \"../shared\"\nimport { isAbortErrorLike } from \"../common\"\n\ntype ManagedTerminal = {\n readonly session: TerminalSession\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 private readonly existingSessions = new Map<string, TerminalSession>()\n\n private constructor(\n private readonly terminalBackend: TerminalBackend,\n private readonly stateManager: StateManager,\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<TerminalSession> {\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 session = await this.stateManager.getTerminalSessionRepository(projectId).get(sessionId)\n\n if (!session) {\n throw new Error(`Terminal session \"${sessionId}\" not found`)\n }\n\n yield session\n return\n }\n\n yield managedTerminal.session\n\n for await (const terminalSession of this.pubsubManager.subscribe(\n [\"active-terminal-session\", projectId, sessionId],\n signal,\n )) {\n yield terminalSession\n\n if (terminalSession.meta.finishedAt) {\n // terminal session is finished, stop watching\n return\n }\n }\n }\n\n public async createSession(projectId: string, terminalId: string): Promise<TerminalSession> {\n // Get the terminal info from info repository for meta data\n const terminalInfoRepo = this.stateManager.getTerminalRepository(projectId)\n const terminal = await terminalInfoRepo.get(terminalId)\n\n if (!terminal) {\n throw new Error(`Terminal \"${terminalId}\" not found`)\n }\n\n const terminalSession: TerminalSession = {\n id: uuidv7(),\n projectId,\n instanceId: terminal.instanceId,\n terminalId,\n meta: {\n title: terminal.meta.title,\n description: terminal.meta.description,\n icon: terminal.meta.icon,\n },\n }\n\n // Get the terminal spec for execution\n const terminalSpec = await this.stateManager\n .getTerminalSpecRepository(projectId)\n .get(terminalId)\n\n if (!terminalSpec) {\n throw new Error(`No spec found for terminal \"${terminalId}\"`)\n }\n\n const batch = this.stateManager.batch()\n const promises: Promise<void>[] = [\n this.stateManager.getTerminalSessionRepository(projectId).putItem(terminalSession, batch),\n this.stateManager\n .getActiveTerminalSessionIndexRepository(projectId)\n .indexRepository.put(terminalSession.id, terminalSession.id, batch),\n ]\n\n if (terminal.instanceId) {\n promises.push(\n this.stateManager\n .getInstanceTerminalSessionIndexRepository(projectId, terminal.instanceId)\n .indexRepository.put(terminalSession.id, terminalSession.id, batch),\n )\n }\n\n await Promise.allSettled(promises)\n await batch.write()\n this.logger.info({ msg: \"terminal session created\", id: terminalSession.id })\n\n this.createManagedTerminal(terminalSpec, terminalSession)\n\n return terminalSession\n }\n\n public async getOrCreateSession(\n projectId: string,\n terminalId: string,\n newSession = false,\n ): Promise<TerminalSession> {\n const existingSession = this.existingSessions.get(`${projectId}:${terminalId}`)\n\n if (existingSession && !newSession) {\n return existingSession\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 async updateActiveTerminalSessions(): Promise<void> {\n // TODO\n }\n\n private createManagedTerminal(\n spec: TerminalSpec,\n terminalSession: TerminalSession,\n ): ManagedTerminal {\n const managedTerminal: ManagedTerminal = {\n session: terminalSession,\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 await this.stateManager\n .getTerminalSessionLineRepository(terminalSession.projectId, terminalSession.id)\n .putMany(entries.map(entry => [uuidv7(), entry]))\n }),\n\n refCount: 0,\n started: false,\n\n start: (screenSize: ScreenSize) => {\n void this.terminalBackend\n .run({\n 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 this.existingSessions.delete(\n `${managedTerminal.session.projectId}:${managedTerminal.session.terminalId}`,\n )\n\n managedTerminal.session.meta.finishedAt = Date.now()\n void this.pubsubManager.publish(\n [\n \"active-terminal-session\",\n managedTerminal.session.projectId,\n managedTerminal.session.id,\n ],\n managedTerminal.session,\n )\n\n void this.stateManager\n .getTerminalSessionRepository(managedTerminal.session.projectId)\n .putItem(managedTerminal.session)\n\n void this.updateActiveTerminalSessions()\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 this.existingSessions.set(\n `${managedTerminal.session.projectId}:${managedTerminal.session.terminalId}`,\n managedTerminal.session,\n )\n\n void this.updateActiveTerminalSessions()\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 this.existingSessions.delete(`${terminal.session.projectId}:${terminal.session.terminalId}`)\n return\n }\n\n setTimeout(() => this.closeTerminalIfNotAttached(terminal), notAttachedTerminalLifetime)\n }\n\n static create(\n terminalBackend: TerminalBackend,\n stateBackend: StateManager,\n pubsubManager: PubSubManager,\n projectUnlockService: ProjectUnlockService,\n logger: Logger,\n ): TerminalManager {\n return new TerminalManager(\n terminalBackend,\n stateBackend,\n pubsubManager,\n projectUnlockService,\n logger.child({ service: \"TerminalManager\" }),\n )\n }\n\n private async markFinishedSessions(projectId: string): Promise<void> {\n const activeSessions = await this.stateManager\n .getActiveTerminalSessionIndexRepository(projectId)\n .getAllItems()\n\n if (activeSessions.length === 0) {\n this.logger.debug({ projectId }, \"no lost terminal sessions found\")\n return\n }\n\n const batch = this.stateManager.batch()\n\n for (const session of activeSessions) {\n if (session.meta.finishedAt) {\n // Already marked as finished\n this.logger.debug({ sessionId: session.id }, \"session already marked as finished\")\n continue\n }\n\n session.meta.finishedAt = Date.now()\n\n // mark session as finished and delete from active index\n await Promise.all([\n this.stateManager.getTerminalSessionRepository(projectId).putItem(session, batch),\n this.stateManager\n .getActiveTerminalSessionIndexRepository(projectId)\n .indexRepository.delete(session.id, batch),\n ])\n }\n\n await batch.write()\n\n this.logger.debug(\n { projectId, count: activeSessions.length },\n \"marked terminal sessions as finished\",\n )\n }\n}\n","import type { RunnerBackend } from \"./abstractions\"\nimport type { LibraryBackend } from \"../library\"\nimport type { ArtifactBackend, ArtifactService } from \"../artifact\"\nimport type { Logger } from \"pino\"\nimport type { StateManager } from \"../state\"\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 stateManager: StateManager,\n logger: Logger,\n): RunnerBackend {\n switch (config.HIGHSTATE_RUNNER_BACKEND_TYPE) {\n case \"local\": {\n const localPulumiHost = LocalPulumiHost.create(stateManager, logger)\n\n return LocalRunnerBackend.create(\n config,\n localPulumiHost,\n libraryBackend,\n artifactManager,\n artifactBackend,\n logger,\n )\n }\n }\n}\n","import type { ConfigMap, OutputMap, Stack } from \"@pulumi/pulumi/automation/index.js\"\nimport type { LibraryBackend, ResolvedUnitSource } from \"../library\"\nimport type { ArtifactBackend, ArtifactService } from \"../artifact\"\nimport type { Logger } from \"pino\"\nimport type { DualAbortSignal } from \"./force-abort\"\nimport { EventEmitter, on } from \"node:events\"\nimport { resolve, join } from \"node:path\"\nimport { tmpdir } from \"node:os\"\nimport { mkdtemp, rm } from \"node:fs/promises\"\nimport { getInstanceId } from \"@highstate/contract\"\nimport { ensureDependencyInstalled } from \"nypm\"\nimport { mapValues, omitBy, pickBy } from \"remeda\"\nimport { z } from \"zod\"\nimport { sha256 } from \"@noble/hashes/sha2\"\nimport { bytesToHex } from \"@noble/hashes/utils\"\nimport { encode } from \"@msgpack/msgpack\"\nimport { runWithRetryOnError } from \"../common\"\nimport {\n unitInstanceStatusFieldSchema,\n unitPageSchema,\n unitTerminalSchema,\n unitTriggerSchema,\n} from \"../shared\"\nimport {\n getOperationSummary,\n pulumiErrorToString,\n updateResourceCount,\n type LocalPulumiHost,\n} from \"./pulumi\"\nimport {\n setupArtifactEnvironment,\n collectAndStoreArtifacts,\n type ArtifactEnvironment,\n} from \"./artifact-env\"\nimport {\n type RunnerBackend,\n type UnitOptions,\n type UnitUpdateOptions,\n type UnitDestroyOptions,\n type UnitStateUpdate,\n type TypedUnitStateUpdate,\n} from \"./abstractions\"\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 const configMap: ConfigMap = {\n ...mapValues(options.config, value => ({ value })),\n ...mapValues(options.secrets, value => ({ value, secret: true })),\n }\n\n void this.updateWorker(options, configMap, false)\n\n return Promise.resolve()\n }\n\n preview(options: UnitUpdateOptions): Promise<void> {\n const configMap: ConfigMap = {\n ...mapValues(options.config, value => ({ value })),\n ...mapValues(options.secrets, value => ({ value, secret: true })),\n }\n\n void this.updateWorker(options, configMap, true)\n\n return Promise.resolve()\n }\n\n private async updateWorker(\n options: UnitUpdateOptions,\n configMap: ConfigMap,\n preview: boolean,\n ): Promise<void> {\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 // this provides a second layer of reliability: even if materialized files/folders\n // cannot clean up their specific paths, this entire directory will be cleaned up\n unitTempPath = await mkdtemp(join(tmpdir(), `highstate-unit-${unitId}-`))\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 ...options.envVars,\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 const { stdout } = await stack[preview ? \"preview\" : \"up\"]({\n color: \"always\",\n refresh: options.refresh,\n signal,\n diff: preview,\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(unitId, outputs, stdout)\n\n if (completionUpdate.artifacts && artifactEnv) {\n const declaredArtifacts = Object.values(completionUpdate.artifacts).flat()\n\n await collectAndStoreArtifacts(\n artifactEnv.writePath,\n options.projectId,\n this.arttifactManager,\n declaredArtifacts,\n childLogger,\n )\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 },\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 const { stdout } = await stack.destroy({\n color: \"always\",\n refresh: options.refresh,\n remove: true,\n signal,\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(unitId, stack, stdout)\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 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 const { stdout } = await stack.refresh({\n color: \"always\",\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 unitId,\n message: getOperationSummary(stdout),\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 unitId: string,\n outputs: OutputMap,\n stdout: string,\n ): TypedUnitStateUpdate<\"completion\"> {\n const unitOutputs = omitBy(outputs, (_, key) => key.startsWith(\"$\"))\n\n return {\n unitId,\n type: \"completion\",\n message: getOperationSummary(stdout),\n\n outputHash: bytesToHex(sha256(encode(unitOutputs))),\n\n statusFields: outputs[\"$statusFields\"]\n ? z.array(unitInstanceStatusFieldSchema).parse(outputs[\"$statusFields\"].value)\n : undefined,\n\n // artifacts: outputs[\"$artifacts\"]\n // ? z.record(z.array(unitArtifactSchema)).parse(outputs[\"$artifacts\"].value)\n // : undefined,\n\n terminals: outputs[\"$terminals\"]\n ? z.array(unitTerminalSchema).parse(outputs[\"$terminals\"].value)\n : undefined,\n\n pages: outputs[\"$pages\"] ? z.array(unitPageSchema).parse(outputs[\"$pages\"].value) : undefined,\n\n triggers: outputs[\"$triggers\"]\n ? z.array(unitTriggerSchema).parse(outputs[\"$triggers\"].value)\n : undefined,\n\n secrets: outputs[\"$secrets\"]\n ? (pickBy(\n z.record(z.string().nullish()).parse(outputs[\"$secrets\"].value),\n v => !!v,\n ) as Record<string, string>)\n : undefined,\n }\n }\n\n private async emitCompletionStateUpdate(\n unitId: string,\n stack: Stack,\n stdout: string,\n ): Promise<TypedUnitStateUpdate<\"completion\">> {\n const output = await stack.outputs()\n const update = this.createCompletionStateUpdate(unitId, output, stdout)\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.projectId}_${options.instanceName}`\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 { StateManager } from \"../state\"\nimport {\n type ConfigMap,\n type OpMap,\n type OpType,\n type Stack,\n type WhoAmIResult,\n} from \"@pulumi/pulumi/automation/index.js\"\nimport { BetterLock } from \"better-lock\"\nimport { v4 as uuidv4, v7 as uuidv7 } from \"uuid\"\nimport { formatSecretDescriptor, WellKnownSecretDescriptors, type Secret } from \"../shared\"\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 stateManager: StateManager,\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.getPassword(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 (e) {\n if (e instanceof Error && e.message.includes(\"canceled\")) {\n throw new AbortError()\n }\n\n throw e\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: \"nodejs\",\n },\n stackSettings: stackConfig\n ? {\n [pulumiStackName]: {\n config: stackConfig,\n },\n }\n : undefined,\n envVars: {\n PULUMI_CONFIG_PASSPHRASE: await this.getPassword(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 (e) {\n if (e instanceof Error && e.message.includes(\"canceled\")) {\n throw new AbortError()\n }\n\n throw e\n }\n })\n }\n\n private async getPassword(projectId: string): Promise<string> {\n return await this.lock.acquire(`pulumi-password.${projectId}`, async () => {\n const secretRepo = this.stateManager.getSecretRepository(projectId)\n const secretContentRepo = this.stateManager.getSecretContentRepository(projectId)\n const indexRepo = this.stateManager.createSecretIndexRepository(projectId)\n\n const contentKey = formatSecretDescriptor(WellKnownSecretDescriptors.PulumiPassword)\n const pulumiPasswordContent = await secretContentRepo.get(contentKey)\n if (typeof pulumiPasswordContent === \"string\") {\n return pulumiPasswordContent\n }\n\n this.logger.info({ projectId }, \"generating new Pulumi password\")\n\n const pulumiPassword = uuidv4()\n const batch = this.stateManager.batch()\n\n const pulumiPasswordSecret: Secret = {\n id: uuidv7(),\n descriptor: WellKnownSecretDescriptors.PulumiPassword,\n meta: {\n title: \"Pulumi Password\",\n description: \"The password used to encrypt the Pulumi state.\",\n icon: \"devicon:pulumi\",\n },\n }\n\n await Promise.all([\n secretRepo.putItem(pulumiPasswordSecret, batch),\n secretContentRepo.put(contentKey, pulumiPassword, batch),\n indexRepo.indexRepository.put(contentKey, pulumiPasswordSecret.id, batch),\n ])\n\n await batch.write()\n\n return pulumiPassword\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(stateManager: StateManager, logger: Logger) {\n return new LocalPulumiHost(stateManager, 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\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\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\nexport function getOperationSummary(stdout: string): string | null {\n const summaryStart = stdout.indexOf(\"\\u001b[38;5;13m\\u001b[1mOutputs:\")\n\n if (summaryStart !== -1) {\n return stdout.slice(summaryStart)\n }\n\n return null\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { PulumiCommand } from \"@pulumi/pulumi/automation/index.js\"\nimport * as path from \"node:path\"\nimport * as os from \"node:os\"\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 { Logger } from \"pino\"\nimport type { Artifact } from \"../shared\"\nimport type { ArtifactBackend, ArtifactService } from \"../artifact\"\nimport type { UnitArtifact } from \"@highstate/contract\"\nimport { mkdtemp, readdir } from \"node:fs/promises\"\nimport { createReadStream, createWriteStream } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { pipeline } from \"node:stream/promises\"\nimport { createHash } from \"node:crypto\"\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.hash, 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\", hash: artifact.hash, 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 * Returns the list of artifact hashes that were stored.\n */\nexport async function collectAndStoreArtifacts(\n writePath: string,\n projectId: 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 await artifactManager.store(\n projectId,\n expectedHash,\n fileSize,\n artifact.meta ?? {},\n readStream,\n )\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","import { AccessError, type CollectionQueryResult } from \"../shared\"\n\nexport type CollectionQuery = {\n /**\n * The search string to filter documents by display name, descriptiion, or other text fields.\n *\n * Not implemented yet.\n */\n search?: string\n\n /**\n * The ID of the document to start the query from.\n *\n * If \"asc\" sorting is used, this will return results after this ID.\n * Otherwise, it will return results before this ID.\n */\n cursor?: string\n\n /**\n * The count of documents to return.\n *\n * Defaults to 20 if not specified.\n * Maximum value is 100.\n */\n count?: number\n\n /**\n * The sorting order for the results.\n *\n * By default, \"asc\" is used.\n */\n sort?: \"asc\" | \"desc\"\n}\n\nexport const CollectionBackend = Symbol(\"CollectionBackend\")\n\n/**\n * The batch interface for write operations.\n *\n * It ensures that all changes made within a batch are written atomically.\n */\nexport type StateBatch = {\n [CollectionBackend]: unknown\n [Symbol.asyncDispose](): Promise<void>\n\n /**\n * Writes all changes made in this batch as a single atomic operation.\n */\n write(): Promise<void>\n}\n\n/**\n * The snapshot interface for read operations.\n *\n * It ensure the consistency of read operations performed within a single snapshot.\n */\nexport type StateSnapshot = {\n [CollectionBackend]: unknown\n [Symbol.asyncDispose](): Promise<void>\n}\n\n/**\n * Low-level storage abstraction that operates on raw binary data.\n * This interface provides basic CRUD operations without any knowledge of data structure or validation.\n */\nexport interface StateCollection {\n /**\n * Retrieves a single item by its ID.\n *\n * @param id The ID of the item to retrieve.\n * @param snapshot Optional snapshot for consistent reads.\n */\n get(id: string, snapshot?: StateSnapshot): Promise<Uint8Array | undefined>\n\n /**\n * Retrieves multiple items by their IDs.\n * Returns a record where keys are IDs and values are the data (or undefined if not found).\n * The order of the results matches the order of the input IDs.\n *\n * @param ids An array of IDs to retrieve.\n * @param snapshot Optional snapshot for consistent reads.\n */\n getMany(ids: string[], snapshot?: StateSnapshot): Promise<(Uint8Array | undefined)[]>\n\n /**\n * Retrieves all items in the collection as an array of tuples.\n * Use carefully, as this may return a large amount of data.\n *\n * @param snapshot Optional snapshot for consistent reads.\n */\n getAll(snapshot?: StateSnapshot): Promise<[string, Uint8Array][]>\n\n /**\n * Retrieves items matching a query.\n *\n * @param query The query object containing search, cursor, skip, count, and sort options.\n * @param snapshot Optional snapshot for consistent reads.\n */\n query(\n query: CollectionQuery,\n snapshot?: StateSnapshot,\n ): Promise<CollectionQueryResult<[string, Uint8Array]>>\n\n /**\n * Retrieves the total count of items in the collection.\n * This is useful for pagination and understanding the size of the collection.\n *\n * @param snapshot Optional snapshot for consistent reads.\n */\n getTotalCount(snapshot?: StateSnapshot): Promise<number>\n\n /**\n * Returns an async iterator over all items in the collection.\n * This is more memory-efficient than getAll() for large collections.\n *\n * @param snapshot Optional snapshot for consistent reads.\n */\n iterate(snapshot?: StateSnapshot): AsyncIterable<[string, Uint8Array]>\n\n /**\n * Stores a single item with the given ID.\n *\n * @param id The ID of the item to store.\n * @param value The binary data to store.\n * @param batch Optional batch for atomic writes.\n */\n put(id: string, value: Uint8Array, batch?: StateBatch): Promise<void>\n\n /**\n * Stores multiple items in a batch operation.\n *\n * @param entries An array of key-value pairs where keys are IDs and values are binary data.\n * @param batch Optional batch for atomic writes.\n */\n putMany(entries: Array<[string, Uint8Array]>, batch?: StateBatch): Promise<void>\n\n /**\n * Deletes a single item by its ID.\n *\n * @param id The ID of the item to delete.\n * @param batch Optional batch for atomic writes.\n */\n delete(id: string, batch?: StateBatch): Promise<void>\n\n /**\n * Deletes multiple items by their IDs.\n *\n * @param ids An array of IDs to delete.\n * @param batch Optional batch for atomic writes.\n */\n deleteMany(ids: string[], batch?: StateBatch): Promise<void>\n}\n\nexport interface StateBackend {\n /**\n * Returns the encrypted master key used for the encryption of backend-wide data.\n */\n getEncryptedBackendMasterKey(): Promise<string | null>\n\n /**\n * Sets the encrypted master key used for the encryption of backend-wide data.\n *\n * @param encryptedMasterKey The encrypted master key to set, as a hex string.\n */\n setEncryptedBackendMasterKey(encryptedMasterKey: string): Promise<void>\n\n /**\n * Returns the static identifier for the backend.\n */\n getStaticBackendId(): Promise<string | null>\n\n /**\n * Sets the static identifier for the backend.\n */\n setStaticBackendId(id: string): Promise<void>\n\n /**\n * Creates a backend-wide collection for storing projects.\n */\n createProjectCollection(): StateCollection\n\n /**\n * Creates a backend-wide collection for storing id hash namespaces for projects.\n */\n createProjectIdHashNamespaceCollection(): StateCollection\n\n /**\n * Creates a backend-wide collection for storing unlock suites for project unlocking.\n */\n createProjectUnlockSuiteCollection(): StateCollection\n\n /**\n * Creates a backend-wide collection for storing the encrypted master keys for project unlocking.\n */\n createProjectMasterKeyCollection(): StateCollection\n\n /**\n * Creates a batch for performing atomic write operations.\n */\n createStateBatch(): StateBatch\n\n /**\n * Creates a snapshot for consistent read operations.\n */\n createStateSnapshot(): StateSnapshot\n\n /**\n * Creates a collection for storing terminal sessions.\n *\n * @param projectId The ID of the project.\n */\n createTerminalSessionCollection(projectId: string): StateCollection\n\n /**\n * Creates an index collection for terminal sessions belonging to a specific instance.\n *\n * @param projectId The ID of the project.\n * @param instanceId The ID of the instance.\n */\n createInstanceTerminalSessionIndexCollection(\n projectId: string,\n instanceId: string,\n ): StateCollection\n\n /**\n * Creates an index collection for active terminal sessions in a project.\n *\n * @param projectId The ID of the project.\n */\n createActiveTerminalSessionIndexCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing project terminal info.\n *\n * @param projectId The ID of the project.\n */\n createTerminalCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing project terminal specs.\n *\n * @param projectId The ID of the project.\n */\n createTerminalSpecCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing service accounts in a project.\n *\n * @param projectId The ID of the project.\n */\n createServiceAccountCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing API keys in a project.\n *\n * @param projectId The ID of the project.\n */\n createApiKeyCollection(projectId: string): StateCollection\n\n /**\n * Creates an index collection for mapping API key tokens to API key IDs.\n *\n * @param projectId The ID of the project.\n */\n createApiKeyTokenIndexCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing workers in a project.\n *\n * @param projectId The ID of the project.\n */\n createWorkerCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing worker registrations in a project.\n *\n * @param projectId The ID of the project.\n */\n createWorkerRegistrationCollection(projectId: string): StateCollection\n\n /**\n * Creates an index collection for worker registrations belonging to a specific worker.\n *\n * @param projectId The ID of the project.\n * @param workerId The ID of the worker.\n */\n createWorkerRegistrationIndexCollection(projectId: string, workerId: string): StateCollection\n\n /**\n * Creates a collection for worker logs in a project.\n *\n * @param projectId The ID of the project.\n * @param workerId The ID of the worker.\n */\n createWorkerLogCollection(projectId: string, workerId: string): StateCollection\n\n /**\n * Creates a collection for storing project page info.\n *\n * @param projectId The ID of the project.\n */\n createPageCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing project page content.\n *\n * @param projectId The ID of the project.\n */\n createPageContentCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing project artifacts.\n *\n * @param projectId The ID of the project.\n */\n createArtifactCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing artifact hash indexes.\n *\n * @param projectId The ID of the project.\n */\n createArtifactHashIndexCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing trigger info.\n *\n * @param projectId The ID of the project.\n */\n createTriggerCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing operation info.\n *\n * @param projectId The ID of the project.\n */\n createOperationCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing active operation indexes.\n * This is used to track currently running operations.\n *\n * @param projectId The ID of the project.\n */\n createActiveOperationIndexCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing unlock methods.\n *\n * @param projectId The ID of the project.\n */\n createUnlockMethodCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing secret info.\n *\n * @param projectId The ID of the project.\n */\n createSecretCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing secret content.\n *\n * @param projectId The ID of the project.\n */\n createSecretContentCollection(projectId: string): StateCollection\n\n /**\n * Creates an index collection to map secret descriptors to secret UUIDv7s.\n *\n * @param projectId The ID of the project.\n */\n createSecretIndexCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing operation logs.\n *\n * @param projectId The ID of the project.\n * @param operationId The ID of the operation.\n */\n createOperationLogCollection(projectId: string, operationId: string): StateCollection\n\n /**\n * Creates a collection for storing instance states.\n *\n * @param projectId The ID of the project.\n */\n createInstanceStateCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing instance locks.\n *\n * @param projectId The ID of the project.\n */\n createInstanceLockCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing instance logs.\n *\n * @param projectId The ID of the project.\n * @param operationId The ID of the operation.\n * @param instanceId The ID of the instance.\n */\n createInstanceLogIndexCollection(\n projectId: string,\n operationId: string,\n instanceId: string,\n ): StateCollection\n\n /**\n * Creates a collection for storing terminal session lines.\n *\n * @param projectId The ID of the project.\n * @param sessionId The ID of the terminal session.\n */\n createTerminalSessionLineCollection(projectId: string, sessionId: string): StateCollection\n\n /**\n * Creates a collection for storing composite instances.\n *\n * @param projectId The ID of the project.\n */\n createCompositeInstanceCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing the layouts of user interfaces.\n */\n createUserLayoutCollection(): StateCollection\n\n /**\n * Creates a collection for storing viewports of the project per user.\n *\n * @param projectId The ID of the project.\n */\n createProjectViewportCollection(projectId: string): StateCollection\n\n /**\n * Creates a collection for storing viewports of the project's composite instance per user.\n *\n * @param projectId The ID of the project.\n * @param instanceId The ID of the composite instance.\n */\n createInstanceViewportCollection(projectId: string, instanceId: string): StateCollection\n}\n\nexport class ProjectLockedError extends AccessError {\n constructor(projectId: string) {\n super(`The project with ID \"${projectId}\" is locked, decryption is not possible.`)\n }\n}\n","import type { StateBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport { z } from \"zod\"\nimport { LocalStateBackend, localStateBackendConfig } from \"./local\"\n\nexport const stateBackendConfig = z.object({\n HIGHSTATE_STATE_BACKEND_TYPE: z.enum([\"local\"]).default(\"local\"),\n ...localStateBackendConfig.shape,\n})\n\nexport function createStateBackend(\n config: z.infer<typeof stateBackendConfig>,\n logger: Logger,\n): Promise<StateBackend> {\n switch (config.HIGHSTATE_STATE_BACKEND_TYPE) {\n case \"local\": {\n return LocalStateBackend.create(config, logger)\n }\n }\n}\n","import type {\n AbstractChainedBatch,\n AbstractIteratorOptions,\n AbstractLevel,\n AbstractSnapshot,\n AbstractSublevel,\n} from \"abstract-level\"\nimport type { CollectionQueryResult } from \"../../shared\"\nimport { BetterLock } from \"better-lock\"\nimport {\n type StateCollection,\n type CollectionQuery,\n type StateSnapshot,\n type StateBatch,\n CollectionBackend,\n} from \"../abstractions\"\n\ntype Sublevel = AbstractSublevel<\n AbstractLevel<string, unknown>,\n string | Buffer<ArrayBufferLike> | Uint8Array<ArrayBufferLike>,\n string,\n Uint8Array<ArrayBufferLike>\n>\n\ntype ChainedBatch = AbstractChainedBatch<AbstractLevel<string, unknown>, string, Uint8Array>\n\nfunction getSnapshot(snapshot: StateSnapshot | undefined) {\n if (snapshot && CollectionBackend in snapshot) {\n return snapshot[CollectionBackend] as AbstractSnapshot\n }\n\n return undefined\n}\n\nfunction getBatch(batch: StateBatch | undefined) {\n if (batch && CollectionBackend in batch) {\n return batch[CollectionBackend] as AbstractChainedBatch<\n AbstractLevel<string, unknown>,\n string,\n Uint8Array\n >\n }\n\n return undefined\n}\n\nfunction getOrCreateBatch(db: AbstractLevel<string, unknown>, batch?: StateBatch) {\n const explicitBatch = getBatch(batch)\n if (explicitBatch) {\n return { chainedBatch: explicitBatch, explicit: true }\n }\n\n const chainedBatch = db.batch() as unknown as AbstractChainedBatch<\n AbstractLevel<string, unknown>,\n string,\n Uint8Array\n >\n\n return { chainedBatch, explicit: false }\n}\n\n/**\n * LocalStateCollection implements StateCollection using LevelDB sublevel for binary data storage.\n * It operates on raw binary data without any knowledge of the data structure.\n */\nexport class LocalStateCollection implements StateCollection {\n private static readonly countKey = \"_count\"\n\n // the lock for operations that modify the collection by first reading the item\n // used to update the count key atomically\n private readonly readWriteLock = new BetterLock()\n\n constructor(\n private readonly db: AbstractLevel<string, unknown>,\n private readonly sublevel: Sublevel,\n ) {}\n\n async get(key: string, snapshot?: StateSnapshot): Promise<Uint8Array | undefined> {\n return await this.sublevel.get(key, { snapshot: getSnapshot(snapshot) })\n }\n\n async getMany(keys: string[], snapshot?: StateSnapshot): Promise<(Uint8Array | undefined)[]> {\n return await this.sublevel.getMany(keys, { snapshot: getSnapshot(snapshot) })\n }\n\n async getAll(snapshot?: StateSnapshot): Promise<Array<[string, Uint8Array]>> {\n const result: Array<[string, Uint8Array]> = []\n for await (const [key, value] of this.sublevel.iterator({ snapshot: getSnapshot(snapshot) })) {\n // skip count key\n if (key === LocalStateCollection.countKey) continue\n\n result.push([key, value])\n }\n\n return result\n }\n\n async put(key: string, value: Uint8Array, batch?: StateBatch): Promise<void> {\n await this.readWriteLock.acquire(key, async () => {\n // check if this is a new item\n const existing = await this.sublevel.get(key)\n const isNewItem = !existing\n\n const { chainedBatch, explicit } = getOrCreateBatch(this.db, batch)\n\n chainedBatch.put(key, value, { sublevel: this.sublevel })\n\n // update count if this is a new item\n if (isNewItem) {\n await this.incrementCount(1, chainedBatch)\n }\n\n if (!explicit) {\n // if we created a new batch, we need to commit it\n await chainedBatch.write()\n }\n })\n }\n\n async putMany(entries: Array<[string, Uint8Array]>, batch?: StateBatch): Promise<void> {\n const keys = entries.map(([key]) => key)\n\n await this.readWriteLock.acquire(keys, async () => {\n // check which items are new\n let newItemsCount = 0\n\n for (const [key] of entries) {\n const existing = await this.sublevel.get(key)\n if (!existing) {\n newItemsCount++\n }\n }\n\n const { chainedBatch, explicit } = getOrCreateBatch(this.db, batch)\n\n for (const [key, value] of entries) {\n chainedBatch.put(key, value, { sublevel: this.sublevel })\n }\n\n // update count for new items\n if (newItemsCount > 0) {\n await this.incrementCount(newItemsCount, chainedBatch)\n }\n\n if (!explicit) {\n // if we created a new batch, we need to commit it\n await chainedBatch.write()\n }\n })\n }\n\n async delete(key: string, batch?: StateBatch): Promise<void> {\n await this.readWriteLock.acquire(key, async () => {\n // check if item exists before deleting\n const existing = await this.sublevel.get(key)\n\n const { chainedBatch, explicit } = getOrCreateBatch(this.db, batch)\n\n chainedBatch.del(key, { sublevel: this.sublevel })\n\n // update count if item existed\n if (existing) {\n await this.incrementCount(-1, chainedBatch)\n }\n\n if (!explicit) {\n // if we created a new batch, we need to commit it\n await chainedBatch.write()\n }\n })\n }\n\n async deleteMany(keys: string[], batch?: StateBatch): Promise<void> {\n await this.readWriteLock.acquire(keys, async () => {\n // check which items exist before deleting\n const existingValues = await this.sublevel.getMany(keys)\n let deletedItemsCount = 0\n\n for (const value of existingValues) {\n if (value) {\n deletedItemsCount++\n }\n }\n\n const { chainedBatch, explicit } = getOrCreateBatch(this.db, batch)\n\n for (const id of keys) {\n chainedBatch.del(id, { sublevel: this.sublevel })\n }\n\n // update count for deleted items\n if (deletedItemsCount > 0) {\n await this.incrementCount(-deletedItemsCount, chainedBatch)\n }\n\n if (!explicit) {\n // if we created a new batch, we need to commit it\n await chainedBatch.write()\n }\n })\n }\n\n async query(\n query: CollectionQuery,\n snapshot?: StateSnapshot,\n ): Promise<CollectionQueryResult<[string, Uint8Array]>> {\n const { cursor, count = 20, sort = \"asc\" } = query\n const limit = Math.min(count, 100) // cap at 100\n\n const items: [string, Uint8Array][] = []\n let nextCursor: string | undefined\n\n const iteratorOptions: AbstractIteratorOptions<string, Uint8Array> = {\n limit: limit + 1, // +1 to account \"_count\" key\n reverse: sort === \"desc\",\n snapshot: getSnapshot(snapshot),\n }\n\n if (cursor && sort === \"asc\") {\n iteratorOptions.gt = cursor // start after the cursor\n } else if (cursor && sort === \"desc\") {\n iteratorOptions.lt = cursor // start before the cursor\n }\n\n for await (const [key, value] of this.sublevel.iterator(iteratorOptions)) {\n // skip count key\n if (key === LocalStateCollection.countKey) continue\n\n items.push([key, value])\n\n // if we've collected enough documents, the last key becomes the next cursor\n if (items.length === limit) {\n nextCursor = key\n break\n }\n }\n\n // get total count for the collection\n const total = await this.getTotalCount(snapshot)\n\n return {\n items,\n total,\n nextCursor,\n }\n }\n\n async getTotalCount(snapshot?: StateSnapshot): Promise<number> {\n const countData = await this.sublevel.get(LocalStateCollection.countKey, {\n snapshot: getSnapshot(snapshot),\n })\n\n if (!countData) {\n // if count doesn't exist, recalculate it\n return await this.readWriteLock.acquire(LocalStateCollection.countKey, async () => {\n return await this.recalculateCount()\n })\n }\n\n // decode the count data and return it as an integer\n // if the data is not a valid number, recalculate it\n const count = new TextDecoder().decode(countData)\n const countValue = parseInt(count, 10)\n if (isNaN(countValue)) {\n return await this.readWriteLock.acquire(LocalStateCollection.countKey, async () => {\n return await this.recalculateCount()\n })\n }\n\n return countValue\n }\n\n /**\n * Helper method to increment the count by a specific amount.\n *\n * MUST be used within a lock to ensure atomicity.\n */\n private async incrementCount(amount: number, batch: ChainedBatch): Promise<void> {\n await this.readWriteLock.acquire(LocalStateCollection.countKey, async () => {\n const currentCount = await this.sublevel.get(LocalStateCollection.countKey)\n if (!currentCount) {\n await this.recalculateCount()\n return\n }\n\n const count = new TextDecoder().decode(currentCount)\n const currentCountValue = parseInt(count, 10)\n if (isNaN(currentCountValue)) {\n await this.recalculateCount()\n return\n }\n\n const newCount = currentCountValue + amount\n const countData = new TextEncoder().encode(newCount.toString())\n\n batch.put(LocalStateCollection.countKey, countData, { sublevel: this.sublevel })\n })\n }\n\n /**\n * Helper method to recalculate the count from scratch by iterating through all keys.\n */\n private async recalculateCount(): Promise<number> {\n // calculate the count by iterating through all keys\n let count = 0\n for await (const key of this.sublevel.keys()) {\n if (key !== LocalStateCollection.countKey) {\n count++\n }\n }\n\n // store the calculated count\n const countData = new TextEncoder().encode(count.toString())\n await this.sublevel.put(LocalStateCollection.countKey, countData)\n\n return count\n }\n\n iterate(snapshot?: StateSnapshot): AsyncIterable<[string, Uint8Array]> {\n const sublevel = this.sublevel\n const snapshotOption = getSnapshot(snapshot)\n\n return {\n async *[Symbol.asyncIterator](): AsyncGenerator<[string, Uint8Array], void, unknown> {\n for await (const [key, value] of sublevel.iterator({ snapshot: snapshotOption })) {\n // skip count key\n if (key === LocalStateCollection.countKey) continue\n yield [key, value] as [string, Uint8Array]\n }\n },\n }\n }\n\n /**\n * Creates a LocalStateCollection for the specified path using binary encoding.\n */\n static create(db: AbstractLevel<string, unknown>, path: string): LocalStateCollection {\n const sublevel = db.sublevel<string, Uint8Array>(path, { valueEncoding: \"buffer\" })\n\n return new LocalStateCollection(db, sublevel as Sublevel)\n }\n}\n","import type { AbstractLevel } from \"abstract-level\"\nimport type { Logger } from \"pino\"\nimport { resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport {\n CollectionBackend,\n type StateBackend,\n type StateBatch,\n type StateCollection,\n type StateSnapshot,\n} from \"../abstractions\"\nimport { LocalStateCollection } from \"./collection\"\n\nexport const localStateBackendConfig = z.object({\n HIGHSTATE_STATE_BACKEND_LOCAL_DIR: z.string().optional(),\n})\n\n/**\n * A state backend that stores the state in a local LevelDB database.\n *\n * The default state location is `~/.highstate/state.db`.\n *\n * Storage Structure:\n *\n * ## System Collections\n * - `backend/id` - static id for the backend\n * - `backend/encryptedMasterKey` - encrypted master key for the backend\n * - `backend/projects/{projectId}` - project metadata\n * - `backend/projectMasterKeys/{projectId}` - encrypted master keys for data encryption/decryption\n * - `backend/projectHashNamespaces/{projectId}` - UUID namespaces for ID hashing per project\n * - `backend/projectUnlockSuites/{projectId}` - unlock suites for project unlocking\n *\n * ## Project Collections\n * - `projects/{projectId}/instanceStates/{instanceId}` - instance states\n * - `projects/{projectId}/instanceLocks/{instanceId}` - instance locks for operation coordination\n * - `projects/{projectId}/terminalSessions/{sessionId}` - terminal sessions (sessionId is UUIDv7)\n * - `projects/{projectId}/activeTerminalSessions` - index of active terminal sessions\n * - `projects/{projectId}/instances/{instanceId}/terminalSessions/{sessionId}` - terminal session index per instance\n * - `projects/{projectId}/terminals/{terminalId}` - project terminals\n * - `projects/{projectId}/terminalSpecs/{terminalId}` - terminal spec data\n * - `projects/{projectId}/pages/{pageId}` - project pages\n * - `projects/{projectId}/pageContents/{pageId}` - page content data\n * - `projects/{projectId}/artifacts/{artifactId}` - project artifacts\n * - `projects/{projectId}/artifactHashIndex/{hash}` - artifact hash to ID mapping\n * - `projects/{projectId}/triggers/{triggerId}` - instance triggers\n * - `projects/{projectId}/operations/{operationId}` - project operations\n * - `projects/{projectId}/activeOperations/{operationId}` - index of active operations\n * - `projects/{projectId}/unlockMethods/{methodId}` - unlock methods for the project\n * - `projects/{projectId}/compositeInstances/{instanceId}` - evaluated composite instances\n * - `projects/{projectId}/secrets/{secretId}` - project secrets\n * - `projects/{projectId}/secretContents/{secretId}` - secret content data\n * - `projects/{projectId}/serviceAccounts/{serviceAccountId}` - project service accounts\n * - `projects/{projectId}/apiKeys/{apiKeyId}` - project API keys\n * - `projects/{projectId}/apiKeyTokenIndex/{tokenHash}` - maps API key token hashes to API key IDs\n * - `projects/{projectId}/workers/{workerId}` - project workers\n * - `projects/{projectId}/workerRegistrations/{registrationId}` - worker registrations\n * - `projects/{projectId}/workers/{workerId}/registrations/{registrationId}` - index of registrations per worker\n * - `projects/{projectId}/workers/{workerId}/logs/{logId}` - worker logs (logId is UUIDv7)\n *\n * ## Operation Collections\n * - `projects/{projectId}/operations/{operationId}/logs/{logId}` - operation logs (logId is UUIDv7)\n * - `projects/{projectId}/operations/{operationId}/instances/{instanceId}/logs/{logId}` - instance-specific log index\n *\n * ## Terminal Collections\n * - `projects/{projectId}/terminalSessions/{sessionId}/lines/{lineId}` - terminal session history (lineId is UUIDv7)\n *\n * ## Collection Metadata\n * Each collection sublevel contains a special `_count` key that tracks the total number of documents\n * in that collection for efficient pagination and querying without full iteration.\n */\nexport class LocalStateBackend implements StateBackend {\n constructor(private readonly db: AbstractLevel<string, unknown>) {}\n\n async getEncryptedBackendMasterKey(): Promise<string | null> {\n const encryptedMasterKey = await this.db.get(\"backend/encryptedMasterKey\")\n\n return encryptedMasterKey ?? null\n }\n\n async setEncryptedBackendMasterKey(encryptedMasterKey: string): Promise<void> {\n await this.db.put(\"backend/encryptedMasterKey\", encryptedMasterKey)\n }\n\n async getStaticBackendId(): Promise<string | null> {\n const ns = await this.db.get(\"backend/id\")\n\n return ns ?? null\n }\n\n async setStaticBackendId(namespace: string): Promise<void> {\n await this.db.put(\"backend/id\", namespace)\n }\n\n createStateBatch(): StateBatch {\n const batch = this.db.batch()\n\n return {\n [CollectionBackend]: batch,\n [Symbol.asyncDispose]: () => batch.close(),\n write: () => batch.write(),\n }\n }\n\n createStateSnapshot(): StateSnapshot {\n const snapshot = this.db.snapshot()\n\n return {\n [CollectionBackend]: snapshot,\n [Symbol.asyncDispose]: () => snapshot.close(),\n }\n }\n\n createProjectCollection(): StateCollection {\n return LocalStateCollection.create(this.db, \"backend/projects\")\n }\n\n createProjectMasterKeyCollection(): StateCollection {\n return LocalStateCollection.create(this.db, \"backend/projectMasterKeys\")\n }\n\n createProjectIdHashNamespaceCollection(): StateCollection {\n return LocalStateCollection.create(this.db, \"backend/projectHashNamespaces\")\n }\n\n createProjectUnlockSuiteCollection(): StateCollection {\n return LocalStateCollection.create(this.db, \"backend/projectUnlockSuites\")\n }\n\n createTerminalSessionCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/terminalSessions`)\n }\n\n createActiveTerminalSessionIndexCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/activeTerminalSessions`)\n }\n\n createInstanceTerminalSessionIndexCollection(\n projectId: string,\n instanceId: string,\n ): StateCollection {\n return LocalStateCollection.create(\n this.db,\n `projects/${projectId}/instances/${instanceId}/terminalSessions`,\n )\n }\n\n createTerminalCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/terminals`)\n }\n\n createTerminalSpecCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/terminalSpecs`)\n }\n\n createServiceAccountCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/serviceAccounts`)\n }\n\n createApiKeyCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/apiKeys`)\n }\n\n createApiKeyTokenIndexCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/apiKeyTokenIndex`)\n }\n\n createWorkerCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/workers`)\n }\n\n createWorkerRegistrationCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/workerRegistrations`)\n }\n\n createWorkerRegistrationIndexCollection(projectId: string, workerId: string): StateCollection {\n return LocalStateCollection.create(\n this.db,\n `projects/${projectId}/workers/${workerId}/registrations`,\n )\n }\n\n createWorkerLogCollection(projectId: string, workerId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/workers/${workerId}/logs`)\n }\n\n createPageCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/pages`)\n }\n\n createPageContentCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/pageContents`)\n }\n\n createArtifactCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/artifacts`)\n }\n\n createArtifactHashIndexCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/artifactHashIndex`)\n }\n\n createTriggerCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/triggers`)\n }\n\n createUnlockMethodCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/unlockMethods`)\n }\n\n createOperationCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/operations`)\n }\n\n createActiveOperationIndexCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/activeOperations`)\n }\n\n createSecretCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/secrets`)\n }\n\n createSecretContentCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/secretContents`)\n }\n\n createSecretIndexCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/secretIndex`)\n }\n\n createOperationLogCollection(projectId: string, operationId: string): StateCollection {\n return LocalStateCollection.create(\n this.db,\n `projects/${projectId}/operations/${operationId}/logs`,\n )\n }\n\n createInstanceLogIndexCollection(\n projectId: string,\n operationId: string,\n instanceId: string,\n ): StateCollection {\n return LocalStateCollection.create(\n this.db,\n `projects/${projectId}/operations/${operationId}/instances/${instanceId}/logs`,\n )\n }\n\n createTerminalSessionLineCollection(projectId: string, sessionId: string): StateCollection {\n return LocalStateCollection.create(\n this.db,\n `projects/${projectId}/terminalSessions/${sessionId}/lines`,\n )\n }\n\n createCompositeInstanceCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/compositeInstances`)\n }\n\n createInstanceStateCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/instanceStates`)\n }\n\n createInstanceLockCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/instanceLocks`)\n }\n\n createUserLayoutCollection(): StateCollection {\n return LocalStateCollection.create(this.db, \"backend/userLayouts\")\n }\n\n createProjectViewportCollection(projectId: string): StateCollection {\n return LocalStateCollection.create(this.db, `projects/${projectId}/viewports`)\n }\n\n createInstanceViewportCollection(projectId: string, instanceId: string): StateCollection {\n return LocalStateCollection.create(\n this.db,\n `projects/${projectId}/instances/${instanceId}/viewports`,\n )\n }\n\n static async create(\n config: z.infer<typeof localStateBackendConfig>,\n logger: Logger,\n ): Promise<StateBackend> {\n const childLogger = logger.child({ backend: \"StateBackend\", service: \"LocalStateBackend\" })\n\n let location = config.HIGHSTATE_STATE_BACKEND_LOCAL_DIR\n if (!location) {\n location = resolve(process.env.HOME!, \".highstate\", \"state.db\")\n childLogger.debug({ location }, \"using default local state backend location\")\n }\n\n const { ClassicLevel } = await import(\"classic-level\")\n const db = new ClassicLevel<string, string>(location)\n\n return new LocalStateBackend(db as unknown as AbstractLevel<string, unknown>)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { HotStateManager } from \"../hotstate\"\nimport { randomBytes } from \"node:crypto\"\nimport { readFile } from \"node:fs/promises\"\nimport { z } from \"zod\"\nimport { BetterLock } from \"better-lock\"\nimport { v4 as uuidv4, v5 as uuidv5 } from \"uuid\"\nimport { armor, Decrypter, Encrypter, identityToRecipient } from \"age-encryption\"\nimport { LRUCache } from \"lru-cache\"\nimport {\n terminalSessionSchema,\n triggerSchema,\n unlockMethodSchema,\n terminalSchema,\n terminalSpecSchema,\n pageSchema,\n artifactSchema,\n secretSchema,\n operationSchema,\n instanceStateSchema,\n serviceAccountSchema,\n projectApiKeySchema,\n workerSchema,\n workerUnitRegistrationSchema,\n instanceLockSchema,\n compositeInstanceSchema,\n pageBlockSchema,\n projectSchema,\n projectUnlockSuiteSchema,\n} from \"../shared\"\nimport {\n ProjectLockedError,\n type StateBackend,\n type StateBatch,\n type StateSnapshot,\n} from \"./abstractions\"\nimport { MasterKeyEncryptionBackend, type EncryptionBackend } from \"./encryption\"\nimport { StateIndexRepository, StateRepository, NO_KEY_HASHING } from \"./repository\"\nimport { getOrCreateBackendIdentity } from \"./keyring\"\n\nexport const stateManagerConfig = z.object({\n HIGHSTATE_BACKEND_MASTER_KEY: z.string().optional(),\n HIGHSTATE_BACKEND_MASTER_KEY_PATH: z.string().optional(),\n})\n\n/**\n * StateManager handles the creation of repositories and provides a unified interface\n * for accessing typed repositories with proper configuration.\n */\nexport class StateManager {\n constructor(\n private readonly backendNamespace: string,\n private readonly encryptionBackend: EncryptionBackend,\n private readonly backend: StateBackend,\n private readonly hotStateManager: HotStateManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Creates a new batch for atomic operations.\n * This allows multiple operations to be executed atomically.\n */\n batch(): StateBatch {\n return this.backend.createStateBatch()\n }\n\n /**\n * Creates a snapshot of the current state.\n * This allows for consistent reads without affecting ongoing writes.\n */\n snapshot(): StateSnapshot {\n return this.backend.createStateSnapshot()\n }\n\n /**\n * Gets a repository with projects.\n */\n getProjectRepository(): StateRepository<typeof projectSchema> {\n return new StateRepository(\n this.backend.createProjectCollection(),\n projectSchema,\n this.encryptionBackend,\n this.configureBackendKeyHashing(), // to hide project IDs\n this.logger,\n )\n }\n\n /**\n * Gets a repository for encrypted project master keys armored in AGE's format.\n * These project keys are not ready to be used for encryption/decryption\n * and must be first decrypted using one of the project unlock methods.\n */\n getProjectMasterKeyRepository(): StateRepository<z.ZodString> {\n return new StateRepository(\n this.backend.createProjectMasterKeyCollection(),\n z.string(),\n this.encryptionBackend,\n this.configureBackendKeyHashing(), // to hide project IDs\n this.logger,\n )\n }\n\n /**\n * Creates a repository for project unlock suites.\n * They contain encrypted AGE identities which can be used to unlock project master keys.\n */\n getProjectUnlockSuiteRepository(): StateRepository<typeof projectUnlockSuiteSchema> {\n return new StateRepository(\n this.backend.createProjectUnlockSuiteCollection(),\n projectUnlockSuiteSchema,\n this.encryptionBackend,\n this.configureBackendKeyHashing(), // to hide project IDs\n this.logger,\n )\n }\n\n /**\n * Gets a repository for terminal sessions.\n *\n * @param projectId The ID of the project owning the terminal sessions.\n */\n getTerminalSessionRepository(projectId: string): StateRepository<typeof terminalSessionSchema> {\n return new StateRepository(\n this.backend.createTerminalSessionCollection(projectId),\n terminalSessionSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates index repository which keeps the list of terminal sessions for a specific instance.\n *\n * @param projectId The ID of the project owning the terminal sessions.\n * @param instanceId The ID of the instance to which the terminal sessions belong.\n */\n getInstanceTerminalSessionIndexRepository(\n projectId: string,\n instanceId: string,\n ): StateIndexRepository<typeof terminalSessionSchema> {\n return new StateIndexRepository(\n this,\n this.getTerminalSessionRepository(projectId),\n new StateRepository(\n this.backend.createInstanceTerminalSessionIndexCollection(projectId, instanceId),\n z.string(),\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n ),\n this.logger,\n )\n }\n\n /**\n * Creates index repository which keeps the list of active terminal sessions.\n *\n * @param projectId The ID of the project owning the terminal sessions.\n */\n getActiveTerminalSessionIndexRepository(\n projectId: string,\n ): StateIndexRepository<typeof terminalSessionSchema> {\n return new StateIndexRepository(\n this,\n this.getTerminalSessionRepository(projectId),\n new StateRepository(\n this.backend.createActiveTerminalSessionIndexCollection(projectId),\n z.string(),\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide which terminal sessions are active\n this.logger,\n ),\n this.logger,\n )\n }\n\n /**\n * Creates a repository for terminal session lines.\n *\n * @param projectId The ID of the project owning the terminal session.\n * @param sessionId The ID of the terminal session to which the lines belong.\n */\n getTerminalSessionLineRepository(\n projectId: string,\n sessionId: string,\n ): StateRepository<z.ZodString> {\n return new StateRepository(\n this.backend.createTerminalSessionLineCollection(projectId, sessionId),\n z.string(),\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for project terminals.\n *\n * @param projectId The ID of the project owning the terminals.\n */\n getTerminalRepository(projectId: string): StateRepository<typeof terminalSchema> {\n return new StateRepository(\n this.backend.createTerminalCollection(projectId),\n terminalSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for specifications of project terminals.\n *\n * @param projectId The ID of the project owning the terminals.\n */\n getTerminalSpecRepository(projectId: string): StateRepository<typeof terminalSpecSchema> {\n return new StateRepository(\n this.backend.createTerminalSpecCollection(projectId),\n terminalSpecSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // nothing to hide\n this.logger,\n )\n }\n\n /**\n * Creates a repository for pages.\n *\n * @param projectId The ID of the project owning the pages.\n */\n getPageRepository(projectId: string): StateRepository<typeof pageSchema> {\n return new StateRepository(\n this.backend.createPageCollection(projectId),\n pageSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for page content.\n *\n * @param projectId The ID of the project owning the page content.\n */\n getPageContentRepository(projectId: string): StateRepository<z.ZodArray<typeof pageBlockSchema>> {\n return new StateRepository(\n this.backend.createPageContentCollection(projectId),\n pageBlockSchema.array(),\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // nothing to hide\n this.logger,\n )\n }\n\n /**\n * Creates a repository for service accounts.\n *\n * @param projectId The ID of the project owning the service accounts.\n */\n getServiceAccountRepository(projectId: string): StateRepository<typeof serviceAccountSchema> {\n return new StateRepository(\n this.backend.createServiceAccountCollection(projectId),\n serviceAccountSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for API keys.\n *\n * @param projectId The ID of the project owning the API keys.\n */\n getApiKeyRepository(projectId: string): StateRepository<typeof projectApiKeySchema> {\n return new StateRepository(\n this.backend.createApiKeyCollection(projectId),\n projectApiKeySchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by ULID\n this.logger,\n )\n }\n\n /**\n * Creates an index repository which maps API key tokens to API key IDs.\n * The tokens are hashed to prevent leaking sensitive information.\n *\n * @param projectId The ID of the project owning the API keys.\n */\n getApiKeyTokenIndexRepository(\n projectId: string,\n ): StateIndexRepository<typeof projectApiKeySchema> {\n return new StateIndexRepository(\n this,\n this.getApiKeyRepository(projectId),\n new StateRepository(\n this.backend.createApiKeyTokenIndexCollection(projectId),\n z.string(),\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide the tokens\n this.logger,\n ),\n this.logger,\n )\n }\n\n /**\n * Creates a repository for workers.\n *\n * @param projectId The ID of the project owning the workers.\n */\n getWorkerRepository(projectId: string): StateRepository<typeof workerSchema> {\n return new StateRepository(\n this.backend.createWorkerCollection(projectId),\n workerSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for worker logs.\n *\n * @param projectId The ID of the project owning the worker logs.\n * @param workerId The ID of the worker to which the logs belong.\n */\n getWorkerLogRepository(projectId: string, workerId: string): StateRepository<z.ZodString> {\n return new StateRepository(\n this.backend.createWorkerLogCollection(projectId, workerId),\n z.string(),\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for worker registrations.\n *\n * @param projectId The ID of the project owning the worker registrations.\n */\n getWorkerRegistrationRepository(\n projectId: string,\n ): StateRepository<typeof workerUnitRegistrationSchema> {\n return new StateRepository(\n this.backend.createWorkerRegistrationCollection(projectId),\n workerUnitRegistrationSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates an index repository which holds the list of worker registrations.\n *\n * @param projectId The ID of the project owning the workers.\n * @param workerId The ID of the worker.\n */\n getWorkerRegistrationIndexRepository(\n projectId: string,\n workerId: string,\n ): StateIndexRepository<typeof workerUnitRegistrationSchema> {\n return new StateIndexRepository(\n this,\n this.getWorkerRegistrationRepository(projectId),\n new StateRepository(\n this.backend.createWorkerRegistrationIndexCollection(projectId, workerId),\n z.string(),\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n ),\n this.logger,\n )\n }\n\n /**\n * Gets a repository for artifacts.\n *\n * @param projectId The ID of the project owning the artifacts.\n */\n getArtifactRepository(projectId: string): StateRepository<typeof artifactSchema> {\n return new StateRepository(\n this.backend.createArtifactCollection(projectId),\n artifactSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates an index repository which maps artifact hashes to artifact IDs.\n *\n * @param projectId The ID of the project owning the artifacts.\n */\n getArtifactHashIndexRepository(projectId: string): StateIndexRepository<typeof artifactSchema> {\n return new StateIndexRepository(\n this,\n this.getArtifactRepository(projectId),\n new StateRepository(\n this.backend.createArtifactHashIndexCollection(projectId),\n z.string(),\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide the original sha256 hash\n this.logger,\n ),\n this.logger,\n )\n }\n\n /**\n * Creates a repository for trigger info.\n *\n * @param projectId The ID of the project owning the triggers.\n */\n getTriggerRepository(projectId: string): StateRepository<typeof triggerSchema> {\n return new StateRepository(\n this.backend.createTriggerCollection(projectId),\n triggerSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for unlock methods.\n *\n * @param projectId The ID of the project owning the unlock methods.\n */\n getUnlockMethodRepository(projectId: string): StateRepository<typeof unlockMethodSchema> {\n return new StateRepository(\n this.backend.createUnlockMethodCollection(projectId),\n unlockMethodSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for secret info.\n *\n * @param projectId The ID of the project owning the secrets.\n */\n getSecretRepository(projectId: string): StateRepository<typeof secretSchema> {\n const collection = this.backend.createSecretCollection(projectId)\n\n return new StateRepository(\n //\n collection,\n secretSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates a repository for secret content.\n *\n * The ID is secret ID, not UUIDv7.\n *\n * @param projectId The ID of the project owning the secret content.\n */\n getSecretContentRepository(projectId: string): StateRepository<z.ZodUnknown> {\n return new StateRepository(\n this.backend.createSecretContentCollection(projectId),\n z.unknown(),\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // nothing to hide\n this.logger,\n )\n }\n\n /**\n * Creates an index repository to map descriptors like `instance:{instanceId}:{secretName}` or `system:{systemSecretName}`\n * to UUIDv7 IDs of these secrets.\n *\n * @param projectId The ID of the project owning the secrets.\n */\n createSecretIndexRepository(projectId: string): StateIndexRepository<typeof secretSchema> {\n return new StateIndexRepository(\n this,\n this.getSecretRepository(projectId),\n new StateRepository(\n this.backend.createSecretIndexCollection(projectId),\n z.string(),\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide the descriptor\n this.logger,\n ),\n this.logger,\n )\n }\n\n /**\n * Creates a repository for operation logs.\n *\n * @param projectId The ID of the project owning the operation logs.\n * @param operationId The ID of the operation to which the logs belong.\n */\n getOperationLogRepository(projectId: string, operationId: string): StateRepository<z.ZodString> {\n return new StateRepository(\n this.backend.createOperationLogCollection(projectId, operationId),\n z.string(),\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates an index repository for instance logs.\n * This repository allows to retrieve operation logs by instance ID.\n *\n * @param projectId The ID of the project owning the operation logs.\n * @param operationId The ID of the operation to which the logs belong.\n * @param instanceId The ID of the instance to which the logs belong.\n */\n getInstanceLogIndexRepository(\n projectId: string,\n operationId: string,\n instanceId: string,\n ): StateIndexRepository<z.ZodString> {\n return new StateIndexRepository(\n this,\n this.getOperationLogRepository(projectId, operationId),\n new StateRepository(\n this.backend.createInstanceLogIndexCollection(projectId, operationId, instanceId),\n z.string(),\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n ),\n this.logger,\n )\n }\n\n /**\n * Creates a repository for operation info.\n *\n * @param projectId The ID of the project owning the operations.\n */\n getOperationRepository(projectId: string): StateRepository<typeof operationSchema> {\n return new StateRepository(\n this.backend.createOperationCollection(projectId),\n operationSchema,\n this.getEncryptionBackend(projectId),\n NO_KEY_HASHING, // we want to sort by UUIDv7\n this.logger,\n )\n }\n\n /**\n * Creates an index repository for active operations.\n *\n * @param projectId The ID of the project owning the operations.\n */\n getActiveOperationIndexRepository(\n projectId: string,\n ): StateIndexRepository<typeof operationSchema> {\n return new StateIndexRepository(\n this,\n this.getOperationRepository(projectId),\n new StateRepository(\n this.backend.createActiveOperationIndexCollection(projectId),\n z.string(),\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide which operations are active\n this.logger,\n ),\n this.logger,\n )\n }\n\n /**\n * Creates a repository for instance states with sensitive ID hashing.\n *\n * @param projectId The ID of the project owning the instance states.\n */\n getInstanceStateRepository(projectId: string): StateRepository<typeof instanceStateSchema> {\n return new StateRepository(\n this.backend.createInstanceStateCollection(projectId),\n instanceStateSchema,\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide the instance ID\n this.logger,\n )\n }\n\n /**\n * Creates a repository for instance locks.\n *\n * @param projectId The ID of the project owning the instance locks.\n */\n getInstanceLockRepository(projectId: string): StateRepository<typeof instanceLockSchema> {\n return new StateRepository(\n this.backend.createInstanceLockCollection(projectId),\n instanceLockSchema,\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide the instance ID\n this.logger,\n )\n }\n\n /**\n * Creates a repository for composite instances with sensitive ID hashing.\n */\n getCompositeInstanceRepository(\n projectId: string,\n ): StateRepository<typeof compositeInstanceSchema> {\n return new StateRepository(\n this.backend.createCompositeInstanceCollection(projectId),\n compositeInstanceSchema,\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide the composite instance ID\n this.logger,\n )\n }\n\n /**\n * Creates a repository for user layouts.\n */\n getUserLayoutRepository(): StateRepository<z.ZodUnknown> {\n return new StateRepository(\n this.backend.createUserLayoutCollection(),\n z.unknown(),\n this.encryptionBackend,\n this.configureBackendKeyHashing(), // to hide user IDs\n this.logger,\n )\n }\n\n /**\n * Creates a repository for project viewports.\n *\n * @param projectId The ID of the project owning the viewports.\n */\n getProjectViewportRepository(projectId: string): StateRepository<z.ZodUnknown> {\n return new StateRepository(\n this.backend.createProjectViewportCollection(projectId),\n z.unknown(),\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide user IDs\n this.logger,\n )\n }\n\n /**\n * Creates a repository for instance viewports.\n *\n * @param projectId The ID of the project owning the viewports.\n * @param instanceId The ID of the instance to which the viewports belong.\n */\n getInstanceViewportRepository(\n projectId: string,\n instanceId: string,\n ): StateRepository<z.ZodUnknown> {\n return new StateRepository(\n this.backend.createInstanceViewportCollection(projectId, instanceId),\n z.unknown(),\n this.getEncryptionBackend(projectId),\n this.configureKeyHashing(projectId), // to hide user IDs\n this.logger,\n )\n }\n\n private idNamespaceHashCache = new Map<string, string>()\n private idNamespaceHashLock = new BetterLock()\n\n private getProjectIdHashNamespaceRepository(): StateRepository<z.ZodString> {\n return new StateRepository(\n this.backend.createProjectIdHashNamespaceCollection(),\n z.string(),\n this.encryptionBackend,\n () => Promise.resolve(this.backendNamespace),\n this.logger,\n )\n }\n\n private configureBackendKeyHashing(): () => Promise<string> {\n return () => Promise.resolve(this.backendNamespace)\n }\n\n public configureKeyHashing(projectId: string): () => Promise<string> {\n return async () => {\n const existing = this.idNamespaceHashCache.get(projectId)\n if (existing) {\n return existing\n }\n\n return await this.idNamespaceHashLock.acquire(projectId, async () => {\n let stored = await this.getProjectIdHashNamespaceRepository().get(projectId)\n\n if (!stored) {\n stored = uuidv4()\n await this.getProjectIdHashNamespaceRepository().put(projectId, stored)\n }\n\n this.idNamespaceHashCache.set(projectId, stored)\n return stored\n })\n }\n }\n\n // store the master keys in memory cache for 30 seconds\n private readonly masterKeyCache = new LRUCache<string, Uint8Array>({\n ttl: 30_000,\n ttlAutopurge: true,\n })\n\n async getProjectMasterKey(projectId: string): Promise<Uint8Array> {\n const cachedKey = this.masterKeyCache.get(projectId)\n if (cachedKey) {\n return cachedKey\n }\n\n const masterKey = await this.hotStateManager.get([\"project-master-key\", projectId])\n if (!masterKey) {\n throw new ProjectLockedError(projectId)\n }\n\n this.masterKeyCache.set(projectId, masterKey)\n return masterKey\n }\n\n public getEncryptionBackend(projectId: string): EncryptionBackend {\n return new MasterKeyEncryptionBackend(() => this.getProjectMasterKey(projectId))\n }\n\n public getHashedProjectId(projectId: string): string {\n return uuidv5(projectId, this.backendNamespace)\n }\n\n static async create(\n config: z.infer<typeof stateManagerConfig>,\n backend: StateBackend,\n hotStateManager: HotStateManager,\n logger: Logger,\n ): Promise<StateManager> {\n let backendId = await backend.getStaticBackendId()\n if (!backendId) {\n backendId = uuidv4()\n await backend.setStaticBackendId(backendId)\n }\n\n const masterKey = await StateManager.loadBackendMasterKey(config, backend, logger)\n const encryptionBackend = new MasterKeyEncryptionBackend(() => Promise.resolve(masterKey))\n\n return new StateManager(backendId, encryptionBackend, backend, hotStateManager, logger)\n }\n\n static async loadBackendMasterKey(\n config: z.infer<typeof stateManagerConfig>,\n backend: StateBackend,\n logger: Logger,\n ): Promise<Uint8Array> {\n // 1. try to load the master key from HIGHSTATE_BACKEND_MASTER_KEY\n const configMasterKey = config.HIGHSTATE_BACKEND_MASTER_KEY\n if (configMasterKey) {\n logger.info(\"loaded backend master key from HIGHSTATE_BACKEND_MASTER_KEY\")\n\n return Buffer.from(configMasterKey, \"hex\")\n }\n\n // 2. try to load the master key from file path provided in HIGHSTATE_BACKEND_MASTER_KEY_PATH\n const configMasterKeyPath = config.HIGHSTATE_BACKEND_MASTER_KEY_PATH\n if (configMasterKeyPath) {\n try {\n const content = await readFile(configMasterKeyPath, \"utf-8\")\n\n return Buffer.from(content.trim(), \"hex\")\n } catch (error) {\n throw new Error(`Failed to read backend master key from path: ${configMasterKeyPath}`, {\n cause: error,\n })\n }\n }\n\n // 3. try to decrypt the master key using the keyring\n try {\n const identity = await getOrCreateBackendIdentity(logger)\n\n let armoredMasterKey = await backend.getEncryptedBackendMasterKey()\n if (!armoredMasterKey) {\n const masterKey = randomBytes(32)\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 armoredMasterKey = armor.encode(encryptedMasterKey)\n await backend.setEncryptedBackendMasterKey(armoredMasterKey)\n\n logger.info(\"generated and stored new backend master key\")\n }\n\n const decrypter = new Decrypter()\n decrypter.addIdentity(identity)\n\n const encryptedMasterKey = armor.decode(armoredMasterKey)\n const masterKey = await decrypter.decrypt(encryptedMasterKey)\n\n logger.info(\"loaded backend master key using OS keyring\")\n\n return masterKey\n } catch (error) {\n throw new Error(\"Failed to load master key using OS keyring\", { cause: error })\n }\n }\n}\n","import { xchacha20poly1305 } from \"@noble/ciphers/chacha.js\"\nimport { managedNonce } from \"@noble/ciphers/webcrypto.js\"\n\nexport interface EncryptionBackend {\n /**\n * Encrypts the given binary data using the configured master key.\n *\n * @param data The binary data to encrypt, represented as a Uint8Array.\n */\n encrypt(data: Uint8Array): Promise<Uint8Array>\n\n /**\n * Decrypts the given binary data using the configured master key.\n *\n * @param data The binary data to decrypt, represented as a Uint8Array.\n */\n decrypt(data: Uint8Array): Promise<Uint8Array>\n}\n\n/**\n * The no-op encryption backend that does not perform any encryption or decryption and simply\n * returns the data as-is.\n */\nexport class PassThroughEncryptionBackend implements EncryptionBackend {\n static readonly instance = new PassThroughEncryptionBackend()\n\n encrypt(data: Uint8Array): Promise<Uint8Array> {\n return Promise.resolve(data)\n }\n\n decrypt(data: Uint8Array): Promise<Uint8Array> {\n return Promise.resolve(data)\n }\n}\n\n/**\n * The MasterKeyEncryptionBackend encryption backend that uses the noble-ciphers library to encrypt and decrypt data.\n * It requires a master key to be provided, which is used for the actual encryption and decryption operations.\n * The master key should be a 32-byte Uint8Array.\n * This backend uses XChaCha20-Poly1305 for encryption and decryption.\n * The nonce is 24 bytes long and is prepended to the ciphertext.\n */\nexport class MasterKeyEncryptionBackend implements EncryptionBackend {\n constructor(private readonly masterKeyProvider: () => Promise<Uint8Array>) {}\n\n async encrypt(data: Uint8Array): Promise<Uint8Array> {\n const chacha = managedNonce(xchacha20poly1305)(await this.masterKeyProvider())\n const encryptedData = chacha.encrypt(data)\n\n return Promise.resolve(encryptedData)\n }\n\n async decrypt(data: Uint8Array): Promise<Uint8Array> {\n const chacha = managedNonce(xchacha20poly1305)(await this.masterKeyProvider())\n const decryptedData = chacha.decrypt(data)\n\n return Promise.resolve(decryptedData)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { EncryptionBackend } from \"../encryption\"\nimport { v5 as uuidv5 } from \"uuid\"\nimport { z } from \"zod\"\nimport { decode, encode } from \"@msgpack/msgpack\"\nimport {\n type StateCollection,\n type CollectionQuery,\n type StateBatch,\n type StateSnapshot,\n ProjectLockedError,\n} from \"../abstractions\"\nimport { type CollectionQueryResult, type ObjectMeta, hasObjectMeta } from \"../../shared\"\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\nexport const NO_KEY_HASHING = undefined\n\n/**\n * StateRepository provides typed high-level CRUD operations over a StateCollection.\n *\n * It handles serialization, encryption, validation, metadata management and hashing of sensitive keys.\n */\nexport class StateRepository<TSchema extends z.ZodType> {\n private isStringSchema: boolean\n private isSchemaHasMeta: boolean\n\n constructor(\n private readonly collection: StateCollection,\n private readonly schema: TSchema,\n private readonly encryptionBackend: EncryptionBackend,\n private readonly keyHashNamespaceProvider: (() => Promise<string>) | undefined,\n private readonly logger: Logger,\n ) {\n this.isStringSchema = this.schema instanceof z.ZodString\n this.isSchemaHasMeta = this.schema instanceof z.ZodObject && !!this.schema.shape.meta\n }\n\n /**\n * Hashes a key using UUIDv5 if keyHashNamespaceProvider is provided.\n */\n private async hashKey(key: string): Promise<string> {\n if (!this.keyHashNamespaceProvider) return key\n const namespace = await this.keyHashNamespaceProvider()\n\n return uuidv5(key, namespace)\n }\n\n /**\n * Retrieves a single value by its key.\n */\n async get(key: string, snapshot?: StateSnapshot): Promise<z.infer<TSchema> | undefined> {\n const hashedKey = await this.hashKey(key)\n const data = await this.collection.get(hashedKey, snapshot)\n if (!data) return undefined\n\n return await this.deserialize(data, key)\n }\n\n /**\n * Retrieves multiple values by their keys, returning an array of key-value pairs which was found.\n */\n async getMany(keys: string[], snapshot?: StateSnapshot): Promise<[string, z.infer<TSchema>][]> {\n if (keys.length === 0) return []\n\n const hashedKeys: string[] = []\n for (const key of keys) {\n const hashedKey = await this.hashKey(key)\n hashedKeys.push(hashedKey)\n }\n\n const entries = await this.collection.getMany(hashedKeys, snapshot)\n const result: [string, z.infer<TSchema>][] = []\n\n for (const [index, data] of entries.entries()) {\n if (!data) continue\n\n const realKey = keys[index]\n const deserialized = await this.deserialize(data, realKey)\n\n if (deserialized !== undefined) {\n result.push([realKey, deserialized])\n }\n }\n\n return result\n }\n\n /**\n * Retrieves multiple values by their keys, returning a record with found items.\n */\n async getManyRecord(\n keys: string[],\n snapshot?: StateSnapshot,\n ): Promise<Record<string, z.infer<TSchema>>> {\n const entries = await this.getMany(keys, snapshot)\n\n return Object.fromEntries(entries)\n }\n\n /**\n * Retrieves multiple items by their IDs, returning only the found items as an array.\n */\n async getManyItems(ids: string[], snapshot?: StateSnapshot): Promise<z.infer<TSchema>[]> {\n const entries = await this.getMany(ids, snapshot)\n\n return entries.map(([, value]) => value)\n }\n\n /**\n * Retrieves all values in the collection, returning an array of key-value pairs.\n *\n * NOTE: If the key hashing is enabled, the keys of the returned entries will be the hashed keys.\n */\n async getAll(snapshot?: StateSnapshot): Promise<Array<[string, z.infer<TSchema>]>> {\n const entries = await this.collection.getAll(snapshot)\n const result: [string, z.infer<TSchema>][] = []\n\n for (const [hashedKey, data] of entries) {\n const deserialized = await this.deserialize(data, hashedKey)\n if (deserialized !== undefined) {\n result.push([hashedKey, deserialized])\n }\n }\n\n return result\n }\n\n /**\n * Retrieves all values in the collection, returning a record of key-value pairs.\n *\n * NOTE: If the key hashing is enabled, the keys of the returned record will be the hashed keys.\n */\n async getAllRecord(snapshot?: StateSnapshot): Promise<Record<string, z.infer<TSchema>>> {\n const entries = await this.getAll(snapshot)\n\n return Object.fromEntries(entries)\n }\n\n /**\n * Retrieves all values in the collection, returning an array of items.\n *\n * NOTE: If the key hashing is enabled, the keys of the returned items will be the hashed keys.\n */\n async getAllItems(snapshot?: StateSnapshot): Promise<z.infer<TSchema>[]> {\n const entries = await this.getAll(snapshot)\n\n return entries.map(([, value]) => value)\n }\n\n /**\n * Stores a single key-value pair.\n */\n async put(key: string, value: z.infer<TSchema>, batch?: StateBatch): Promise<void> {\n const data = await this.serialize(value)\n const hashedKey = await this.hashKey(key)\n\n await this.collection.put(hashedKey, data, batch)\n }\n\n /**\n * Stores a single item which has an `id` field.\n */\n async putItem(item: z.infer<TSchema> & { id: string }, batch?: StateBatch): Promise<void> {\n const hashedKey = await this.hashKey(item.id)\n const data = await this.serialize(item)\n\n await this.collection.put(hashedKey, data, batch)\n }\n\n /**\n * Stores multiple key-value pairs in a batch operation.\n */\n async putMany(entries: [string, z.infer<TSchema>][], batch?: StateBatch): Promise<void> {\n if (entries.length === 0) return\n\n const serialiedEntries: [string, Uint8Array][] = []\n for (const [key, value] of entries) {\n const hashedKey = await this.hashKey(key)\n const serializedValue = await this.serialize(value)\n serialiedEntries.push([hashedKey, serializedValue])\n }\n\n await this.collection.putMany(serialiedEntries, batch)\n }\n\n /**\n * Stores multiple items which have an `id` field.\n */\n async putManyItems(\n items: (z.infer<TSchema> & { id: string })[],\n batch?: StateBatch,\n ): Promise<void> {\n if (items.length === 0) return\n\n const entries: [string, Uint8Array][] = []\n for (const item of items) {\n const hashedKey = await this.hashKey(item.id)\n const serializedValue = await this.serialize(item)\n entries.push([hashedKey, serializedValue])\n }\n\n await this.collection.putMany(entries, batch)\n }\n\n /**\n * Deletes a single value by its key.\n */\n async delete(key: string, batch?: StateBatch): Promise<void> {\n const hashedKey = await this.hashKey(key)\n\n await this.collection.delete(hashedKey, batch)\n }\n\n /**\n * Deletes multiple values by their keys.\n */\n async deleteMany(keys: string[], batch?: StateBatch): Promise<void> {\n const hashedKeys = await Promise.all(keys.map(key => this.hashKey(key)))\n\n await this.collection.deleteMany(hashedKeys, batch)\n }\n\n /**\n * Validates the value and serializes it using the appropriate method based on schema type.\n */\n private async serialize(value: z.infer<TSchema>): Promise<Uint8Array> {\n // first validate the value against the schema\n const validatedValue = this.schema.parse(value)\n\n let encodedValue: Uint8Array\n if (this.isStringSchema) {\n // the strings are encoded as utf-8\n encodedValue = textEncoder.encode(validatedValue as string)\n } else {\n // check if item has meta and update timestamps\n if (this.isSchemaHasMeta) {\n const now = Date.now()\n const valueWithMeta = validatedValue as { meta?: ObjectMeta }\n\n valueWithMeta.meta = valueWithMeta.meta ?? {}\n valueWithMeta.meta.createdAt ??= now\n valueWithMeta.meta.updatedAt = now\n }\n\n // other types are serialized using messagepack\n encodedValue = encode(validatedValue, { ignoreUndefined: true })\n }\n\n // then encrypt the serialized data\n return await this.encryptionBackend.encrypt(encodedValue)\n }\n\n /**\n * Deserializes and validates binary data to a typed value.\n */\n private async deserialize(data: Uint8Array, key: string): Promise<z.infer<TSchema> | undefined> {\n let decryptedData: Uint8Array\n try {\n // decrypt the data first\n decryptedData = await this.encryptionBackend.decrypt(data)\n } catch (error) {\n if (error instanceof ProjectLockedError) {\n throw error\n }\n\n this.logger.warn(\n { error, key },\n \"failed to decrypt data during deserialization, will return undefined\",\n )\n\n return undefined\n }\n\n let decodedValue: unknown\n try {\n if (this.isStringSchema) {\n // if the schema is a string, decode as utf-8\n decodedValue = textDecoder.decode(decryptedData)\n } else {\n // otherwise decode as messagepack\n decodedValue = decode(decryptedData)\n }\n } catch (error) {\n this.logger.warn(\n { error, key },\n \"failed to decode data during deserialization, will return undefined\",\n )\n\n return undefined\n }\n\n // validate against schema\n const parseResult = this.schema.safeParse(decodedValue)\n if (!parseResult.success) {\n this.logger.warn(\n { error: parseResult.error, key },\n `failed to validate data during deserialization, will return undefined`,\n )\n\n return undefined\n }\n\n return parseResult.data\n }\n\n /**\n * Queries the collection with pagination support.\n *\n * Returns a subset of deserialized key/value pairs and a cursor for the next page.\n *\n * NOTE: If the `search` parameter is provided, this method will perform a O(n) search.\n *\n * NOTE 2: If the key hashing is enabled, the keys of the returned items will be the hashed keys.\n */\n async query(\n query: CollectionQuery,\n snapshot?: StateSnapshot,\n ): Promise<CollectionQueryResult<[string, z.infer<TSchema>]>> {\n const { search } = query\n\n // if search is provided, we need to get all items and filter them\n // if (search) {\n // return await this.queryWithSearchNotOptimal(query, snapshot)\n // }\n\n // no search - use the efficient collection query\n const rawResult = await this.collection.query(query, snapshot)\n const total = await this.collection.getTotalCount(snapshot)\n\n // deserialize and validate values\n const items: Array<[string, z.infer<TSchema>]> = []\n\n for (const [index, rawData] of rawResult.items.entries()) {\n const deserialized = await this.deserialize(rawData[1], `query-item-${index}`)\n if (deserialized !== undefined) {\n items.push([rawData[0], deserialized])\n }\n }\n\n return {\n items,\n total,\n nextCursor: rawResult.nextCursor,\n }\n }\n\n /**\n * Queries the collection with pagination support.\n * Returns a subset of deserialized values and a cursor for the next page.\n */\n async queryItems(\n query: CollectionQuery,\n snapshot?: StateSnapshot,\n ): Promise<CollectionQueryResult<z.infer<TSchema>>> {\n const result = await this.query(query, snapshot)\n\n return {\n items: result.items.map(item => item[1]), // extract only the values\n total: result.total,\n nextCursor: result.nextCursor,\n }\n }\n\n /**\n * Handles search queries by streaming and filtering items using collection.iterate.\n * For string schemas, searches in the string value. For object schemas, searches in meta fields.\n */\n private async queryWithSearchNotOptimal(\n query: CollectionQuery,\n snapshot?: StateSnapshot,\n ): Promise<CollectionQueryResult<z.infer<TSchema>>> {\n const { search, cursor, count = 20 } = query\n const limit = Math.min(count, 100)\n\n const items: z.infer<TSchema>[] = []\n let total = 0\n let cursorPassed = cursor === undefined\n let pageFilled = false\n let nextCursor: string | undefined\n\n // iterate through collection and apply pagination in the loop\n for await (const [hashedKey, rawData] of this.collection.iterate(snapshot)) {\n const item = await this.deserialize(rawData, hashedKey)\n if (item === undefined) continue\n if (!this.matchesSearch(item, search!)) continue\n\n total++\n\n // handle cursor pagination\n if (!cursorPassed) {\n if (hashedKey === cursor) {\n cursorPassed = true\n }\n continue\n }\n\n // collect results\n if (items.length < limit) {\n items.push(item)\n }\n\n if (items.length === limit) {\n // if we reached the limit, set the page filled flag\n pageFilled = true\n continue\n }\n\n if (!nextCursor && pageFilled) {\n // if the last item had filled the page, set the next cursor\n nextCursor = hashedKey\n }\n\n // continue iterating even if we reached the limit to calculate total\n }\n\n return {\n items,\n total,\n nextCursor,\n }\n }\n\n /**\n * Checks if an item matches the search query.\n * For strings: searches in the string value itself.\n * For objects: searches in meta fields if they exist.\n */\n private matchesSearch(item: z.infer<TSchema>, search: string): boolean {\n const searchLower = search.toLowerCase()\n\n // for string schemas, search in the string value\n if (this.isStringSchema) {\n const stringValue = item as string\n return stringValue.toLowerCase().includes(searchLower)\n }\n\n // for object schemas, search in meta fields if they exist\n if (hasObjectMeta(item)) {\n const { meta } = item\n\n if (meta.title?.toLowerCase().includes(searchLower)) {\n return true\n }\n\n if (meta.globalTitle?.toLowerCase().includes(searchLower)) {\n return true\n }\n\n if (meta.description?.toLowerCase().includes(searchLower)) {\n return true\n }\n }\n\n return false\n }\n}\n","import type { Logger } from \"pino\"\nimport type { StateRepository } from \"./repository\"\nimport type { CollectionQuery, StateSnapshot } from \"../abstractions\"\nimport type { CollectionQueryResult } from \"../../shared\"\nimport type { StateManager } from \"../manager\"\nimport { type z } from \"zod\"\n\n/**\n * The index value that indicates an object key is the same as the index key.\n *\n * NOTE: DO NOT use this feature when the index repository has key hashing enabled.\n */\nexport const SAME_KEY = \"\"\n\n/**\n * StateIndexRepository provides read-only operations that combine two StateRepository instances.\n *\n * The index repository maps index keys to object keys, allowing indirect access to objects in the main repository.\n */\nexport class StateIndexRepository<TSchema extends z.ZodType> {\n constructor(\n private readonly stateManager: StateManager,\n public readonly repository: StateRepository<TSchema>,\n public readonly indexRepository: StateRepository<z.ZodString>,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Retrieves a single item by its index key.\n */\n async get(indexKey: string): Promise<z.infer<TSchema> | undefined> {\n const snapshot = this.stateManager.snapshot()\n\n // fetch the object key from the index repository\n const objectKey = await this.indexRepository.get(indexKey, snapshot)\n if (!objectKey) {\n return undefined\n }\n\n // if index value is empty string, use the index key itself\n const resolvedObjectId = objectKey === SAME_KEY ? indexKey : objectKey\n\n const item = await this.repository.get(resolvedObjectId, snapshot)\n if (item === undefined) {\n this.logger.warn({ indexKey, resolvedObjectId }, \"index points to non-existent object\")\n return undefined\n }\n\n return item\n }\n\n /**\n * Retrieves multiple items by their index keys, returning an array of records.\n *\n * NOTE: the keys of the records are the index keys, not the object keys.\n */\n async getMany(indexKeys: string[]): Promise<[string, z.infer<TSchema>][]> {\n if (indexKeys.length === 0) return []\n\n const snapshot = this.stateManager.snapshot()\n\n // get all index records for the provided keys\n const indexRecords = await this.indexRepository.getMany(indexKeys, snapshot)\n if (indexRecords.length === 0) return []\n\n // resolve index records to get the actual objects\n return this.resolveIndexEntries(indexRecords, snapshot)\n }\n\n /**\n * Retrieves multiple items by their index keys, returning a record of objects.\n *\n * NOTE: the keys of the record are the index keys, not the object keys.\n */\n async getManyRecord(indexKeys: string[]): Promise<Record<string, z.infer<TSchema> | null>> {\n const records = await this.getMany(indexKeys)\n\n return Object.fromEntries(records)\n }\n\n /**\n * Retrieves multiple items by their index keys, returning an array of objects.\n */\n async getManyItems(indexKeys: string[]): Promise<z.infer<TSchema>[]> {\n const records = await this.getMany(indexKeys)\n\n return Object.values(records)\n .filter(item => item !== null)\n .map(([, item]) => item)\n }\n\n /**\n * Retrieves all items that have index entries, returning an array of records.\n *\n * NOTE: the keys of the records are the index keys, not the object keys.\n */\n async getAll(): Promise<Array<[string, z.infer<TSchema>]>> {\n const snapshot = this.stateManager.snapshot()\n\n // get all index records\n const indexEntries = await this.indexRepository.getAll(snapshot)\n if (indexEntries.length === 0) return []\n\n // resolve index entries to get the actual objects\n return this.resolveIndexEntries(indexEntries, snapshot)\n }\n\n /**\n * Retrieves all items that have index entries, returning a record of objects.\n *\n * NOTE: the keys of the record are the index keys, not the object keys.\n */\n async getAllRecord(): Promise<Record<string, z.infer<TSchema> | null>> {\n const allEntries = await this.getAll()\n\n // convert the array of entries to a record\n return Object.fromEntries(allEntries)\n }\n\n /**\n * Retrieves all items that have index entries.\n * Iterates through the index and returns all matched objects.\n */\n async getAllItems(): Promise<z.infer<TSchema>[]> {\n const allEntries = await this.getAll()\n\n return allEntries.map(([, item]) => item)\n }\n\n /**\n * Queries the index repository and retrieves items from the main repository.\n */\n async query(query: CollectionQuery): Promise<CollectionQueryResult<[string, z.infer<TSchema>]>> {\n const snapshot = this.stateManager.snapshot()\n\n // first, resolve the query to get the index keys\n const result = await this.indexRepository.query(query, snapshot)\n\n // then resolve the index entries to get the actual objects\n const items = await this.resolveIndexEntries(result.items, snapshot)\n\n return {\n total: result.total,\n items,\n nextCursor: result.nextCursor,\n }\n }\n\n /**\n * Queries the index repository and retrieves items from the main repository, returning an array of objects.\n */\n async queryItems(query: CollectionQuery): Promise<CollectionQueryResult<z.infer<TSchema>>> {\n const result = await this.query(query)\n\n // extract the items from the result\n return {\n total: result.total,\n items: result.items.map(([, item]) => item),\n nextCursor: result.nextCursor,\n }\n }\n\n private async resolveIndexEntries(\n indexEntries: [string, string][],\n snapshot: StateSnapshot,\n ): Promise<[string, z.infer<TSchema>][]> {\n // collect all object keys that were found\n const objectKeys: string[] = []\n for (const [indexKey, objectId] of indexEntries) {\n // if index value is empty string, use the index key itself\n const resolvedObjectId = objectId === SAME_KEY ? indexKey : objectId\n objectKeys.push(resolvedObjectId)\n }\n\n // get objects from main repository\n const objectRecord = await this.repository.getManyRecord(objectKeys, snapshot)\n const result: [string, z.infer<TSchema>][] = []\n\n for (const [indexKey, objectKey] of indexEntries) {\n const resolvedObjectId = objectKey === SAME_KEY ? indexKey : objectKey\n const item = objectRecord[resolvedObjectId]\n\n if (item === undefined) {\n this.logger.warn({ indexKey, resolvedObjectId }, \"index points to non-existent object\")\n continue\n }\n\n result.push([indexKey, item])\n }\n\n return result\n }\n}\n","import type { Logger } from \"pino\"\nimport { AsyncEntry, findCredentialsAsync } from \"@napi-rs/keyring\"\nimport { generateIdentity } from \"age-encryption\"\n\nconst serviceName = \"io.highstate.backend\"\nconst accountName = \"identity\"\n\nexport async function getOrCreateBackendIdentity(logger: Logger): Promise<string> {\n const credentials = await findCredentialsAsync(serviceName)\n const entry = credentials.find(entry => entry.account === accountName)\n\n if (entry) {\n logger.debug(\"found existing backend identity in 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 type { ArtifactBackend } from \"./abstractions\"\nimport type { Logger } from \"pino\"\nimport type { StateManager } from \"../state\"\nimport { z } from \"zod\"\nimport { LocalArtifactBackend, localArtifactBackendConfig } from \"./local\"\nimport { EncryptionArtifactBackend } from \"./encryption\"\n\nexport const artifactBackendConfig = z.object({\n HIGHSTATE_ARTIFACT_BACKEND_TYPE: z.enum([\"local\"]).default(\"local\"),\n HIGHSTATE_ARTIFACT_ENABLE_ENCRYPTION: z.coerce.boolean().default(true),\n ...localArtifactBackendConfig.shape,\n})\n\nexport async function createArtifactBackend(\n config: z.infer<typeof artifactBackendConfig> & Record<string, unknown>,\n stateManager: StateManager,\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, stateManager, logger)\n }\n }\n\n if (config.HIGHSTATE_ARTIFACT_ENABLE_ENCRYPTION) {\n backend = new EncryptionArtifactBackend(backend, stateManager)\n } else {\n logger.warn(\"artifact encryption is disabled, this is not recommended\")\n }\n\n return backend\n}\n","import type { Logger } from \"pino\"\nimport type { StateManager } from \"../state\"\nimport { createReadStream, createWriteStream } from \"node:fs\"\nimport { access, mkdir, readdir, rmdir, unlink } from \"node:fs/promises\"\nimport { join, resolve } from \"node:path\"\nimport { z } from \"zod\"\nimport { type ArtifactBackend } from \"./abstractions\"\n\nexport const localArtifactBackendConfig = z.object({\n HIGHSTATE_ARTIFACT_BACKEND_LOCAL_DIR: z.string().optional(),\n})\n\n/**\n * A local artifact backend that stores artifacts in the filesystem.\n *\n * The default artifact location is `~/.highstate/artifacts`.\n *\n * File structure:\n * - `{artifactDir}/{first2chars}/{hash}` - actual artifact content files\n */\nexport class LocalArtifactBackend implements ArtifactBackend {\n constructor(\n private readonly storageDir: string,\n private readonly fileExtension: string,\n private readonly stateManager: StateManager,\n private readonly logger: Logger,\n ) {\n this.logger.debug({ msg: \"initialized\", baseDir: storageDir })\n }\n\n async store(\n projectId: string,\n hash: string,\n chunkSize: number,\n content: AsyncIterable<Uint8Array>,\n ): Promise<void> {\n const [baseDir, fileName] = this.getArtifactPath(projectId, hash)\n await mkdir(baseDir, { recursive: true })\n\n // check if the artifact already exists\n try {\n await access(fileName)\n this.logger.debug({ msg: \"artifact already exists\", hash })\n\n return\n } catch {\n // artifact does not exist, continue with storing\n }\n\n const file = createWriteStream(fileName, { highWaterMark: chunkSize })\n this.logger.debug({ msg: \"opened file for writing\", hash, fileName })\n\n for await (const chunk of content) {\n file.write(chunk)\n }\n\n file.end()\n this.logger.info({ msg: \"artifact stored\", hash, fileName })\n }\n\n async retrieve(\n projectId: string,\n hash: string,\n chunkSize: number,\n ): Promise<AsyncIterable<Uint8Array> | null> {\n const [, fileName] = this.getArtifactPath(projectId, hash)\n\n try {\n return Promise.resolve(createReadStream(fileName, { highWaterMark: chunkSize }))\n } catch (error) {\n this.logger.debug({ msg: \"artifact retrieval failed\", hash, error })\n\n return null\n }\n }\n\n async delete(projectId: string, hash: string): Promise<void> {\n const [baseDir, fileName] = this.getArtifactPath(projectId, hash)\n\n try {\n await unlink(fileName)\n await this.deleteDirectoryIfEmpty(baseDir)\n\n this.logger.info({ msg: \"artifact deleted\", hash, fileName })\n } catch (error) {\n this.logger.error({ msg: \"artifact deletion failed\", hash, fileName, error })\n }\n }\n\n async deleteDirectoryIfEmpty(dirPath: string): Promise<void> {\n try {\n const files = await readdir(dirPath)\n if (files.length === 0) {\n await rmdir(dirPath)\n this.logger.info({ msg: \"deleted empty directory\", dirPath })\n } else {\n this.logger.debug({ msg: \"directory not empty, skipping deletion\", dirPath, files })\n }\n } catch (error) {\n this.logger.error({ msg: \"failed to delete directory\", dirPath, error })\n }\n }\n\n async exists(projectId: string, hash: string): Promise<boolean> {\n const [, fileName] = this.getArtifactPath(projectId, hash)\n\n try {\n await access(fileName)\n return true\n } catch {\n return false\n }\n }\n\n private getArtifactPath(projectId: string, hash: string): [baseDir: string, fileName: string] {\n const hashedProjectId = this.stateManager.getHashedProjectId(projectId)\n const baseDir = resolve(this.storageDir, hashedProjectId, hash.substring(0, 2))\n const fileName = join(baseDir, `${hash}${this.fileExtension}`)\n\n return [baseDir, fileName]\n }\n\n static async create(\n config: z.infer<typeof localArtifactBackendConfig>,\n fileExtension: string,\n stateManager: StateManager,\n logger: Logger,\n ): Promise<LocalArtifactBackend> {\n const childLogger = logger.child({\n backend: \"ArtifactBackend\",\n service: \"LocalArtifactBackend\",\n })\n\n let location = config.HIGHSTATE_ARTIFACT_BACKEND_LOCAL_DIR\n if (!location) {\n location = resolve(process.env.HOME!, \".highstate\", \"artifacts\")\n }\n\n await mkdir(location, { recursive: true })\n return new LocalArtifactBackend(location, fileExtension, stateManager, childLogger)\n }\n}\n","import type { EncryptionBackend, StateManager } from \"../state\"\nimport type { ArtifactBackend } from \"./abstractions\"\n\nconst nonceSize = 24\n\nexport class EncryptionArtifactBackend implements ArtifactBackend {\n constructor(\n private readonly artifactBackend: ArtifactBackend,\n private readonly stateManager: StateManager,\n ) {}\n\n async store(\n projectId: string,\n hash: string,\n chunkSize: number,\n content: AsyncIterable<Uint8Array>,\n ): Promise<void> {\n const encryptionBackend = this.stateManager.getEncryptionBackend(projectId)\n const encryptedContent = this.getEncryptedContent(encryptionBackend, content)\n\n await this.artifactBackend.store(projectId, hash, chunkSize + nonceSize, encryptedContent)\n }\n\n private async *getEncryptedContent(\n encryptionBackend: EncryptionBackend,\n content: AsyncIterable<Uint8Array>,\n ): AsyncIterable<Uint8Array> {\n for await (const chunk of content) {\n yield await encryptionBackend.encrypt(chunk)\n }\n }\n\n async retrieve(\n projectId: string,\n hash: string,\n chunkSize: number,\n ): Promise<AsyncIterable<Uint8Array> | null> {\n const encryptionBackend = this.stateManager.getEncryptionBackend(projectId)\n\n const encryptedContent = await this.artifactBackend.retrieve(\n projectId,\n hash,\n chunkSize + nonceSize,\n )\n\n if (encryptedContent === null) {\n return null\n }\n\n return this.getDecryptedContent(encryptionBackend, encryptedContent)\n }\n\n private async *getDecryptedContent(\n encryptionBackend: EncryptionBackend,\n encryptedContent: AsyncIterable<Uint8Array>,\n ): AsyncIterable<Uint8Array> {\n for await (const chunk of encryptedContent) {\n yield await encryptionBackend.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 { StateManager } from \"../state\"\nimport type { ArtifactBackend } from \"../artifact/abstractions\"\nimport type { LockManager } from \"../lock\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport { unique } from \"remeda\"\nimport { compareArtifactUsage, type Artifact, type ArtifactUsage, type ObjectMeta } from \"../shared\"\n\nconst 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 stateManager: StateManager,\n private readonly artifactBackend: ArtifactBackend,\n private readonly lockManager: LockManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Stores an artifact in the backend and indexes it in the state manager.\n * If the artifact already exists, it does nothing.\n *\n * Returns the artifact ID of the stored artifact.\n *\n * @param projectId The project ID to store the artifact under.\n * @param hash The unique hash of the artifact content.\n * @param meta The metadata for the artifact, including name, size, and other properties.\n * @param size The total size of the artifact in bytes.\n * @param chunkSize The size of each chunk in bytes.\n * @param content An async iterable providing the artifact content in chunks.\n * @param usages The list of usages for this artifact. Can be provided later.\n */\n async store(\n projectId: string,\n hash: string,\n size: number,\n meta: ObjectMeta,\n content: AsyncIterable<Uint8Array>,\n usages: ArtifactUsage[] = [],\n ): Promise<string> {\n return await this.lockManager.acquire([\"artifact-hash\", projectId, hash], async () => {\n const existingArtifact = await this.stateManager\n .getArtifactHashIndexRepository(projectId)\n .get(hash)\n\n if (existingArtifact) {\n const fileExists = await this.artifactBackend.exists(projectId, hash)\n if (fileExists) {\n this.logger.debug(`artifact with hash \"%s\" already exists`, hash)\n return existingArtifact.id\n }\n\n // TODO: make this check configurable\n this.logger.warn(\n `artifact with hash \"%s\" exists in index but not in backend, re-uploading`,\n hash,\n )\n }\n\n await this.artifactBackend.store(projectId, hash, artifactChunkSize, content)\n\n const artifact: Artifact = {\n id: uuidv7(),\n hash,\n size,\n usages,\n meta,\n chunkSize: artifactChunkSize,\n }\n\n const batch = this.stateManager.batch()\n\n await Promise.all([\n this.stateManager.getArtifactRepository(projectId).putItem(artifact, batch),\n this.stateManager\n .getArtifactHashIndexRepository(projectId)\n .indexRepository.put(hash, artifact.id, batch),\n ])\n\n await batch.write()\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.id\n })\n }\n\n /**\n * Add usages for artifacts in the project.\n *\n * @param projectId The project ID to which the artifacts belong.\n * @param artifactIds The IDs of the artifacts to track usages for.\n * @param usages The list of usages to track for the artifacts.\n * @returns\n */\n async addUsages(\n projectId: string,\n artifactIds: string[],\n usages: ArtifactUsage[],\n ): Promise<void> {\n if (artifactIds.length === 0 || usages.length === 0) {\n return\n }\n\n await this.lockManager.acquire(\n artifactIds.map(id => [\"artifact\", projectId, id] as const),\n () => this._addUsages(projectId, artifactIds, usages),\n )\n }\n\n private async _addUsages(\n projectId: string,\n artifactIds: string[],\n usages: ArtifactUsage[],\n ): Promise<void> {\n this.logger.debug({\n msg: \"tracking artifact usages\",\n projectId,\n artifactIds,\n usages,\n })\n\n const artifacts = await this.stateManager\n .getArtifactRepository(projectId)\n .getManyRecord(artifactIds)\n\n const artifactsToUpdate: Artifact[] = []\n\n for (const artifactId of artifactIds) {\n const artifact = artifacts[artifactId]\n if (!artifact) {\n this.logger.warn({\n msg: \"artifact not found during usage addition\",\n projectId,\n artifactId,\n })\n continue\n }\n\n // add new usages to the artifact\n for (const usage of usages) {\n if (!artifact.usages.some(u => compareArtifactUsage(u, usage))) {\n artifact.usages.push(usage)\n }\n }\n\n artifactsToUpdate.push(artifact)\n }\n\n await this.stateManager.getArtifactRepository(projectId).putManyItems(artifactsToUpdate)\n }\n\n /**\n * Removes usages for artifacts in the project.\n *\n * If an artifact has no usages left, it will be deleted immediately.\n *\n * @param projectId The project ID to which the artifacts belong.\n * @param artifactIds The IDs of the artifacts to remove usages for.\n * @param usages The list of usages to remove from the artifacts.\n */\n async removeUsages(\n projectId: string,\n artifactIds: string[],\n usages: ArtifactUsage[],\n ): Promise<void> {\n if (artifactIds.length === 0 || usages.length === 0) {\n return\n }\n\n await this.lockManager.acquire(\n artifactIds.map(id => [\"artifact\", projectId, id] as const),\n () => this._removeUsages(projectId, artifactIds, usages),\n )\n }\n\n private async _removeUsages(\n projectId: string,\n artifactIds: string[],\n usages: ArtifactUsage[],\n ): Promise<void> {\n this.logger.debug({\n msg: \"removing artifact usages\",\n projectId,\n artifactIds,\n usages,\n })\n\n const artifacts = await this.stateManager\n .getArtifactRepository(projectId)\n .getManyRecord(artifactIds)\n\n const artifactsToUpdate: Artifact[] = []\n const artifactsToDelete: Artifact[] = []\n\n for (const artifactId of artifactIds) {\n const artifact = artifacts[artifactId]\n if (!artifact) {\n this.logger.warn({\n msg: \"artifact not found during usage removal\",\n projectId,\n artifactId,\n })\n continue\n }\n\n // remove specified usages from the artifact\n artifact.usages = artifact.usages.filter(\n u => !usages.some(usage => compareArtifactUsage(u, usage)),\n )\n\n if (artifact.usages.length === 0) {\n // if no usages left, mark for deletion\n artifactsToDelete.push(artifact)\n } else {\n // otherwise, update the artifact metadata\n artifactsToUpdate.push(artifact)\n }\n }\n\n if (artifactsToUpdate.length > 0) {\n await this.stateManager.getArtifactRepository(projectId).putManyItems(artifactsToUpdate)\n }\n\n if (artifactsToDelete.length > 0) {\n await this.removeArtifacts(projectId, artifactsToDelete)\n }\n }\n\n /**\n * Updates the usage of artifacts which still have it and removes the usage from artifacts which no longer have it.\n *\n * @param projectId The project ID to which the artifacts belong.\n * @param usage The usage to track for the artifacts.\n * @param oldArtifactIds The IDs of the artifacts that previously had this usage.\n * @param newArtifactIds The IDs of the artifacts that now have this usage.\n */\n async updateUsage(\n projectId: string,\n usage: ArtifactUsage,\n oldArtifactIds: string[],\n newArtifactIds: string[],\n ): Promise<void> {\n const removedArtifactIds = oldArtifactIds.filter(id => !newArtifactIds.includes(id))\n const allArtifactIds = unique([...oldArtifactIds, ...newArtifactIds])\n\n await this.lockManager.acquire(\n allArtifactIds.map(id => [\"artifact\", projectId, id] as const),\n async () => {\n await this._addUsages(projectId, newArtifactIds, [usage])\n await this._removeUsages(projectId, removedArtifactIds, [usage])\n },\n )\n }\n\n private async removeArtifacts(projectId: string, artifacts: Artifact[]): Promise<void> {\n const batch = this.stateManager.batch()\n\n await Promise.all([\n this.stateManager.getArtifactRepository(projectId).deleteMany(\n artifacts.map(a => a.id),\n batch,\n ),\n this.stateManager.getArtifactHashIndexRepository(projectId).indexRepository.deleteMany(\n artifacts.map(a => a.hash),\n batch,\n ),\n ])\n\n await Promise.allSettled(\n artifacts.map(artifact => this.artifactBackend.delete(projectId, artifact.hash)),\n )\n\n this.logger.info({\n msg: \"deleted dangling artifacts\",\n projectId,\n artifactHashes: artifacts.map(a => a.hash),\n })\n }\n}\n","import type { Logger } from \"pino\"\nimport type { PubSubBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { LocalPubSubBackend } from \"./local\"\n\nexport const pubSubBackendConfig = z.object({\n HIGHSTATE_PUBSUB_BACKEND_TYPE: z.enum([\"local\"]).default(\"local\"),\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 \"local\": {\n return LocalPubSubBackend.create(logger)\n }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { PubSubBackend } from \"./abstractions\"\nimport type { z } from \"zod\"\nimport { EventEmitter, on } from \"node:events\"\n\nexport class LocalPubSubBackend implements PubSubBackend {\n private readonly eventEmitter = new EventEmitter()\n\n private constructor(private readonly logger: Logger) {}\n\n async *subscribe<TSchema extends z.ZodSchema>(\n topic: string,\n _schema: TSchema,\n signal?: AbortSignal,\n ): AsyncIterable<z.infer<TSchema>> {\n for await (const [event] of on(this.eventEmitter, topic, { signal })) {\n // do not validate here because all IPC happends in the same process\n yield event as z.infer<TSchema>\n }\n }\n\n publish<TSchema extends z.ZodSchema>(\n topic: string,\n _schema: TSchema,\n message: z.infer<TSchema>,\n ): 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 static create(logger: Logger): PubSubBackend {\n return new LocalPubSubBackend(logger)\n }\n}\n","import type { PubSubBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport {\n compositeInstanceEventSchema,\n instanceLockEventSchema,\n instanceStateEventSchema,\n operationEventSchema,\n operationLogEntrySchema,\n projectUnlockStateSchema,\n terminalSessionSchema,\n workerUnitRegistrationSchema,\n} from \"../shared\"\n\nexport type PubSubEventMap = {\n \"project-unlock-state\": [projectId: string]\n \"instance-state\": [projectId: string]\n \"instance-lock\": [projectId: string]\n operation: [projectId: string]\n \"composite-instance\": [projectId: string]\n \"active-terminal-session\": [projectId: string, sessionId: string]\n \"operation-instance-log\": [operationId: string, instanceId: string]\n \"worker-unit-registration\": [projectId: string, workerId: string]\n}\n\nconst eventSchemas = {\n \"project-unlock-state\": projectUnlockStateSchema,\n \"instance-state\": instanceStateEventSchema,\n \"instance-lock\": instanceLockEventSchema,\n operation: operationEventSchema,\n \"composite-instance\": compositeInstanceEventSchema,\n \"active-terminal-session\": terminalSessionSchema,\n \"operation-instance-log\": operationLogEntrySchema,\n \"worker-unit-registration\": workerUnitRegistrationSchema,\n}\n\ntype PubSubEventSchemas = typeof eventSchemas\n\nexport class PubSubManager {\n constructor(private readonly pubsubBackend: PubSubBackend) {}\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.\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 ): AsyncIterable<z.infer<PubSubEventSchemas[K]>> {\n const topic = key.join(\":\")\n const schema = eventSchemas[key[0]]\n try {\n for await (const message of this.pubsubBackend.subscribe(topic, schema, signal)) {\n yield message as z.infer<PubSubEventSchemas[K]>\n }\n } catch (error) {\n if (signal?.aborted) {\n return\n }\n throw error\n }\n }\n\n /**\n * Publishes an event to the pubsub backend.\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: [type: K, ...PubSubEventMap[K]],\n message: z.infer<PubSubEventSchemas[K]>,\n ): Promise<void> {\n const topic = key.join(\":\")\n const schema = eventSchemas[key[0]]\n await this.pubsubBackend.publish(topic, schema, message)\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]) => {\n const topic = key.join(\":\")\n const schema = eventSchemas[key[0]]\n return this.pubsubBackend.publish(topic, schema, message)\n })\n await Promise.allSettled(promises)\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 type { BetterLock as BetterLockType } from \"better-lock/dist/better_lock\"\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 { join } from \"remeda\"\n\nexport type LockKeyMap = {\n /**\n * Lock for a specific project.\n */\n project: [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 instance state within a project.\n */\n \"instance-state\": [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 { HotStateBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { MemoryHotStateBackend } from \"./memory\"\n\nexport const hotStateBackendConfig = z.object({\n HIGHSTATE_HOTSTATE_BACKEND_TYPE: z.enum([\"memory\"]).default(\"memory\"),\n})\n\nexport function createHotStateBackend(\n config: z.infer<typeof hotStateBackendConfig>,\n): HotStateBackend {\n switch (config.HIGHSTATE_HOTSTATE_BACKEND_TYPE) {\n case \"memory\": {\n return MemoryHotStateBackend.create()\n }\n }\n}\n","import type { z } from \"zod\"\nimport type { HotStateBackend } from \"./abstractions\"\n\nexport class MemoryHotStateBackend implements HotStateBackend {\n private readonly storage = new Map<string, unknown>()\n\n get<TSchema extends z.ZodSchema>(key: string): Promise<z.infer<TSchema> | null> {\n const value = this.storage.get(key)\n if (value === undefined || value instanceof Map) {\n return Promise.resolve(null)\n }\n return Promise.resolve(value as z.infer<TSchema>)\n }\n\n exists(key: string): Promise<boolean> {\n const exists = this.storage.has(key) && !(this.storage.get(key) instanceof Map)\n return Promise.resolve(exists)\n }\n\n set<TSchema extends z.ZodSchema>(\n key: string,\n _schema: TSchema,\n value: z.infer<TSchema>,\n ): Promise<void> {\n this.storage.set(key, value)\n return Promise.resolve()\n }\n\n delete(key: string): Promise<void> {\n this.storage.delete(key)\n return Promise.resolve()\n }\n\n hgetall<TSchema extends z.ZodSchema>(key: string): Promise<Array<[string, z.infer<TSchema>]>> {\n const value = this.storage.get(key)\n if (!(value instanceof Map)) {\n return Promise.resolve([])\n }\n\n const result: Array<[string, z.infer<TSchema>]> = []\n for (const [field, fieldValue] of value.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n result.push([field, fieldValue as z.infer<TSchema>])\n }\n return Promise.resolve(result)\n }\n\n hexists(key: string, field: string): Promise<boolean> {\n const hashSet = this.storage.get(key)\n if (!(hashSet instanceof Map)) {\n return Promise.resolve(false)\n }\n\n const exists = hashSet.has(field)\n return Promise.resolve(exists)\n }\n\n hset<TSchema extends z.ZodSchema>(\n key: string,\n field: string,\n _schema: TSchema,\n value: z.infer<TSchema>,\n ): Promise<void> {\n let hashSet = this.storage.get(key)\n if (!(hashSet instanceof Map)) {\n hashSet = new Map<string, unknown>()\n this.storage.set(key, hashSet)\n }\n\n ;(hashSet as Map<string, unknown>).set(field, value)\n return Promise.resolve()\n }\n\n hget<TSchema extends z.ZodSchema>(key: string, field: string): Promise<z.infer<TSchema> | null> {\n const hashSet = this.storage.get(key)\n if (!(hashSet instanceof Map)) {\n return Promise.resolve(null)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const value = hashSet.get(field)\n return Promise.resolve(value === undefined ? null : (value as z.infer<TSchema>))\n }\n\n hdel(key: string, field: string): Promise<void> {\n const hashSet = this.storage.get(key)\n if (hashSet instanceof Map) {\n hashSet.delete(field)\n // If the hash set becomes empty, remove it from storage\n if (hashSet.size === 0) {\n this.storage.delete(key)\n }\n }\n return Promise.resolve()\n }\n\n static create(): HotStateBackend {\n return new MemoryHotStateBackend()\n }\n}\n","import type { HotStateBackend } from \"./abstractions\"\nimport { z } from \"zod\"\nimport { instanceLockSchema, instanceStateSchema, operationSchema } from \"../shared\"\n\nexport type DataMap = {\n /**\n * Master key for a project used to read and write encrypted data.\n *\n * If the key is not set, the project is considered locked.\n */\n \"project-master-key\": {\n key: [projectId: string]\n data: z.ZodType<Uint8Array>\n }\n}\n\nconst dataSchemas: Record<string, z.ZodType> = {\n \"project-master-key\": z.instanceof(Uint8Array),\n}\n\nexport type DataHashSetMap = {\n \"active-operations\": {\n key: [projectId: string]\n data: typeof operationSchema\n }\n \"instance-states\": {\n key: [projectId: string]\n data: typeof instanceStateSchema\n }\n \"instance-locks\": {\n key: [projectId: string]\n data: typeof instanceLockSchema\n }\n \"operation-logs\": {\n key: [operationId: string]\n data: z.ZodString\n }\n}\n\nconst hashSetSchemas: Record<string, z.ZodType> = {\n \"active-operations\": operationSchema,\n \"instance-states\": instanceStateSchema,\n \"instance-locks\": instanceLockSchema,\n \"operation-logs\": z.string(),\n}\n\ntype GenericKey =\n | {\n [K in keyof DataMap]: [type: K, ...DataMap[K][\"key\"]]\n }[keyof DataMap]\n | {\n [K in keyof DataHashSetMap]: [type: K, ...DataHashSetMap[K][\"key\"]]\n }[keyof DataHashSetMap]\n\nexport class HotStateManager {\n constructor(private readonly hotStateBackend: HotStateBackend) {}\n\n /**\n * Gets a value for a key.\n *\n * @param key The key to get the value for.\n * @param schema The Zod schema to validate the value.\n * @returns The value or null if not found.\n */\n public async get<K extends keyof DataMap>(\n key: [type: K, ...DataMap[K][\"key\"]],\n ): Promise<z.infer<DataMap[K][\"data\"]> | null> {\n const result = await this.hotStateBackend.get(key.join(\":\"), dataSchemas[key[0]])\n\n return result as z.infer<DataMap[K][\"data\"]> | null\n }\n\n /**\n * Checks if a key exists.\n *\n * @param key The key to check.\n * @returns True if the key exists, false otherwise.\n */\n public async exists(key: GenericKey): Promise<boolean> {\n return await this.hotStateBackend.exists(key.join(\":\"))\n }\n\n /**\n * Sets a value for a key.\n *\n * @param key The key to set the value for.\n * @param value The value to set.\n */\n public async set<K extends keyof DataMap>(\n key: [type: K, ...DataMap[K][\"key\"]],\n value: z.infer<DataMap[K][\"data\"]>,\n ): Promise<void> {\n return await this.hotStateBackend.set(key.join(\":\"), dataSchemas[key[0]], value)\n }\n\n /**\n * Deletes a key.\n *\n * @param key The key to delete.\n */\n public async delete(key: GenericKey): Promise<void> {\n return await this.hotStateBackend.delete(key.join(\":\"))\n }\n\n /**\n * Gets all key-value pairs from a hash set.\n *\n * @param key The hash set key.\n * @returns All key-value pairs in the hash set.\n */\n public async hgetall<K extends keyof DataHashSetMap>(\n key: [type: K, ...DataHashSetMap[K][\"key\"]],\n ): Promise<[string, z.infer<DataHashSetMap[K][\"data\"]>][]> {\n const result = await this.hotStateBackend.hgetall(key.join(\":\"), hashSetSchemas[key[0]])\n\n return result as [string, z.infer<DataHashSetMap[K][\"data\"]>][]\n }\n\n /**\n * Checks if a field exists in a hash set.\n *\n * @param key The hash set key.\n * @param field The field name.\n * @returns True if the field exists, false otherwise.\n */\n public async hexists<K extends keyof DataHashSetMap>(\n key: [type: K, ...DataHashSetMap[K][\"key\"]],\n field: string,\n ): Promise<boolean> {\n return await this.hotStateBackend.hexists(key.join(\":\"), field)\n }\n\n /**\n * Sets a field in a hash set.\n *\n * @param key The hash set key.\n * @param field The field name.\n * @param value The value to set.\n */\n public async hset<K extends keyof DataHashSetMap>(\n key: [type: K, ...DataHashSetMap[K][\"key\"]],\n field: string,\n value: z.infer<DataHashSetMap[K][\"data\"]>,\n ): Promise<void> {\n return await this.hotStateBackend.hset(key.join(\":\"), field, hashSetSchemas[key[0]], value)\n }\n\n /**\n * Sets multiple fields in a hash set.\n *\n * @param key The hash set key.\n * @param entries An array of field-value pairs to set.\n */\n public async hmset<K extends keyof DataHashSetMap>(\n key: [type: K, ...DataHashSetMap[K][\"key\"]],\n entries: Array<[string, z.infer<DataHashSetMap[K][\"data\"]>]>,\n ): Promise<void> {\n const promises = entries.map(async ([field, value]) => this.hset(key, field, value))\n\n await Promise.allSettled(promises)\n }\n\n /**\n * Gets a field from a hash set.\n *\n * @param key The hash set key.\n * @param field The field name.\n * @returns The value or null if not found.\n */\n public async hget<K extends keyof DataHashSetMap>(\n key: [type: K, ...DataHashSetMap[K][\"key\"]],\n field: string,\n ): Promise<z.infer<DataHashSetMap[K][\"data\"]> | null> {\n const result = await this.hotStateBackend.hget(key.join(\":\"), field, hashSetSchemas[key[0]])\n\n return result as z.infer<DataHashSetMap[K][\"data\"]> | null\n }\n\n /**\n * Deletes a field from a hash set.\n *\n * @param key The hash set key.\n * @param field The field name.\n * @returns A promise that resolves when the field is deleted.\n */\n public async hdel<K extends keyof DataHashSetMap>(\n key: [type: K, ...DataHashSetMap[K][\"key\"]],\n field: string,\n ): Promise<void> {\n return await this.hotStateBackend.hdel(key.join(\":\"), field)\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 { WorkerBackend, WorkerRunOptions } from \"./abstractions\"\nimport { Readable } from \"node:stream\"\nimport { z } from \"zod\"\nimport spawn from \"nano-spawn\"\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 worker,\n apiKey,\n apiPath,\n stdout,\n signal,\n }: WorkerRunOptions): Promise<void> {\n const args = [\n \"run\",\n \"-i\",\n \"-v\",\n `${apiPath}:/var/run/highstate.sock`,\n worker.image,\n \"/bin/bash\",\n \"/run.sh\",\n ]\n\n const initData = {\n projectId,\n workerId: worker.id,\n apiKey,\n apiUrl: \"/var/run/highstate.sock\",\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!)\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 type { StateManager } from \"../state\"\nimport type { ApiKeyService, ProjectUnlockService } from \"../business\"\nimport type { LockManager } from \"../lock\"\nimport { PassThrough } from \"node:stream\"\nimport { z } from \"zod\"\nimport c from \"ansi-colors\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport { createAsyncBatcher } from \"../shared\"\n\nexport const workerManagerConfig = z.object({\n HIGHSTATE_WORKER_API_PATH: z.string().default(\"/var/run/highstate.sock\"),\n})\n\nexport class WorkerManager {\n constructor(\n readonly config: z.infer<typeof workerManagerConfig>,\n private readonly workerBackend: WorkerBackend,\n private readonly stateManager: StateManager,\n private readonly projectUnlockService: ProjectUnlockService,\n private readonly lockManager: LockManager,\n private readonly apiKeyService: ApiKeyService,\n private readonly logger: Logger,\n ) {\n this.projectUnlockService.registerUnlockTask(\n //\n \"launch-active-workers\",\n projectId => this.launchActiveWorkers(projectId),\n )\n }\n\n async startWorker(projectId: string, workerId: string, restart = false): Promise<void> {\n await this.lockManager.acquire([\"worker\", workerId], async () => {\n const worker = await this.stateManager.getWorkerRepository(projectId).get(workerId)\n if (!worker) {\n throw new Error(`Worker \"${workerId}\" not found in project \"${projectId}\"`)\n }\n\n if (!worker.apiKeyId) {\n throw new Error(`Worker \"${workerId}\" does not have an API key associated`)\n }\n\n if (worker.failedStartAttempts === 5) {\n this.logger.debug(\n { projectId },\n `skipping worker \"%s\" start attempt since no attempts left`,\n worker.id,\n )\n\n return\n }\n\n worker.status = \"starting\"\n\n if (restart) {\n worker.failedStartAttempts += 1\n }\n\n await this.stateManager.getWorkerRepository(projectId).putItem(worker)\n\n const apiKey = await this.apiKeyService.regenerateToken(projectId, worker.apiKeyId)\n const stdout = new PassThrough()\n\n await this.writeSystemMessage(\n projectId,\n worker.id,\n `starting worker container, attempt ${worker.failedStartAttempts + 1}/5`,\n )\n\n const logBatcher = createAsyncBatcher<string>(async logs => {\n await this.stateManager\n .getWorkerLogRepository(projectId, worker.id)\n .putMany(logs.map(log => [uuidv7(), log]))\n })\n\n stdout.on(\"data\", chunk => {\n const log = String(chunk)\n\n logBatcher.call(log)\n })\n\n void this.workerBackend\n .run({\n projectId,\n worker,\n apiPath: this.config.HIGHSTATE_WORKER_API_PATH,\n apiKey: apiKey.token,\n stdout,\n })\n // regardless the exit reason, we want to restart the worker if it has remaining attempts\n .finally(() => void this.startWorker(projectId, worker.id, true))\n })\n }\n\n async writeSystemMessage(projectId: string, workerId: string, message: string): Promise<void> {\n const prefix = c.bold.magenta(\"[runtime]\")\n\n await this.stateManager\n .getWorkerLogRepository(projectId, workerId)\n .put(uuidv7(), `${prefix} ${message}`)\n }\n\n async setWorkerRunning(projectId: string, workerId: string): Promise<void> {\n await this.lockManager.acquire([\"worker\", workerId], async () => {\n const worker = await this.stateManager.getWorkerRepository(projectId).get(workerId)\n if (!worker) {\n throw new Error(`Worker \"${workerId}\" not found in project \"${projectId}\"`)\n }\n\n worker.status = \"running\"\n worker.failedStartAttempts = 0\n\n await this.stateManager.getWorkerRepository(projectId).putItem(worker)\n\n this.logger.debug(\n { projectId, workerId },\n `worker \"%s\" is now running in project \"%s\"`,\n workerId,\n projectId,\n )\n })\n }\n\n private async launchActiveWorkers(projectId: string): Promise<void> {\n const workers = await this.stateManager.getWorkerRepository(projectId).getAllItems()\n\n this.logger.debug(\n { projectId, workerCount: workers.length },\n `launching %s active workers for project \"%s\"`,\n workers.length,\n projectId,\n )\n\n for (const worker of workers) {\n void this.startWorker(projectId, worker.id)\n }\n }\n}\n","import type { LibraryBackend } from \"../library\"\nimport type { ProjectBackend } from \"../project\"\nimport type { RunnerBackend } from \"../runner\"\nimport type { StateManager } from \"../state\"\nimport type { ArtifactService } from \"../business/artifact\"\nimport type { Logger } from \"pino\"\nimport type {\n InstanceLockService,\n OperationService,\n SecretService,\n ProjectUnlockService,\n InstanceStateService,\n} from \"../business\"\nimport type { PubSubManager } from \"../pubsub\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport { isFinalOperationStatus, type Operation, type OperationRequest } from \"../shared\"\nimport { RuntimeOperation } from \"./operation\"\n\nexport class OperationManager {\n constructor(\n private readonly runnerBackend: RunnerBackend,\n private readonly libraryBackend: LibraryBackend,\n private readonly projectBackend: ProjectBackend,\n private readonly artifactManager: ArtifactService,\n private readonly stateManager: StateManager,\n private readonly instanceLockService: InstanceLockService,\n private readonly stateUnlockService: ProjectUnlockService,\n private readonly operationService: OperationService,\n private readonly secretService: SecretService,\n private readonly instanceStateService: InstanceStateService,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {\n this.stateUnlockService.registerUnlockTask(\n //\n \"process-lost-operations\",\n projectId => this.processLostOperations(projectId),\n )\n }\n\n private readonly runtimeOperations = new Map<string, RuntimeOperation>()\n\n /**\n * Launches the project operation.\n *\n * @param request The operation request to launch.\n */\n async launch(request: OperationRequest): Promise<Operation> {\n const operation: Operation = {\n id: uuidv7(),\n meta: {},\n type: request.type,\n requestedInstanceIds: request.instanceIds,\n instanceIdsToUpdate: [],\n instanceIdsToDestroy: [],\n status: \"pending\",\n options: {\n forceUpdateDependencies: request.options?.forceUpdateDependencies ?? false,\n forceUpdateChildren: request.options?.forceUpdateChildren ?? false,\n destroyDependentInstances: request.options?.destroyDependentInstances ?? true,\n invokeDestroyTriggers: request.options?.invokeDestroyTriggers ?? false,\n deleteUnreachableResources: request.options?.deleteUnreachableResources ?? false,\n forceDeleteState: request.options?.forceDeleteState ?? false,\n refresh: request.options?.refresh ?? false,\n allowPartialCompositeInstanceUpdates:\n request.options?.allowPartialCompositeInstanceUpdates ?? false,\n },\n error: null,\n startedAt: Date.now(),\n completedAt: null,\n }\n\n this.logger.info({ operation }, \"launching operation\")\n\n await this.operationService.updateOperation(request.projectId, operation)\n\n this.startOperation(request.projectId, 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: string): void {\n const runtimeOperation = this.runtimeOperations.get(operationId)\n if (runtimeOperation) {\n runtimeOperation.cancelInstance(instanceId)\n }\n }\n\n private startOperation(projectId: string, operation: Operation): void {\n const runtimeOperation = new RuntimeOperation(\n projectId,\n operation,\n this.runnerBackend,\n this.libraryBackend,\n this.projectBackend,\n this.artifactManager,\n this.stateManager,\n this.instanceLockService,\n this.operationService,\n this.secretService,\n this.instanceStateService,\n this.pubsubManager,\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 processLostOperations(projectId: string): Promise<void> {\n const activeOperations = await this.stateManager\n .getActiveOperationIndexRepository(projectId)\n .getAllItems()\n\n for (const operation of activeOperations) {\n if (isFinalOperationStatus(operation.status)) {\n this.logger.warn(\n { projectId, operationId: operation.id },\n \"operation is in final state but still marked as active, removing from index\",\n )\n\n await this.stateManager\n .getActiveOperationIndexRepository(projectId)\n .indexRepository.delete(operation.id)\n continue\n }\n\n const errorMessagePrefix = operation.error ? `${operation.error}\\n\\n` : \"\"\n\n operation.status = \"failed\"\n operation.error = `${errorMessagePrefix}Operation was unexpectedly interrupted. Please restart it.`\n\n await this.operationService.updateOperation(projectId, operation)\n }\n\n // unlock instances that were locked by lost operations\n const activeOperationIds = new Set(activeOperations.map(op => op.id))\n\n const allLocks = await this.stateManager.getInstanceLockRepository(projectId).getAllItems()\n const lockIdsToRemvoe: string[] = []\n\n // clean up unexpected operation locks\n for (const lock of allLocks) {\n if (lock.spec.type !== \"operation\") {\n continue\n }\n\n if (activeOperationIds.has(lock.spec.operationId)) {\n // remove locks for lost operation which is expected\n lockIdsToRemvoe.push(lock.id)\n continue\n }\n\n // unexpected operation lock found, also remove it\n this.logger.warn(\n { projectId, lockId: lock.id },\n `unexpected operation lock found for completed operation \"${lock.spec.operationId}\", removing lock`,\n )\n\n lockIdsToRemvoe.push(lock.id)\n }\n\n if (lockIdsToRemvoe.length > 0) {\n await this.instanceLockService.unlockInstancesUnconditionally(projectId, lockIdsToRemvoe)\n }\n\n this.logger.debug(\n { projectId, operationCount: activeOperations.length },\n `processed %s lost operations for project \"%s\"`,\n activeOperations.length,\n projectId,\n )\n }\n\n static create(\n runnerBackend: RunnerBackend,\n libraryBackend: LibraryBackend,\n projectBackend: ProjectBackend,\n artifactManager: ArtifactService,\n stateManager: StateManager,\n instanceLockService: InstanceLockService,\n stateUnlockService: ProjectUnlockService,\n operationService: OperationService,\n secretService: SecretService,\n instanceService: InstanceStateService,\n pubsubManager: PubSubManager,\n logger: Logger,\n ): OperationManager {\n const operator = new OperationManager(\n runnerBackend,\n libraryBackend,\n projectBackend,\n artifactManager,\n stateManager,\n instanceLockService,\n stateUnlockService,\n operationService,\n secretService,\n instanceService,\n pubsubManager,\n logger.child({ service: \"OperationManager\" }),\n )\n\n return operator\n }\n}\n","import type { LibraryBackend } from \"../library\"\nimport type { StateManager } from \"../state\"\nimport type { ProjectBackend } from \"../project\"\nimport type {\n RunnerArtifact,\n RunnerBackend,\n TypedUnitStateUpdate,\n UnitStateUpdate,\n} from \"../runner\"\nimport type { Logger } from \"pino\"\nimport type {\n InstanceLockService,\n InstanceStateService,\n OperationService,\n SecretService,\n} from \"../business\"\nimport type { PubSubManager } from \"../pubsub\"\nimport { randomBytes } from \"node:crypto\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport {\n isUnitModel,\n parseInstanceId,\n type ComponentModel,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { mapValues, unique } from \"remeda\"\nimport { ArtifactService } from \"../artifact\"\nimport {\n type InstanceState,\n type UnitPage,\n type Operation,\n type Page,\n type Trigger,\n type UnitTrigger,\n type UnitTerminal,\n type Terminal,\n type TerminalSpec,\n type TriggerInvocation,\n PromiseTracker,\n type InstanceStatePatch,\n type PageBlock,\n} from \"../shared\"\nimport {\n AbortError,\n errorToString,\n isAbortErrorLike,\n PerformanceLogger,\n stringToValue,\n valueToString,\n waitForAbort,\n} from \"../common\"\nimport { OperationWorkset, type OperationPhase } from \"./operation-workset\"\n\nexport class RuntimeOperation {\n private readonly abortController = new AbortController()\n private readonly forceAbortController = new AbortController()\n\n private readonly instanceAbortControllers = new Map<string, AbortController>()\n private readonly instanceForceAbortControllers = new Map<string, AbortController>()\n\n private readonly instancePromiseMap = new Map<string, Promise<void>>()\n private readonly promiseTracker = new PromiseTracker()\n\n private workset!: OperationWorkset\n\n constructor(\n private readonly projectId: string,\n private readonly operation: Operation,\n private readonly runnerBackend: RunnerBackend,\n private readonly libraryBackend: LibraryBackend,\n private readonly projectBackend: ProjectBackend,\n private readonly artifactService: ArtifactService,\n private readonly stateManager: StateManager,\n private readonly instanceLockService: InstanceLockService,\n private readonly operationService: OperationService,\n private readonly secretService: SecretService,\n private readonly instanceStateService: InstanceStateService,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\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 this.operation.status = \"cancelled\"\n this.operation.error = null\n\n await this.operationService.updateOperation(this.projectId, this.operation)\n return\n }\n\n this.logger.error({ error }, \"an error occurred while running the operation\")\n\n this.operation.status = \"failed\"\n this.operation.error = errorToString(error)\n\n await this.operationService.updateOperation(this.projectId, this.operation)\n } finally {\n try {\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 // create the workset for the operation\n this.workset = await OperationWorkset.load(\n this.projectId,\n this.operation,\n this.projectBackend,\n this.libraryBackend,\n this.stateManager,\n this.instanceLockService,\n this.instanceStateService,\n this.logger,\n this.abortController.signal,\n )\n\n // start the process to lock more instances when they become available\n const lockAbortSignal = new AbortController()\n this.promiseTracker.track(this.tryLockMore(lockAbortSignal.signal))\n\n // try to lock as many instances as possible\n await this.workset.tryLock()\n\n if (this.workset.instanceIdsToLockIds.size === 0) {\n this.logger.debug(\"successfully locked all instances for the operation before starting\")\n lockAbortSignal.abort()\n }\n\n // setup abort controllers for the instances\n for (const instanceId of this.workset.getAllAffectedInstanceIds()) {\n this.setupInstanceAbortControllers(instanceId)\n }\n\n try {\n // run the operation\n await this.processOperation()\n } finally {\n lockAbortSignal.abort()\n\n if (this.operation.type === \"preview\") {\n // stream initial states for preview operations\n await this.workset.restoreAffectedInitialStates()\n }\n }\n }\n\n private setupInstanceAbortControllers(instanceId: string): void {\n const abortController = new AbortController()\n this.abortController.signal.addEventListener(\"abort\", () => abortController.abort())\n this.instanceAbortControllers.set(instanceId, abortController)\n\n const forceAbortController = new AbortController()\n this.forceAbortController.signal.addEventListener(\"abort\", () => forceAbortController.abort())\n this.instanceForceAbortControllers.set(instanceId, forceAbortController)\n }\n\n private async tryLockMore(signal: AbortSignal): Promise<void> {\n const eventStream = this.pubsubManager.subscribe([\"instance-lock\", this.projectId], signal)\n\n for await (const event of eventStream) {\n if (event.type !== \"unlocked\") {\n continue\n }\n\n const instanceIdsToLock = event.instanceIds.filter(\n //\n instanceId => this.workset.instanceIdsToLockIds.has(instanceId),\n )\n\n if (instanceIdsToLock.length === 0) {\n try {\n await this.workset.tryLock(instanceIdsToLock)\n } catch (error) {\n this.logger.error({ error }, \"failed to lock more instances during operation\")\n }\n }\n\n if (this.workset.instanceIdsToLockIds.size === 0) {\n // no more instances to lock, stop listening for events\n this.logger.debug(\"successfully locked all instances for the operation\")\n break\n }\n }\n }\n\n private async processOperation(): Promise<void> {\n this.operation.instanceIdsToUpdate = this.workset.operation.instanceIdsToUpdate\n this.operation.instanceIdsToDestroy = this.workset.operation.instanceIdsToDestroy\n\n this.logger.info(\n \"operation started with %s instances to update and %s to destroy\",\n this.operation.instanceIdsToUpdate.length,\n this.operation.instanceIdsToDestroy.length,\n )\n\n const phases = this.getOperationPhases()\n const errors: string[] = []\n let hasAbortError = false\n\n for (const phase of phases) {\n this.workset.currentPhase = phase\n\n const promises: Promise<void>[] = []\n for (const instanceId of this.workset.getAffectedInstanceIds()) {\n const parentId = this.workset.getParentId(instanceId)\n if (parentId && this.workset.isAffected(parentId)) {\n // do not call the operation for child instances of affected composites,\n // they will be called by their parent instance\n continue\n }\n\n promises.push(this.getInstancePromiseForOperation(instanceId))\n }\n\n this.logger.info(`all operations for phase \"%s\" started`, phase)\n this.operation.status = \"running\"\n await this.operationService.updateOperation(this.projectId, this.operation)\n\n const phaseResults = await Promise.allSettled(promises)\n for (const result of phaseResults) {\n if (result.status !== \"rejected\") {\n continue\n }\n\n if (isAbortErrorLike(result.reason)) {\n hasAbortError = true\n } else {\n errors.push(errorToString(result.reason))\n }\n }\n\n this.logger.info(`all operations for phase \"%s\" completed`, phase)\n }\n\n if (errors.length > 0) {\n this.operation.status = \"failed\"\n // TODO: map errors to instances inside operation\n this.operation.error = errors.join(\"\\n\\n\")\n } else if (hasAbortError) {\n this.operation.status = \"cancelled\"\n this.operation.error = null\n } else {\n this.operation.status = \"completed\"\n this.operation.error = null\n }\n\n await this.operationService.updateOperation(this.projectId, this.operation)\n\n this.logger.info(\"operation completed\")\n }\n\n cancelInstance(instanceId: string): void {\n const abortController = this.instanceAbortControllers.get(instanceId)\n if (!abortController) {\n throw new Error(`No abort controller found for instance \"${instanceId}\"`)\n }\n\n if (!abortController.signal.aborted) {\n this.logger.info(`cancelling operation for instance \"${instanceId}\"`)\n abortController.abort()\n\n // just the UX feature to indicate that we are trying to cancel the operation\n this.promiseTracker.track(\n this.workset.patchState({\n id: instanceId,\n operationStatus: {\n status: \"cancelling\",\n },\n }),\n )\n\n return\n }\n\n // then try to force cancel the operation\n const forceAbortController = this.instanceForceAbortControllers.get(instanceId)\n if (!forceAbortController) {\n throw new Error(`No force abort controller found for instance \"${instanceId}\"`)\n }\n\n if (!forceAbortController.signal.aborted) {\n this.logger.info(`force cancelling operation for instance \"${instanceId}\"`)\n forceAbortController.abort()\n return\n }\n\n this.logger.warn(`operation for instance \"${instanceId}\" is already force cancelled`)\n }\n\n cancel(): void {\n if (!this.abortController.signal.aborted) {\n this.logger.info(\"cancelling the operation\")\n this.abortController.abort()\n return\n }\n\n // then try to force cancel the operation\n if (!this.forceAbortController.signal.aborted) {\n this.logger.info(\"force cancelling the operation\")\n this.forceAbortController.abort()\n return\n }\n\n this.logger.warn(\"the operation is already cancelled or force cancelled\")\n }\n\n private getInstancePromiseForOperation(instanceId: string): Promise<void> {\n const [instanceType] = parseInstanceId(instanceId)\n const component = this.workset.library.components[instanceType]\n\n if (isUnitModel(component)) {\n return this.getUnitPromise(instanceId)\n }\n\n return this.getCompositePromise(instanceId)\n }\n\n private getOperationPhases(): OperationPhase[] {\n switch (this.operation.type) {\n case \"update\": {\n if (this.operation.instanceIdsToDestroy.length > 0) {\n return [\"destroy\", \"update\"]\n }\n\n return [\"update\"]\n }\n case \"preview\":\n return [\"update\"]\n case \"recreate\":\n return [\"destroy\", \"update\"]\n case \"destroy\":\n return [\"destroy\"]\n case \"refresh\":\n return [\"refresh\"]\n }\n }\n\n private async getUnitPromise(instanceId: string): Promise<void> {\n switch (this.workset.currentPhase) {\n case \"update\": {\n return this.updateUnit(instanceId)\n }\n case \"destroy\": {\n return this.destroyUnit(instanceId)\n }\n case \"refresh\": {\n return this.refreshUnit(instanceId)\n }\n }\n }\n\n private getCompositePromise(instanceId: string): Promise<void> {\n return this.getInstancePromise(instanceId, async logger => {\n const instance = this.workset.getInstance(instanceId)\n\n await this.setInitialOperationStatus(instance)\n\n const children = this.workset.getAffectedCompositeChildren(instanceId)\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 if (!this.operation.options.forceUpdateChildren && !this.workset.isAffected(child.id)) {\n // skip children that are not affected by the operation\n continue\n }\n\n logger.debug(`waiting for child \"%s\"`, child.id)\n childPromises.push(this.getInstancePromiseForOperation(child.id))\n }\n\n try {\n await Promise.all(childPromises)\n\n if (children.length > 0) {\n logger.debug(\"all children completed\")\n }\n\n if (this.operation.type === \"destroy\") {\n await this.clearOperationState(instanceId)\n return\n }\n\n const { inputHash, dependencyOutputHash } =\n await this.workset.getUpToDateInputHashOutput(instance)\n\n await this.workset.patchState({\n id: instanceId,\n operationStatus: {\n status: \"created\",\n inputHash,\n dependencyOutputHash,\n },\n })\n } catch (error) {\n if (isAbortErrorLike(error)) {\n await this.workset.restoreInitialState(instanceId)\n return\n }\n\n await this.workset.patchState({\n id: instanceId,\n operationStatus: {\n status: \"error\",\n message: errorToString(error),\n },\n })\n }\n })\n }\n\n private updateUnit(instanceId: string): Promise<void> {\n return this.getInstancePromise(instanceId, async (logger, signal, forceSignal) => {\n const instance = this.workset.getInstance(instanceId)\n const component = this.workset.library.components[instance.type]\n const perfLogger = new PerformanceLogger(logger)\n perfLogger.log(\"starting update promise for instance\")\n\n await this.setInitialOperationStatus(instance)\n perfLogger.log(\"initial operation status set\")\n\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 if (!signal.aborted) {\n perfLogger.log(\"dependencies updated\")\n }\n\n signal.throwIfAborted()\n\n logger.info(\"updating unit\")\n\n await this.workset.patchState({\n id: instance.id,\n operationStatus: {\n status: \"updating\",\n currentResourceCount: 0,\n totalResourceCount: 0,\n },\n })\n\n perfLogger.log(\"set 'updating' operation status\")\n signal.throwIfAborted()\n\n const secrets = await this.secretService.getInstanceSecrets(this.projectId, instance.id)\n\n perfLogger.log(\"secrets loaded\")\n signal.throwIfAborted()\n\n const config = this.prepareUnitConfig(instance, component)\n perfLogger.log(\"unit config prepared\")\n\n // extract artifact hashes from dependencies based on instance inputs\n const artifactHashes = this.collectArtifactIdsForInstance(instance)\n const artifacts = await this.stateManager\n .getArtifactHashIndexRepository(this.projectId)\n .getManyItems(artifactHashes)\n\n logger.debug({ count: artifactHashes.length }, \"artifact hashes collected from dependencies\")\n perfLogger.log(\"artifact hashes collected\")\n\n // track artifact usage for this instance (only for non-preview operations)\n if (this.operation.type !== \"preview\" && artifactHashes.length > 0) {\n const state = this.workset.getState(instance.id)\n\n // update artifact metadata in the artifact manager\n this.promiseTracker.track(\n this.artifactService.updateUsage(\n this.projectId,\n { type: \"instance\", instanceId: instance.id },\n state?.extra?.usedArtifactIds ?? [],\n artifacts.map(artifact => artifact.id),\n ),\n )\n\n await this.workset.patchState({\n id: instance.id,\n extra: {\n usedArtifactIds: artifacts.map(artifact => artifact.id),\n },\n })\n\n perfLogger.log(\"artifact usage tracked\")\n }\n\n await this.runnerBackend[this.operation.type === \"preview\" ? \"preview\" : \"update\"]({\n projectId: this.projectId,\n libraryId: this.workset.libraryId,\n instanceType: instance.type,\n instanceName: instance.name,\n config,\n refresh: this.operation.options.refresh,\n secrets: mapValues(secrets, value => valueToString(value)),\n artifacts,\n signal,\n forceSignal,\n })\n\n perfLogger.log(\"unit update requested\")\n\n await this.watchStateStream(instance.type, instance.name, logger)\n perfLogger.log(\"unit update completed\")\n logger.info(\"unit updated\")\n })\n }\n\n private async updateUnitDependencies(instanceId: string, logger: Logger): Promise<void> {\n try {\n const dependencies = this.getInstanceDependencyIds(instanceId)\n const dependencyPromises: Promise<void>[] = []\n\n for (const dependencyId of dependencies) {\n if (!this.operation.instanceIdsToUpdate.includes(dependencyId)) {\n // skip dependencies that are not affected by the operation\n continue\n }\n\n logger.debug(`waiting for dependency \"${dependencyId}\"`)\n dependencyPromises.push(this.getInstancePromiseForOperation(dependencyId))\n }\n\n await Promise.all(dependencyPromises)\n\n if (dependencies.length > 0) {\n logger.info(\"all dependencies completed\")\n }\n } catch {\n // abort the instance if any dependency fails\n throw new AbortError()\n }\n }\n\n private async processBeforeDestroyTriggers(\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 instance = this.workset.getInstance(state.id)\n const component = this.workset.library.components[instance.type]\n\n // fetch triggers from state backend by their IDs\n const triggerIds = Object.values(state.extra?.triggerIds ?? {})\n\n const allTriggers = await this.stateManager\n .getTriggerRepository(this.projectId)\n .getManyItems(triggerIds)\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 // get trigger names from state mapping by finding the key for each trigger ID\n const invokedTriggers = beforeDestroyTriggers.map(trigger => {\n const triggerName = Object.keys(state?.extra?.triggerIds ?? {}).find(\n name => state?.extra?.triggerIds?.[name] === trigger.id,\n )\n\n return { name: triggerName || \"unknown\" }\n })\n\n await this.workset.patchState({\n id: instance.id,\n operationStatus: {\n status: \"processing-triggers\",\n },\n })\n\n logger.info(\"updating unit to process before-destroy triggers...\")\n\n const secrets = await this.secretService.getInstanceSecrets(this.projectId, instance.id)\n\n await this.runnerBackend.update({\n projectId: this.projectId,\n libraryId: this.workset.libraryId,\n instanceType: instance.type,\n instanceName: instance.name,\n config: this.prepareUnitConfig(instance, component, invokedTriggers),\n refresh: this.operation.options.refresh,\n secrets: mapValues(secrets, value => valueToString(value)),\n signal,\n forceSignal,\n })\n\n logger.debug(\"unit update requested\")\n\n await this.watchStateStream(instance.type, instance.name, logger)\n logger.debug(\"before-destroy triggers processed\")\n }\n\n private async destroyUnit(instanceId: string): Promise<void> {\n return this.getInstancePromise(instanceId, async (logger, signal, forceSignal) => {\n await this.workset.patchState({\n id: instanceId,\n operationStatus: {\n status: \"pending\",\n },\n })\n\n signal.throwIfAborted()\n\n const state = this.workset.getState(instanceId)\n if (!state) {\n logger.warn(\"state not found for unit, but destroy was requested\")\n return\n }\n\n const dependentPromises: Promise<void>[] = []\n const dependents = this.workset.getDependentStates(state.id)\n\n for (const dependent of dependents) {\n if (\n !this.operation.options.destroyDependentInstances &&\n !this.operation.instanceIdsToDestroy.includes(dependent.id)\n ) {\n // skip dependents that are not affected by the operation\n continue\n }\n\n dependentPromises.push(this.getInstancePromiseForOperation(dependent.id))\n }\n\n await Promise.all(dependentPromises)\n signal.throwIfAborted()\n\n await this.processBeforeDestroyTriggers(state, logger, signal, forceSignal)\n signal.throwIfAborted()\n\n logger.info(\"destroying unit...\")\n\n await this.workset.patchState({\n id: instanceId,\n operationStatus: {\n status: \"destroying\",\n },\n })\n\n const [type, name] = parseInstanceId(instanceId)\n\n await this.runnerBackend.destroy({\n projectId: this.projectId,\n libraryId: this.workset.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 })\n\n logger.debug(\"destroy request sent\")\n\n await this.watchStateStream(type, name, logger)\n\n // clean up artifacts after successful destruction\n try {\n const artifactIds = unique([\n ...Object.values(state.extra?.ownedArtifactIds ?? {}).flat(),\n ...(state.extra?.usedArtifactIds ?? []),\n ])\n\n await this.artifactService.removeUsages(\n //\n this.projectId,\n artifactIds,\n [{ type: \"instance\", instanceId: state.id }],\n )\n } catch (error) {\n logger.warn({ error }, \"failed to cleanup artifacts for destroyed instance\")\n }\n\n logger.info(\"unit destroyed\")\n })\n }\n\n private async refreshUnit(instanceId: string) {\n return this.getInstancePromise(instanceId, async (logger, signal, forceSignal) => {\n await this.workset.patchState({\n id: instanceId,\n operationStatus: {\n status: \"refreshing\",\n currentResourceCount: 0,\n totalResourceCount: 0,\n },\n })\n\n logger.info(\"refreshing unit...\")\n\n const [type, name] = parseInstanceId(instanceId)\n\n await this.runnerBackend.refresh({\n projectId: this.projectId,\n libraryId: this.workset.libraryId,\n instanceType: type,\n instanceName: name,\n signal,\n forceSignal,\n })\n\n logger.debug(\"unit refresh requested\")\n\n await this.watchStateStream(type, name, logger)\n logger.info(\"unit refreshed\")\n })\n }\n\n private async watchStateStream(\n instanceType: string,\n instanceName: string,\n logger: Logger,\n ): Promise<void> {\n const stream = this.runnerBackend.watch({\n projectId: this.projectId,\n libraryId: this.workset.libraryId,\n instanceType,\n instanceName,\n })\n\n let update: UnitStateUpdate | undefined\n\n for await (update of stream) {\n try {\n await this.handleUnitStateUpdate(update)\n } catch (error) {\n logger.error({ error }, \"failed to handle unit state update\")\n }\n\n if (update.type === \"error\") {\n if (isAbortErrorLike(update.message)) {\n // abort the unit if the returned error contains some abort-like pattern\n // generally, this might not be safe, but for now, we assume that\n throw new AbortError()\n }\n\n // rethrow the error to stop the execution of dependent units\n throw new Error(`An error occurred while processing the unit \"${update.unitId}\"`, {\n cause: 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 component: ComponentModel,\n invokedTriggers: TriggerInvocation[] = [],\n ): Record<string, string> {\n const config: Record<string, string> = {}\n\n for (const key of Object.keys(component.args)) {\n // explicitly set empty values to remove old values in the config\n const value = instance.args?.[key]\n config[key] = value ? valueToString(value) : \"\"\n }\n\n const instanceInputs = this.workset.resolvedInstanceInputs.get(instance.id) ?? {}\n\n for (const key of Object.keys(component.inputs)) {\n const inputs = instanceInputs[key] ?? []\n\n config[`input.${key}`] = JSON.stringify(inputs.map(input => input.input))\n }\n\n config[\"$invokedTriggers\"] = JSON.stringify(invokedTriggers)\n\n return config\n }\n\n private async handleUnitStateUpdate(update: UnitStateUpdate): Promise<void> {\n switch (update.type) {\n case \"message\":\n this.handleUnitMessage(update)\n return\n case \"progress\":\n await this.handleUnitProgress(update)\n return\n case \"error\":\n await this.handleUnitError(update)\n return\n case \"completion\":\n await this.handleUnitCompletion(update)\n return\n }\n }\n\n private handleUnitMessage(update: TypedUnitStateUpdate<\"message\">): void {\n // collect all instances in the hierarchy that should receive this log\n const instanceIdsInHierarchy: string[] = []\n let instance: InstanceModel | null = this.workset.getInstance(update.unitId)\n\n for (;;) {\n instanceIdsInHierarchy.push(instance.id)\n\n if (!instance.parentId) {\n break\n }\n\n instance = this.workset.getInstance(instance.parentId)\n }\n\n // persist the log for all instances in the hierarchy\n // TODO: batch\n this.promiseTracker.track(\n this.operationService.appendLogs(this.projectId, this.operation.id, instanceIdsInHierarchy, [\n update.message,\n ]),\n )\n return\n }\n\n private async handleUnitProgress(update: TypedUnitStateUpdate<\"progress\">): Promise<void> {\n const patch: InstanceStatePatch = { id: update.unitId }\n patch.operationStatus = {}\n\n if (update.currentResourceCount !== undefined) {\n patch.operationStatus.currentResourceCount = update.currentResourceCount\n }\n\n if (update.totalResourceCount !== undefined) {\n patch.operationStatus.totalResourceCount = update.totalResourceCount\n }\n\n await this.workset.patchState(patch)\n }\n\n private async handleUnitError(update: TypedUnitStateUpdate<\"error\">): Promise<void> {\n if (isAbortErrorLike(update.message)) {\n return\n }\n\n const patch: InstanceStatePatch = {\n id: update.unitId,\n operationStatus: {\n status: \"error\",\n message: update.message,\n },\n }\n\n await this.workset.patchState(patch)\n }\n\n private async handleUnitCompletion(update: TypedUnitStateUpdate<\"completion\">): Promise<void> {\n if (this.workset.currentPhase === \"destroy\") {\n // if the destroy operation was completed, clear the state from all operation-related fields\n await this.clearOperationState(update.unitId)\n return\n }\n\n const state = this.workset.getState(update.unitId)\n if (!state) {\n throw new Error(\n `Cannot handle completion for unit \"${update.unitId}\" because its state is not found.`,\n )\n }\n\n const instance = this.workset.getInstance(update.unitId)\n\n // patch the state with output hash first to recalculate the input hash\n if (update.outputHash) {\n await this.workset.patchState({\n id: update.unitId,\n operationStatus: { outputHash: update.outputHash },\n })\n }\n\n const { inputHash, dependencyOutputHash } =\n await this.workset.getUpToDateInputHashOutput(instance)\n\n const patch: InstanceStatePatch = {\n id: update.unitId,\n operationStatus: {\n status: \"created\",\n message:\n update.message ?? \"The operation on this instance has been completed successfully.\",\n outputHash: update.outputHash ?? undefined,\n inputHash,\n dependencyOutputHash,\n },\n extra: {\n statusFields: update.statusFields,\n\n terminalIds: update.terminals\n ? this.processTerminals(update.unitId, update.terminals, state.extra?.terminalIds)\n : undefined,\n\n pageIds: update.pages\n ? this.processPages(update.unitId, update.pages, state.extra?.pageIds)\n : undefined,\n\n triggerIds: update.triggers\n ? this.processTriggers(update.unitId, update.triggers, state.extra?.triggerIds)\n : undefined,\n\n ownedArtifactIds: update.artifacts\n ? this.processArtifacts(update.unitId, update.artifacts, state.extra?.ownedArtifactIds)\n : undefined,\n },\n }\n\n if (update.secrets) {\n const instance = this.workset.getInstance(update.unitId)\n\n this.promiseTracker.track(\n this.updateInstanceSecrets(\n instance,\n mapValues(update.secrets, value => stringToValue(value)),\n ),\n )\n }\n\n await this.workset.patchState(patch)\n }\n\n private async clearOperationState(instanceId: string): Promise<void> {\n const patch: InstanceStatePatch = {\n id: instanceId,\n operationStatus: null,\n extra: null,\n }\n\n await this.workset.patchState(patch)\n }\n\n private getInstancePromise(\n instanceId: string,\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 const logger = this.logger.child({ instanceId }, { msgPrefix: `[${instanceId}] ` })\n const abortController = this.instanceAbortControllers.get(instanceId)\n const forceAbortController = this.instanceForceAbortControllers.get(instanceId)\n\n if (!abortController || !forceAbortController) {\n throw new Error(`Abort controllers for instance \"${instanceId}\" are not initialized`)\n }\n\n instancePromise = this.workset\n .ensureInstanceLocked(instanceId, abortController.signal)\n .then(() => fn(logger, abortController.signal, forceAbortController.signal))\n .catch(error => {\n if (isAbortErrorLike(error)) {\n // if the operation was aborted, restore the initial state of the instance\n this.promiseTracker.track(this.workset.restoreInitialState(instanceId))\n\n throw error\n }\n\n if (this.operation.status !== \"failing\") {\n // report the failing status of the operation\n this.operation.status = \"failing\"\n this.promiseTracker.track(\n this.operationService.updateOperation(this.projectId, this.operation),\n )\n }\n\n // rethrow the error\n throw error\n })\n .finally(() => {\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.unlockInstancesUnconditionally(this.projectId, [instanceId]),\n )\n })\n\n this.instancePromiseMap.set(instanceId, instancePromise)\n\n return instancePromise\n }\n\n private async setInitialOperationStatus(instance: InstanceModel): Promise<void> {\n const state = this.workset.getState(instance.id)\n\n await this.workset.patchState({\n id: instance.id,\n parentId: instance.parentId,\n operationStatus: {\n status: \"pending\",\n message: \"\",\n dependencyIds: this.getInstanceDependencyIds(instance.id),\n latestOperationId: this.operation.id,\n inputHashNonce: state?.operationStatus?.inputHashNonce ?? randomBytes(4).readInt32LE(),\n args: instance.args,\n },\n })\n }\n\n private getInstanceDependencyIds(instanceId: string): string[] {\n const dependencies = new Set<string>()\n const instanceInputs = this.workset.resolvedInstanceInputs.get(instanceId) ?? {}\n\n for (const inputs of Object.values(instanceInputs)) {\n for (const input of inputs) {\n dependencies.add(input.input.instanceId)\n }\n }\n\n return Array.from(dependencies)\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.workset.resolvedInstanceInputs.get(instance.id) ?? {}\n\n for (const inputs of Object.values(instanceInputs)) {\n for (const input of inputs) {\n const dependencyState = this.workset.getState(input.input.instanceId)\n if (!dependencyState?.extra?.ownedArtifactIds) {\n continue\n }\n\n const outputKey = input.input.output\n const outputArtifacts = dependencyState.extra.ownedArtifactIds[outputKey]\n if (!outputArtifacts) {\n continue\n }\n\n for (const hash of outputArtifacts) {\n artifactIds.add(hash)\n }\n }\n }\n\n return Array.from(artifactIds)\n }\n\n /**\n * Updates the secrets for a specific instance.\n * Processes terminals from instance state update.\n *\n * Converts unit terminals to instance terminals and handles cleanup.\n */\n private processTerminals(\n instanceId: string,\n unitTerminals: UnitTerminal[],\n currentTerminalIds: Record<string, string> | undefined,\n ): Record<string, string> {\n const terminals: Terminal[] = unitTerminals.map(unitTerminal => ({\n id: currentTerminalIds?.[unitTerminal.name] ?? uuidv7(),\n instanceId,\n meta: unitTerminal.meta ?? {},\n }))\n\n const terminalSpecEntries: [string, TerminalSpec][] = unitTerminals\n //\n .map((unitTerminal, index) => [terminals[index].id, unitTerminal.spec])\n\n // create mapping from local name to UUID\n const newTerminalIds: Record<string, string> = {}\n for (let i = 0; i < unitTerminals.length; i++) {\n const unitTerminal = unitTerminals[i]\n const instanceTerminal = terminals[i]\n newTerminalIds[unitTerminal.name] = instanceTerminal.id\n }\n\n // find terminals that need to be deleted (old terminals not in new list)\n const terminalsToDelete = Object.values(currentTerminalIds ?? {}).filter(\n id => !Object.values(newTerminalIds).includes(id),\n )\n\n if (terminals.length > 0) {\n this.promiseTracker.track(this.putTerminals(terminals, terminalSpecEntries))\n }\n\n if (terminalsToDelete.length > 0) {\n this.promiseTracker.track(this.deleteTerminals(terminalsToDelete))\n }\n\n return newTerminalIds\n }\n\n private async putTerminals(\n terminals: Terminal[],\n terminalSpecEntries: [string, TerminalSpec][],\n ): Promise<void> {\n if (this.operation.type === \"preview\") {\n return\n }\n\n await using batch = this.stateManager.batch()\n\n await Promise.all([\n this.stateManager.getTerminalRepository(this.projectId).putManyItems(terminals, batch),\n\n this.stateManager\n .getTerminalSpecRepository(this.projectId)\n .putMany(terminalSpecEntries, batch),\n ])\n\n await batch.write()\n }\n\n private async deleteTerminals(terminalIds: string[]): Promise<void> {\n if (this.operation.type === \"preview\") {\n return\n }\n\n await using batch = this.stateManager.batch()\n\n await Promise.all([\n this.stateManager.getTerminalRepository(this.projectId).deleteMany(terminalIds, batch),\n this.stateManager.getTerminalSpecRepository(this.projectId).deleteMany(terminalIds, batch),\n ])\n\n await batch.write()\n }\n\n /**\n * Processes pages from instance state update.\n *\n * Converts unit pages to instance pages and handles cleanup.\n */\n private processPages(\n instanceId: string,\n unitPages: UnitPage[],\n currentPageIds: Record<string, string> | undefined,\n ): Record<string, string> {\n const pages: Page[] = unitPages.map(unitPage => ({\n id: currentPageIds?.[unitPage.name] ?? uuidv7(),\n instanceId,\n meta: unitPage.meta,\n }))\n\n const pageContentEntries: [string, PageBlock[]][] = unitPages\n //\n .map((unitPage, index) => [pages[index].id, unitPage.content])\n\n // create mapping from local name to UUID\n const newPageIds: Record<string, string> = {}\n for (let i = 0; i < unitPages.length; i++) {\n const unitPage = unitPages[i]\n const instancePage = pages[i]\n newPageIds[unitPage.name] = instancePage.id\n }\n\n // find pages that need to be deleted (old pages not in new list)\n const pagesToDelete = Object.values(currentPageIds ?? {}).filter(\n id => !Object.values(newPageIds).includes(id),\n )\n\n if (pages.length > 0) {\n this.promiseTracker.track(this.putPages(pages, pageContentEntries))\n }\n\n if (pagesToDelete.length > 0) {\n this.promiseTracker.track(this.deletePages(pagesToDelete))\n }\n\n return newPageIds\n }\n\n private async putPages(\n pages: Page[],\n pageContentEntries: [string, PageBlock[]][],\n ): Promise<void> {\n if (this.operation.type === \"preview\") {\n return\n }\n\n const batch = this.stateManager.batch()\n\n await Promise.all([\n this.stateManager.getPageRepository(this.projectId).putManyItems(pages, batch),\n this.stateManager.getPageContentRepository(this.projectId).putMany(pageContentEntries, batch),\n ])\n\n await batch.write()\n }\n\n private async deletePages(pageIds: string[]): Promise<void> {\n if (this.operation.type === \"preview\") {\n return\n }\n\n const batch = this.stateManager.batch()\n\n await Promise.all([\n this.stateManager.getPageRepository(this.projectId).deleteMany(pageIds, batch),\n this.stateManager.getPageContentRepository(this.projectId).deleteMany(pageIds, batch),\n ])\n\n await batch.write()\n }\n\n /**\n * Processes triggers from instance state update.\n *\n * Converts unit triggers to instance triggers and handles cleanup.\n */\n private processTriggers(\n instanceId: string,\n unitTriggers: UnitTrigger[],\n currentTriggerIds: Record<string, string> | undefined,\n ): Record<string, string> {\n const triggers: Trigger[] = unitTriggers.map(unitTrigger => ({\n id: currentTriggerIds?.[unitTrigger.name] ?? uuidv7(),\n instanceId,\n meta: unitTrigger.meta ?? {},\n spec: unitTrigger.spec,\n }))\n\n // create mapping from local name to UUID\n const newTriggerIds: Record<string, string> = {}\n for (let i = 0; i < unitTriggers.length; i++) {\n const unitTrigger = unitTriggers[i]\n newTriggerIds[unitTrigger.name] = triggers[i].id\n }\n\n // find triggers that need to be deleted (old triggers not in new list)\n const triggersToDelete = Object.values(currentTriggerIds ?? {}).filter(\n id => !Object.values(newTriggerIds).includes(id),\n )\n\n if (triggers.length > 0) {\n this.promiseTracker.track(this.putTriggers(triggers))\n }\n\n if (triggersToDelete.length > 0) {\n this.promiseTracker.track(this.deleteTriggers(triggersToDelete))\n }\n\n return newTriggerIds\n }\n\n private async putTriggers(triggers: Trigger[]): Promise<void> {\n if (this.operation.type === \"preview\") {\n return\n }\n\n await this.stateManager.getTriggerRepository(this.projectId).putManyItems(triggers)\n }\n\n private async deleteTriggers(triggerIds: string[]): Promise<void> {\n if (this.operation.type === \"preview\") {\n return\n }\n\n await this.stateManager.getTriggerRepository(this.projectId).deleteMany(triggerIds)\n }\n\n /**\n * Processes artifacts from instance state update.\n */\n private processArtifacts(\n instanceId: string,\n newOwnedArtifacts: Record<string, RunnerArtifact[]>,\n oldOwnedArtifactIds: Record<string, string[]> | undefined,\n ): Record<string, string[]> {\n if (this.operation.type !== \"preview\") {\n // persist the new owned artifacts if this is not a preview operation\n this.promiseTracker.track(\n this.artifactService.updateUsage(\n this.projectId,\n { type: \"instance\", instanceId },\n unique(Object.values(oldOwnedArtifactIds ?? {}).flat()),\n unique(\n Object.values(newOwnedArtifacts).flatMap(artifacts =>\n artifacts.map(artifact => artifact.id),\n ),\n ),\n ),\n )\n }\n\n return mapValues(newOwnedArtifacts, artifacts => artifacts.map(artifact => artifact.id))\n }\n\n /**\n * Updates the secrets for a specific instance.\n */\n private async updateInstanceSecrets(\n instance: InstanceModel,\n secrets: Record<string, unknown>,\n ): Promise<void> {\n if (this.operation.type === \"preview\") {\n // do not update secrets in preview mode\n return\n }\n\n await this.secretService.updateInstanceSecrets(\n this.projectId,\n instance.id,\n secrets,\n [], // no secrets to delete in this context\n false, // do not invalidate state even if the secrets were updated\n )\n }\n}\n","import type { LibraryBackend } from \"../library\"\nimport type { ProjectBackend } from \"../project\"\nimport type { StateManager } from \"../state\"\nimport type { Logger } from \"pino\"\nimport type { InstanceLockService, InstanceStateService } from \"../business\"\nimport { EventEmitter, on } from \"node:events\"\nimport {\n isUnitModel,\n parseInstanceId,\n type ComponentModel,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { unique } from \"remeda\"\nimport { BetterLock } from \"better-lock\"\nimport {\n InputHashResolver,\n InputResolver,\n type InputHashNode,\n type InputHashOutput,\n type InputResolverNode,\n type InstanceOperataionStatusEnum,\n type InstanceState,\n type InstanceStatePatch,\n type LibraryModel,\n type Operation,\n type ResolvedInstanceInput,\n} from \"../shared\"\n\nexport type OperationPhase = \"update\" | \"destroy\" | \"refresh\"\n\nexport class OperationWorkset {\n private readonly lockedInstanceIds = new Set<string>()\n public readonly instanceIdsToLockIds = new Set<string>()\n\n private readonly instanceIdsToUpdate = new Set<string>()\n private readonly instanceIdsToDestroy = new Set<string>()\n\n private readonly instanceMap = new Map<string, InstanceModel>()\n private readonly instanceChildrenMap = new Map<string, InstanceModel[]>()\n\n private readonly initialStateMap = new Map<string, InstanceState>()\n private readonly stateMap = new Map<string, InstanceState>()\n private readonly dependentStateIdMap = new Map<string, Set<string>>()\n private readonly stateChildIdMap = new Map<string, string[]>()\n\n private readonly unitSourceHashMap = new Map<string, number>()\n\n private inputResolver!: InputResolver\n private readonly inputResolverNodes = new Map<string, InputResolverNode>()\n\n private inputHashResolver!: InputHashResolver\n private readonly inputHashNodes = new Map<string, InputHashNode>()\n private readonly inputHashResolverLock = new BetterLock()\n\n public readonly resolvedInstanceInputs = new Map<\n string,\n Record<string, ResolvedInstanceInput[]>\n >()\n\n public currentPhase!: OperationPhase\n\n private readonly lockEventEmitter = new EventEmitter()\n\n private constructor(\n public readonly projectId: string,\n public readonly operation: Operation,\n public readonly library: LibraryModel,\n public readonly libraryId: string,\n private readonly instanceLockService: InstanceLockService,\n private readonly instanceStateService: InstanceStateService,\n private readonly logger: Logger,\n ) {}\n\n public async ensureInstanceLocked(instanceId: string, signal: AbortSignal): Promise<void> {\n if (this.lockedInstanceIds.has(instanceId)) {\n return\n }\n\n for await (const _ of on(this.lockEventEmitter, instanceId, { signal })) {\n return\n }\n }\n\n public getInstance(instanceId: string): InstanceModel {\n const instance = this.instanceMap.get(instanceId)\n if (!instance) {\n throw new Error(`Instance with ID ${instanceId} not found in the operation workset`)\n }\n\n return instance\n }\n\n public getAffectedInstanceIds(): string[] {\n if (this.currentPhase === \"destroy\") {\n return Array.from(this.instanceIdsToDestroy)\n }\n\n return Array.from(this.instanceIdsToUpdate)\n }\n\n public getAllAffectedInstanceIds(): string[] {\n return Array.from(this.instanceIdsToUpdate.union(this.instanceIdsToDestroy))\n }\n\n public getInstanceOrUndefined(instanceId: string): InstanceModel | undefined {\n return this.instanceMap.get(instanceId)\n }\n\n public isAffected(instanceId: string): boolean {\n if (this.currentPhase === \"destroy\") {\n return this.instanceIdsToDestroy.has(instanceId)\n }\n\n return this.instanceIdsToUpdate.has(instanceId)\n }\n\n public async patchState(patch: InstanceStatePatch): Promise<InstanceState> {\n const state = await this.instanceStateService.patchOperationInstanceState(\n this.projectId,\n this.operation,\n patch,\n )\n this.stateMap.set(state.id, state)\n\n if (state.parentId) {\n await this.recalculateCompositeInstanceState(state.parentId)\n }\n\n return state\n }\n\n public setState(state: InstanceState): void {\n this.stateMap.set(state.id, state)\n this.initialStateMap.set(state.id, state)\n\n if (state.parentId) {\n let children = this.stateChildIdMap.get(state.parentId)\n if (!children) {\n children = []\n this.stateChildIdMap.set(state.parentId, children)\n }\n\n children.push(state.id)\n }\n\n for (const dependencyId of state.operationStatus?.dependencyIds ?? []) {\n this.addDependentState(state.id, dependencyId)\n }\n }\n\n private addDependentState(instanceId: string, dependencyId: string): void {\n let dependentStates = this.dependentStateIdMap.get(dependencyId)\n\n if (!dependentStates) {\n dependentStates = new Set<string>()\n this.dependentStateIdMap.set(dependencyId, dependentStates)\n }\n\n dependentStates.add(instanceId)\n }\n\n public async restoreInitialState(instanceId: string): Promise<void> {\n const initialState = this.initialStateMap.get(instanceId) ?? { id: instanceId }\n\n this.logger.debug(\n { initialState },\n `resetting state for instance \"%s\" to initial state`,\n instanceId,\n )\n\n await this.instanceStateService.updateInstanceStates(this.projectId, [initialState], true)\n\n if (initialState.parentId) {\n await this.recalculateCompositeInstanceState(initialState.parentId)\n }\n }\n\n public async restoreAffectedInitialStates(): Promise<void> {\n const instanceStates: InstanceState[] = []\n\n for (const instanceId of this.getAffectedInstanceIds()) {\n const state = this.initialStateMap.get(instanceId)\n if (state) {\n instanceStates.push(state)\n }\n }\n\n await this.instanceStateService.updateInstanceStates(this.projectId, instanceStates)\n }\n\n public getAffectedCompositeChildren(instanceId: string): InstanceModel[] {\n const children = this.instanceChildrenMap.get(instanceId)\n if (!children) {\n return []\n }\n\n if (this.currentPhase === \"destroy\") {\n return children.filter(child => this.instanceIdsToDestroy.has(child.id))\n }\n\n return children.filter(child => this.instanceIdsToUpdate.has(child.id))\n }\n\n public getState(instanceId: string): InstanceState | undefined {\n return this.stateMap.get(instanceId)\n }\n\n public getParentId(instanceId: string): string | undefined {\n if (this.currentPhase === \"destroy\") {\n const state = this.stateMap.get(instanceId)\n if (!state) {\n return undefined\n }\n\n return state.parentId\n }\n\n const instance = this.getInstance(instanceId)\n\n return instance.parentId\n }\n\n public getDependentStates(instanceId: string): 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 private async recalculateCompositeInstanceState(instanceId: string): Promise<void> {\n const state = this.stateMap.get(instanceId)\n if (!state) {\n this.logger.warn(\n `cannot recalculate composite instance state for \"${instanceId}\" because it is not in the state map`,\n )\n return\n }\n\n let currentResourceCount = 0\n let totalResourceCount = 0\n\n const children = this.stateChildIdMap.get(instanceId) ?? []\n for (const childId of children) {\n const child = this.stateMap.get(childId)\n\n if (child?.operationStatus?.currentResourceCount) {\n currentResourceCount += child.operationStatus.currentResourceCount\n }\n\n if (child?.operationStatus?.totalResourceCount) {\n totalResourceCount += child.operationStatus?.totalResourceCount\n }\n }\n\n const patch: InstanceStatePatch = {\n id: instanceId,\n operationStatus: {\n status: this.getTransientStatusByOperationPhase(),\n currentResourceCount,\n totalResourceCount,\n },\n }\n\n await this.patchState(patch)\n }\n\n private addInstance(instance: InstanceModel): 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 (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 async calculateInstanceIdsToUpdate(): Promise<void> {\n const traverse = async (instanceId: string) => {\n if (this.instanceIdsToUpdate.has(instanceId)) {\n return\n }\n\n const instance = this.instanceMap.get(instanceId)\n if (!instance) {\n return\n }\n\n const instanceInputs = this.resolvedInstanceInputs.get(instance.id) ?? {}\n\n for (const inputs of Object.values(instanceInputs)) {\n for (const input of inputs) {\n await traverse(input.input.instanceId)\n }\n }\n\n const state = this.stateMap.get(instance.id)\n const { inputHash: expectedInputHash } = this.inputHashResolver.requireOutput(instance.id)\n\n if (this.operation.options.forceUpdateDependencies) {\n this.instanceIdsToUpdate.add(instanceId)\n return\n }\n\n if (\n !state?.operationStatus ||\n state.operationStatus.status === \"error\" ||\n state.operationStatus.inputHash !== expectedInputHash\n ) {\n this.instanceIdsToUpdate.add(instanceId)\n }\n }\n\n // 1. extend affected instance IDs with their not-created or not-up-to-date dependencies (only for \"update\" operations)\n for (const instanceId of this.operation.requestedInstanceIds) {\n if (this.operation.type === \"update\") {\n await traverse(instanceId)\n }\n\n this.instanceIdsToUpdate.add(instanceId)\n }\n\n // 2. extend affected instance IDs with the children of the affected composite instances\n const compositeInstanceQueue = Array.from(this.instanceIdsToUpdate)\n while (compositeInstanceQueue.length > 0) {\n const childId = compositeInstanceQueue.pop()!\n const children = this.instanceChildrenMap.get(childId) ?? []\n\n for (const child of children) {\n compositeInstanceQueue.push(child.id)\n\n if (this.operation.options.forceUpdateChildren) {\n this.instanceIdsToUpdate.add(child.id)\n continue\n }\n\n const state = this.stateMap.get(child.id)\n const { inputHash: expectedInputHash } = this.inputHashResolver.requireOutput(child.id)\n\n if (\n !state?.operationStatus ||\n state.operationStatus.status === \"error\" ||\n state.operationStatus.inputHash !== expectedInputHash\n ) {\n this.instanceIdsToUpdate.add(child.id)\n }\n }\n }\n\n // 3. detect composite instance children and include their parents (recursively)\n for (const instanceId of this.instanceIdsToUpdate) {\n let instance = this.instanceMap.get(instanceId)\n while (instance?.parentId) {\n this.instanceIdsToUpdate.add(instance.parentId)\n instance = this.instanceMap.get(instance.parentId)\n }\n }\n\n // 4. if \"allowPartialCompositeInstanceUpdates\" is not set, include all children of the composite instances\n if (!this.operation.options.allowPartialCompositeInstanceUpdates) {\n for (const instanceId of this.instanceIdsToUpdate) {\n const children = this.instanceChildrenMap.get(instanceId) ?? []\n for (const child of children) {\n this.instanceIdsToUpdate.add(child.id)\n }\n }\n }\n\n this.operation.instanceIdsToUpdate = Array.from(this.instanceIdsToUpdate)\n }\n\n private calculateInstanceIdsToDestroy() {\n const traverse = (instanceKey: string) => {\n if (this.instanceIdsToDestroy.has(instanceKey)) {\n return\n }\n\n const state = this.stateMap.get(instanceKey)\n if (!state) {\n return\n }\n\n const dependentIds = this.dependentStateIdMap.get(instanceKey) ?? []\n\n for (const dependentId of dependentIds) {\n traverse(dependentId)\n this.instanceIdsToDestroy.add(dependentId)\n }\n }\n\n if (this.operation.type === \"destroy\" || this.operation.type === \"recreate\") {\n // 1.a. extend affected instance IDs with their created dependents (if not forbidden by the operation options)\n for (const instanceId of this.operation.requestedInstanceIds) {\n const instance = this.instanceMap.get(instanceId)\n if (!instance) {\n throw new Error(`Instance not found: ${instanceId}`)\n }\n\n if (this.operation.options.destroyDependentInstances) {\n traverse(instance.id)\n }\n\n this.instanceIdsToDestroy.add(instanceId)\n }\n } else if (this.operation.type === \"update\") {\n // 1.b. find all children instances of the affected to-update instances which are in the state map, but not in the instance map\n // in other words, this code cleans up child instances which are not produced by composite instances anymore\n\n for (const instanceId of this.operation.instanceIdsToUpdate) {\n const [type] = parseInstanceId(instanceId)\n const component = this.library.components[type]\n\n if (!component || isUnitModel(component)) {\n // ignore non-composite instances\n continue\n }\n\n const childrenQueue = [...(this.stateChildIdMap.get(instanceId) ?? [])]\n\n while (childrenQueue.length > 0) {\n const childId = childrenQueue.pop()!\n if (!this.instanceMap.has(childId)) {\n this.instanceIdsToDestroy.add(childId)\n }\n\n childrenQueue.push(...(this.stateChildIdMap.get(childId) ?? []))\n }\n }\n } else {\n return\n }\n\n // 2. extend affected instance IDs with the children of the affected composite instances\n const compositeInstanceQueue = Array.from(this.instanceIdsToDestroy)\n while (compositeInstanceQueue.length > 0) {\n const childId = compositeInstanceQueue.pop()!\n const children = this.stateChildIdMap.get(childId) ?? []\n\n for (const child of children) {\n compositeInstanceQueue.push(child)\n this.instanceIdsToDestroy.add(child)\n }\n }\n\n // 3. detect composite instance children and include their parents (recursively)\n for (const instanceId of this.instanceIdsToDestroy) {\n let state = this.stateMap.get(instanceId)\n while (state?.parentId) {\n this.instanceIdsToDestroy.add(state.parentId)\n state = this.stateMap.get(state.parentId)\n }\n }\n\n // 4. if \"allowPartialCompositeInstanceUpdates\" is not set, include all children of the composite instances\n if (!this.operation.options.allowPartialCompositeInstanceUpdates) {\n for (const instanceId of this.instanceIdsToDestroy) {\n const children = this.stateChildIdMap.get(instanceId) ?? []\n for (const childId of children) {\n this.instanceIdsToDestroy.add(childId)\n }\n }\n }\n\n this.operation.instanceIdsToDestroy = Array.from(this.instanceIdsToDestroy)\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 private getTransientStatusByOperationPhase(): InstanceOperataionStatusEnum {\n switch (this.currentPhase) {\n case \"update\":\n return \"updating\"\n case \"destroy\":\n return \"destroying\"\n case \"refresh\":\n return \"refreshing\"\n }\n }\n\n public async getUpToDateInputHashOutput(instance: InstanceModel): Promise<InputHashOutput> {\n return await 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.invalidate(instance.id)\n await this.inputHashResolver.process()\n\n return this.inputHashResolver.requireOutput(instance.id)\n })\n }\n\n /**\n * Tries to acquire not-locked instances in the workset.\n *\n * Should not be called if the whole workset is already locked.\n *\n * If `instancesToLock` is provided, it will try to lock only those instances.\n */\n public async tryLock(instancesToLock?: string[]): Promise<void> {\n const [, lockedInstanceIds] = await this.instanceLockService.tryLockInstances(\n this.projectId,\n instancesToLock ?? Array.from(this.instanceIdsToLockIds),\n {\n title: \"Operation Lock\",\n description: `The instance is locked for the ${this.operation.type} operation with ID \"${this.operation.id}\".`,\n icon: \"mdi:cog-sync\",\n },\n { type: \"operation\", operationId: this.operation.id },\n true, // allow partial locking\n )\n\n // add locked instance IDs to the workset and remove them from the instanceIdsToLockIds\n for (const instanceId of lockedInstanceIds) {\n this.lockedInstanceIds.add(instanceId)\n this.instanceIdsToLockIds.delete(instanceId)\n this.lockEventEmitter.emit(instanceId, null)\n }\n }\n\n public static async load(\n projectId: string,\n operation: Operation,\n projectBackend: ProjectBackend,\n libraryBackend: LibraryBackend,\n stateManager: StateManager,\n instanceLockService: InstanceLockService,\n instanceStateService: InstanceStateService,\n logger: Logger,\n signal: AbortSignal,\n ): Promise<OperationWorkset> {\n // First get project info to obtain libraryId\n const projectInfo = await projectBackend.getProjectInfo(projectId, signal)\n\n // Use StateManager for instance states, StateBackend directly for composite instances\n // TODO: use hotstate for composite instances as well\n const compositeInstanceRepo = stateManager.getCompositeInstanceRepository(projectId)\n\n const [library, project, compositeInstances, states] = await Promise.all([\n libraryBackend.loadLibrary(projectInfo.libraryId, signal),\n projectBackend.getProject(projectId, signal),\n compositeInstanceRepo.getAllItems(),\n instanceStateService.getInstanceStates(projectId),\n ])\n\n const workset = new OperationWorkset(\n projectId,\n operation,\n library,\n projectInfo.libraryId,\n instanceLockService,\n instanceStateService,\n logger.child({ operationId: operation.id, service: \"OperationWorkset\" }),\n )\n\n // prepare instances\n for (const instance of project.instances) {\n workset.addInstance(instance)\n }\n\n for (const instance of compositeInstances) {\n const worksetInstance = workset.instanceMap.get(instance.instance.id)\n\n if (worksetInstance) {\n worksetInstance.outputs = instance.instance.outputs\n worksetInstance.resolvedOutputs = instance.instance.resolvedOutputs\n } else if (instance.instance.parentId) {\n workset.addInstance(instance.instance)\n } else {\n workset.logger.warn(\n `ignoring instance \"${instance.instance.id}\" from composite instance state because it is not in the project or is not a part of known composite instance`,\n )\n continue\n }\n\n for (const child of instance.children) {\n if (!workset.instanceMap.has(child.id)) {\n workset.addInstance(child)\n }\n }\n }\n\n const unitSources = await libraryBackend.getResolvedUnitSources(\n projectInfo.libraryId,\n unique(Array.from(workset.instanceMap.values()).map(i => i.type)),\n )\n\n for (const unitSource of unitSources) {\n workset.unitSourceHashMap.set(unitSource.unitType, unitSource.sourceHash)\n }\n\n for (const state of states) {\n if (!workset.instanceMap.has(state.id)) {\n workset.logger.warn(\n `ignoring instance \"${state.id}\" from state because it is not in the project or is not a part of a composite instance`,\n )\n continue\n }\n\n workset.setState(state)\n }\n\n // prepare input resolver\n for (const instance of workset.instanceMap.values()) {\n workset.inputResolverNodes.set(`instance:${instance.id}`, {\n kind: \"instance\",\n instance,\n component: library.components[instance.type],\n })\n }\n\n for (const hub of project.hubs) {\n workset.inputResolverNodes.set(`hub:${hub.id}`, { kind: \"hub\", hub })\n }\n\n workset.inputResolver = new InputResolver(workset.inputResolverNodes, logger)\n workset.inputResolver.addAllNodesToWorkset()\n\n await workset.inputResolver.process()\n\n // resolve inputs for all instances and pass outputs to input hash resolver\n for (const instance of workset.instanceMap.values()) {\n const output = workset.inputResolver.requireOutput(`instance:${instance.id}`)\n if (output.kind !== \"instance\") {\n throw new Error(\"Unexpected output kind\")\n }\n\n workset.resolvedInstanceInputs.set(instance.id, output.resolvedInputs)\n\n const component = workset.library.components[instance.type]\n\n workset.inputHashNodes.set(instance.id, {\n instance,\n component,\n resolvedInputs: output.resolvedInputs,\n state: workset.stateMap.get(instance.id),\n sourceHash: workset.getSourceHashIfApplicable(instance, component),\n })\n }\n\n // prepare input hash resolver\n workset.inputHashResolver = new InputHashResolver(workset.inputHashNodes, logger)\n workset.inputHashResolver.addAllNodesToWorkset()\n\n await workset.inputHashResolver.process()\n\n if (operation.type !== \"destroy\") {\n await workset.calculateInstanceIdsToUpdate()\n }\n\n workset.calculateInstanceIdsToDestroy()\n\n for (const instanceId of workset.instanceIdsToUpdate) {\n workset.instanceIdsToLockIds.add(instanceId)\n }\n\n for (const instanceId of workset.instanceIdsToDestroy) {\n workset.instanceIdsToLockIds.add(instanceId)\n }\n\n return workset\n }\n}\n","import type { RunnerBackend } from \"./runner\"\nimport { pino, type Logger } from \"pino\"\nimport { createWorkerBackend, WorkerManager, type WorkerBackend } from \"./worker\"\nimport { createHotStateBackend, HotStateManager, type HotStateBackend } from \"./hotstate\"\nimport { createPubSubBackend, PubSubManager, type PubSubBackend } from \"./pubsub\"\nimport { createLockBackend, type LockBackend, LockManager } from \"./lock\"\nimport { createStateBackend, StateManager, type StateBackend } from \"./state\"\nimport { type Config, loadConfig } from \"./config\"\nimport { type LibraryBackend, createLibraryBackend } from \"./library\"\nimport { OperationManager } from \"./orchestrator\"\nimport { type ProjectBackend, ProjectManager, createProjectBackend } from \"./project\"\nimport { createRunnerBackend } from \"./runner\"\nimport { type TerminalBackend, TerminalManager, createTerminalBackend } from \"./terminal\"\nimport { type ArtifactBackend, createArtifactBackend, ArtifactService } from \"./artifact\"\nimport {\n InstanceLockService,\n OperationService,\n SecretService,\n ProjectUnlockService,\n InstanceStateService,\n ApiKeyService,\n WorkerService,\n} from \"./business\"\n\nexport type Services = {\n readonly logger: Logger\n\n readonly hotStateBackend: HotStateBackend\n readonly hotStateManager: HotStateManager\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 readonly projectBackend: ProjectBackend\n readonly projectManager: ProjectManager\n readonly stateBackend: StateBackend\n readonly stateManager: StateManager\n readonly operationManager: OperationManager\n\n readonly terminalBackend: TerminalBackend\n readonly terminalManager: TerminalManager\n\n readonly workerBackend: WorkerBackend\n readonly workerManager: WorkerManager\n\n readonly artifactBackend: ArtifactBackend\n readonly artifactManager: ArtifactService\n\n // business services\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}\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 logger,\n\n hotStateBackend,\n hotStateManager,\n\n pubsubBackend,\n pubsubManager,\n\n lockBackend,\n lockManager,\n\n libraryBackend,\n runnerBackend,\n projectBackend,\n projectManager,\n stateBackend,\n stateManager,\n operationManager,\n\n terminalBackend,\n terminalManager,\n\n workerBackend,\n workerManager,\n\n artifactBackend,\n artifactManager,\n\n // business services\n instanceLockService,\n projectUnlockService,\n operationService,\n secretService,\n instanceStateService,\n apiKeyService,\n workerService,\n } = {},\n}: CreateServicesOptions = {}): Promise<Services> {\n config ??= await loadConfig()\n logger ??= pino({ level: config.HIGHSTATE_LOG_LEVEL, errorKey: \"error\" })\n\n pubsubBackend ??= createPubSubBackend(config, logger)\n pubsubManager ??= new PubSubManager(pubsubBackend)\n\n lockBackend ??= createLockBackend(config)\n lockManager ??= new LockManager(lockBackend)\n\n hotStateBackend ??= createHotStateBackend(config)\n hotStateManager ??= new HotStateManager(hotStateBackend)\n\n stateBackend ??= await createStateBackend(config, logger)\n stateManager ??= await StateManager.create(config, stateBackend, hotStateManager, logger)\n\n libraryBackend ??= await createLibraryBackend(config, logger)\n\n artifactBackend ??= await createArtifactBackend(config, stateManager, logger)\n artifactManager ??= new ArtifactService(stateManager, artifactBackend, lockManager, logger)\n\n runnerBackend ??= createRunnerBackend(\n config,\n libraryBackend,\n artifactManager,\n artifactBackend,\n stateManager,\n logger,\n )\n\n projectBackend ??= await createProjectBackend(config)\n\n instanceLockService ??= new InstanceLockService(\n stateManager,\n lockManager,\n pubsubManager,\n logger.child({ service: \"InstanceLockService\" }),\n )\n\n projectUnlockService ??= new ProjectUnlockService(\n stateManager,\n hotStateManager,\n pubsubManager,\n logger.child({ service: \"StateUnlockService\" }),\n )\n\n operationService ??= new OperationService(\n stateManager,\n hotStateManager,\n pubsubManager,\n logger.child({ service: \"OperationService\" }),\n )\n\n instanceStateService ??= new InstanceStateService(\n stateManager,\n hotStateManager,\n pubsubManager,\n lockManager,\n runnerBackend,\n artifactManager,\n logger.child({ service: \"InstanceService\" }),\n )\n\n secretService ??= new SecretService(\n stateManager,\n libraryBackend,\n projectBackend,\n instanceStateService,\n logger.child({ service: \"SecretService\" }),\n )\n\n apiKeyService ??= new ApiKeyService(stateManager, lockManager)\n\n operationManager ??= OperationManager.create(\n runnerBackend,\n libraryBackend,\n projectBackend,\n artifactManager,\n stateManager,\n instanceLockService,\n projectUnlockService,\n operationService,\n secretService,\n instanceStateService,\n pubsubManager,\n logger,\n )\n\n projectManager ??= ProjectManager.create(\n projectBackend,\n libraryBackend,\n stateManager,\n instanceLockService,\n pubsubManager,\n logger,\n )\n\n terminalBackend ??= createTerminalBackend(config, logger)\n terminalManager ??= TerminalManager.create(\n terminalBackend,\n stateManager,\n pubsubManager,\n projectUnlockService,\n logger,\n )\n\n workerBackend ??= createWorkerBackend(config, logger)\n workerManager ??= new WorkerManager(\n config,\n workerBackend,\n stateManager,\n projectUnlockService,\n lockManager,\n apiKeyService,\n logger,\n )\n\n workerService ??= new WorkerService(\n stateManager,\n workerManager,\n lockManager,\n instanceStateService,\n logger.child({ service: \"WorkerService\" }),\n )\n\n logger.info(\"services created\")\n\n return {\n logger,\n\n hotStateBackend,\n hotStateManager,\n\n pubsubBackend,\n pubsubManager,\n\n lockBackend,\n lockManager,\n\n libraryBackend,\n runnerBackend,\n projectBackend,\n projectManager,\n stateBackend,\n stateManager,\n operationManager,\n\n terminalBackend,\n terminalManager,\n\n workerBackend,\n workerManager,\n\n artifactBackend,\n artifactManager,\n\n // business services\n instanceLockService,\n projectUnlockService,\n operationService,\n instanceStateService,\n secretService,\n apiKeyService,\n workerService,\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","import type { LockManager } from \"../lock\"\nimport type { StateManager } from \"../state\"\nimport { randomBytes } from \"node:crypto\"\nimport { AccessError, type ProjectApiKey } from \"../shared\"\n\nexport class ApiKeyService {\n constructor(\n private readonly stateManager: StateManager,\n private readonly lockManager: LockManager,\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<ProjectApiKey> {\n return await this.lockManager.acquire([[\"api-key\", projectId, apiKeyId]], async () => {\n const apiKey = await this.stateManager.getApiKeyRepository(projectId).get(apiKeyId)\n if (!apiKey) {\n throw new Error(`API key with ID \"${apiKeyId}\" not found in project \"${projectId}\"`)\n }\n\n const batch = this.stateManager.batch()\n\n // delete the old token from the index\n await this.stateManager\n .getApiKeyTokenIndexRepository(projectId)\n .indexRepository.delete(apiKey.token, batch)\n\n // generate a new token\n apiKey.token = randomBytes(32).toString(\"hex\")\n\n // update the API key with the new token and update the index\n await Promise.all([\n this.stateManager.getApiKeyRepository(projectId).putItem(apiKey, batch),\n this.stateManager\n .getApiKeyTokenIndexRepository(projectId)\n .indexRepository.put(apiKey.token, apiKey.id, batch),\n ])\n\n await batch.write()\n\n return apiKey\n })\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<ProjectApiKey> {\n const apiKey = await this.stateManager.getApiKeyTokenIndexRepository(projectId).get(token)\n if (!apiKey || apiKey.token !== token) {\n throw new AccessError(`Token is not valid for project \"${projectId}\"`)\n }\n\n return apiKey\n }\n}\n","import type { BackendUnlockMethod } from \"../shared\"\nimport type { StateBackend } from \"../state/abstractions\"\n\nexport class BackendUnlockService {\n constructor(private readonly stateBackend: StateBackend) {}\n\n getUnlockMethods(): Promise<BackendUnlockMethod[]> {}\n\n unlock(): Promise<string> {}\n}\n","import type { Logger } from \"pino\"\nimport type { LockManager } from \"../lock\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { StateManager } from \"../state\"\nimport { compareInstanceLockSpecs, type InstanceLockSpec, type ObjectMeta } from \"../shared\"\n\nexport class InstanceLockService {\n constructor(\n private readonly stateManager: StateManager,\n private readonly lockManager: LockManager,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Tries to lock instances in the project.\n * Returns true if the lock was acquired successfully, false otherwise.\n *\n * @param projectId The project ID to lock instances in.\n * @param instanceIds The instance IDs to lock.\n * @param lockMeta The metadata for the lock.\n * @param spec The lock specification containing the lock type and other parameters.\n * @param allowPartialLock Whether to allow partial locking of instances.\n * If true, it will lock as many instances as possible even if some are already locked.\n *\n * @return A tuple containing a boolean indicating if the lock was acquired,\n * and an array of instance IDs that were successfully locked.\n * If `allowPartialLock` is false and some instances are already locked,\n * it will return false and an empty array.\n */\n async tryLockInstances(\n projectId: string,\n instanceIds: string[],\n lockMeta: ObjectMeta,\n spec: InstanceLockSpec,\n allowPartialLock = false,\n ): Promise<[locked: boolean, lockedInstanceIds: string[]]> {\n const lockKeys = instanceIds.map(id => [\"instance-lock\", projectId, id] as const)\n\n // acquire the hard lock to ensure no other process can manage the lock entries\n return await this.lockManager.acquire(lockKeys, async () => {\n // check if the instances are already locked\n const existingLocks = await this.stateManager\n .getInstanceLockRepository(projectId)\n .getManyItems(instanceIds)\n\n // only the locks with another spec are considered as the conflicting locks\n const conflictingLocks = existingLocks.filter(\n lock => !compareInstanceLockSpecs(lock.spec, spec),\n )\n\n if (conflictingLocks.length > 0) {\n this.logger.debug(\n {\n projectId,\n requestedInstanceIds: instanceIds,\n lockedInstanceIds: conflictingLocks.map(lock => lock.id),\n },\n `failed to lock %s of %s instances in project \"%s\"`,\n conflictingLocks.length,\n instanceIds.length,\n projectId,\n )\n\n if (!allowPartialLock) {\n // if partial locking is not allowed, return false\n return [false, []]\n }\n\n // if partial locking is allowed, filter out the already locked instances and proceed with the rest\n instanceIds = instanceIds.filter(id => !conflictingLocks.some(lock => lock.id === id))\n }\n\n const newLocks = instanceIds.map(id => ({ id, projectId, meta: lockMeta, spec }))\n\n // persist the new locks\n await this.stateManager.getInstanceLockRepository(projectId).putManyItems(newLocks)\n\n this.logger.debug(\n {\n projectId,\n instanceIds: newLocks.map(lock => lock.id),\n spec,\n },\n `locked %s instances in project \"%s\"`,\n newLocks.length,\n projectId,\n )\n\n // publish the lock event\n await this.pubsubManager.publish([\"instance-lock\", projectId], {\n type: \"locked\",\n locks: newLocks,\n })\n\n return [true, newLocks.map(lock => lock.id)]\n })\n }\n\n /**\n * Unlocks instances in the project unconditionally.\n * This will remove the locks regardless of their current state.\n *\n * @param projectId The project ID to unlock instances in.\n * @param instanceIds The instance IDs to unlock.\n */\n async unlockInstancesUnconditionally(projectId: string, instanceIds: string[]): Promise<void> {\n this.logger.debug(\n { projectId, instanceIds },\n `unconditionally unlocking %s instances in project \"%s\"`,\n instanceIds.length,\n projectId,\n )\n\n // remove the locks from the state\n await this.stateManager.getInstanceLockRepository(projectId).deleteMany(instanceIds)\n\n // publish the unlock event\n await this.pubsubManager.publish([\"instance-lock\", projectId], {\n type: \"unlocked\",\n instanceIds,\n })\n }\n}\n","import type { HotStateManager } from \"../hotstate\"\nimport type { LockManager } from \"../lock\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { StateManager } from \"../state\"\nimport type { Logger } from \"pino\"\nimport type { RunnerBackend } from \"../runner\"\nimport type { ArtifactService } from \"../artifact\"\nimport { randomBytes } from \"node:crypto\"\nimport { parseInstanceId } from \"@highstate/contract\"\nimport { unique } from \"remeda\"\nimport {\n applyStatePatch,\n isStableOperationStatus,\n isStateEmpty,\n type InstanceCustomStatus,\n type InstanceState,\n type InstanceStatePatch,\n type Operation,\n} from \"../shared\"\n\nexport class InstanceStateService {\n constructor(\n private readonly stateManager: StateManager,\n private readonly hotStateManager: HotStateManager,\n private readonly pubsubManager: PubSubManager,\n private readonly lockManager: LockManager,\n private readonly runnerBackend: RunnerBackend,\n private readonly artifactManager: ArtifactService,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Gets the current states of all instances in a project.\n *\n * @param projectId The ID of the project for which to retrieve instance states.\n */\n async getInstanceStates(projectId: string): Promise<InstanceState[]> {\n const entries = await this.hotStateManager.hgetall([\"instance-states\", projectId])\n\n return entries.map(([, value]) => value)\n }\n\n async getInstanceState(projectId: string, instanceId: string): Promise<InstanceState | null> {\n return await this.hotStateManager.hget([\"instance-states\", projectId], instanceId)\n }\n\n async updateInstanceStates(\n projectId: string,\n states: InstanceState[],\n persistent = false,\n ): Promise<InstanceState[]> {\n const batch = this.stateManager.batch()\n const promises: Promise<void>[] = []\n\n for (const state of states) {\n promises.push(this.hotStateManager.hset([\"instance-states\", projectId], state.id, state))\n\n promises.push(\n this.pubsubManager.publish([\"instance-state\", projectId], { type: \"updated\", state }),\n )\n\n if (persistent) {\n promises.push(this.stateManager.getInstanceStateRepository(projectId).putItem(state, batch))\n }\n }\n\n await Promise.allSettled(promises)\n await batch.write()\n\n this.logger.debug({ projectId, states }, `instance states updated for project \"%s\"`, projectId)\n\n return states\n }\n\n async patchInstanceState(projectId: string, patch: InstanceStatePatch): Promise<InstanceState> {\n return await this.lockManager.acquire([\"instance-state\", projectId, patch.id], async () => {\n const state = await this.hotStateManager.hget([\"instance-states\", projectId], patch.id)\n\n if (!state) {\n throw new Error(`Instance state with ID \"${patch.id}\" not found in project \"${projectId}\"`)\n }\n\n const patchedState = await this.applyStatePatch(\n projectId,\n state,\n patch,\n patch.operationStatus !== undefined,\n )\n\n this.logger.debug(\n { projectId, instanceId: patch.id, patch },\n `instance state updated for instance \"%s\" in project \"%s\"`,\n patch.id,\n projectId,\n )\n\n return patchedState\n })\n }\n\n async patchOperationInstanceState(\n projectId: string,\n operation: Operation,\n patch: InstanceStatePatch,\n ): Promise<InstanceState> {\n return await this.lockManager.acquire([\"instance-state\", projectId, patch.id], async () => {\n const state = await this.hotStateManager.hget([\"instance-states\", projectId], patch.id)\n\n const patchedState = await this.applyStatePatch(\n projectId,\n state,\n patch,\n operation.type !== \"preview\",\n )\n\n this.logger.debug(\n { projectId, instanceId: patch.id, patch },\n `instance state updated for instance \"%s\" in project \"%s\"`,\n patch.id,\n projectId,\n )\n\n return patchedState\n })\n }\n\n async updateStateSecretNames(\n projectId: string,\n instanceId: string,\n secretNamesToAdd: string[],\n secretNamesToRemove: string[],\n invalidateState = true,\n ): Promise<void> {\n await this.lockManager.acquire([\"instance-state\", projectId, instanceId], async () => {\n const state = await this.hotStateManager.hget([\"instance-states\", projectId], instanceId)\n\n const secretNameSet = new Set(state?.secretNames ?? [])\n for (const name of secretNamesToAdd) {\n secretNameSet.add(name)\n }\n\n for (const name of secretNamesToRemove) {\n secretNameSet.delete(name)\n }\n\n const patch: InstanceStatePatch = {\n id: instanceId,\n secretNames: Array.from(secretNameSet),\n }\n\n if (state?.operationStatus && invalidateState) {\n // invalidate the input hash nonce if the operation status is present\n // if not, the invalidation makes no sense\n patch.operationStatus = {\n inputHashNonce: randomBytes(4).readInt32LE(),\n }\n }\n\n await this.applyStatePatch(projectId, state, patch, true)\n })\n }\n\n /**\n * Completely deletes the instance state from the system including all related resources.\n *\n * @param projectId The ID of the project from which to delete the instance state.\n * @param instanceId The ID of the instance whose state is to be deleted.\n */\n async deleteInstanceState(projectId: string, instanceId: string): Promise<void> {\n await this.lockManager.acquire([\"instance-state\", projectId, instanceId], async () => {\n const [instanceType, instanceName] = parseInstanceId(instanceId)\n const state = await this.getInstanceState(projectId, instanceId)\n\n const batch = this.stateManager.batch()\n\n await Promise.allSettled([\n // remove from the state\n this.stateManager.getInstanceStateRepository(projectId).delete(instanceId, batch),\n\n // clear related resources\n this.stateManager.getInstanceLockRepository(projectId).delete(instanceId, batch),\n\n this.stateManager\n .getPageRepository(projectId)\n .deleteMany(Object.values(state?.extra?.pageIds ?? {}), batch),\n\n this.stateManager\n .getTriggerRepository(projectId)\n .deleteMany(Object.values(state?.extra?.triggerIds ?? {}), batch),\n\n this.stateManager\n .getTerminalRepository(projectId)\n .deleteMany(Object.values(state?.extra?.terminalIds ?? {}), batch),\n ])\n\n await Promise.allSettled([\n // commit the state batch\n batch.write(),\n\n // update hotstate\n this.hotStateManager.hdel([\"instance-states\", projectId], instanceId),\n\n // publish the instance state deletion event\n this.pubsubManager.publish([\"instance-state\", projectId], { type: \"deleted\", instanceId }),\n\n // remove all artifact references\n this.artifactManager.removeUsages(\n projectId,\n unique([\n ...Object.values(state?.extra?.ownedArtifactIds ?? []).flat(),\n ...(state?.extra?.usedArtifactIds ?? []),\n ]),\n [{ type: \"instance\", instanceId }],\n ),\n\n // clear pulumi state\n this.runnerBackend.deleteState({ projectId, instanceName, instanceType }),\n ])\n })\n }\n\n async updateCustomStatus(\n projectId: string,\n instanceId: string,\n status: InstanceCustomStatus,\n ): Promise<void> {\n await this.lockManager.acquire([\"instance-state\", projectId, instanceId], async () => {\n const state = await this.hotStateManager.hget([\"instance-states\", projectId], instanceId)\n if (!state) {\n throw new Error(\n `Instance state with ID \"${instanceId}\" not found in project \"${projectId}\"`,\n )\n }\n\n const existingStatus = state.extra?.customStatuses?.find(s => s.name === status.name)\n if (existingStatus) {\n Object.assign(existingStatus, status)\n } else {\n state.extra ??= {}\n state.extra.customStatuses ??= []\n state.extra.customStatuses?.push(status)\n }\n\n await this.applyStatePatch(projectId, state, { id: instanceId, extra: state.extra })\n })\n }\n\n private async applyStatePatch(\n projectId: string,\n state: InstanceState | null,\n patch: InstanceStatePatch,\n persistent = true,\n ): Promise<InstanceState> {\n const patchedState = applyStatePatch(state, patch)\n\n const promises: Promise<void>[] = [\n this.hotStateManager.hset([\"instance-states\", projectId], patchedState.id, patchedState),\n ]\n\n const shouldPersist =\n persistent &&\n (!patchedState.operationStatus ||\n isStableOperationStatus(patchedState.operationStatus?.status))\n\n const repo = this.stateManager.getInstanceStateRepository(projectId)\n\n if (isStateEmpty(patchedState)) {\n promises.push(\n this.pubsubManager.publish([\"instance-state\", projectId], {\n type: \"deleted\",\n instanceId: patchedState.id,\n }),\n )\n\n if (shouldPersist) {\n promises.push(repo.delete(patchedState.id))\n }\n } else {\n promises.push(\n this.pubsubManager.publish([\"instance-state\", projectId], { type: \"patched\", patch }),\n )\n\n if (shouldPersist) {\n promises.push(repo.putItem(patchedState))\n }\n }\n\n await Promise.allSettled(promises)\n\n return patchedState\n }\n}\n","import type { Logger } from \"pino\"\nimport type { PubSubManager } from \"../pubsub\"\nimport type { HotStateManager } from \"../hotstate\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport { SAME_KEY, type StateManager } from \"../state\"\nimport { isFinalOperationStatus, type Operation } from \"../shared\"\n\nexport class OperationService {\n constructor(\n private readonly stateManager: StateManager,\n private readonly hotStateManager: HotStateManager,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {}\n\n async getActiveOperaiton(projectId: string, operationId: string): Promise<Operation | null> {\n try {\n return await this.hotStateManager.hget([\"active-operations\", projectId], operationId)\n } catch (error) {\n this.logger.error(\n { projectId, operationId, error },\n `failed to get active operation with ID \"%s\" in project \"%s\" from hot state`,\n operationId,\n projectId,\n )\n\n return null\n }\n }\n\n /**\n * Persists an operation to the state and publishes an update event.\n *\n * @param projectId The project ID to which the operation belongs.\n * @param operation The operation to persist.\n */\n async updateOperation(projectId: string, operation: Operation): Promise<void> {\n // 1. update the operation in the hot state\n try {\n if (isFinalOperationStatus(operation.status)) {\n await this.hotStateManager.hdel([\"active-operations\", projectId], operation.id)\n } else {\n await this.hotStateManager.hset([\"active-operations\", projectId], operation.id, operation)\n }\n } catch (error) {\n this.logger.error(\n { projectId, operationId: operation.id, error },\n `failed to update operation with ID \"%s\" in project \"%s\" in hot state`,\n operation.id,\n projectId,\n )\n }\n\n // 2. persist the operation in the state repository\n try {\n await using batch = this.stateManager.batch()\n\n // persist the operation to the operation repository\n await this.stateManager.getOperationRepository(projectId).put(operation.id, operation, batch)\n\n if (operation.status === \"pending\") {\n // add the just created operation to the active operations index\n await this.stateManager\n .getActiveOperationIndexRepository(projectId)\n .indexRepository.put(operation.id, operation.id, batch)\n } else if (isFinalOperationStatus(operation.status)) {\n // remove the finished operation from the active operations index\n await this.stateManager\n .getActiveOperationIndexRepository(projectId)\n .indexRepository.delete(operation.id, batch)\n }\n\n await batch.write()\n\n try {\n await this.pubsubManager.publish([\"operation\", operation.id], {\n type: \"updated\",\n operation,\n })\n } catch (error) {\n this.logger.error(\n { projectId, operationId: operation.id, error },\n `failed to publish operation update for operation with ID \"%s\" in project \"%s\"`,\n operation.id,\n projectId,\n )\n }\n\n this.logger.info(\n { projectId, operationId: operation.id },\n `updated operation with ID \"%s\" in project \"%s\"`,\n operation.id,\n projectId,\n )\n } catch (error) {\n this.logger.error(\n { projectId, operationId: operation.id, error },\n `failed to update operation with ID \"%s\" in project \"%s\"`,\n operation.id,\n projectId,\n )\n\n throw new Error(`Failed to update operation \"${operation.id}\" in project \"${projectId}\"`, {\n cause: error,\n })\n }\n }\n\n /**\n * Appends logs for a specific operation.\n * Creates all necessary indexes to retrieve the logs by instance ID.\n *\n * @param projectId The ID of the project to persist the logs for.\n * @param operationId The ID of the operation to persist the logs for.\n * @param instanceIds The IDs of the instances to persist the logs for. Should include the whole hierarchy of instances produced the logs.\n * @param logs The logs entries to persist.\n */\n async appendLogs(\n projectId: string,\n operationId: string,\n instanceIds: string[],\n logs: string[],\n ): Promise<void> {\n const records: [string, string][] = logs.map(log => [uuidv7(), log])\n\n // 1. publish logs to the pubsub system, ignore errors\n try {\n const events = instanceIds.flatMap(instanceId =>\n records.map(\n record => [[`operation-instance-log`, operationId, instanceId], record] as const,\n ),\n )\n\n await this.pubsubManager.publishMany(events)\n } catch (error) {\n this.logger.error(\n { projectId, operationId, instanceIds, error },\n `failed to publish logs for operation \"%s\" in project \"%s\"`,\n operationId,\n projectId,\n )\n }\n\n // 2. persist logs to the hot state and state repository, ignore errors\n try {\n // insert logs into the hotstate\n await this.hotStateManager.hmset([\"operation-logs\", projectId], records)\n } catch (error) {\n this.logger.error(\n { projectId, operationId, instanceIds, error },\n `failed to append logs for operation \"%s\" in project \"%s\"`,\n operationId,\n projectId,\n )\n }\n\n // 3. persist logs to the state repository, fail on error\n try {\n await using batch = this.stateManager.batch()\n\n // insert logs into the operation log repository\n await this.stateManager\n .getOperationLogRepository(projectId, operationId)\n .putMany(records, batch)\n\n for (const instanceId of instanceIds) {\n // create an index for the instance logs\n await this.stateManager\n .getInstanceLogIndexRepository(projectId, operationId, instanceId)\n .indexRepository.putMany(\n records.map(([id]) => [id, SAME_KEY]),\n batch,\n )\n }\n\n await batch.write()\n } catch (error) {\n this.logger.error(\n { projectId, operationId, instanceIds, error },\n `failed to persist instance logs for operation \"%s\" in project \"%s\"`,\n operationId,\n projectId,\n )\n\n throw new Error(\n `Failed to persist logs for operation \"${operationId}\" in project \"${projectId}\"`,\n { cause: error },\n )\n }\n }\n\n /**\n * Retrieves logs for a specific operation and instance.\n * First tries to get logs from the hot state, then falls back to the state repository.\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 instanceId The ID of the instance to retrieve logs for.\n * @returns An array of log entries as tuples of [logId, logContent].\n */\n async getInstanceLogs(\n projectId: string,\n operationId: string,\n instanceId: string,\n ): Promise<[string, string][]> {\n // 1. first try to get logs from the hot state\n try {\n const logs = await this.hotStateManager.hgetall([\"operation-logs\", projectId])\n\n if (logs.length > 0) {\n // if there are logs, assume they are up-to-date\n return logs\n }\n\n // otherwise, check if the operation is active to determine if logs are expected\n const hasActiveOperation = await this.hotStateManager.hexists(\n [\"active-operations\", projectId],\n operationId,\n )\n\n if (hasActiveOperation) {\n // if the operation is active, there is just no logs yet\n return []\n }\n } catch (error) {\n this.logger.error(\n { projectId, operationId, instanceId, error },\n `failed to get logs for operation \"%s\" in project \"%s\"`,\n operationId,\n projectId,\n )\n }\n\n // 2. if not found or failed, try to get logs from the state repository\n try {\n // if no logs are found in the hot state, load them from the state repository\n return await this.stateManager\n .getInstanceLogIndexRepository(projectId, operationId, instanceId)\n .getAll()\n } catch (error) {\n this.logger.error(\n { projectId, operationId, instanceId, error },\n `failed to get logs for operation \"%s\" in project \"%s\"`,\n operationId,\n projectId,\n )\n\n return []\n }\n }\n}\n","import type { StateBatch, StateManager } from \"../state\"\nimport type { Logger } from \"pino\"\nimport type { HotStateManager } from \"../hotstate\"\nimport type { PubSubManager } from \"../pubsub\"\nimport { randomBytes } from \"node:crypto\"\nimport { armor, Decrypter, Encrypter } from \"age-encryption\"\nimport { type ProjectUnlockState, type UnlockMethod } from \"../shared\"\n\ntype UnlockTask = {\n name: string\n handler: (projectId: string) => Promise<void> | void\n}\n\nexport class ProjectUnlockService {\n constructor(\n private readonly stateManager: StateManager,\n private readonly hotStateManager: HotStateManager,\n private readonly pubsubManager: PubSubManager,\n private readonly logger: Logger,\n ) {}\n\n private readonly unlockTasks: UnlockTask[] = []\n\n /**\n * Checks if the project is unlocked.\n * A project is considered locked if it has no master key set in memory.\n *\n * @param projectId The ID of the project to check.\n * @returns True if the project is locked, false otherwise.\n */\n async isProjectUnlocked(projectId: string): Promise<boolean> {\n return await this.hotStateManager.exists([\"project-master-key\", projectId])\n }\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.isProjectUnlocked(projectId)\n if (isUnlocked) {\n return { type: \"unlocked\" }\n }\n\n const unlockSuite = await this.stateManager.getProjectUnlockSuiteRepository().get(projectId)\n return {\n type: \"locked\",\n unlockSuite,\n }\n }\n\n /**\n * Creates a new project state and generates a master key for it.\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 createProjectState(projectId: string, unlockMethod: UnlockMethod): Promise<void> {\n const masterKey = randomBytes(32)\n await using batch = this.stateManager.batch()\n\n // unlock the project by storing the master key in memory\n await this.hotStateManager.set([\"project-master-key\", projectId], masterKey)\n\n // store the master key in the backend\n await this.updateUnlockSuite(projectId, [unlockMethod], batch)\n await this.updateEncryptedMasterKey(projectId, [unlockMethod], batch, masterKey)\n\n // persist the unlock method as any other project data\n await this.stateManager\n .getUnlockMethodRepository(projectId)\n .put(unlockMethod.id, unlockMethod, batch)\n\n await batch.write()\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.isProjectUnlocked(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 armoredMasterKey = await this.stateManager.getProjectMasterKeyRepository().get(projectId)\n if (!armoredMasterKey) {\n throw new Error(`Project ${projectId} does not have a master key set.`)\n }\n\n const encryptedMasterKey = armor.decode(armoredMasterKey)\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 // store the master key in memory to unlock the project\n await this.hotStateManager.set([\"project-master-key\", projectId], masterKey)\n\n // load instance states to the hot state\n // TODO: this should be done by something else, ideally lazy-loaded when needed\n const instanceStates = await this.stateManager\n .getInstanceStateRepository(projectId)\n .getAllItems()\n\n await this.hotStateManager.hmset(\n [\"instance-states\", projectId],\n instanceStates.map(state => [state.id, state]),\n )\n\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 unlockMethod The unlock method to add. Should be provided by the frontend.\n */\n async addProjectUnlockMethod(projectId: string, unlockMethod: UnlockMethod): Promise<void> {\n await using batch = this.stateManager.batch()\n\n // add the unlock method to the repository\n await this.stateManager\n .getUnlockMethodRepository(projectId)\n .put(unlockMethod.id, unlockMethod, batch)\n\n // get all existing unlock methods\n const existingMethods = await this.stateManager\n .getUnlockMethodRepository(projectId)\n .getAllItems()\n\n // update the encrypted master identity set and master key\n await this.updateUnlockSuite(projectId, existingMethods, batch)\n await this.updateEncryptedMasterKey(projectId, existingMethods, batch)\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 await using batch = this.stateManager.batch()\n\n // get all existing unlock methods\n let existingMethods = await this.stateManager.getUnlockMethodRepository(projectId).getAllItems()\n\n // do not allow removing the last unlock method under any circumstances\n if (existingMethods.length === 1) {\n throw new Error(\"Rejected removing the last unlock method!\")\n }\n\n // remove the unlock method from the repository\n await this.stateManager.getUnlockMethodRepository(projectId).delete(unlockMethodId, batch)\n existingMethods = existingMethods.filter(method => method.id !== unlockMethodId)\n\n // update the encrypted master identity set and master key\n await this.updateUnlockSuite(projectId, existingMethods, batch)\n await this.updateEncryptedMasterKey(projectId, existingMethods, batch)\n\n await batch.write()\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 updateUnlockSuite(\n projectId: string,\n unlockMethods: UnlockMethod[],\n batch: StateBatch,\n ): Promise<void> {\n // write new encrypted master identity set\n await this.stateManager.getProjectUnlockSuiteRepository().put(\n projectId,\n {\n encryptedIdentities: unlockMethods.map(method => method.encryptedIdentity),\n hasPasskey: unlockMethods.some(method => method.type === \"passkey\"),\n },\n batch,\n )\n }\n\n private async updateEncryptedMasterKey(\n projectId: string,\n unlockMethods: UnlockMethod[],\n batch: StateBatch,\n masterKey?: Uint8Array,\n ): Promise<void> {\n masterKey ??= await this.stateManager.getProjectMasterKey(projectId)\n\n const encrypter = new Encrypter()\n for (const method of unlockMethods) {\n encrypter.addRecipient(method.recipient)\n }\n\n // encrypt the master key for all unlock methods\n const encryptedMasterKey = await encrypter.encrypt(masterKey)\n\n // set the encrypted master key in the backend\n const armoredMasterKey = armor.encode(encryptedMasterKey)\n await this.stateManager.getProjectMasterKeyRepository().put(projectId, armoredMasterKey, batch)\n }\n}\n","import type { Logger } from \"pino\"\nimport type { LibraryBackend } from \"../library\"\nimport type { ProjectBackend } from \"../project\"\nimport type { StateManager } from \"../state\"\nimport type { InstanceStateService } from \"./instance-state\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport { isUnitModel, parseInstanceId } from \"@highstate/contract\"\nimport { formatSecretDescriptor, type Secret, type SecretDescriptor } from \"../shared\"\n\nexport class SecretService {\n constructor(\n private readonly stateManager: StateManager,\n private readonly libraryBackend: LibraryBackend,\n private readonly projectBackend: ProjectBackend,\n private readonly instanceStateService: InstanceStateService,\n private readonly logger: Logger,\n ) {}\n\n /**\n * Updates secrets for a specific instance, handling both creation/updates and deletions.\n * Also updates the instance state's secretNames field.\n *\n * @param projectId The project ID.\n * @param instanceId The instance ID.\n * @param changedSecretValues The secrets to create or update.\n * @param deletedSecretNames The names of secrets to delete.\n * @param invalidateState Whether to invalidate the instance state after updating secrets.\n */\n async updateInstanceSecrets(\n projectId: string,\n instanceId: string,\n changedSecretValues: Record<string, unknown>,\n deletedSecretNames: string[],\n invalidateState = true,\n ): Promise<void> {\n const projectInfo = await this.projectBackend.getProjectInfo(projectId)\n const library = await this.libraryBackend.loadLibrary(projectInfo.libraryId)\n\n const [type] = parseInstanceId(instanceId)\n const component = library.components[type]\n if (!component) {\n throw new Error(`Component type ${type} not found in library`)\n }\n\n if (!isUnitModel(component)) {\n throw new Error(`Component type ${type} is not a unit model`)\n }\n\n // validate changed secrets\n for (const secretName of Object.keys(changedSecretValues)) {\n if (!component.secrets[secretName]) {\n throw new Error(`Secret ${secretName} not found in component ${type}`)\n }\n }\n\n // validate deleted secrets\n for (const secretName of deletedSecretNames) {\n if (!component.secrets[secretName]) {\n throw new Error(`Secret ${secretName} not found in component ${type}`)\n }\n }\n\n // use a batch for atomic operations\n await using batch = this.stateManager.batch()\n\n const secretRepo = this.stateManager.getSecretRepository(projectId)\n const secretContentRepo = this.stateManager.getSecretContentRepository(projectId)\n const indexRepo = this.stateManager.createSecretIndexRepository(projectId)\n\n // process changed secrets\n for (const [secretName, value] of Object.entries(changedSecretValues)) {\n const descriptor: SecretDescriptor = { type: \"instance\", instanceId, secretName }\n const indexKey = formatSecretDescriptor(descriptor)\n\n // check if secret already exists\n const existingSecret = await indexRepo.get(indexKey)\n\n // create or update secret info\n const secret: Secret = {\n id: existingSecret?.id ?? uuidv7(),\n descriptor: descriptor,\n meta: {\n ...existingSecret?.meta,\n ...component.secrets[secretName].meta,\n icon: component.secrets[secretName].meta.primaryIcon ?? component.meta.primaryIcon,\n },\n }\n\n // store secret info and content\n await secretRepo.putItem(secret, batch)\n await secretContentRepo.put(indexKey, value, batch)\n\n // update index mapping\n await indexRepo.indexRepository.put(indexKey, secret.id, batch)\n }\n\n // process deleted secrets\n for (const secretName of deletedSecretNames) {\n const indexKey = formatSecretDescriptor({ type: \"instance\", instanceId, secretName })\n\n // get the secret ID from index\n const secretId = await indexRepo.indexRepository.get(indexKey)\n if (secretId) {\n // delete secret info, content, and index entry\n await secretRepo.delete(secretId, batch)\n await secretContentRepo.delete(indexKey, batch)\n await indexRepo.indexRepository.delete(indexKey, batch)\n }\n }\n\n // write all changes atomically\n await batch.write()\n\n // update instance state secretNames\n await this.instanceStateService.updateStateSecretNames(\n projectId,\n instanceId,\n Object.keys(changedSecretValues),\n deletedSecretNames,\n invalidateState,\n )\n\n this.logger.info(\n {\n projectId,\n instanceId,\n changedCount: Object.keys(changedSecretValues).length,\n deletedCount: deletedSecretNames.length,\n },\n \"updated instance secrets for instance %s in project %s\",\n instanceId,\n projectId,\n )\n }\n\n /**\n * Gets the secrets for a specific instance.\n *\n * @param projectId The project ID.\n * @param instanceId The instance ID.\n * @returns A record of secret key-value pairs.\n */\n async getInstanceSecrets(\n projectId: string,\n instanceId: string,\n ): Promise<Record<string, unknown>> {\n const projectInfo = await this.projectBackend.getProjectInfo(projectId)\n const library = await this.libraryBackend.loadLibrary(projectInfo.libraryId)\n\n const [type] = parseInstanceId(instanceId)\n const component = library.components[type]\n if (!component) {\n throw new Error(`Component type ${type} not found in library`)\n }\n\n if (!isUnitModel(component)) {\n throw new Error(`Component type ${type} is not a unit model`)\n }\n\n const secretNames = Object.keys(component.secrets)\n if (secretNames.length === 0) {\n return {}\n }\n\n // get all index keys for this instance's secrets\n const indexKeys = secretNames.map(secretName =>\n formatSecretDescriptor({ type: \"instance\", instanceId, secretName }),\n )\n\n // get the secret contents using the formatted secret IDs directly\n const secretContentsMap = await this.stateManager\n .getSecretContentRepository(projectId)\n .getManyRecord(indexKeys)\n\n // build the result mapping secret names to values\n const secrets: Record<string, unknown> = {}\n for (const secretName of secretNames) {\n const indexKey = formatSecretDescriptor({ type: \"instance\", instanceId, secretName })\n const value = secretContentsMap[indexKey]\n if (value) {\n secrets[secretName] = value\n }\n }\n\n return secrets\n }\n}\n","import type { Logger } from \"pino\"\nimport type { LockManager } from \"../lock\"\nimport type { WorkerManager } from \"../worker\"\nimport type { InstanceStateService } from \"./instance-state\"\nimport { randomBytes } from \"node:crypto\"\nimport { v7 as uuidv7 } from \"uuid\"\nimport {\n getWorkerIdentity,\n type InstanceState,\n type ProjectApiKey,\n type ServiceAccount,\n type UnitWorker,\n type Worker,\n type WorkerUnitRegistration,\n} from \"../shared\"\nimport { SAME_KEY, type StateManager } from \"../state\"\n\nexport class WorkerService {\n constructor(\n private readonly stateManager: StateManager,\n private readonly workerManager: WorkerManager,\n private readonly lockManager: LockManager,\n private readonly instanceStateService: InstanceStateService,\n private readonly logger: Logger,\n ) {}\n\n async handleUnitWorker(\n projectId: string,\n state: InstanceState,\n unitWorker: UnitWorker,\n ): Promise<void> {\n await this.lockManager.acquire([\"worker-image\", projectId, unitWorker.image], async () => {\n const existingRegistrations = await this.stateManager\n .getWorkerRegistrationRepository(projectId)\n .getManyItems(state.extra?.workerRegistrationIds ?? [])\n\n const existingReg = existingRegistrations.find(reg => reg.image === unitWorker.image)\n if (existingReg && JSON.stringify(existingReg.params) === JSON.stringify(unitWorker.params)) {\n this.logger.debug(\n `instance \"%s\" already registered with worker \"%s\" with the same parameters`,\n state.id,\n unitWorker.image,\n )\n return\n }\n\n let workerId = existingReg?.workerId\n if (!workerId) {\n workerId = await this.ensureWorkerCreated(projectId, unitWorker)\n }\n\n const registration: WorkerUnitRegistration = {\n id: existingReg?.id ?? uuidv7(),\n meta: existingReg?.meta ?? {},\n image: unitWorker.image,\n params: unitWorker.params,\n instanceId: state.id,\n workerId,\n }\n\n const batch = this.stateManager.batch()\n\n await this.stateManager\n .getWorkerRegistrationRepository(projectId)\n .putItem(registration, batch)\n\n if (!existingReg) {\n // update the index if this is a new registration\n await this.stateManager\n .getWorkerRegistrationIndexRepository(projectId, workerId)\n .indexRepository.put(registration.id, SAME_KEY, batch)\n\n // update the instance state with the new registration ID\n await this.instanceStateService.patchInstanceState(projectId, {\n id: state.id,\n extra: {\n workerRegistrationIds: [...(state.extra?.workerRegistrationIds ?? []), registration.id],\n },\n })\n }\n\n await batch.write()\n })\n }\n\n private async ensureWorkerCreated(projectId: string, unitWorker: UnitWorker): Promise<string> {\n const identity = getWorkerIdentity(unitWorker.image)\n\n return await this.lockManager.acquire([\"worker-image\", projectId, identity], async () => {\n // it is not critical to fetch all workers since their count is not expected to be high\n const workers = await this.stateManager.getWorkerRepository(projectId).getAllItems()\n\n const existingWorker = workers.find(worker => worker.image === unitWorker.image)\n if (existingWorker) {\n this.logger.debug(`worker with image \"%s\" already exists, reusing it`, unitWorker.image)\n return existingWorker.id\n }\n\n let serviceAccountId: string | undefined\n\n const siblingWorker = workers.find(worker => worker.identity === identity)\n if (siblingWorker) {\n this.logger.debug(\n `sibling worker with identity \"%s\" already exists, using its service account`,\n identity,\n )\n\n serviceAccountId = siblingWorker.serviceAccountId\n }\n\n const batch = this.stateManager.batch()\n\n // create an empty service account if it is the first worker with this identity\n // the meta of the account will be updated by the worker itself\n if (!serviceAccountId) {\n const serviceAccount: ServiceAccount = {\n id: uuidv7(),\n meta: {},\n }\n\n serviceAccountId = serviceAccount.id\n await this.stateManager\n .getServiceAccountRepository(projectId)\n .putItem(serviceAccount, batch)\n }\n\n const apiKey: ProjectApiKey = {\n id: uuidv7(),\n meta: {},\n token: randomBytes(32).toString(\"hex\"),\n scopes: [\n {\n type: \"service-account\",\n actions: [\"full\"],\n serviceAccountIds: [serviceAccountId],\n },\n ],\n }\n\n await this.stateManager.getApiKeyRepository(projectId).putItem(apiKey, batch)\n\n const worker: Worker = {\n id: uuidv7(),\n meta: {},\n status: \"starting\",\n failedStartAttempts: 5,\n identity,\n image: unitWorker.image,\n serviceAccountId,\n apiKeyId: apiKey.id,\n }\n\n await this.stateManager.getWorkerRepository(projectId).putItem(worker, batch)\n await batch.write()\n\n this.workerManager.startWorker(projectId, worker)\n\n return worker.id\n })\n }\n}\n"],"mappings":"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","names":["z","path","z","z","z","readFile","resolve","z","BetterLock","z","BetterLock","readFile","resolve","z","isUnitModel","isUnitModel","instances","inputHashResolver","z","resolve","mkdir","writeFile","z","runScript","z","resolve","mkdir","writeFile","runScript","process","z","z","EventEmitter","on","resolve","join","tmpdir","mkdtemp","getInstanceId","z","BetterLock","uuidv7","command","BetterLock","uuidv7","readdir","z","EventEmitter","on","mkdtemp","join","tmpdir","getInstanceId","source","resolve","z","z","BetterLock","BetterLock","path","resolve","z","z","resolve","z","readFile","z","BetterLock","uuidv4","uuidv5","z","decode","encode","z","encode","decode","entry","z","BetterLock","uuidv4","uuidv5","readFile","masterKey","encryptedMasterKey","z","createReadStream","createWriteStream","mkdir","readdir","join","resolve","z","z","mkdir","createWriteStream","createReadStream","readdir","resolve","join","z","uuidv7","unique","uuidv7","unique","z","EventEmitter","on","z","z","BetterLock","z","join","z","z","z","z","z","Readable","z","spawn","process","z","PassThrough","z","uuidv7","z","PassThrough","uuidv7","z","uuidv7","randomBytes","uuidv7","isUnitModel","parseInstanceId","mapValues","unique","EventEmitter","on","isUnitModel","unique","BetterLock","BetterLock","EventEmitter","on","isUnitModel","unique","parseInstanceId","isUnitModel","mapValues","unique","instance","randomBytes","uuidv7","uuidv7","randomBytes","randomBytes","randomBytes","parseInstanceId","unique","randomBytes","parseInstanceId","unique","uuidv7","uuidv7","randomBytes","armor","Decrypter","Encrypter","randomBytes","armor","Decrypter","Encrypter","uuidv7","isUnitModel","parseInstanceId","parseInstanceId","isUnitModel","uuidv7","randomBytes","uuidv7","uuidv7","worker","randomBytes"]}