@highstate/backend 0.9.15 → 0.9.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/chunk-RCB4AFGD.js +159 -0
  2. package/dist/chunk-RCB4AFGD.js.map +1 -0
  3. package/dist/chunk-WHALQHEZ.js +2017 -0
  4. package/dist/chunk-WHALQHEZ.js.map +1 -0
  5. package/dist/highstate.manifest.json +3 -3
  6. package/dist/index.js +6158 -2178
  7. package/dist/index.js.map +1 -1
  8. package/dist/library/worker/main.js +47 -155
  9. package/dist/library/worker/main.js.map +1 -1
  10. package/dist/shared/index.js +159 -41
  11. package/package.json +25 -7
  12. package/src/artifact/abstractions.ts +46 -0
  13. package/src/artifact/encryption.ts +69 -0
  14. package/src/artifact/factory.ts +36 -0
  15. package/src/artifact/index.ts +3 -0
  16. package/src/artifact/local.ts +142 -0
  17. package/src/business/api-key.ts +65 -0
  18. package/src/business/artifact.ts +288 -0
  19. package/src/business/backend-unlock.ts +10 -0
  20. package/src/business/index.ts +9 -0
  21. package/src/business/instance-lock.ts +124 -0
  22. package/src/business/instance-state.ts +292 -0
  23. package/src/business/operation.ts +251 -0
  24. package/src/business/project-unlock.ts +242 -0
  25. package/src/business/secret.ts +187 -0
  26. package/src/business/worker.ts +161 -0
  27. package/src/common/index.ts +2 -1
  28. package/src/common/performance.ts +44 -0
  29. package/src/common/tree.ts +33 -0
  30. package/src/common/utils.ts +40 -1
  31. package/src/config.ts +14 -10
  32. package/src/hotstate/abstractions.ts +48 -0
  33. package/src/hotstate/factory.ts +17 -0
  34. package/src/{secret → hotstate}/index.ts +1 -0
  35. package/src/hotstate/manager.ts +192 -0
  36. package/src/hotstate/memory.ts +100 -0
  37. package/src/hotstate/validation.ts +101 -0
  38. package/src/index.ts +2 -1
  39. package/src/library/abstractions.ts +10 -23
  40. package/src/library/factory.ts +2 -2
  41. package/src/library/local.ts +89 -102
  42. package/src/library/worker/evaluator.ts +9 -42
  43. package/src/library/worker/loader.lite.ts +41 -0
  44. package/src/library/worker/main.ts +14 -65
  45. package/src/library/worker/protocol.ts +8 -24
  46. package/src/lock/abstractions.ts +6 -0
  47. package/src/lock/factory.ts +15 -0
  48. package/src/{workspace → lock}/index.ts +1 -0
  49. package/src/lock/manager.ts +82 -0
  50. package/src/lock/memory.ts +19 -0
  51. package/src/orchestrator/manager.ts +129 -82
  52. package/src/orchestrator/operation-workset.ts +168 -77
  53. package/src/orchestrator/operation.ts +967 -284
  54. package/src/project/abstractions.ts +20 -7
  55. package/src/project/factory.ts +1 -1
  56. package/src/project/index.ts +0 -1
  57. package/src/project/local.ts +73 -17
  58. package/src/project/manager.ts +272 -131
  59. package/src/pubsub/abstractions.ts +13 -0
  60. package/src/pubsub/factory.ts +19 -0
  61. package/src/pubsub/index.ts +3 -0
  62. package/src/pubsub/local.ts +36 -0
  63. package/src/pubsub/manager.ts +100 -0
  64. package/src/pubsub/validation.ts +33 -0
  65. package/src/runner/abstractions.ts +135 -68
  66. package/src/runner/artifact-env.ts +160 -0
  67. package/src/runner/factory.ts +20 -5
  68. package/src/runner/force-abort.ts +117 -0
  69. package/src/runner/local.ts +281 -371
  70. package/src/{common → runner}/pulumi.ts +86 -37
  71. package/src/services.ts +193 -35
  72. package/src/shared/index.ts +3 -11
  73. package/src/shared/models/backend/index.ts +3 -0
  74. package/src/shared/models/backend/project.ts +63 -0
  75. package/src/shared/models/backend/unlock-method.ts +20 -0
  76. package/src/shared/models/base.ts +151 -0
  77. package/src/shared/models/errors.ts +5 -0
  78. package/src/shared/models/index.ts +4 -0
  79. package/src/shared/models/project/api-key.ts +62 -0
  80. package/src/shared/models/project/artifact.ts +113 -0
  81. package/src/shared/models/project/component.ts +45 -0
  82. package/src/shared/models/project/index.ts +14 -0
  83. package/src/shared/{project.ts → models/project/instance.ts} +12 -0
  84. package/src/shared/models/project/lock.ts +91 -0
  85. package/src/shared/{operation.ts → models/project/operation.ts} +28 -7
  86. package/src/shared/models/project/page.ts +57 -0
  87. package/src/shared/models/project/secret.ts +112 -0
  88. package/src/shared/models/project/service-account.ts +22 -0
  89. package/src/shared/models/project/state.ts +432 -0
  90. package/src/shared/models/project/terminal.ts +99 -0
  91. package/src/shared/models/project/trigger.ts +56 -0
  92. package/src/shared/models/project/unlock-method.ts +31 -0
  93. package/src/shared/models/project/worker.ts +105 -0
  94. package/src/shared/resolvers/graph-resolver.ts +28 -0
  95. package/src/shared/resolvers/index.ts +5 -0
  96. package/src/shared/resolvers/input-hash.ts +53 -15
  97. package/src/shared/resolvers/input.ts +1 -9
  98. package/src/shared/resolvers/registry.ts +3 -2
  99. package/src/shared/resolvers/state.ts +2 -2
  100. package/src/shared/resolvers/validation.ts +61 -20
  101. package/src/shared/{async-batcher.ts → utils/async-batcher.ts} +13 -1
  102. package/src/shared/utils/hash.ts +6 -0
  103. package/src/shared/utils/index.ts +3 -0
  104. package/src/shared/utils/promise-tracker.ts +23 -0
  105. package/src/state/abstractions.ts +330 -101
  106. package/src/state/encryption.ts +59 -0
  107. package/src/state/factory.ts +3 -5
  108. package/src/state/index.ts +3 -0
  109. package/src/state/keyring.ts +22 -0
  110. package/src/state/local/backend.ts +299 -0
  111. package/src/state/local/collection.ts +342 -0
  112. package/src/state/local/index.ts +2 -0
  113. package/src/state/manager.ts +804 -18
  114. package/src/state/repository/index.ts +2 -0
  115. package/src/state/repository/repository.index.ts +193 -0
  116. package/src/state/repository/repository.ts +458 -0
  117. package/src/terminal/{shared.ts → abstractions.ts} +3 -3
  118. package/src/terminal/docker.ts +18 -14
  119. package/src/terminal/factory.ts +3 -3
  120. package/src/terminal/index.ts +1 -1
  121. package/src/terminal/manager.ts +131 -79
  122. package/src/terminal/run.sh.ts +21 -11
  123. package/src/worker/abstractions.ts +42 -0
  124. package/src/worker/docker.ts +83 -0
  125. package/src/worker/factory.ts +20 -0
  126. package/src/worker/index.ts +3 -0
  127. package/src/worker/manager.ts +139 -0
  128. package/dist/chunk-KTGKNSKM.js +0 -979
  129. package/dist/chunk-KTGKNSKM.js.map +0 -1
  130. package/dist/chunk-WXDYCRTT.js +0 -234
  131. package/dist/chunk-WXDYCRTT.js.map +0 -1
  132. package/src/library/worker/loader.ts +0 -114
  133. package/src/preferences/shared.ts +0 -1
  134. package/src/project/lock.ts +0 -39
  135. package/src/secret/abstractions.ts +0 -59
  136. package/src/secret/factory.ts +0 -22
  137. package/src/secret/local.ts +0 -152
  138. package/src/shared/state.ts +0 -247
  139. package/src/shared/terminal.ts +0 -14
  140. package/src/state/local.ts +0 -612
  141. package/src/workspace/abstractions.ts +0 -41
  142. package/src/workspace/factory.ts +0 -14
  143. package/src/workspace/local.ts +0 -54
  144. /package/src/shared/{library.ts → models/backend/library.ts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shared/project.ts","../src/shared/state.ts","../src/shared/operation.ts","../src/shared/resolvers/graph-resolver.ts","../src/shared/resolvers/state.ts","../src/shared/resolvers/input.ts","../src/shared/resolvers/input-hash.ts","../src/shared/resolvers/validation.ts","../src/shared/resolvers/registry.ts","../src/shared/terminal.ts","../src/shared/library.ts","../src/shared/async-batcher.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport const positionSchema = z.object({\n x: z.number(),\n y: z.number(),\n})\n\nexport const instanceInputSchema = z.object({\n instanceId: z.string(),\n output: z.string(),\n})\n\nexport const hubInstanceInputSchema = z.object({\n hubId: z.string(),\n})\n\nexport const instanceModelPatchSchema = z.object({\n args: z.record(z.unknown()).optional(),\n inputs: z.record(z.array(instanceInputSchema)).optional(),\n hubInputs: z.record(z.array(hubInstanceInputSchema)).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n position: positionSchema.optional(),\n})\n\nexport const instanceModelSchema = z.object({\n id: z.string(),\n type: z.string(),\n name: z.string(),\n\n ...instanceModelPatchSchema.shape,\n resolvedInputs: z.record(z.array(instanceInputSchema)).optional(),\n\n parentId: z.string().optional(),\n outputs: z.record(z.array(instanceInputSchema)).optional(),\n resolvedOutputs: z.record(z.array(instanceInputSchema)).optional(),\n})\n\nexport const compositeInstanceSchema = z.object({\n instance: instanceModelSchema,\n children: z.array(instanceModelSchema),\n inputHash: z.string().optional(),\n})\n\nexport type CompositeInstance = z.infer<typeof compositeInstanceSchema>\n\nexport const hubModelPatchSchema = z.object({\n position: positionSchema.optional(),\n inputs: z.array(instanceInputSchema).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n})\n\nexport const hubModelSchema = z.object({\n id: z.string().nanoid(),\n position: positionSchema,\n\n inputs: z.array(instanceInputSchema).optional(),\n injectionInputs: z.array(hubInstanceInputSchema).optional(),\n})\n\nexport type InstanceModelPatch = z.infer<typeof instanceModelPatchSchema>\nexport type HubModel = z.infer<typeof hubModelSchema>\nexport type HubModelPatch = z.infer<typeof hubModelPatchSchema>\n","import { omit } from \"remeda\"\nimport { z } from \"zod\"\n\nexport const instanceStatusSchema = z.enum([\n \"not_created\",\n \"updating\",\n \"previewing\",\n \"destroying\",\n \"refreshing\",\n \"created\",\n \"error\",\n \"pending\",\n \"unknown\",\n])\n\nexport const instanceStatusFieldValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(z.string()),\n])\n\nexport const instanceStatusFieldSchema = z.object({\n name: z.string(),\n value: instanceStatusFieldValueSchema.optional(),\n displayName: z.string().optional(),\n sensitive: z.boolean().optional(),\n url: z.string().optional(),\n complementaryTo: z.string().optional(),\n})\n\nexport const instanceFileMetaSchema = z.object({\n name: z.string(),\n contentType: z.string(),\n size: z.number(),\n isBinary: z.boolean().optional(),\n})\n\nexport const instanceFileSchema = z.object({\n meta: instanceFileMetaSchema,\n content: z.string(),\n})\n\nexport const instancePageBlockSchema = z.union([\n z.object({\n type: z.literal(\"markdown\"),\n content: z.string(),\n }),\n z.object({\n type: z.literal(\"qr\"),\n content: z.string(),\n showContent: z.coerce.boolean(),\n language: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"file\"),\n fileMeta: instanceFileMetaSchema,\n }),\n])\n\nexport const instancePageMetaSchema = z.object({\n name: z.string(),\n title: z.string(),\n})\n\nexport const instancePageSchema = z.object({\n ...instancePageMetaSchema.shape,\n content: z.array(instancePageBlockSchema),\n})\n\nexport const instanceTerminalMetaSchema = z.object({\n name: z.string(),\n title: z.string(),\n description: z.string().optional(),\n icon: z.string().optional(),\n})\n\nexport const instanceTerminalFileSchema = z.object({\n content: z.string().optional(),\n isBinary: z.boolean().optional(),\n mode: z.number().optional(),\n})\n\nexport const instanceTerminalSchema = z.object({\n ...instanceTerminalMetaSchema.shape,\n image: z.string(),\n command: z.string().array(),\n cwd: z.string().optional(),\n env: z.record(z.string()).optional(),\n files: z.record(instanceTerminalFileSchema).optional(),\n})\n\nexport const instanceTriggerSpecSchema = z.union([\n z.object({\n type: z.literal(\"before-destroy\"),\n }),\n z.object({\n type: z.literal(\"schedule\"),\n schedule: z.string(),\n }),\n])\n\nexport const instanceTriggerSchema = z.object({\n name: z.string(),\n title: z.string(),\n description: z.string().optional(),\n spec: instanceTriggerSpecSchema,\n})\n\nexport const instanceTriggerInvocationSchema = z.object({\n name: z.string(),\n})\n\nexport const instanceStateSchema = z.object({\n id: z.string(),\n parentId: z.string().nullable().default(null),\n status: instanceStatusSchema,\n dependencyIds: z.array(z.string()).default(() => []),\n\n latestOperationId: z.string().nullable().default(null),\n\n currentResourceCount: z.number().nullable().default(null),\n totalResourceCount: z.number().nullable().default(null),\n inputHash: z.string().nullable().default(null),\n outputHash: z.string().nullable().default(null),\n\n error: z.string().nullable().default(null),\n evaluationError: z.string().nullable().default(null),\n\n statusFields: z.array(instanceStatusFieldSchema).default(() => []),\n files: z.array(instanceFileMetaSchema).default(() => []),\n pages: z.array(instancePageMetaSchema).default(() => []),\n terminals: z.array(instanceTerminalMetaSchema).default(() => []),\n triggers: z.array(instanceTriggerSchema).default(() => []),\n})\n\nexport const instanceStateUpdateSchema = z\n .object({\n ...instanceStateSchema.shape,\n\n // secrets updated by the unit\n secrets: z.record(z.string()).nullable(),\n\n // log line emitted by the unit\n logLine: z.string().nullable(),\n })\n .partial()\n\nexport type InstanceStatusFieldValue = z.infer<typeof instanceStatusFieldValueSchema>\nexport type InstanceStatusField = z.infer<typeof instanceStatusFieldSchema>\nexport type InstanceTerminalMeta = z.infer<typeof instanceTerminalMetaSchema>\nexport type InstanceTerminal = z.infer<typeof instanceTerminalSchema>\n\nexport type InstanceStatus = z.infer<typeof instanceStatusSchema>\nexport type InstanceState = z.infer<typeof instanceStateSchema>\n\nexport type InstanceStateUpdate = z.infer<typeof instanceStateUpdateSchema>\n\nexport type InstancePageBlock = z.infer<typeof instancePageBlockSchema>\nexport type InstancePageMeta = z.infer<typeof instancePageMetaSchema>\nexport type InstanceFileMeta = z.infer<typeof instanceFileMetaSchema>\n\nexport type InstanceTriggerSpec = z.infer<typeof instanceTriggerSpecSchema>\nexport type InstanceTrigger = z.infer<typeof instanceTriggerSchema>\nexport type InstanceTriggerInvocation = z.infer<typeof instanceTriggerInvocationSchema>\n\nexport function createInstanceState(\n id: string,\n status: InstanceStatus = \"not_created\",\n fields: Partial<InstanceState> = {},\n): InstanceState {\n return {\n id,\n parentId: null,\n dependencyIds: [],\n status: status,\n\n latestOperationId: null,\n\n currentResourceCount: null,\n totalResourceCount: null,\n inputHash: null,\n outputHash: null,\n\n error: null,\n evaluationError: null,\n\n statusFields: [],\n files: [],\n pages: [],\n terminals: [],\n triggers: [],\n\n ...fields,\n }\n}\n\nexport function applyPartialInstanceState(\n states: Map<string, InstanceState>,\n patch: Partial<InstanceState>,\n): InstanceState {\n if (!patch.id) {\n throw new Error(\"The ID of the instance state is required.\")\n }\n\n let state = states.get(patch.id) ?? createInstanceState(patch.id, \"unknown\")\n state = { ...state, ...patch }\n\n states.set(state.id, state)\n return state\n}\n\nexport function createInstanceStatePatch(update: InstanceStateUpdate): Partial<InstanceState> {\n return omit(update, [\"secrets\", \"logLine\"])\n}\n\n/**\n * Gets all instance ids that depend on the given instance id (including recursively).\n * The instance id itself is not included in the result.\n *\n * @param dependentMap The dependent map.\n * @param instanceId The instance id to get all dependent instance ids.\n */\nexport function getAllDependentInstanceIds(\n dependentMap: Map<string, string[]>,\n instanceId: string,\n): string[] {\n const result = new Set<string>()\n const visited = new Set<string>()\n\n const traverse = (id: string) => {\n if (visited.has(id)) return\n visited.add(id)\n\n const dependents = dependentMap.get(id)\n if (!dependents) return\n\n for (const dependent of dependents) {\n result.add(dependent)\n traverse(dependent)\n }\n }\n\n traverse(instanceId)\n\n return Array.from(result)\n}\n","import { z } from \"zod\"\n\nexport const operationTypeSchema = z.enum([\"update\", \"preview\", \"destroy\", \"recreate\", \"refresh\"])\n\nexport const operationStatusSchema = z.enum([\n \"pending\",\n \"running\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n])\n\nexport const operationOptionsSchema = z.object({\n /**\n * Whether to force update all dependencies of the instances even if they are not changed.\n *\n * Only applicable for `update`, `preview`, `recreate`, and `refresh` operations.\n *\n * By default, `false`.\n */\n forceUpdateDependencies: z.boolean().default(false),\n\n /**\n * Whether to force update all children of the composite instances even if they are not changed.\n *\n * Only applicable for `update`, `preview`, `recreate`, and `refresh` operations.\n *\n * By default, `false`.\n */\n forceUpdateChildren: z.boolean().default(false),\n\n /**\n * Whether to destroy all dependents of the instances when destroying them.\n *\n * Only applicable for `destroy` and `recreate` operations.\n *\n * By default, `true`.\n */\n destroyDependentInstances: z.boolean().default(true),\n\n /**\n * Whether to invoke destroy triggers when destroying the instances.\n *\n * Only applicable for `destroy`.\n *\n * By default, `true`.\n */\n invokeDestroyTriggers: z.boolean().default(true),\n\n /**\n * Whether to delete unreachable resources when updating or destroying the instances.\n * This is potentially dangerous and should be used with caution.\n *\n * By default, `false`.\n */\n deleteUnreachableResources: z.boolean().default(false),\n\n /**\n * Whether to delete the stack state even if the destroy operation fails.\n * This is very dangerous and should be used only when the stack is unrecoverable.\n *\n * By default, `false`.\n */\n forceDeleteState: z.boolean().default(false),\n\n /**\n * Whether to allow partial updates of composite instances when updating, destroying or recreating them.\n *\n * If `true`, the operation will only update/destroy composite instance children that are directly referenced by other affected instances.\n * If `false`, the operation will update/destroy all children at of the composite instances at all levels if at least one of them is referenced by affected instances.\n *\n * By default, `false`.\n */\n allowPartialCompositeInstanceUpdates: z.boolean().default(false),\n\n /**\n * Whether to refresh the state before running the operation.\n *\n * By default, `false`.\n */\n refresh: z.boolean().default(false),\n})\n\nexport const projectOperationRequestSchema = z.object({\n projectId: z.string(),\n type: operationTypeSchema,\n instanceIds: z.array(z.string()),\n options: operationOptionsSchema.partial().optional(),\n})\n\nexport const projectOperationSchema = z.object({\n id: z.string().uuid(),\n status: operationStatusSchema,\n\n projectId: z.string(),\n type: operationTypeSchema,\n\n requestedInstanceIds: z.array(z.string()),\n\n instanceIdsToUpdate: z.array(z.string()).default(() => []),\n instanceIdsToDestroy: z.array(z.string()).default(() => []),\n\n options: operationOptionsSchema.default(() => ({})),\n\n error: z.string().nullable(),\n startedAt: z.number(),\n completedAt: z.number().nullable(),\n})\n\nexport type OperationType = z.infer<typeof operationTypeSchema>\nexport type OperationStatus = z.infer<typeof operationStatusSchema>\nexport type ProjectOperation = z.infer<typeof projectOperationSchema>\nexport type ProjectOperationRequest = z.infer<typeof projectOperationRequestSchema>\nexport type OperationOptions = z.infer<typeof operationOptionsSchema>\n\nexport function isFinalOperationStatus(status: OperationStatus): boolean {\n return status === \"completed\" || status === \"failed\" || status === \"cancelled\"\n}\n","import type { Logger } from \"pino\"\nimport { unique } from \"remeda\"\n\nexport type ResolverOutputHandler<TOutput> = (id: string, value: TOutput) => void\n\nexport abstract class GraphResolver<TNode, TOutput> {\n private readonly workset: Set<string> = new Set()\n private readonly dependencyMap: Map<string, string[]> = new Map()\n private readonly dependentMap: Map<string, Set<string>> = new Map()\n private readonly outputMap: Map<string, TOutput> = new Map()\n\n constructor(\n private readonly nodes: ReadonlyMap<string, TNode>,\n protected readonly logger: Logger,\n private readonly outputHandler?: ResolverOutputHandler<TOutput>,\n ) {}\n\n addToWorkset(nodeId: string): void {\n this.workset.add(nodeId)\n }\n\n addAllNodesToWorkset(): void {\n for (const nodeId of this.nodes.keys()) {\n this.workset.add(nodeId)\n }\n }\n\n /**\n * The map of calculated outputs.\n */\n get outputs(): ReadonlyMap<string, TOutput> {\n return this.outputMap\n }\n\n requireOutput(nodeId: string): TOutput {\n const output = this.outputMap.get(nodeId)\n if (!output) {\n throw new Error(`Output for node ${nodeId} is not available`)\n }\n\n return output\n }\n\n /**\n * Gets the list of the identifiers of the dependencies for the node.\n *\n * Used to produce the dependency graph.\n */\n protected abstract getNodeDependencies(node: TNode): string[]\n\n /**\n * Processes the node and returns the output.\n */\n protected abstract processNode(node: TNode, logger: Logger): TOutput | Promise<TOutput>\n\n /**\n * Gets all identifiers of the nodes that depend on the given node directly or indirectly.\n */\n getAllDependents(nodeId: string): string[] {\n const result = new Set<string>()\n const stack: string[] = [nodeId]\n\n while (stack.length > 0) {\n const dependents = this.dependentMap.get(stack.pop()!)\n if (!dependents) {\n continue\n }\n\n for (const dependentId of dependents) {\n if (!result.has(dependentId)) {\n result.add(dependentId)\n stack.push(dependentId)\n }\n }\n }\n\n return Array.from(result)\n }\n\n /**\n * Invalidates the node and all nodes that depend on it.\n *\n * Also adds the node to the work set for processing.\n */\n invalidate(nodeId: string): void {\n const stack = [nodeId]\n\n while (stack.length > 0) {\n const nodeId = stack.pop()!\n if (!this.nodes.has(nodeId)) {\n // it is ok to invalidate deleted nodes\n continue\n }\n\n // remove the node from the output map\n this.outputMap.delete(nodeId)\n this.workset.add(nodeId)\n\n const dependents = this.dependentMap.get(nodeId)\n if (!dependents) {\n continue\n }\n\n for (const dependentId of dependents) {\n if (this.outputMap.has(dependentId)) {\n // add the dependent to the stack for further processing\n stack.push(dependentId)\n }\n }\n }\n }\n\n /**\n * Resolves all not-resolved or invalidated nodes in the graph.\n *\n * The abort signal of the previous operation must be called before calling this method again.\n */\n async process(signal?: AbortSignal): Promise<void> {\n type StackItem = {\n nodeId: string\n resolved: boolean\n dependencies: string[]\n }\n\n while (this.workset.size > 0) {\n const rootNodeId = this.workset.values().next().value!\n const stack: StackItem[] = [{ nodeId: rootNodeId, resolved: false, dependencies: [] }]\n\n while (stack.length > 0) {\n const stackItem = stack[stack.length - 1]\n const { nodeId, resolved } = stackItem\n\n const node = this.nodes.get(nodeId)\n if (!node) {\n this.logger.warn({ nodeId }, \"node not found in the graph, skipping\")\n stack.pop()\n continue\n }\n\n if (this.outputMap.has(nodeId)) {\n // already processed\n stack.pop()\n continue\n }\n\n if (!resolved) {\n stackItem.dependencies = unique(this.getNodeDependencies(node))\n\n let hasUnresolvedDependencies = false\n\n for (const depId of stackItem.dependencies) {\n if (!this.nodes.has(depId)) {\n this.logger.warn({ depId, nodeId }, \"dependency not found in the graph, skipping\")\n continue\n }\n\n if (!this.outputMap.has(depId)) {\n stack.push({ nodeId: depId, resolved: false, dependencies: [] })\n hasUnresolvedDependencies = true\n }\n }\n\n if (hasUnresolvedDependencies) {\n // wait for dependencies to be resolved\n stackItem.resolved = true\n continue\n }\n }\n\n // all dependencies are resolved, process the node\n const output = await this.processNode(node, this.logger)\n\n if (signal?.aborted) {\n this.logger.warn({ nodeId }, \"processing aborted, skipping output\")\n return\n }\n\n // remove all dependent nodes\n const oldDependencies = this.dependencyMap.get(nodeId) ?? []\n for (const depId of oldDependencies) {\n const dependantSet = this.dependentMap.get(depId)\n if (dependantSet) {\n dependantSet.delete(nodeId)\n if (dependantSet.size === 0) {\n this.dependentMap.delete(depId)\n }\n }\n }\n\n // add the new dependencies\n for (const depId of stackItem.dependencies) {\n let dependantSet = this.dependentMap.get(depId)\n if (!dependantSet) {\n dependantSet = new Set()\n this.dependentMap.set(depId, dependantSet)\n }\n\n dependantSet.add(nodeId)\n }\n\n this.outputMap.set(nodeId, output)\n this.outputHandler?.(nodeId, output)\n this.dependencyMap.set(nodeId, stackItem.dependencies)\n\n stack.pop()\n }\n\n this.workset.delete(rootNodeId)\n }\n }\n}\n","import type { InstanceState } from \"../state\"\nimport { GraphResolver } from \"./graph-resolver\"\n\nexport class StateResolver extends GraphResolver<InstanceState, void> {\n protected getNodeDependencies(node: InstanceState): string[] {\n return node.dependencyIds\n }\n\n protected processNode(): void {\n return\n }\n}\n","import type { HubModel } from \"../project\"\nimport {\n isUnitModel,\n type ComponentModel,\n type HubInput,\n type InstanceInput,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { fromEntries, mapValues } from \"remeda\"\nimport { GraphResolver } from \"./graph-resolver\"\n\nexport type InputResolverNode =\n | {\n kind: \"instance\"\n instance: InstanceModel\n component: ComponentModel\n }\n | {\n kind: \"hub\"\n hub: HubModel\n }\n\nexport type ResolvedInstanceInput = {\n input: InstanceInput\n type: string\n}\n\nexport type InputResolverOutput =\n | {\n kind: \"instance\"\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n resolvedOutputs: Record<string, InstanceInput[]> | undefined\n resolvedInjectionInputs: ResolvedInstanceInput[]\n matchedInjectionInputs: ResolvedInstanceInput[]\n }\n | {\n kind: \"hub\"\n resolvedInputs: ResolvedInstanceInput[]\n }\n\n/**\n * Resolves the all recursive instance and hub inputs based on its direct inputs and injected inputs.\n */\nexport class InputResolver extends GraphResolver<InputResolverNode, InputResolverOutput> {\n // constructor(\n // nodes: ReadonlyMap<string, InputResolverNode>,\n // logger: Logger,\n // outputHandler?: ResolverOutputHandler<InputResolverOutput>,\n // ) {\n // super(nodes, logger, outputHandler)\n // }\n\n getNodeDependencies(node: InputResolverNode): string[] {\n const dependencies: string[] = []\n\n if (node.kind === \"hub\") {\n for (const input of node.hub.inputs ?? []) {\n dependencies.push(`instance:${input.instanceId}`)\n }\n\n for (const input of node.hub.injectionInputs ?? []) {\n dependencies.push(`hub:${input.hubId}`)\n }\n\n return dependencies\n }\n\n for (const inputs of Object.values(node.instance.inputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(`instance:${input.instanceId}`)\n }\n }\n\n for (const inputs of Object.values(node.instance.hubInputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(`hub:${input.hubId}`)\n }\n }\n\n for (const input of node.instance.injectionInputs ?? []) {\n dependencies.push(`hub:${input.hubId}`)\n }\n\n return dependencies\n }\n\n processNode(node: InputResolverNode): InputResolverOutput {\n const getHubOutput = (input: HubInput) => {\n const output = this.outputs.get(`hub:${input.hubId}`)\n if (!output) {\n return { resolvedInputs: [] }\n }\n\n if (output.kind !== \"hub\") {\n throw new Error(\"Expected hub node\")\n }\n\n return output\n }\n\n const getInstanceOutput = (input: InstanceInput) => {\n const output = this.outputs.get(`instance:${input.instanceId}`)\n if (!output) {\n return {\n component: null,\n resolvedInputs: [] as ResolvedInstanceInput[],\n resolvedOutputs: [] as InstanceInput[],\n }\n }\n\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return {\n component: output.component,\n resolvedInputs: output.resolvedInputs[input.output] ?? [],\n resolvedOutputs: output.resolvedOutputs?.[input.output],\n }\n }\n\n // resolve inputs for hub\n if (node.kind === \"hub\") {\n const hubResult: Map<string, ResolvedInstanceInput> = new Map()\n\n const addHubResult = (input: ResolvedInstanceInput) => {\n hubResult.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n\n for (const input of node.hub.inputs ?? []) {\n const { component } = getInstanceOutput(input)\n const componentInput = component?.outputs[input.output]\n\n if (!componentInput) {\n this.logger.warn({ msg: \"output not found in the component\", input, component })\n continue\n }\n\n addHubResult({ input, type: componentInput.type })\n }\n\n for (const injectionInput of node.hub.injectionInputs ?? []) {\n const { resolvedInputs } = getHubOutput(injectionInput)\n\n for (const input of resolvedInputs) {\n addHubResult(input)\n }\n }\n\n return {\n kind: \"hub\",\n resolvedInputs: Array.from(hubResult.values()),\n }\n }\n\n // хуяк (which translates as \"lets reuse resolved inputs of level 2+ composite instances provided by the evaluator\")\n if (node.instance.resolvedInputs) {\n return {\n kind: \"instance\",\n instance: node.instance,\n component: node.component,\n resolvedInputs: mapValues(node.instance.resolvedInputs, (inputs, inputName) => {\n const componentInput = node.component.inputs[inputName]\n if (!componentInput) {\n this.logger.warn({\n msg: \"input not found in the component\",\n inputName,\n component: node.component,\n })\n return []\n }\n\n return inputs.map(input => ({ input, type: componentInput.type }))\n }),\n resolvedOutputs: node.instance.resolvedOutputs ?? {},\n resolvedInjectionInputs: [],\n matchedInjectionInputs: [],\n }\n }\n\n // resolve inputs for instance\n const resolvedInputsMap: Map<string, Map<string, ResolvedInstanceInput>> = new Map()\n\n const addInstanceResult = (inputName: string, input: ResolvedInstanceInput) => {\n let inputs = resolvedInputsMap.get(inputName)\n if (!inputs) {\n inputs = new Map()\n resolvedInputsMap.set(inputName, inputs)\n }\n\n inputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n\n const addInstanceInput = (inputName: string, input: InstanceInput) => {\n const componentInput = node.component.inputs[inputName]\n if (!componentInput) {\n this.logger.warn({\n msg: \"input not found in the component\",\n input,\n component: node.component,\n })\n return\n }\n\n const { component, resolvedOutputs } = getInstanceOutput(input)\n\n if (!component) {\n this.logger.warn({ instanceId: node.instance.id, input }, \"no output found for the input\")\n return\n }\n\n if (isUnitModel(component)) {\n addInstanceResult(inputName, { input, type: componentInput.type })\n return\n }\n\n if (resolvedOutputs) {\n for (const output of resolvedOutputs) {\n addInstanceResult(inputName, { input: output, type: componentInput.type })\n }\n } else {\n // if the instance is not evaluated, we a forced to use the input as is\n addInstanceResult(inputName, { input, type: componentInput.type })\n }\n }\n\n for (const [inputName, inputs] of Object.entries(node.instance.inputs ?? {})) {\n for (const input of inputs) {\n addInstanceInput(inputName, input)\n }\n }\n\n const injectionInputs: Map<string, ResolvedInstanceInput> = new Map()\n const matchedInjectionInputs: Map<string, ResolvedInstanceInput> = new Map()\n\n for (const injectionInput of node.instance.injectionInputs ?? []) {\n const { resolvedInputs } = getHubOutput(injectionInput)\n for (const input of resolvedInputs) {\n injectionInputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n }\n\n for (const [inputName, componentInput] of Object.entries(node.component.inputs ?? {})) {\n const allInputs = new Map<string, ResolvedInstanceInput>(injectionInputs)\n const hubInputs = node.instance.hubInputs?.[inputName] ?? []\n\n for (const hubInput of hubInputs) {\n const { resolvedInputs } = getHubOutput(hubInput)\n for (const input of resolvedInputs) {\n allInputs.set(`${input.input.instanceId}:${input.input.output}`, input)\n }\n }\n\n for (const input of allInputs.values()) {\n if (input.type === componentInput.type) {\n addInstanceInput(inputName, input.input)\n\n const key = `${input.input.instanceId}:${input.input.output}`\n if (injectionInputs.has(key)) {\n matchedInjectionInputs.set(key, input)\n }\n }\n }\n }\n\n const resolvedInputs = fromEntries(\n Array.from(resolvedInputsMap.entries()).map(([inputName, inputs]) => [\n inputName,\n Array.from(inputs.values()),\n ]),\n )\n\n return {\n kind: \"instance\",\n instance: node.instance,\n component: node.component,\n resolvedInputs,\n resolvedOutputs: node.instance.resolvedOutputs,\n resolvedInjectionInputs: Array.from(injectionInputs.values()),\n matchedInjectionInputs: Array.from(matchedInjectionInputs.values()),\n }\n }\n}\n\nexport function getResolvedHubInputs(output: InputResolverOutput): ResolvedInstanceInput[] {\n if (output.kind !== \"hub\") {\n throw new Error(\"Expected hub node\")\n }\n\n return output.resolvedInputs\n}\n\nexport function getResolvedInstanceInputs(\n output: InputResolverOutput,\n): Record<string, ResolvedInstanceInput[]> {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.resolvedInputs\n}\n\nexport function getResolvedInjectionInstanceInputs(\n output: InputResolverOutput,\n): ResolvedInstanceInput[] {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.resolvedInjectionInputs\n}\n\nexport function getMatchedInjectionInstanceInputs(\n output: InputResolverOutput,\n): ResolvedInstanceInput[] {\n if (output.kind !== \"instance\") {\n throw new Error(\"Expected instance node\")\n }\n\n return output.matchedInjectionInputs\n}\n","import type { InstanceState } from \"../state\"\nimport type { ResolvedInstanceInput } from \"./input\"\nimport { isUnitModel, type ComponentModel, type InstanceModel } from \"@highstate/contract\"\nimport { sha256 } from \"crypto-hash\"\nimport { GraphResolver } from \"./graph-resolver\"\n\nexport type InputHashNode = {\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n state: InstanceState | undefined\n sourceHash: string | undefined\n}\n\nexport type InputHashOutput = {\n inputHash: string\n outputHash: string\n}\n\n/**\n * Resolves the hash of the instance based on its args, resolved input hashes, source hash, and the output hash.\n */\nexport class InputHashResolver extends GraphResolver<InputHashNode, InputHashOutput> {\n getNodeDependencies({ resolvedInputs }: InputHashNode): string[] {\n const dependencies: string[] = []\n\n for (const inputs of Object.values(resolvedInputs ?? {})) {\n for (const input of inputs) {\n dependencies.push(input.input.instanceId)\n }\n }\n\n return dependencies\n }\n\n async processNode({\n instance,\n component,\n resolvedInputs,\n sourceHash,\n state,\n }: InputHashNode): Promise<InputHashOutput> {\n let sink = component.definitionHash + JSON.stringify(instance.args ?? {})\n\n if (sourceHash) {\n sink += sourceHash\n } else if (isUnitModel(component)) {\n this.logger.warn(\n { instanceId: instance.id },\n \"missing source hash for unit model, this may lead to incorrect input hash\",\n )\n }\n\n const sortedInputs = Object.entries(resolvedInputs)\n //\n .sort(([a], [b]) => a.localeCompare(b))\n\n for (const [inputKey, inputs] of sortedInputs) {\n if (Object.keys(inputs).length === 0) {\n continue\n }\n\n sink += inputKey\n\n const instanceIds = inputs.map(input => input.input.instanceId)\n instanceIds.sort()\n\n for (const instanceId of instanceIds) {\n const dependency = this.outputs.get(instanceId)\n if (!dependency) continue\n\n sink += dependency.inputHash\n sink += dependency.outputHash\n }\n }\n\n return {\n inputHash: await sha256(sink),\n outputHash: state?.outputHash ?? \"\",\n }\n }\n}\n","import type { ComponentModel, InstanceModel } from \"@highstate/contract\"\nimport type { ResolvedInstanceInput } from \"./input\"\nimport { Ajv } from \"ajv\"\nimport { GraphResolver } from \"./graph-resolver\"\n\nexport type ValidationNode = {\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n}\n\nexport type ValidationOutput =\n | {\n status: \"ok\"\n }\n | {\n status: \"invalid-args\"\n errorText: string\n }\n | {\n status: \"invalid-inputs\" | \"missing-inputs\"\n errorText: string\n }\n\n/**\n * Validates the instance based on its arguments and inputs.\n */\nexport class ValidationResolver extends GraphResolver<ValidationNode, ValidationOutput> {\n getNodeDependencies({ resolvedInputs }: ValidationNode): string[] {\n const dependencies: string[] = []\n\n for (const inputs of Object.values(resolvedInputs)) {\n for (const input of inputs) {\n dependencies.push(input.input.instanceId)\n }\n }\n\n return dependencies\n }\n\n processNode({ instance, component, resolvedInputs }: ValidationNode): ValidationOutput {\n const ajv = new Ajv({ strict: false })\n\n this.logger.debug({ instanceId: instance.id }, \"validating instance\")\n\n for (const [name, argument] of Object.entries(component.args)) {\n if (!argument.required && !instance.args?.[name]) {\n continue\n }\n\n if (!ajv.validate(argument.schema, instance.args?.[name])) {\n this.logger.debug({ instanceId: instance.id, argumentName: name }, \"invalid argument\")\n\n return {\n status: \"invalid-args\",\n errorText: `invalid argument \"${name}\": ${ajv.errorsText()}`,\n }\n }\n }\n\n for (const inputs of Object.values(resolvedInputs)) {\n for (const input of inputs) {\n const inputInstance = this.outputs.get(input.input.instanceId)\n if (inputInstance?.status !== \"ok\") {\n return {\n status: \"invalid-inputs\",\n errorText: `instance \"${input.input.instanceId}\" has errors`,\n }\n }\n }\n }\n\n for (const [name, input] of Object.entries(component.inputs)) {\n if (!input.required) {\n continue\n }\n\n if (!resolvedInputs[name] || !resolvedInputs[name].length) {\n return {\n status: \"missing-inputs\",\n errorText: `input \"${name}\" is missing`,\n }\n }\n }\n\n return { status: \"ok\" }\n }\n}\n","import type { Logger } from \"pino\"\nimport type { GraphResolver, ResolverOutputHandler } from \"./graph-resolver\"\nimport type { InstanceState } from \"../state\"\nimport { StateResolver } from \"./state\"\nimport { InputResolver, type InputResolverNode, type InputResolverOutput } from \"./input\"\nimport { InputHashResolver, type InputHashNode, type InputHashOutput } from \"./input-hash\"\nimport { ValidationResolver, type ValidationNode, type ValidationOutput } from \"./validation\"\n\nexport type GraphResolverType = keyof GraphResolverMap\n\nexport type GraphResolverMap = {\n InputResolver: [InputResolverNode, InputResolverOutput]\n InputHashResolver: [InputHashNode, InputHashOutput]\n ValidationResolver: [ValidationNode, ValidationOutput]\n StateResolver: [InstanceState, void]\n}\n\nexport const resolverFactories = {\n InputResolver,\n InputHashResolver,\n ValidationResolver,\n StateResolver,\n} as Record<\n GraphResolverType,\n new (\n nodes: ReadonlyMap<string, unknown>,\n logger: Logger,\n outputHandler?: ResolverOutputHandler<unknown>,\n ) => GraphResolver<unknown, unknown>\n>\n","import { z } from \"zod\"\n\nexport const terminalSessionSchema = z.object({\n id: z.string().uuid(),\n projectId: z.string(),\n instanceId: z.string(),\n terminalName: z.string(),\n terminalTitle: z.string(),\n terminalIcon: z.string().optional(),\n createdAt: z.coerce.date(),\n finishedAt: z.coerce.date().optional(),\n})\n\nexport type TerminalSession = z.infer<typeof terminalSessionSchema>\n","import type { ComponentModel, Entity } from \"@highstate/contract\"\n\nexport type LibraryModel = {\n components: Record<string, ComponentModel>\n entities: Record<string, Entity>\n}\n\nexport type LibraryUpdate =\n | {\n type: \"reload-started\" | \"reload-completed\"\n }\n | {\n type: \"component-updated\"\n component: ComponentModel\n }\n | {\n type: \"entity-updated\"\n entity: Entity\n }\n | {\n type: \"component-removed\"\n componentType: string\n }\n | {\n type: \"entity-removed\"\n entityType: string\n }\n\nexport function diffLibraries(oldLibrary: LibraryModel, newLibrary: LibraryModel): LibraryUpdate[] {\n const updates: LibraryUpdate[] = []\n\n for (const [componentType, newComponent] of Object.entries(newLibrary.components)) {\n const existingComponent = oldLibrary.components[componentType]\n if (existingComponent?.definitionHash !== newComponent.definitionHash) {\n updates.push({ type: \"component-updated\", component: newComponent })\n }\n }\n\n for (const componentType of Object.keys(oldLibrary.components)) {\n if (!newLibrary.components[componentType]) {\n updates.push({ type: \"component-removed\", componentType })\n }\n }\n\n for (const [entityType, newEntity] of Object.entries(newLibrary.entities)) {\n const existingEntity = oldLibrary.entities[entityType]\n if (existingEntity?.definitionHash !== newEntity.definitionHash) {\n updates.push({ type: \"entity-updated\", entity: newEntity })\n }\n }\n\n for (const entityType of Object.keys(oldLibrary.entities)) {\n if (!newLibrary.entities[entityType]) {\n updates.push({ type: \"entity-removed\", entityType })\n }\n }\n\n return updates\n}\n\nexport function applyLibraryUpdate(\n components: Record<string, ComponentModel>,\n entities: Record<string, Entity>,\n update: LibraryUpdate,\n): void {\n switch (update.type) {\n case \"component-updated\":\n components[update.component.type] = update.component\n break\n case \"entity-updated\":\n entities[update.entity.type] = update.entity\n break\n case \"component-removed\":\n delete components[update.componentType]\n break\n case \"entity-removed\":\n delete entities[update.entityType]\n break\n }\n}\n","export type AsyncBatcherOptions = {\n waitMs?: number\n maxWaitTimeMs?: number\n}\n\nexport function createAsyncBatcher<T>(\n fn: (items: T[]) => Promise<void> | void,\n { waitMs = 100, maxWaitTimeMs = 1000 }: AsyncBatcherOptions = {},\n) {\n let batch: T[] = []\n let activeTimeout: NodeJS.Timeout | null = null\n let maxWaitTimeout: NodeJS.Timeout | null = null\n let firstCallTimestamp: number | null = null\n\n async function processBatch() {\n if (batch.length === 0) return\n\n const currentBatch = batch\n batch = [] // Reset batch before async call\n\n await fn(currentBatch)\n\n // Clear max wait timer since batch has been processed\n if (maxWaitTimeout) {\n clearTimeout(maxWaitTimeout)\n maxWaitTimeout = null\n }\n firstCallTimestamp = null\n }\n\n function schedule() {\n if (activeTimeout) clearTimeout(activeTimeout)\n activeTimeout = setTimeout(() => {\n activeTimeout = null\n void processBatch()\n }, waitMs)\n\n // Ensure batch is executed within maxWaitTimeMs\n if (!firstCallTimestamp) {\n firstCallTimestamp = Date.now()\n maxWaitTimeout = setTimeout(() => {\n if (activeTimeout) clearTimeout(activeTimeout)\n activeTimeout = null\n void processBatch()\n }, maxWaitTimeMs)\n }\n }\n\n return {\n /**\n * Add an item to the batch.\n */\n call(item: T): void {\n batch.push(item)\n schedule()\n },\n\n /**\n * Immediately flush the pending batch (if any).\n */\n async flush(): Promise<void> {\n if (activeTimeout) {\n clearTimeout(activeTimeout)\n activeTimeout = null\n }\n if (maxWaitTimeout) {\n clearTimeout(maxWaitTimeout)\n maxWaitTimeout = null\n }\n await processBatch()\n },\n }\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAEX,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,GAAG,EAAE,OAAO;AAAA,EACZ,GAAG,EAAE,OAAO;AACd,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,YAAY,EAAE,OAAO;AAAA,EACrB,QAAQ,EAAE,OAAO;AACnB,CAAC;AAEM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,OAAO,EAAE,OAAO;AAClB,CAAC;AAEM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACrC,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC,EAAE,SAAS;AAAA,EACxD,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC,EAAE,SAAS;AAAA,EAC9D,iBAAiB,EAAE,MAAM,sBAAsB,EAAE,SAAS;AAAA,EAC1D,UAAU,eAAe,SAAS;AACpC,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,IAAI,EAAE,OAAO;AAAA,EACb,MAAM,EAAE,OAAO;AAAA,EACf,MAAM,EAAE,OAAO;AAAA,EAEf,GAAG,yBAAyB;AAAA,EAC5B,gBAAgB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC,EAAE,SAAS;AAAA,EAEhE,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,SAAS,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC,EAAE,SAAS;AAAA,EACzD,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC,EAAE,SAAS;AACnE,CAAC;AAEM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,UAAU;AAAA,EACV,UAAU,EAAE,MAAM,mBAAmB;AAAA,EACrC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAIM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,UAAU,eAAe,SAAS;AAAA,EAClC,QAAQ,EAAE,MAAM,mBAAmB,EAAE,SAAS;AAAA,EAC9C,iBAAiB,EAAE,MAAM,sBAAsB,EAAE,SAAS;AAC5D,CAAC;AAEM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,IAAI,EAAE,OAAO,EAAE,OAAO;AAAA,EACtB,UAAU;AAAA,EAEV,QAAQ,EAAE,MAAM,mBAAmB,EAAE,SAAS;AAAA,EAC9C,iBAAiB,EAAE,MAAM,sBAAsB,EAAE,SAAS;AAC5D,CAAC;;;ACzDD,SAAS,YAAY;AACrB,SAAS,KAAAA,UAAS;AAEX,IAAM,uBAAuBA,GAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,iCAAiCA,GAAE,MAAM;AAAA,EACpDA,GAAE,OAAO;AAAA,EACTA,GAAE,OAAO;AAAA,EACTA,GAAE,QAAQ;AAAA,EACVA,GAAE,MAAMA,GAAE,OAAO,CAAC;AACpB,CAAC;AAEM,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EAChD,MAAMA,GAAE,OAAO;AAAA,EACf,OAAO,+BAA+B,SAAS;AAAA,EAC/C,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,WAAWA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAChC,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,EACzB,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AACvC,CAAC;AAEM,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EAC7C,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO;AAAA,EACtB,MAAMA,GAAE,OAAO;AAAA,EACf,UAAUA,GAAE,QAAQ,EAAE,SAAS;AACjC,CAAC;AAEM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EACzC,MAAM;AAAA,EACN,SAASA,GAAE,OAAO;AACpB,CAAC;AAEM,IAAM,0BAA0BA,GAAE,MAAM;AAAA,EAC7CA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,UAAU;AAAA,IAC1B,SAASA,GAAE,OAAO;AAAA,EACpB,CAAC;AAAA,EACDA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,IAAI;AAAA,IACpB,SAASA,GAAE,OAAO;AAAA,IAClB,aAAaA,GAAE,OAAO,QAAQ;AAAA,IAC9B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,CAAC;AAAA,EACDA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,MAAM;AAAA,IACtB,UAAU;AAAA,EACZ,CAAC;AACH,CAAC;AAEM,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EAC7C,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO;AAClB,CAAC;AAEM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EACzC,GAAG,uBAAuB;AAAA,EAC1B,SAASA,GAAE,MAAM,uBAAuB;AAC1C,CAAC;AAEM,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EACjD,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO;AAAA,EAChB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAMA,GAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAEM,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EACjD,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAEM,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EAC7C,GAAG,2BAA2B;AAAA,EAC9B,OAAOA,GAAE,OAAO;AAAA,EAChB,SAASA,GAAE,OAAO,EAAE,MAAM;AAAA,EAC1B,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,EACzB,KAAKA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,OAAOA,GAAE,OAAO,0BAA0B,EAAE,SAAS;AACvD,CAAC;AAEM,IAAM,4BAA4BA,GAAE,MAAM;AAAA,EAC/CA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,gBAAgB;AAAA,EAClC,CAAC;AAAA,EACDA,GAAE,OAAO;AAAA,IACP,MAAMA,GAAE,QAAQ,UAAU;AAAA,IAC1B,UAAUA,GAAE,OAAO;AAAA,EACrB,CAAC;AACH,CAAC;AAEM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO;AAAA,EAChB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAM;AACR,CAAC;AAEM,IAAM,kCAAkCA,GAAE,OAAO;AAAA,EACtD,MAAMA,GAAE,OAAO;AACjB,CAAC;AAEM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC5C,QAAQ;AAAA,EACR,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EAEnD,mBAAmBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAErD,sBAAsBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACxD,oBAAoBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACtD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC7C,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAE9C,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACzC,iBAAiBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAEnD,cAAcA,GAAE,MAAM,yBAAyB,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EACjE,OAAOA,GAAE,MAAM,sBAAsB,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EACvD,OAAOA,GAAE,MAAM,sBAAsB,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EACvD,WAAWA,GAAE,MAAM,0BAA0B,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC/D,UAAUA,GAAE,MAAM,qBAAqB,EAAE,QAAQ,MAAM,CAAC,CAAC;AAC3D,CAAC;AAEM,IAAM,4BAA4BA,GACtC,OAAO;AAAA,EACN,GAAG,oBAAoB;AAAA;AAAA,EAGvB,SAASA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAGvC,SAASA,GAAE,OAAO,EAAE,SAAS;AAC/B,CAAC,EACA,QAAQ;AAoBJ,SAAS,oBACd,IACA,SAAyB,eACzB,SAAiC,CAAC,GACnB;AACf,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV,eAAe,CAAC;AAAA,IAChB;AAAA,IAEA,mBAAmB;AAAA,IAEnB,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,YAAY;AAAA,IAEZ,OAAO;AAAA,IACP,iBAAiB;AAAA,IAEjB,cAAc,CAAC;AAAA,IACf,OAAO,CAAC;AAAA,IACR,OAAO,CAAC;AAAA,IACR,WAAW,CAAC;AAAA,IACZ,UAAU,CAAC;AAAA,IAEX,GAAG;AAAA,EACL;AACF;AAEO,SAAS,0BACd,QACA,OACe;AACf,MAAI,CAAC,MAAM,IAAI;AACb,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,MAAI,QAAQ,OAAO,IAAI,MAAM,EAAE,KAAK,oBAAoB,MAAM,IAAI,SAAS;AAC3E,UAAQ,EAAE,GAAG,OAAO,GAAG,MAAM;AAE7B,SAAO,IAAI,MAAM,IAAI,KAAK;AAC1B,SAAO;AACT;AAEO,SAAS,yBAAyB,QAAqD;AAC5F,SAAO,KAAK,QAAQ,CAAC,WAAW,SAAS,CAAC;AAC5C;AASO,SAAS,2BACd,cACA,YACU;AACV,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,UAAU,oBAAI,IAAY;AAEhC,QAAM,WAAW,CAAC,OAAe;AAC/B,QAAI,QAAQ,IAAI,EAAE,EAAG;AACrB,YAAQ,IAAI,EAAE;AAEd,UAAM,aAAa,aAAa,IAAI,EAAE;AACtC,QAAI,CAAC,WAAY;AAEjB,eAAW,aAAa,YAAY;AAClC,aAAO,IAAI,SAAS;AACpB,eAAS,SAAS;AAAA,IACpB;AAAA,EACF;AAEA,WAAS,UAAU;AAEnB,SAAO,MAAM,KAAK,MAAM;AAC1B;;;ACtPA,SAAS,KAAAC,UAAS;AAEX,IAAM,sBAAsBA,GAAE,KAAK,CAAC,UAAU,WAAW,WAAW,YAAY,SAAS,CAAC;AAE1F,IAAM,wBAAwBA,GAAE,KAAK;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,yBAAyBA,GAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7C,yBAAyBA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlD,qBAAqBA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS9C,2BAA2BA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD,uBAAuBA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/C,4BAA4BA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQrD,kBAAkBA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU3C,sCAAsCA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/D,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AACpC,CAAC;AAEM,IAAM,gCAAgCA,GAAE,OAAO;AAAA,EACpD,WAAWA,GAAE,OAAO;AAAA,EACpB,MAAM;AAAA,EACN,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC/B,SAAS,uBAAuB,QAAQ,EAAE,SAAS;AACrD,CAAC;AAEM,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EAC7C,IAAIA,GAAE,OAAO,EAAE,KAAK;AAAA,EACpB,QAAQ;AAAA,EAER,WAAWA,GAAE,OAAO;AAAA,EACpB,MAAM;AAAA,EAEN,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAExC,qBAAqBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EACzD,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EAE1D,SAAS,uBAAuB,QAAQ,OAAO,CAAC,EAAE;AAAA,EAElD,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAWA,GAAE,OAAO;AAAA,EACpB,aAAaA,GAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAQM,SAAS,uBAAuB,QAAkC;AACvE,SAAO,WAAW,eAAe,WAAW,YAAY,WAAW;AACrE;;;ACpHA,SAAS,cAAc;AAIhB,IAAe,gBAAf,MAA6C;AAAA,EAMlD,YACmB,OACE,QACF,eACjB;AAHiB;AACE;AACF;AAAA,EAChB;AAAA,EATc,UAAuB,oBAAI,IAAI;AAAA,EAC/B,gBAAuC,oBAAI,IAAI;AAAA,EAC/C,eAAyC,oBAAI,IAAI;AAAA,EACjD,YAAkC,oBAAI,IAAI;AAAA,EAQ3D,aAAa,QAAsB;AACjC,SAAK,QAAQ,IAAI,MAAM;AAAA,EACzB;AAAA,EAEA,uBAA6B;AAC3B,eAAW,UAAU,KAAK,MAAM,KAAK,GAAG;AACtC,WAAK,QAAQ,IAAI,MAAM;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAwC;AAC1C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,QAAyB;AACrC,UAAM,SAAS,KAAK,UAAU,IAAI,MAAM;AACxC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,mBAAmB,MAAM,mBAAmB;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAiBA,iBAAiB,QAA0B;AACzC,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,QAAkB,CAAC,MAAM;AAE/B,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,aAAa,KAAK,aAAa,IAAI,MAAM,IAAI,CAAE;AACrD,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AAEA,iBAAW,eAAe,YAAY;AACpC,YAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC5B,iBAAO,IAAI,WAAW;AACtB,gBAAM,KAAK,WAAW;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAsB;AAC/B,UAAM,QAAQ,CAAC,MAAM;AAErB,WAAO,MAAM,SAAS,GAAG;AACvB,YAAMC,UAAS,MAAM,IAAI;AACzB,UAAI,CAAC,KAAK,MAAM,IAAIA,OAAM,GAAG;AAE3B;AAAA,MACF;AAGA,WAAK,UAAU,OAAOA,OAAM;AAC5B,WAAK,QAAQ,IAAIA,OAAM;AAEvB,YAAM,aAAa,KAAK,aAAa,IAAIA,OAAM;AAC/C,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AAEA,iBAAW,eAAe,YAAY;AACpC,YAAI,KAAK,UAAU,IAAI,WAAW,GAAG;AAEnC,gBAAM,KAAK,WAAW;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,QAAqC;AAOjD,WAAO,KAAK,QAAQ,OAAO,GAAG;AAC5B,YAAM,aAAa,KAAK,QAAQ,OAAO,EAAE,KAAK,EAAE;AAChD,YAAM,QAAqB,CAAC,EAAE,QAAQ,YAAY,UAAU,OAAO,cAAc,CAAC,EAAE,CAAC;AAErF,aAAO,MAAM,SAAS,GAAG;AACvB,cAAM,YAAY,MAAM,MAAM,SAAS,CAAC;AACxC,cAAM,EAAE,QAAQ,SAAS,IAAI;AAE7B,cAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAClC,YAAI,CAAC,MAAM;AACT,eAAK,OAAO,KAAK,EAAE,OAAO,GAAG,uCAAuC;AACpE,gBAAM,IAAI;AACV;AAAA,QACF;AAEA,YAAI,KAAK,UAAU,IAAI,MAAM,GAAG;AAE9B,gBAAM,IAAI;AACV;AAAA,QACF;AAEA,YAAI,CAAC,UAAU;AACb,oBAAU,eAAe,OAAO,KAAK,oBAAoB,IAAI,CAAC;AAE9D,cAAI,4BAA4B;AAEhC,qBAAW,SAAS,UAAU,cAAc;AAC1C,gBAAI,CAAC,KAAK,MAAM,IAAI,KAAK,GAAG;AAC1B,mBAAK,OAAO,KAAK,EAAE,OAAO,OAAO,GAAG,6CAA6C;AACjF;AAAA,YACF;AAEA,gBAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,oBAAM,KAAK,EAAE,QAAQ,OAAO,UAAU,OAAO,cAAc,CAAC,EAAE,CAAC;AAC/D,0CAA4B;AAAA,YAC9B;AAAA,UACF;AAEA,cAAI,2BAA2B;AAE7B,sBAAU,WAAW;AACrB;AAAA,UACF;AAAA,QACF;AAGA,cAAM,SAAS,MAAM,KAAK,YAAY,MAAM,KAAK,MAAM;AAEvD,YAAI,QAAQ,SAAS;AACnB,eAAK,OAAO,KAAK,EAAE,OAAO,GAAG,qCAAqC;AAClE;AAAA,QACF;AAGA,cAAM,kBAAkB,KAAK,cAAc,IAAI,MAAM,KAAK,CAAC;AAC3D,mBAAW,SAAS,iBAAiB;AACnC,gBAAM,eAAe,KAAK,aAAa,IAAI,KAAK;AAChD,cAAI,cAAc;AAChB,yBAAa,OAAO,MAAM;AAC1B,gBAAI,aAAa,SAAS,GAAG;AAC3B,mBAAK,aAAa,OAAO,KAAK;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AAGA,mBAAW,SAAS,UAAU,cAAc;AAC1C,cAAI,eAAe,KAAK,aAAa,IAAI,KAAK;AAC9C,cAAI,CAAC,cAAc;AACjB,2BAAe,oBAAI,IAAI;AACvB,iBAAK,aAAa,IAAI,OAAO,YAAY;AAAA,UAC3C;AAEA,uBAAa,IAAI,MAAM;AAAA,QACzB;AAEA,aAAK,UAAU,IAAI,QAAQ,MAAM;AACjC,aAAK,gBAAgB,QAAQ,MAAM;AACnC,aAAK,cAAc,IAAI,QAAQ,UAAU,YAAY;AAErD,cAAM,IAAI;AAAA,MACZ;AAEA,WAAK,QAAQ,OAAO,UAAU;AAAA,IAChC;AAAA,EACF;AACF;;;AC/MO,IAAM,gBAAN,cAA4B,cAAmC;AAAA,EAC1D,oBAAoB,MAA+B;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,cAAoB;AAC5B;AAAA,EACF;AACF;;;ACVA;AAAA,EACE;AAAA,OAKK;AACP,SAAS,aAAa,iBAAiB;AAqChC,IAAM,gBAAN,cAA4B,cAAsD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvF,oBAAoB,MAAmC;AACrD,UAAM,eAAyB,CAAC;AAEhC,QAAI,KAAK,SAAS,OAAO;AACvB,iBAAW,SAAS,KAAK,IAAI,UAAU,CAAC,GAAG;AACzC,qBAAa,KAAK,YAAY,MAAM,UAAU,EAAE;AAAA,MAClD;AAEA,iBAAW,SAAS,KAAK,IAAI,mBAAmB,CAAC,GAAG;AAClD,qBAAa,KAAK,OAAO,MAAM,KAAK,EAAE;AAAA,MACxC;AAEA,aAAO;AAAA,IACT;AAEA,eAAW,UAAU,OAAO,OAAO,KAAK,SAAS,UAAU,CAAC,CAAC,GAAG;AAC9D,iBAAW,SAAS,QAAQ;AAC1B,qBAAa,KAAK,YAAY,MAAM,UAAU,EAAE;AAAA,MAClD;AAAA,IACF;AAEA,eAAW,UAAU,OAAO,OAAO,KAAK,SAAS,aAAa,CAAC,CAAC,GAAG;AACjE,iBAAW,SAAS,QAAQ;AAC1B,qBAAa,KAAK,OAAO,MAAM,KAAK,EAAE;AAAA,MACxC;AAAA,IACF;AAEA,eAAW,SAAS,KAAK,SAAS,mBAAmB,CAAC,GAAG;AACvD,mBAAa,KAAK,OAAO,MAAM,KAAK,EAAE;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,MAA8C;AACxD,UAAM,eAAe,CAAC,UAAoB;AACxC,YAAM,SAAS,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,EAAE;AACpD,UAAI,CAAC,QAAQ;AACX,eAAO,EAAE,gBAAgB,CAAC,EAAE;AAAA,MAC9B;AAEA,UAAI,OAAO,SAAS,OAAO;AACzB,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACrC;AAEA,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,CAAC,UAAyB;AAClD,YAAM,SAAS,KAAK,QAAQ,IAAI,YAAY,MAAM,UAAU,EAAE;AAC9D,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,UACL,WAAW;AAAA,UACX,gBAAgB,CAAC;AAAA,UACjB,iBAAiB,CAAC;AAAA,QACpB;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,YAAY;AAC9B,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AAEA,aAAO;AAAA,QACL,WAAW,OAAO;AAAA,QAClB,gBAAgB,OAAO,eAAe,MAAM,MAAM,KAAK,CAAC;AAAA,QACxD,iBAAiB,OAAO,kBAAkB,MAAM,MAAM;AAAA,MACxD;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,OAAO;AACvB,YAAM,YAAgD,oBAAI,IAAI;AAE9D,YAAM,eAAe,CAAC,UAAiC;AACrD,kBAAU,IAAI,GAAG,MAAM,MAAM,UAAU,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK;AAAA,MACxE;AAEA,iBAAW,SAAS,KAAK,IAAI,UAAU,CAAC,GAAG;AACzC,cAAM,EAAE,UAAU,IAAI,kBAAkB,KAAK;AAC7C,cAAM,iBAAiB,WAAW,QAAQ,MAAM,MAAM;AAEtD,YAAI,CAAC,gBAAgB;AACnB,eAAK,OAAO,KAAK,EAAE,KAAK,qCAAqC,OAAO,UAAU,CAAC;AAC/E;AAAA,QACF;AAEA,qBAAa,EAAE,OAAO,MAAM,eAAe,KAAK,CAAC;AAAA,MACnD;AAEA,iBAAW,kBAAkB,KAAK,IAAI,mBAAmB,CAAC,GAAG;AAC3D,cAAM,EAAE,gBAAAC,gBAAe,IAAI,aAAa,cAAc;AAEtD,mBAAW,SAASA,iBAAgB;AAClC,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB,MAAM,KAAK,UAAU,OAAO,CAAC;AAAA,MAC/C;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,gBAAgB;AAChC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,QAChB,gBAAgB,UAAU,KAAK,SAAS,gBAAgB,CAAC,QAAQ,cAAc;AAC7E,gBAAM,iBAAiB,KAAK,UAAU,OAAO,SAAS;AACtD,cAAI,CAAC,gBAAgB;AACnB,iBAAK,OAAO,KAAK;AAAA,cACf,KAAK;AAAA,cACL;AAAA,cACA,WAAW,KAAK;AAAA,YAClB,CAAC;AACD,mBAAO,CAAC;AAAA,UACV;AAEA,iBAAO,OAAO,IAAI,YAAU,EAAE,OAAO,MAAM,eAAe,KAAK,EAAE;AAAA,QACnE,CAAC;AAAA,QACD,iBAAiB,KAAK,SAAS,mBAAmB,CAAC;AAAA,QACnD,yBAAyB,CAAC;AAAA,QAC1B,wBAAwB,CAAC;AAAA,MAC3B;AAAA,IACF;AAGA,UAAM,oBAAqE,oBAAI,IAAI;AAEnF,UAAM,oBAAoB,CAAC,WAAmB,UAAiC;AAC7E,UAAI,SAAS,kBAAkB,IAAI,SAAS;AAC5C,UAAI,CAAC,QAAQ;AACX,iBAAS,oBAAI,IAAI;AACjB,0BAAkB,IAAI,WAAW,MAAM;AAAA,MACzC;AAEA,aAAO,IAAI,GAAG,MAAM,MAAM,UAAU,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK;AAAA,IACrE;AAEA,UAAM,mBAAmB,CAAC,WAAmB,UAAyB;AACpE,YAAM,iBAAiB,KAAK,UAAU,OAAO,SAAS;AACtD,UAAI,CAAC,gBAAgB;AACnB,aAAK,OAAO,KAAK;AAAA,UACf,KAAK;AAAA,UACL;AAAA,UACA,WAAW,KAAK;AAAA,QAClB,CAAC;AACD;AAAA,MACF;AAEA,YAAM,EAAE,WAAW,gBAAgB,IAAI,kBAAkB,KAAK;AAE9D,UAAI,CAAC,WAAW;AACd,aAAK,OAAO,KAAK,EAAE,YAAY,KAAK,SAAS,IAAI,MAAM,GAAG,+BAA+B;AACzF;AAAA,MACF;AAEA,UAAI,YAAY,SAAS,GAAG;AAC1B,0BAAkB,WAAW,EAAE,OAAO,MAAM,eAAe,KAAK,CAAC;AACjE;AAAA,MACF;AAEA,UAAI,iBAAiB;AACnB,mBAAW,UAAU,iBAAiB;AACpC,4BAAkB,WAAW,EAAE,OAAO,QAAQ,MAAM,eAAe,KAAK,CAAC;AAAA,QAC3E;AAAA,MACF,OAAO;AAEL,0BAAkB,WAAW,EAAE,OAAO,MAAM,eAAe,KAAK,CAAC;AAAA,MACnE;AAAA,IACF;AAEA,eAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,KAAK,SAAS,UAAU,CAAC,CAAC,GAAG;AAC5E,iBAAW,SAAS,QAAQ;AAC1B,yBAAiB,WAAW,KAAK;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,kBAAsD,oBAAI,IAAI;AACpE,UAAM,yBAA6D,oBAAI,IAAI;AAE3E,eAAW,kBAAkB,KAAK,SAAS,mBAAmB,CAAC,GAAG;AAChE,YAAM,EAAE,gBAAAA,gBAAe,IAAI,aAAa,cAAc;AACtD,iBAAW,SAASA,iBAAgB;AAClC,wBAAgB,IAAI,GAAG,MAAM,MAAM,UAAU,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK;AAAA,MAC9E;AAAA,IACF;AAEA,eAAW,CAAC,WAAW,cAAc,KAAK,OAAO,QAAQ,KAAK,UAAU,UAAU,CAAC,CAAC,GAAG;AACrF,YAAM,YAAY,IAAI,IAAmC,eAAe;AACxE,YAAM,YAAY,KAAK,SAAS,YAAY,SAAS,KAAK,CAAC;AAE3D,iBAAW,YAAY,WAAW;AAChC,cAAM,EAAE,gBAAAA,gBAAe,IAAI,aAAa,QAAQ;AAChD,mBAAW,SAASA,iBAAgB;AAClC,oBAAU,IAAI,GAAG,MAAM,MAAM,UAAU,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK;AAAA,QACxE;AAAA,MACF;AAEA,iBAAW,SAAS,UAAU,OAAO,GAAG;AACtC,YAAI,MAAM,SAAS,eAAe,MAAM;AACtC,2BAAiB,WAAW,MAAM,KAAK;AAEvC,gBAAM,MAAM,GAAG,MAAM,MAAM,UAAU,IAAI,MAAM,MAAM,MAAM;AAC3D,cAAI,gBAAgB,IAAI,GAAG,GAAG;AAC5B,mCAAuB,IAAI,KAAK,KAAK;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB;AAAA,MACrB,MAAM,KAAK,kBAAkB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,WAAW,MAAM,MAAM;AAAA,QACnE;AAAA,QACA,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,iBAAiB,KAAK,SAAS;AAAA,MAC/B,yBAAyB,MAAM,KAAK,gBAAgB,OAAO,CAAC;AAAA,MAC5D,wBAAwB,MAAM,KAAK,uBAAuB,OAAO,CAAC;AAAA,IACpE;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,QAAsD;AACzF,MAAI,OAAO,SAAS,OAAO;AACzB,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AAEA,SAAO,OAAO;AAChB;AAEO,SAAS,0BACd,QACyC;AACzC,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,SAAO,OAAO;AAChB;AAEO,SAAS,mCACd,QACyB;AACzB,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,SAAO,OAAO;AAChB;AAEO,SAAS,kCACd,QACyB;AACzB,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,SAAO,OAAO;AAChB;;;AChUA,SAAS,eAAAC,oBAA4D;AACrE,SAAS,cAAc;AAmBhB,IAAM,oBAAN,cAAgC,cAA8C;AAAA,EACnF,oBAAoB,EAAE,eAAe,GAA4B;AAC/D,UAAM,eAAyB,CAAC;AAEhC,eAAW,UAAU,OAAO,OAAO,kBAAkB,CAAC,CAAC,GAAG;AACxD,iBAAW,SAAS,QAAQ;AAC1B,qBAAa,KAAK,MAAM,MAAM,UAAU;AAAA,MAC1C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA4C;AAC1C,QAAI,OAAO,UAAU,iBAAiB,KAAK,UAAU,SAAS,QAAQ,CAAC,CAAC;AAExE,QAAI,YAAY;AACd,cAAQ;AAAA,IACV,WAAWC,aAAY,SAAS,GAAG;AACjC,WAAK,OAAO;AAAA,QACV,EAAE,YAAY,SAAS,GAAG;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,OAAO,QAAQ,cAAc,EAE/C,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAExC,eAAW,CAAC,UAAU,MAAM,KAAK,cAAc;AAC7C,UAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC;AAAA,MACF;AAEA,cAAQ;AAER,YAAM,cAAc,OAAO,IAAI,WAAS,MAAM,MAAM,UAAU;AAC9D,kBAAY,KAAK;AAEjB,iBAAW,cAAc,aAAa;AACpC,cAAM,aAAa,KAAK,QAAQ,IAAI,UAAU;AAC9C,YAAI,CAAC,WAAY;AAEjB,gBAAQ,WAAW;AACnB,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,MAAM,OAAO,IAAI;AAAA,MAC5B,YAAY,OAAO,cAAc;AAAA,IACnC;AAAA,EACF;AACF;;;AC/EA,SAAS,WAAW;AAyBb,IAAM,qBAAN,cAAiC,cAAgD;AAAA,EACtF,oBAAoB,EAAE,eAAe,GAA6B;AAChE,UAAM,eAAyB,CAAC;AAEhC,eAAW,UAAU,OAAO,OAAO,cAAc,GAAG;AAClD,iBAAW,SAAS,QAAQ;AAC1B,qBAAa,KAAK,MAAM,MAAM,UAAU;AAAA,MAC1C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,EAAE,UAAU,WAAW,eAAe,GAAqC;AACrF,UAAM,MAAM,IAAI,IAAI,EAAE,QAAQ,MAAM,CAAC;AAErC,SAAK,OAAO,MAAM,EAAE,YAAY,SAAS,GAAG,GAAG,qBAAqB;AAEpE,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,UAAU,IAAI,GAAG;AAC7D,UAAI,CAAC,SAAS,YAAY,CAAC,SAAS,OAAO,IAAI,GAAG;AAChD;AAAA,MACF;AAEA,UAAI,CAAC,IAAI,SAAS,SAAS,QAAQ,SAAS,OAAO,IAAI,CAAC,GAAG;AACzD,aAAK,OAAO,MAAM,EAAE,YAAY,SAAS,IAAI,cAAc,KAAK,GAAG,kBAAkB;AAErF,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,WAAW,qBAAqB,IAAI,MAAM,IAAI,WAAW,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAEA,eAAW,UAAU,OAAO,OAAO,cAAc,GAAG;AAClD,iBAAW,SAAS,QAAQ;AAC1B,cAAM,gBAAgB,KAAK,QAAQ,IAAI,MAAM,MAAM,UAAU;AAC7D,YAAI,eAAe,WAAW,MAAM;AAClC,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,WAAW,aAAa,MAAM,MAAM,UAAU;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU,MAAM,GAAG;AAC5D,UAAI,CAAC,MAAM,UAAU;AACnB;AAAA,MACF;AAEA,UAAI,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,IAAI,EAAE,QAAQ;AACzD,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,WAAW,UAAU,IAAI;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AACF;;;ACtEO,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACtBA,SAAS,KAAAC,UAAS;AAEX,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,IAAIA,GAAE,OAAO,EAAE,KAAK;AAAA,EACpB,WAAWA,GAAE,OAAO;AAAA,EACpB,YAAYA,GAAE,OAAO;AAAA,EACrB,cAAcA,GAAE,OAAO;AAAA,EACvB,eAAeA,GAAE,OAAO;AAAA,EACxB,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,WAAWA,GAAE,OAAO,KAAK;AAAA,EACzB,YAAYA,GAAE,OAAO,KAAK,EAAE,SAAS;AACvC,CAAC;;;ACiBM,SAAS,cAAc,YAA0B,YAA2C;AACjG,QAAM,UAA2B,CAAC;AAElC,aAAW,CAAC,eAAe,YAAY,KAAK,OAAO,QAAQ,WAAW,UAAU,GAAG;AACjF,UAAM,oBAAoB,WAAW,WAAW,aAAa;AAC7D,QAAI,mBAAmB,mBAAmB,aAAa,gBAAgB;AACrE,cAAQ,KAAK,EAAE,MAAM,qBAAqB,WAAW,aAAa,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,aAAW,iBAAiB,OAAO,KAAK,WAAW,UAAU,GAAG;AAC9D,QAAI,CAAC,WAAW,WAAW,aAAa,GAAG;AACzC,cAAQ,KAAK,EAAE,MAAM,qBAAqB,cAAc,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,aAAW,CAAC,YAAY,SAAS,KAAK,OAAO,QAAQ,WAAW,QAAQ,GAAG;AACzE,UAAM,iBAAiB,WAAW,SAAS,UAAU;AACrD,QAAI,gBAAgB,mBAAmB,UAAU,gBAAgB;AAC/D,cAAQ,KAAK,EAAE,MAAM,kBAAkB,QAAQ,UAAU,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,aAAW,cAAc,OAAO,KAAK,WAAW,QAAQ,GAAG;AACzD,QAAI,CAAC,WAAW,SAAS,UAAU,GAAG;AACpC,cAAQ,KAAK,EAAE,MAAM,kBAAkB,WAAW,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,YACA,UACA,QACM;AACN,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,iBAAW,OAAO,UAAU,IAAI,IAAI,OAAO;AAC3C;AAAA,IACF,KAAK;AACH,eAAS,OAAO,OAAO,IAAI,IAAI,OAAO;AACtC;AAAA,IACF,KAAK;AACH,aAAO,WAAW,OAAO,aAAa;AACtC;AAAA,IACF,KAAK;AACH,aAAO,SAAS,OAAO,UAAU;AACjC;AAAA,EACJ;AACF;;;AC1EO,SAAS,mBACd,IACA,EAAE,SAAS,KAAK,gBAAgB,IAAK,IAAyB,CAAC,GAC/D;AACA,MAAI,QAAa,CAAC;AAClB,MAAI,gBAAuC;AAC3C,MAAI,iBAAwC;AAC5C,MAAI,qBAAoC;AAExC,iBAAe,eAAe;AAC5B,QAAI,MAAM,WAAW,EAAG;AAExB,UAAM,eAAe;AACrB,YAAQ,CAAC;AAET,UAAM,GAAG,YAAY;AAGrB,QAAI,gBAAgB;AAClB,mBAAa,cAAc;AAC3B,uBAAiB;AAAA,IACnB;AACA,yBAAqB;AAAA,EACvB;AAEA,WAAS,WAAW;AAClB,QAAI,cAAe,cAAa,aAAa;AAC7C,oBAAgB,WAAW,MAAM;AAC/B,sBAAgB;AAChB,WAAK,aAAa;AAAA,IACpB,GAAG,MAAM;AAGT,QAAI,CAAC,oBAAoB;AACvB,2BAAqB,KAAK,IAAI;AAC9B,uBAAiB,WAAW,MAAM;AAChC,YAAI,cAAe,cAAa,aAAa;AAC7C,wBAAgB;AAChB,aAAK,aAAa;AAAA,MACpB,GAAG,aAAa;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,KAAK,MAAe;AAClB,YAAM,KAAK,IAAI;AACf,eAAS;AAAA,IACX;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,QAAuB;AAC3B,UAAI,eAAe;AACjB,qBAAa,aAAa;AAC1B,wBAAgB;AAAA,MAClB;AACA,UAAI,gBAAgB;AAClB,qBAAa,cAAc;AAC3B,yBAAiB;AAAA,MACnB;AACA,YAAM,aAAa;AAAA,IACrB;AAAA,EACF;AACF;","names":["z","z","nodeId","resolvedInputs","isUnitModel","isUnitModel","z"]}
@@ -1,234 +0,0 @@
1
- // src/common/utils.ts
2
- import { z } from "zod";
3
- async function runWithRetryOnError(runner, tryHandleError, maxRetries = 1) {
4
- let lastError;
5
- for (let i = 0; i < maxRetries + 1; i++) {
6
- try {
7
- return await runner();
8
- } catch (e) {
9
- lastError = e;
10
- if (await tryHandleError(e)) {
11
- continue;
12
- }
13
- throw e;
14
- }
15
- }
16
- throw lastError;
17
- }
18
- var AbortError = class extends Error {
19
- constructor(options) {
20
- super("Operation aborted", options);
21
- }
22
- };
23
- function isAbortError(error) {
24
- return error instanceof Error && error.name === "AbortError";
25
- }
26
- var abortMessagePatterns = ["Operation aborted", "Command was killed with SIGINT"];
27
- function isAbortErrorLike(error) {
28
- if (error instanceof Error) {
29
- return abortMessagePatterns.some((pattern) => error.message.includes(pattern));
30
- }
31
- return false;
32
- }
33
- function tryWrapAbortErrorLike(error) {
34
- if (isAbortErrorLike(error)) {
35
- return new AbortError({ cause: error });
36
- }
37
- return error;
38
- }
39
- var stringArrayType = z.string().transform((args) => args.split(",").map((arg) => arg.trim()));
40
- function errorToString(error) {
41
- if (error instanceof Error) {
42
- return error.stack || error.message;
43
- }
44
- return JSON.stringify(error);
45
- }
46
-
47
- // src/common/pulumi.ts
48
- import { BetterLock } from "better-lock";
49
- var LocalPulumiHost = class _LocalPulumiHost {
50
- constructor(logger) {
51
- this.logger = logger;
52
- }
53
- lock = new BetterLock();
54
- async getCurrentUser() {
55
- const { LocalWorkspace } = await import("@pulumi/pulumi/automation/index.js");
56
- const workspace = await LocalWorkspace.create({});
57
- try {
58
- return await workspace.whoAmI();
59
- } catch (error) {
60
- this.logger.error({ msg: "failed to get current user", error });
61
- return null;
62
- }
63
- }
64
- async runEmpty(options, fn, signal) {
65
- const { projectId, pulumiProjectName, pulumiStackName, envVars } = options;
66
- return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {
67
- const { LocalWorkspace } = await import("@pulumi/pulumi/automation/index.js");
68
- const stack = await LocalWorkspace.createOrSelectStack(
69
- {
70
- projectName: pulumiProjectName,
71
- stackName: pulumiStackName,
72
- program: () => Promise.resolve()
73
- },
74
- {
75
- projectSettings: {
76
- name: pulumiProjectName,
77
- runtime: "nodejs"
78
- },
79
- envVars: {
80
- PULUMI_CONFIG_PASSPHRASE: this.getPassword(projectId),
81
- PULUMI_K8S_AWAIT_ALL: "true",
82
- ...envVars
83
- }
84
- }
85
- );
86
- signal?.throwIfAborted();
87
- try {
88
- return await runWithRetryOnError(
89
- () => fn(stack),
90
- (error) => this.tryUnlockStack(stack, error)
91
- );
92
- } catch (e) {
93
- if (e instanceof Error && e.message.includes("canceled")) {
94
- throw new AbortError();
95
- }
96
- throw e;
97
- }
98
- });
99
- }
100
- async runLocal(options, fn, signal) {
101
- const { projectId, pulumiProjectName, pulumiStackName, projectPath, stackConfig, envVars } = options;
102
- return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {
103
- const { LocalWorkspace } = await import("@pulumi/pulumi/automation/index.js");
104
- const stack = await LocalWorkspace.createOrSelectStack(
105
- {
106
- stackName: pulumiStackName,
107
- workDir: projectPath
108
- },
109
- {
110
- projectSettings: {
111
- name: pulumiProjectName,
112
- runtime: "nodejs"
113
- },
114
- stackSettings: stackConfig ? {
115
- [pulumiStackName]: {
116
- config: stackConfig
117
- }
118
- } : void 0,
119
- envVars: {
120
- PULUMI_CONFIG_PASSPHRASE: this.getPassword(projectId),
121
- PULUMI_K8S_AWAIT_ALL: "true",
122
- ...envVars
123
- }
124
- }
125
- );
126
- signal?.throwIfAborted();
127
- try {
128
- return await runWithRetryOnError(
129
- () => fn(stack),
130
- (error) => this.tryUnlockStack(stack, error)
131
- );
132
- } catch (e) {
133
- if (e instanceof Error && e.message.includes("canceled")) {
134
- throw new AbortError();
135
- }
136
- throw e;
137
- }
138
- });
139
- }
140
- sharedPassword = process.env.PULUMI_CONFIG_PASSPHRASE ?? "";
141
- passwords = /* @__PURE__ */ new Map();
142
- hasPassword(projectId) {
143
- return !!this.sharedPassword || this.passwords.has(projectId);
144
- }
145
- setPassword(projectId, password) {
146
- this.passwords.set(projectId, password);
147
- }
148
- removePassword(projectId) {
149
- this.passwords.delete(projectId);
150
- }
151
- getPassword(projectId) {
152
- return this.sharedPassword || this.passwords.get(projectId) || "";
153
- }
154
- async tryUnlockStack(stack, error) {
155
- if (error instanceof Error && error.message.includes("the stack is currently locked")) {
156
- this.logger.warn({ stackName: stack.name }, "inlocking stack");
157
- await stack.cancel();
158
- return true;
159
- }
160
- return false;
161
- }
162
- static create(logger) {
163
- return new _LocalPulumiHost(logger.child({ service: "LocalPulumiHost" }));
164
- }
165
- };
166
- function valueToString(value) {
167
- if (typeof value === "string") {
168
- return value;
169
- }
170
- return JSON.stringify(value);
171
- }
172
- function stringToValue(value) {
173
- try {
174
- return JSON.parse(value);
175
- } catch {
176
- return value;
177
- }
178
- }
179
- function updateResourceCount(opType, currentCount) {
180
- switch (opType) {
181
- case "same":
182
- case "create":
183
- case "update":
184
- case "replace":
185
- case "create-replacement":
186
- case "import":
187
- case "import-replacement":
188
- return currentCount + 1;
189
- case "delete":
190
- case "delete-replaced":
191
- case "discard":
192
- case "discard-replaced":
193
- case "remove-pending-replace":
194
- return currentCount - 1;
195
- case "refresh":
196
- case "read-replacement":
197
- case "read":
198
- return currentCount;
199
- default:
200
- throw new Error(`Unknown operation type: ${opType}`);
201
- }
202
- }
203
-
204
- // src/common/local.ts
205
- import { basename } from "node:path";
206
- import { findWorkspaceDir, readPackageJSON } from "pkg-types";
207
- async function resolveMainLocalProject(projectPath, projectName) {
208
- if (!projectPath) {
209
- projectPath = await findWorkspaceDir();
210
- }
211
- if (!projectName) {
212
- const packageJson = await readPackageJSON(projectPath);
213
- projectName = packageJson.name;
214
- }
215
- if (!projectName) {
216
- projectName = basename(projectPath);
217
- }
218
- return [projectPath, projectName];
219
- }
220
-
221
- export {
222
- runWithRetryOnError,
223
- isAbortError,
224
- isAbortErrorLike,
225
- tryWrapAbortErrorLike,
226
- stringArrayType,
227
- errorToString,
228
- LocalPulumiHost,
229
- valueToString,
230
- stringToValue,
231
- updateResourceCount,
232
- resolveMainLocalProject
233
- };
234
- //# sourceMappingURL=chunk-WXDYCRTT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/utils.ts","../src/common/pulumi.ts","../src/common/local.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport async function runWithRetryOnError<T>(\n runner: () => T | Promise<T>,\n tryHandleError: (error: unknown) => boolean | Promise<boolean>,\n maxRetries: number = 1,\n): Promise<T> {\n let lastError: unknown\n\n for (let i = 0; i < maxRetries + 1; i++) {\n try {\n return await runner()\n } catch (e) {\n lastError = e\n\n if (await tryHandleError(e)) {\n continue\n }\n\n throw e\n }\n }\n\n throw lastError\n}\n\nexport class AbortError extends Error {\n constructor(options?: ErrorOptions) {\n super(\"Operation aborted\", options)\n }\n}\n\nexport function isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\"\n}\n\nconst abortMessagePatterns = [\"Operation aborted\", \"Command was killed with SIGINT\"]\n\nexport function isAbortErrorLike(error: unknown): boolean {\n if (error instanceof Error) {\n return abortMessagePatterns.some(pattern => error.message.includes(pattern))\n }\n\n return false\n}\n\nexport function tryWrapAbortErrorLike(error: unknown): unknown {\n if (isAbortErrorLike(error)) {\n return new AbortError({ cause: error })\n }\n\n return error\n}\n\nexport const stringArrayType = z.string().transform(args => args.split(\",\").map(arg => arg.trim()))\n\nexport function errorToString(error: unknown): string {\n if (error instanceof Error) {\n return error.stack || error.message\n }\n\n return JSON.stringify(error)\n}\n","import type { ConfigMap, OpMap, OpType, Stack, WhoAmIResult } from \"@pulumi/pulumi/automation\"\nimport type { Logger } from \"pino\"\nimport { BetterLock } from \"better-lock\"\nimport { AbortError, runWithRetryOnError } from \"./utils\"\n\nexport type RunOptions = {\n projectId: string\n pulumiProjectName: string\n pulumiStackName: string\n envVars?: Record<string, string>\n}\n\nexport type RunLocalOptions = RunOptions & {\n projectPath: string\n stackConfig?: ConfigMap\n}\n\nexport class LocalPulumiHost {\n private lock = new BetterLock()\n\n private constructor(private readonly logger: Logger) {}\n\n async getCurrentUser(): Promise<WhoAmIResult | null> {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n const workspace = await LocalWorkspace.create({})\n\n try {\n return await workspace.whoAmI()\n } catch (error) {\n this.logger.error({ msg: \"failed to get current user\", error })\n\n return null\n }\n }\n\n async runEmpty<T>(\n options: RunOptions,\n fn: (stack: Stack) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n const { projectId, pulumiProjectName, pulumiStackName, envVars } = options\n\n return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n const stack = await LocalWorkspace.createOrSelectStack(\n {\n projectName: pulumiProjectName,\n stackName: pulumiStackName,\n program: () => Promise.resolve(),\n },\n {\n projectSettings: {\n name: pulumiProjectName,\n runtime: \"nodejs\",\n },\n envVars: {\n PULUMI_CONFIG_PASSPHRASE: this.getPassword(projectId),\n PULUMI_K8S_AWAIT_ALL: \"true\",\n ...envVars,\n },\n },\n )\n\n signal?.throwIfAborted()\n\n try {\n return await runWithRetryOnError(\n () => fn(stack),\n error => this.tryUnlockStack(stack, error),\n )\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"canceled\")) {\n throw new AbortError()\n }\n\n throw e\n }\n })\n }\n\n async runLocal<T>(\n options: RunLocalOptions,\n fn: (stack: Stack) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n const { projectId, pulumiProjectName, pulumiStackName, projectPath, stackConfig, envVars } =\n options\n\n return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n const stack = await LocalWorkspace.createOrSelectStack(\n {\n stackName: pulumiStackName,\n workDir: projectPath,\n },\n {\n projectSettings: {\n name: pulumiProjectName,\n runtime: \"nodejs\",\n },\n stackSettings: stackConfig\n ? {\n [pulumiStackName]: {\n config: stackConfig,\n },\n }\n : undefined,\n envVars: {\n PULUMI_CONFIG_PASSPHRASE: this.getPassword(projectId),\n PULUMI_K8S_AWAIT_ALL: \"true\",\n ...envVars,\n },\n },\n )\n\n signal?.throwIfAborted()\n\n try {\n return await runWithRetryOnError(\n () => fn(stack),\n error => this.tryUnlockStack(stack, error),\n )\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"canceled\")) {\n throw new AbortError()\n }\n\n throw e\n }\n })\n }\n\n private sharedPassword: string = process.env.PULUMI_CONFIG_PASSPHRASE ?? \"\"\n private passwords = new Map<string, string>()\n\n hasPassword(projectId: string) {\n return !!this.sharedPassword || this.passwords.has(projectId)\n }\n\n setPassword(projectId: string, password: string) {\n this.passwords.set(projectId, password)\n }\n\n removePassword(projectId: string) {\n this.passwords.delete(projectId)\n }\n\n private getPassword(projectId: string) {\n return this.sharedPassword || this.passwords.get(projectId) || \"\"\n }\n\n async tryUnlockStack(stack: Stack, error: unknown) {\n if (error instanceof Error && error.message.includes(\"the stack is currently locked\")) {\n // TODO: kill the process if the hostname matches the current hostname\n\n this.logger.warn({ stackName: stack.name }, \"inlocking stack\")\n await stack.cancel()\n return true\n }\n\n return false\n }\n\n static create(logger: Logger) {\n return new LocalPulumiHost(logger.child({ service: \"LocalPulumiHost\" }))\n }\n}\n\nexport function valueToString(value: unknown): string {\n if (typeof value === \"string\") {\n return value\n }\n\n return JSON.stringify(value)\n}\n\nexport function stringToValue(value: string): unknown {\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport function updateResourceCount(opType: OpType, currentCount: number): number {\n switch (opType) {\n case \"same\":\n case \"create\":\n case \"update\":\n case \"replace\":\n case \"create-replacement\":\n case \"import\":\n case \"import-replacement\":\n return currentCount + 1\n\n case \"delete\":\n case \"delete-replaced\":\n case \"discard\":\n case \"discard-replaced\":\n case \"remove-pending-replace\":\n return currentCount - 1\n\n case \"refresh\":\n case \"read-replacement\":\n case \"read\":\n return currentCount\n\n default:\n throw new Error(`Unknown operation type: ${opType as string}`)\n }\n}\n\nexport function calculateTotalResources(opMap: OpMap | undefined): number {\n if (!opMap) {\n return 0 // No operations imply no resources\n }\n\n let total = 0\n\n for (const [op, count] of Object.entries(opMap)) {\n const opType = op as OpType\n const value = count ?? 0\n\n total = updateResourceCount(opType, value)\n }\n\n return total\n}\n","import { basename } from \"node:path\"\nimport { findWorkspaceDir, readPackageJSON } from \"pkg-types\"\n\nexport async function resolveMainLocalProject(\n projectPath?: string,\n projectName?: string,\n): Promise<[projecPath: string, projectName: string]> {\n if (!projectPath) {\n projectPath = await findWorkspaceDir()\n }\n\n if (!projectName) {\n const packageJson = await readPackageJSON(projectPath)\n projectName = packageJson.name\n }\n\n if (!projectName) {\n projectName = basename(projectPath)\n }\n\n return [projectPath, projectName]\n}\n"],"mappings":"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","names":[]}
@@ -1,114 +0,0 @@
1
- import type { Logger } from "pino"
2
- import type { Jiti } from "jiti"
3
- import Module from "node:module"
4
- import {
5
- type Component,
6
- type Entity,
7
- isComponent,
8
- isEntity,
9
- isUnitModel,
10
- originalCreate,
11
- } from "@highstate/contract"
12
- import { serializeFunction } from "@pulumi/pulumi/runtime/index.js"
13
- import { sha256 } from "crypto-hash"
14
-
15
- declare module "module" {
16
- // eslint-disable-next-line @typescript-eslint/no-namespace
17
- namespace Module {
18
- function _load(request: unknown, parent: unknown, isMain: boolean): unknown
19
- }
20
- }
21
-
22
- const originalLoad = Module._load
23
-
24
- Module._load = function (request: unknown, parent: unknown, isMain: boolean) {
25
- if (request === "trace_events") {
26
- return {}
27
- }
28
-
29
- return originalLoad(request, parent, isMain)
30
- }
31
-
32
- export type Library = Readonly<{
33
- components: Readonly<Record<string, Component>>
34
- entities: Readonly<Record<string, Entity>>
35
- }>
36
-
37
- export async function loadLibrary(
38
- jiti: Jiti,
39
- logger: Logger,
40
- modulePaths: string[],
41
- ): Promise<Library> {
42
- const modules: Record<string, unknown> = {}
43
- for (const modulePath of modulePaths) {
44
- try {
45
- logger.debug({ modulePath }, "loading module")
46
- modules[modulePath] = await jiti.import(modulePath)
47
-
48
- logger.debug({ modulePath }, "module loaded")
49
- } catch (err) {
50
- logger.error({ modulePath, err }, "module load failed")
51
- }
52
- }
53
-
54
- const components: Record<string, Component> = {}
55
- const entities: Record<string, Entity> = {}
56
-
57
- await _loadLibrary(modules, components, entities)
58
-
59
- logger.info(
60
- {
61
- componentCount: Object.keys(components).length,
62
- entityCount: Object.keys(entities).length,
63
- },
64
- "library loaded",
65
- )
66
-
67
- logger.trace({ components, entities }, "library content")
68
-
69
- return { components, entities }
70
- }
71
-
72
- async function _loadLibrary(
73
- value: unknown,
74
- components: Record<string, Component>,
75
- entities: Record<string, Entity>,
76
- ): Promise<void> {
77
- if (isComponent(value)) {
78
- components[value.model.type] = value
79
- value.model.definitionHash = await calculateComponentDefinitionHash(value)
80
-
81
- for (const entity of value.entities.values()) {
82
- entity.definitionHash ??= await calculateEntityDefinitionHash(entity)
83
- }
84
- return
85
- }
86
-
87
- if (isEntity(value)) {
88
- entities[value.type] = value
89
- entities[value.type].definitionHash ??= await calculateEntityDefinitionHash(value)
90
- return
91
- }
92
-
93
- if (typeof value !== "object" || value === null) {
94
- return
95
- }
96
-
97
- for (const key in value) {
98
- await _loadLibrary((value as Record<string, unknown>)[key], components, entities)
99
- }
100
- }
101
-
102
- async function calculateComponentDefinitionHash(component: Component): Promise<string> {
103
- if (isUnitModel(component.model)) {
104
- return await sha256(JSON.stringify(component.model))
105
- }
106
-
107
- const serializedCreate = await serializeFunction(component[originalCreate])
108
-
109
- return await sha256(JSON.stringify(component.model) + serializedCreate.text)
110
- }
111
-
112
- async function calculateEntityDefinitionHash(entity: Entity): Promise<string> {
113
- return await sha256(JSON.stringify(entity))
114
- }
@@ -1 +0,0 @@
1
- export interface PreferencesBackend {}
@@ -1,39 +0,0 @@
1
- import type { BetterLock as BetterLockType } from "better-lock/dist/better_lock"
2
- import { BetterLock } from "better-lock"
3
-
4
- export class ProjectLock {
5
- constructor(private readonly lock: BetterLockType, private readonly projectId: string) {}
6
-
7
- canImmediatelyAcquireLock(instanceId: string): boolean {
8
- return this.lock.canAcquire(`${this.projectId}/${instanceId}`)
9
- }
10
-
11
- canImmediatelyAcquireLocks(instanceIds: string[]): boolean {
12
- for (const instanceId of instanceIds) {
13
- if (!this.canImmediatelyAcquireLock(instanceId)) {
14
- return false
15
- }
16
- }
17
-
18
- return true
19
- }
20
-
21
- lockInstance<T>(instanceId: string, fn: () => Promise<T>): Promise<T> {
22
- return this.lock.acquire(`${this.projectId}/${instanceId}`, fn)
23
- }
24
-
25
- lockInstances<T>(instanceIds: string[], fn: () => Promise<T>): Promise<T> {
26
- return this.lock.acquire(
27
- instanceIds.map(id => `${this.projectId}/${id}`),
28
- fn,
29
- )
30
- }
31
- }
32
-
33
- export class ProjectLockManager {
34
- private readonly lock = new BetterLock()
35
-
36
- getLock(projectId: string) {
37
- return new ProjectLock(this.lock, projectId)
38
- }
39
- }
@@ -1,59 +0,0 @@
1
- export class SecretAccessDeniedError extends Error {
2
- constructor(projectId: string, key: string) {
3
- super(`Access to the secrets of component "${projectId}.${key}" is denied.`)
4
- }
5
- }
6
-
7
- export interface SecretBackend {
8
- /**
9
- * Check if the state and secrets of the project are locked.
10
- * The backend may not implement this method.
11
- *
12
- * @param projectId The ID of the project.
13
- * @param signal The signal to abort the operation.
14
- *
15
- * @returns `true` if the project is locked, `false` if the project is unlocked.
16
- */
17
- isLocked?(projectId: string, signal?: AbortSignal): Promise<boolean>
18
-
19
- /**
20
- * Unlock the state and secrets of the project.
21
- * The backend may not implement this method.
22
- *
23
- * @param projectId The ID of the project.
24
- * @param password The password to unlock the secrets.
25
- * @param signal The signal to abort the operation.
26
- *
27
- * @returns `true` if the project is unlocked, `false` if the password is incorrect.
28
- */
29
- unlock?(projectId: string, password: string, signal?: AbortSignal): Promise<boolean>
30
-
31
- /**
32
- * Get the secrets of the component.
33
- *
34
- * @param projectId The ID of the project.
35
- * @param instanceId The ID of the instance.
36
- * @param signal The signal to abort the operation.
37
- *
38
- * @returns A record of secret key-value pairs or `null` if the secrets are not found.
39
- * @throws {SecretAccessDeniedError} If access to the secrets is denied.
40
- */
41
- get(projectId: string, instanceId: string, signal?: AbortSignal): Promise<Record<string, unknown>>
42
-
43
- /**
44
- * Set the secrets of the component.
45
- *
46
- * @param projectId The ID of the project.
47
- * @param instanceId The ID of the instance.
48
- * @param values The record of secret key-value pairs.
49
- * @param signal The signal to abort the operation.
50
- *
51
- * @throws {SecretAccessDeniedError} If access to the secrets is denied.
52
- */
53
- set(
54
- projectId: string,
55
- instanceId: string,
56
- values: Record<string, unknown>,
57
- signal?: AbortSignal,
58
- ): Promise<void>
59
- }
@@ -1,22 +0,0 @@
1
- import type { SecretBackend } from "./abstractions"
2
- import type { LocalPulumiHost } from "../common"
3
- import type { Logger } from "pino"
4
- import { z } from "zod"
5
- import { LocalSecretBackend, localSecretBackendConfig } from "./local"
6
-
7
- export const secretBackendConfig = z.object({
8
- HIGHSTATE_BACKEND_SECRET_TYPE: z.enum(["local"]).default("local"),
9
- ...localSecretBackendConfig.shape,
10
- })
11
-
12
- export function createSecretBackend(
13
- config: z.infer<typeof secretBackendConfig>,
14
- localPulumiHost: LocalPulumiHost,
15
- logger: Logger,
16
- ): Promise<SecretBackend> {
17
- switch (config.HIGHSTATE_BACKEND_SECRET_TYPE) {
18
- case "local": {
19
- return LocalSecretBackend.create(config, localPulumiHost, logger)
20
- }
21
- }
22
- }