@highstate/backend 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.map(type => library.components[type]).filter(isUnitModel)\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 await this.ensureLibraryPackagesLoaded(this.libraryPackages, true)\n\n this.worker = this.createLibraryWorker({\n modulePaths: this.libraryPackages,\n logLevel: \"silent\",\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 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 createInputResolver,\n createInputHashResolver,\n type InputResolverInput,\n type InputHashResolverInput,\n type InstanceModelPatch,\n type LibraryUpdate,\n createInstanceState,\n type CompositeInstance,\n type ResolvedInstanceInput,\n type HubModel,\n} from \"../shared\"\n\ntype CompositeInstanceEvent =\n | {\n type: \"updated\"\n instance: CompositeInstance\n }\n | {\n type: \"deleted\"\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.updateCompositeInstance(projectId, createdInstance)\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.updateCompositeInstance(projectId, instance)\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.updateCompositeInstance(projectId, instance)\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 updateCompositeInstance(projectId: string, instance: InstanceModel): Promise<void> {\n const { resolveInputHash, library } = await this.prepareInputHashResolver(projectId)\n\n const component = library.components[instance.type]\n if (!component) {\n return\n }\n\n if (isUnitModel(component)) {\n return\n }\n\n const { inputHash: expectedInputHash } = await resolveInputHash(instance.id)\n const inputHash = await this.stateBackend.getCompositeInstanceInputHash(projectId, instance.id)\n\n if (inputHash !== expectedInputHash) {\n this.logger.info(\"re-evaluating instance since input hash has changed\", {\n projectId,\n instanceId: instance.id,\n })\n\n await this.evaluateCompositeInstances(projectId, [instance.id])\n }\n }\n\n private async evaluateCompositeInstances(projectId: string, instanceIds: string[]) {\n await this.projectLockManager.getLock(projectId).lockInstances(instanceIds, async () => {\n this.logger.debug({ instanceIds }, \"evaluating composite instances\")\n\n const [\n { instances, resolvedInputs, stateMap, resolveInputHash },\n topLevelCompositeChildrenIds,\n ] = await Promise.all([\n this.prepareInputHashResolver(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 const inputHashes = new Map<string, string>()\n for (const instanceId of instanceIds) {\n const { inputHash } = await resolveInputHash(instanceId)\n inputHashes.set(instanceId, inputHash)\n }\n\n const compositeInstances = results\n .filter(result => result.success)\n .flatMap(result =>\n result.compositeInstances.map(instance => ({\n ...instance,\n inputHash: inputHashes.get(instance.instance.id),\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\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 prepareInputHashResolver(projectId: string) {\n const { instances, hubs } = await this.projectBackend.getProject(projectId)\n\n const library = await this.libraryBackend.loadLibrary()\n const filteredInstances = instances.filter(instance => instance.type in library.components)\n\n const states = await this.stateBackend.getAllInstanceStates(projectId)\n const stateMap = new Map(states.map(state => [state.id, state]))\n\n const inputResolverNodes = new Map<string, InputResolverInput>()\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 resolveInputs = createInputResolver(inputResolverNodes, this.logger)\n\n const inputHashInputs = new Map<string, InputHashResolverInput>()\n const resolvedInputs: Record<string, Record<string, ResolvedInstanceInput[]>> = {}\n\n for (const instance of filteredInstances) {\n const output = await resolveInputs(`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 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 resolveInputHash = createInputHashResolver(inputHashInputs, this.logger)\n\n return {\n resolveInputHash,\n library,\n instances,\n stateMap,\n resolvedInputs,\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 { resolveInputHash, instances } = await this.prepareInputHashResolver(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 const inputHashMap = new Map<string, string>()\n for (const instance of filteredInstances) {\n const { inputHash } = await resolveInputHash(instance.id)\n inputHashMap.set(instance.id, inputHash)\n }\n\n try {\n await this.evaluateCompositeInstances(\n projectId,\n filteredInstances.map(instance => instance.id),\n )\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 { InstanceTerminal, TerminalSession } 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 { createAsyncBatcher, 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\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 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 },\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 getCompositeInstanceInputHash(\n projectId: string,\n instanceId: string,\n ): Promise<string | null> {\n const sublevel = this.getProjectCompositeInstanceInputHashesSublevel(projectId)\n const inputHash = await sublevel.get(instanceId)\n\n return inputHash ?? null\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 )\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 instanceIds: request.instanceIds,\n affectedInstanceIds: request.instanceIds,\n status: \"pending\",\n options: {\n forceUpdateDependencies: request.options?.forceUpdateDependencies ?? false,\n destroyDependentInstances: request.options?.destroyDependentInstances ?? true,\n invokeDestroyTriggers: request.options?.invokeDestroyTriggers ?? false,\n deleteUnreachableResources: request.options?.deleteUnreachableResources ?? 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 InstanceStatus,\n type ProjectOperation,\n type InstanceTriggerInvocation,\n createInstanceState,\n} from \"../shared\"\nimport {\n createAsyncBatcher,\n errorToString,\n isAbortError,\n isAbortErrorLike,\n tryWrapAbortErrorLike,\n valueToString,\n} from \"../common\"\nimport { OperationWorkset } from \"./operation-workset\"\n\ntype OperationPhase = \"update\" | \"destroy\" | \"refresh\"\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.affectedInstanceIds = this.workset.operation.affectedInstanceIds\n\n this.logger.info(\n { affectedInstanceIds: this.operation.affectedInstanceIds },\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.operation.affectedInstanceIds) {\n const instance = this.workset.getInstance(instanceId)\n if (instance.parentId && this.workset.isAffected(instance.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.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 instance = this.workset.getInstance(instanceId)\n const component = this.workset.library.components[instance.type]\n\n if (isUnitModel(component)) {\n return this.getUnitPromise(instance)\n }\n\n return this.getCompositePromise(instance)\n }\n\n private getOperationPhases(): OperationPhase[] {\n switch (this.operation.type) {\n case \"update\":\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(instance: InstanceModel): Promise<void> {\n switch (this.currentPhase) {\n case \"update\": {\n return this.updateUnit(instance)\n }\n case \"destroy\": {\n return this.destroyUnit(instance.id)\n }\n case \"refresh\": {\n return this.refreshUnit(instance.id)\n }\n }\n }\n\n private async getCompositePromise(instance: InstanceModel): Promise<void> {\n const logger = this.logger.child({ instanceId: instance.id })\n\n return this.getInstancePromise(instance.id, async () => {\n const state = this.workset.getState(instance.id) ?? createInstanceState(instance.id)\n\n this.updateInstanceState({\n ...state,\n parentId: instance.parentId,\n latestOperationId: this.operation.id,\n status: this.getStatusByOperationType(),\n error: null,\n })\n\n const children = this.workset.getAffectedCompositeChildren(instance.id)\n const childPromises: Promise<void>[] = []\n\n if (children.length) {\n logger.info(\"running %s children\", children.length)\n } else {\n logger.warn(\"no affected children found for composite component\")\n }\n\n for (const child of children) {\n logger.debug(`waiting for child: \"%s\"`, child.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: instance.id,\n status: this.operation.type === \"destroy\" ? \"not_created\" : \"created\",\n inputHash: await this.workset.getUpToDateInputHash(instance),\n })\n } catch (error) {\n if (isAbortErrorLike(error)) {\n this.workset.restoreInitialStatus(instance.id)\n return\n }\n\n this.updateInstanceState({\n id: instance.id,\n status: \"error\",\n error: errorToString(error),\n })\n }\n })\n }\n\n private updateUnit(instance: InstanceModel): Promise<void> {\n return this.getInstancePromise(instance.id, async logger => {\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.affectedInstanceIds.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 })\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)\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 getStatusByOperationType(): InstanceStatus {\n switch (this.operation.type) {\n case \"update\":\n return \"updating\"\n case \"preview\":\n return \"previewing\"\n case \"recreate\":\n return \"updating\"\n case \"destroy\":\n return \"destroying\"\n case \"refresh\":\n return \"refreshing\"\n }\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 { isUnitModel, type ComponentModel, type InstanceModel } from \"@highstate/contract\"\nimport { unique } from \"remeda\"\nimport {\n applyPartialInstanceState,\n createInputHashResolver,\n createInputResolver,\n createInstanceState,\n createInstanceStatePatch,\n type GraphResolver,\n type InputHashResolverInput,\n type InputHashResolverOutput,\n type InputResolverInput,\n type InputResolverOutput,\n type InstanceState,\n type InstanceStateUpdate,\n type LibraryModel,\n type ProjectOperation,\n type ResolvedInstanceInput,\n} from \"../shared\"\n\nexport class OperationWorkset {\n private readonly affectedInstanceIdSet = new Set<string>()\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 dependentStateMap = new Map<string, InstanceState[]>()\n private readonly stateChildIdMap = new Map<string, string[]>()\n\n private readonly unitSourceHashMap = new Map<string, string>()\n\n private inputResolver!: GraphResolver<InputResolverOutput>\n private readonly inputResolverInputs = new Map<string, InputResolverInput>()\n private readonly inputResolverPromiseCache = new Map<string, Promise<InputResolverOutput>>()\n\n private inputHashResolver!: GraphResolver<InputHashResolverOutput>\n private readonly inputHashResolverInputs = new Map<string, InputHashResolverInput>()\n\n private readonly inputHashResolverPromiseCache = new Map<\n string,\n Promise<InputHashResolverOutput>\n >()\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 isAffected(instanceId: string): boolean {\n return this.affectedInstanceIdSet.has(instanceId)\n }\n\n public updateState(update: InstanceStateUpdate): InstanceState {\n const finalState = applyPartialInstanceState(this.stateMap, update)\n this.stateManager.emitStatePatch(this.operation.projectId, createInstanceStatePatch(update))\n\n if (finalState.parentId) {\n this.recalculateCompositeState(finalState.parentId)\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\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.affectedInstanceIdSet.has(state.id)) {\n this.stateManager.emitStatePatch(this.operation.projectId, state)\n }\n }\n }\n\n public getAffectedCompositeChildren(instanceId: string): InstanceModel[] {\n const children = this.instanceChildrenMap.get(instanceId)\n if (!children) {\n return []\n }\n\n return children.filter(child => this.affectedInstanceIdSet.has(child.id))\n }\n\n public getState(instanceId: string): InstanceState | undefined {\n return this.stateMap.get(instanceId)\n }\n\n public getDependentStates(instanceId: string): InstanceState[] {\n return this.dependentStateMap.get(instanceId) ?? []\n }\n\n private recalculateCompositeState(instanceId: string): 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 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.recalculateCompositeState(state.parentId)\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 extendForUpdate(): Promise<void> {\n const traverse = async (instanceId: string) => {\n if (this.affectedInstanceIdSet.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 } = await this.inputHashResolver(instance.id)\n\n if (this.operation.options.forceUpdateDependencies) {\n this.affectedInstanceIdSet.add(instanceId)\n return\n }\n\n if (state?.status !== \"created\" || state.inputHash !== expectedInputHash) {\n this.affectedInstanceIdSet.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.instanceIds) {\n if (this.operation.type === \"update\") {\n await traverse(instanceId)\n }\n\n this.affectedInstanceIdSet.add(instanceId)\n }\n\n // 2. extend affected instance IDs with the children of the affected composite instances\n const compositeInstanceQueue = Array.from(this.affectedInstanceIdSet)\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 this.affectedInstanceIdSet.add(child.id)\n }\n }\n\n // 3. detect composite instance children and include their parents (recursively)\n for (const instanceId of this.affectedInstanceIdSet) {\n let instance = this.instanceMap.get(instanceId)\n while (instance?.parentId) {\n this.affectedInstanceIdSet.add(instance.parentId)\n instance = this.instanceMap.get(instance.parentId)\n }\n }\n\n this.operation.affectedInstanceIds = Array.from(this.affectedInstanceIdSet)\n }\n\n private extendForDestroy() {\n const traverse = (instanceKey: string) => {\n if (this.affectedInstanceIdSet.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 dependents = this.dependentStateMap.get(instanceKey) ?? []\n\n for (const dependent of dependents) {\n traverse(dependent.id)\n this.affectedInstanceIdSet.add(instanceKey)\n }\n }\n\n // 1. extend affected instance IDs with their created dependents (if not forbidden by the operation options)\n for (const instanceId of this.operation.instanceIds) {\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.affectedInstanceIdSet.add(instanceId)\n }\n\n // 2. extend affected instance IDs with the children of the affected composite instances\n const compositeInstanceQueue = Array.from(this.affectedInstanceIdSet)\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.affectedInstanceIdSet.add(child)\n }\n }\n\n // 3. detect composite instance children and include their parents (recursively)\n for (const instanceId of this.affectedInstanceIdSet) {\n let state = this.stateMap.get(instanceId)\n while (state?.parentId) {\n this.affectedInstanceIdSet.add(state.parentId)\n state = this.stateMap.get(state.parentId)\n }\n }\n\n this.operation.affectedInstanceIds = Array.from(this.affectedInstanceIdSet)\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 public async getUpToDateInputHash(instance: InstanceModel): Promise<string> {\n const component = this.library.components[instance.type]\n\n this.inputHashResolverInputs.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.inputHashResolverPromiseCache.delete(instance.id)\n\n const { inputHash } = await this.inputHashResolver(instance.id)\n return inputHash\n }\n\n public getLockInstanceIds(): string[] {\n const instanceIds = new Set<string>(this.operation.affectedInstanceIds)\n\n // enrich with the parent IDs of the affected instances in order to lock and update parent states\n for (const instanceId of this.operation.affectedInstanceIds) {\n const instance = this.getInstance(instanceId)\n\n if (instance.parentId) {\n instanceIds.add(instance.parentId)\n }\n }\n\n return Array.from(instanceIds)\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 unitSources = await libraryBackend.getResolvedUnitSources(\n unique(project.instances.map(i => i.type)),\n )\n\n const workset = new OperationWorkset(\n operation,\n library,\n stateManager,\n logger.child({ operationId: operation.id, service: \"OperationWorkset\" }),\n )\n\n for (const unitSource of unitSources) {\n workset.unitSourceHashMap.set(unitSource.unitType, unitSource.sourceHash)\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 {\n workset.addInstance(instance.instance)\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 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.inputResolverInputs.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.inputResolverInputs.set(`hub:${hub.id}`, { kind: \"hub\", hub })\n }\n\n workset.inputResolver = createInputResolver(\n //\n workset.inputResolverInputs,\n logger,\n { promiseCache: workset.inputResolverPromiseCache },\n )\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 = await workset.inputResolver(`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.inputHashResolverInputs.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 = createInputHashResolver(\n //\n workset.inputHashResolverInputs,\n logger,\n { promiseCache: workset.inputHashResolverPromiseCache },\n )\n\n switch (operation.type) {\n case \"update\":\n case \"preview\":\n case \"refresh\":\n await workset.extendForUpdate()\n break\n case \"recreate\":\n workset.extendForDestroy()\n break\n case \"destroy\":\n workset.extendForDestroy()\n break\n }\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","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","unique","isUnitModel","unique","isUnitModel","mapValues","parseInstanceId","EventEmitter","on","uuidv7"]}
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.map(type => library.components[type]).filter(isUnitModel)\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 await this.ensureLibraryPackagesLoaded(this.libraryPackages, true)\n\n this.worker = this.createLibraryWorker({\n modulePaths: this.libraryPackages,\n logLevel: \"silent\",\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 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 createInputResolver,\n createInputHashResolver,\n type InputResolverInput,\n type InputHashResolverInput,\n type InstanceModelPatch,\n type LibraryUpdate,\n createInstanceState,\n type CompositeInstance,\n type ResolvedInstanceInput,\n type HubModel,\n} from \"../shared\"\n\ntype CompositeInstanceEvent =\n | {\n type: \"updated\"\n instance: CompositeInstance\n }\n | {\n type: \"deleted\"\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.updateCompositeInstance(projectId, createdInstance)\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.updateCompositeInstance(projectId, instance)\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.updateCompositeInstance(projectId, instance)\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 updateCompositeInstance(projectId: string, instance: InstanceModel): Promise<void> {\n const { resolveInputHash, library } = await this.prepareInputHashResolver(projectId)\n\n const component = library.components[instance.type]\n if (!component) {\n return\n }\n\n if (isUnitModel(component)) {\n return\n }\n\n const { inputHash: expectedInputHash } = await resolveInputHash(instance.id)\n const inputHash = await this.stateBackend.getCompositeInstanceInputHash(projectId, instance.id)\n\n if (inputHash !== expectedInputHash) {\n this.logger.info(\"re-evaluating instance since input hash has changed\", {\n projectId,\n instanceId: instance.id,\n })\n\n await this.evaluateCompositeInstances(projectId, [instance.id])\n }\n }\n\n private async evaluateCompositeInstances(projectId: string, instanceIds: string[]) {\n await this.projectLockManager.getLock(projectId).lockInstances(instanceIds, async () => {\n this.logger.debug({ instanceIds }, \"evaluating composite instances\")\n\n const [\n { instances, resolvedInputs, stateMap, resolveInputHash },\n topLevelCompositeChildrenIds,\n ] = await Promise.all([\n this.prepareInputHashResolver(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 const inputHashes = new Map<string, string>()\n for (const instanceId of instanceIds) {\n const { inputHash } = await resolveInputHash(instanceId)\n inputHashes.set(instanceId, inputHash)\n }\n\n const compositeInstances = results\n .filter(result => result.success)\n .flatMap(result =>\n result.compositeInstances.map(instance => ({\n ...instance,\n inputHash: inputHashes.get(instance.instance.id),\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\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 prepareInputHashResolver(projectId: string) {\n const { instances, hubs } = await this.projectBackend.getProject(projectId)\n\n const library = await this.libraryBackend.loadLibrary()\n const filteredInstances = instances.filter(instance => instance.type in library.components)\n\n const states = await this.stateBackend.getAllInstanceStates(projectId)\n const stateMap = new Map(states.map(state => [state.id, state]))\n\n const inputResolverNodes = new Map<string, InputResolverInput>()\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 resolveInputs = createInputResolver(inputResolverNodes, this.logger)\n\n const inputHashInputs = new Map<string, InputHashResolverInput>()\n const resolvedInputs: Record<string, Record<string, ResolvedInstanceInput[]>> = {}\n\n for (const instance of filteredInstances) {\n const output = await resolveInputs(`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 resolveInputHash = createInputHashResolver(inputHashInputs, this.logger)\n\n return {\n resolveInputHash,\n library,\n instances,\n stateMap,\n resolvedInputs,\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 { resolveInputHash, instances } = await this.prepareInputHashResolver(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 const inputHashMap = new Map<string, string>()\n for (const instance of filteredInstances) {\n const { inputHash } = await resolveInputHash(instance.id)\n inputHashMap.set(instance.id, inputHash)\n }\n\n try {\n await this.evaluateCompositeInstances(\n projectId,\n filteredInstances.map(instance => instance.id),\n )\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 { InstanceTerminal, TerminalSession } 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 { createAsyncBatcher, 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 getCompositeInstanceInputHash(\n projectId: string,\n instanceId: string,\n ): Promise<string | null> {\n const sublevel = this.getProjectCompositeInstanceInputHashesSublevel(projectId)\n const inputHash = await sublevel.get(instanceId)\n\n return inputHash ?? null\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 )\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 instanceIds: request.instanceIds,\n affectedInstanceIds: request.instanceIds,\n status: \"pending\",\n options: {\n forceUpdateDependencies: request.options?.forceUpdateDependencies ?? 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 InstanceStatus,\n type ProjectOperation,\n type InstanceTriggerInvocation,\n createInstanceState,\n} from \"../shared\"\nimport {\n createAsyncBatcher,\n errorToString,\n isAbortError,\n isAbortErrorLike,\n tryWrapAbortErrorLike,\n valueToString,\n} from \"../common\"\nimport { OperationWorkset } from \"./operation-workset\"\n\ntype OperationPhase = \"update\" | \"destroy\" | \"refresh\"\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.affectedInstanceIds = this.workset.operation.affectedInstanceIds\n\n this.logger.info(\n { affectedInstanceIds: this.operation.affectedInstanceIds },\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.operation.affectedInstanceIds) {\n const instance = this.workset.getInstance(instanceId)\n if (instance.parentId && this.workset.isAffected(instance.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.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 instance = this.workset.getInstance(instanceId)\n const component = this.workset.library.components[instance.type]\n\n if (isUnitModel(component)) {\n return this.getUnitPromise(instance)\n }\n\n return this.getCompositePromise(instance)\n }\n\n private getOperationPhases(): OperationPhase[] {\n switch (this.operation.type) {\n case \"update\":\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(instance: InstanceModel): Promise<void> {\n switch (this.currentPhase) {\n case \"update\": {\n return this.updateUnit(instance)\n }\n case \"destroy\": {\n return this.destroyUnit(instance.id)\n }\n case \"refresh\": {\n return this.refreshUnit(instance.id)\n }\n }\n }\n\n private async getCompositePromise(instance: InstanceModel): Promise<void> {\n const logger = this.logger.child({ instanceId: instance.id })\n\n return this.getInstancePromise(instance.id, async () => {\n const state = this.workset.getState(instance.id) ?? createInstanceState(instance.id)\n\n this.updateInstanceState({\n ...state,\n parentId: instance.parentId,\n latestOperationId: this.operation.id,\n status: this.getStatusByOperationType(),\n error: null,\n })\n\n const children = this.workset.getAffectedCompositeChildren(instance.id)\n const childPromises: Promise<void>[] = []\n\n if (children.length) {\n logger.info(\"running %s children\", children.length)\n } else {\n logger.warn(\"no affected children found for composite component\")\n }\n\n for (const child of children) {\n logger.debug(`waiting for child: \"%s\"`, child.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: instance.id,\n status: this.operation.type === \"destroy\" ? \"not_created\" : \"created\",\n inputHash: await this.workset.getUpToDateInputHash(instance),\n })\n } catch (error) {\n if (isAbortErrorLike(error)) {\n this.workset.restoreInitialStatus(instance.id)\n return\n }\n\n this.updateInstanceState({\n id: instance.id,\n status: \"error\",\n error: errorToString(error),\n })\n }\n })\n }\n\n private updateUnit(instance: InstanceModel): Promise<void> {\n return this.getInstancePromise(instance.id, async logger => {\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.affectedInstanceIds.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)\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 getStatusByOperationType(): InstanceStatus {\n switch (this.operation.type) {\n case \"update\":\n return \"updating\"\n case \"preview\":\n return \"previewing\"\n case \"recreate\":\n return \"updating\"\n case \"destroy\":\n return \"destroying\"\n case \"refresh\":\n return \"refreshing\"\n }\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 { isUnitModel, type ComponentModel, type InstanceModel } from \"@highstate/contract\"\nimport { unique } from \"remeda\"\nimport {\n applyPartialInstanceState,\n createInputHashResolver,\n createInputResolver,\n createInstanceState,\n createInstanceStatePatch,\n type GraphResolver,\n type InputHashResolverInput,\n type InputHashResolverOutput,\n type InputResolverInput,\n type InputResolverOutput,\n type InstanceState,\n type InstanceStateUpdate,\n type LibraryModel,\n type ProjectOperation,\n type ResolvedInstanceInput,\n} from \"../shared\"\n\nexport class OperationWorkset {\n private readonly affectedInstanceIdSet = new Set<string>()\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!: GraphResolver<InputResolverOutput>\n private readonly inputResolverInputs = new Map<string, InputResolverInput>()\n private readonly inputResolverPromiseCache = new Map<string, Promise<InputResolverOutput>>()\n\n private inputHashResolver!: GraphResolver<InputHashResolverOutput>\n private readonly inputHashResolverInputs = new Map<string, InputHashResolverInput>()\n\n private readonly inputHashResolverPromiseCache = new Map<\n string,\n Promise<InputHashResolverOutput>\n >()\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 isAffected(instanceId: string): boolean {\n return this.affectedInstanceIdSet.has(instanceId)\n }\n\n public updateState(update: InstanceStateUpdate): InstanceState {\n const finalState = applyPartialInstanceState(this.stateMap, update)\n this.stateManager.emitStatePatch(this.operation.projectId, createInstanceStatePatch(update))\n\n if (finalState.parentId) {\n this.recalculateCompositeState(finalState.parentId)\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.affectedInstanceIdSet.has(state.id)) {\n this.stateManager.emitStatePatch(this.operation.projectId, state)\n }\n }\n }\n\n public getAffectedCompositeChildren(instanceId: string): InstanceModel[] {\n const children = this.instanceChildrenMap.get(instanceId)\n if (!children) {\n return []\n }\n\n return children.filter(child => this.affectedInstanceIdSet.has(child.id))\n }\n\n public getState(instanceId: string): InstanceState | undefined {\n return this.stateMap.get(instanceId)\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 recalculateCompositeState(instanceId: string): 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 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.recalculateCompositeState(state.parentId)\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 extendForUpdate(): Promise<void> {\n const traverse = async (instanceId: string) => {\n if (this.affectedInstanceIdSet.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 } = await this.inputHashResolver(instance.id)\n\n if (this.operation.options.forceUpdateDependencies) {\n this.affectedInstanceIdSet.add(instanceId)\n return\n }\n\n if (state?.status !== \"created\" || state.inputHash !== expectedInputHash) {\n this.affectedInstanceIdSet.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.instanceIds) {\n if (this.operation.type === \"update\") {\n await traverse(instanceId)\n }\n\n this.affectedInstanceIdSet.add(instanceId)\n }\n\n // 2. extend affected instance IDs with the children of the affected composite instances\n const compositeInstanceQueue = Array.from(this.affectedInstanceIdSet)\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 this.affectedInstanceIdSet.add(child.id)\n }\n }\n\n // 3. detect composite instance children and include their parents (recursively)\n for (const instanceId of this.affectedInstanceIdSet) {\n let instance = this.instanceMap.get(instanceId)\n while (instance?.parentId) {\n this.affectedInstanceIdSet.add(instance.parentId)\n instance = this.instanceMap.get(instance.parentId)\n }\n }\n\n this.operation.affectedInstanceIds = Array.from(this.affectedInstanceIdSet)\n }\n\n private extendForDestroy() {\n const traverse = (instanceKey: string) => {\n if (this.affectedInstanceIdSet.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.affectedInstanceIdSet.add(instanceKey)\n }\n }\n\n // 1. extend affected instance IDs with their created dependents (if not forbidden by the operation options)\n for (const instanceId of this.operation.instanceIds) {\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.affectedInstanceIdSet.add(instanceId)\n }\n\n // 2. extend affected instance IDs with the children of the affected composite instances\n const compositeInstanceQueue = Array.from(this.affectedInstanceIdSet)\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.affectedInstanceIdSet.add(child)\n }\n }\n\n // 3. detect composite instance children and include their parents (recursively)\n for (const instanceId of this.affectedInstanceIdSet) {\n let state = this.stateMap.get(instanceId)\n while (state?.parentId) {\n this.affectedInstanceIdSet.add(state.parentId)\n state = this.stateMap.get(state.parentId)\n }\n }\n\n this.operation.affectedInstanceIds = Array.from(this.affectedInstanceIdSet)\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 public async getUpToDateInputHash(instance: InstanceModel): Promise<string> {\n const component = this.library.components[instance.type]\n\n this.inputHashResolverInputs.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.inputHashResolverPromiseCache.delete(instance.id)\n\n const { inputHash } = await this.inputHashResolver(instance.id)\n return inputHash\n }\n\n public getLockInstanceIds(): string[] {\n const instanceIds = new Set<string>(this.operation.affectedInstanceIds)\n\n // enrich with the parent IDs of the affected instances in order to lock and update parent states\n for (const instanceId of this.operation.affectedInstanceIds) {\n const instance = this.getInstance(instanceId)\n\n if (instance.parentId) {\n instanceIds.add(instance.parentId)\n }\n }\n\n return Array.from(instanceIds)\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 unitSources = await libraryBackend.getResolvedUnitSources(\n unique(project.instances.map(i => i.type)),\n )\n\n const workset = new OperationWorkset(\n operation,\n library,\n stateManager,\n logger.child({ operationId: operation.id, service: \"OperationWorkset\" }),\n )\n\n for (const unitSource of unitSources) {\n workset.unitSourceHashMap.set(unitSource.unitType, unitSource.sourceHash)\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 {\n workset.addInstance(instance.instance)\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 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.inputResolverInputs.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.inputResolverInputs.set(`hub:${hub.id}`, { kind: \"hub\", hub })\n }\n\n workset.inputResolver = createInputResolver(\n //\n workset.inputResolverInputs,\n logger,\n { promiseCache: workset.inputResolverPromiseCache },\n )\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 = await workset.inputResolver(`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.inputHashResolverInputs.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 = createInputHashResolver(\n //\n workset.inputHashResolverInputs,\n logger,\n { promiseCache: workset.inputHashResolverPromiseCache },\n )\n\n switch (operation.type) {\n case \"update\":\n case \"preview\":\n case \"refresh\":\n await workset.extendForUpdate()\n break\n case \"recreate\":\n workset.extendForDestroy()\n break\n case \"destroy\":\n workset.extendForDestroy()\n break\n }\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","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","unique","isUnitModel","unique","isUnitModel","mapValues","parseInstanceId","EventEmitter","on","uuidv7"]}