@highstate/backend 0.9.8 → 0.9.10

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.
@@ -7,9 +7,9 @@ import {
7
7
  type InstanceModel,
8
8
  } from "@highstate/contract"
9
9
  import { fromEntries, mapValues } from "remeda"
10
- import { defineGraphResolver } from "./graph-resolver"
10
+ import { GraphResolver } from "./graph-resolver"
11
11
 
12
- export type InputResolverInput =
12
+ export type InputResolverNode =
13
13
  | {
14
14
  kind: "instance"
15
15
  instance: InstanceModel
@@ -28,6 +28,7 @@ export type ResolvedInstanceInput = {
28
28
  export type InputResolverOutput =
29
29
  | {
30
30
  kind: "instance"
31
+ instance: InstanceModel
31
32
  component: ComponentModel
32
33
  resolvedInputs: Record<string, ResolvedInstanceInput[]>
33
34
  resolvedOutputs: Record<string, InstanceInput[]> | undefined
@@ -42,17 +43,16 @@ export type InputResolverOutput =
42
43
  /**
43
44
  * Resolves the all recursive instance and hub inputs based on its direct inputs and injected inputs.
44
45
  */
45
- export const createInputResolver = defineGraphResolver<InputResolverInput, InputResolverOutput>({
46
- name: "input-resolver",
47
- getNodeId(node) {
48
- if (node.kind === "hub") {
49
- return `hub:${node.hub.id}`
50
- }
51
-
52
- return `instance:${node.instance.id}`
53
- },
54
-
55
- getNodeDependencies(node) {
46
+ export class InputResolver extends GraphResolver<InputResolverNode, InputResolverOutput> {
47
+ // constructor(
48
+ // nodes: ReadonlyMap<string, InputResolverNode>,
49
+ // logger: Logger,
50
+ // outputHandler?: ResolverOutputHandler<InputResolverOutput>,
51
+ // ) {
52
+ // super(nodes, logger, outputHandler)
53
+ // }
54
+
55
+ getNodeDependencies(node: InputResolverNode): string[] {
56
56
  const dependencies: string[] = []
57
57
 
58
58
  if (node.kind === "hub") {
@@ -84,11 +84,11 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
84
84
  }
85
85
 
86
86
  return dependencies
87
- },
87
+ }
88
88
 
89
- process(node, dependencies, logger) {
89
+ processNode(node: InputResolverNode): InputResolverOutput {
90
90
  const getHubOutput = (input: HubInput) => {
91
- const output = dependencies.get(`hub:${input.hubId}`)
91
+ const output = this.outputs.get(`hub:${input.hubId}`)
92
92
  if (!output) {
93
93
  return { resolvedInputs: [] }
94
94
  }
@@ -101,7 +101,7 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
101
101
  }
102
102
 
103
103
  const getInstanceOutput = (input: InstanceInput) => {
104
- const output = dependencies.get(`instance:${input.instanceId}`)
104
+ const output = this.outputs.get(`instance:${input.instanceId}`)
105
105
  if (!output) {
106
106
  return {
107
107
  component: null,
@@ -122,7 +122,6 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
122
122
  }
123
123
 
124
124
  // resolve inputs for hub
125
-
126
125
  if (node.kind === "hub") {
127
126
  const hubResult: Map<string, ResolvedInstanceInput> = new Map()
128
127
 
@@ -135,7 +134,7 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
135
134
  const componentInput = component?.outputs[input.output]
136
135
 
137
136
  if (!componentInput) {
138
- logger.warn({ msg: "output not found in the component", input, component })
137
+ this.logger.warn({ msg: "output not found in the component", input, component })
139
138
  continue
140
139
  }
141
140
 
@@ -160,11 +159,12 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
160
159
  if (node.instance.resolvedInputs) {
161
160
  return {
162
161
  kind: "instance",
162
+ instance: node.instance,
163
163
  component: node.component,
164
164
  resolvedInputs: mapValues(node.instance.resolvedInputs, (inputs, inputName) => {
165
165
  const componentInput = node.component.inputs[inputName]
166
166
  if (!componentInput) {
167
- logger.warn({
167
+ this.logger.warn({
168
168
  msg: "input not found in the component",
169
169
  inputName,
170
170
  component: node.component,
@@ -181,7 +181,6 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
181
181
  }
182
182
 
183
183
  // resolve inputs for instance
184
-
185
184
  const resolvedInputsMap: Map<string, Map<string, ResolvedInstanceInput>> = new Map()
186
185
 
187
186
  const addInstanceResult = (inputName: string, input: ResolvedInstanceInput) => {
@@ -197,14 +196,18 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
197
196
  const addInstanceInput = (inputName: string, input: InstanceInput) => {
198
197
  const componentInput = node.component.inputs[inputName]
199
198
  if (!componentInput) {
200
- logger.warn({ msg: "input not found in the component", input, component: node.component })
199
+ this.logger.warn({
200
+ msg: "input not found in the component",
201
+ input,
202
+ component: node.component,
203
+ })
201
204
  return
202
205
  }
203
206
 
204
207
  const { component, resolvedOutputs } = getInstanceOutput(input)
205
208
 
206
209
  if (!component) {
207
- logger.warn({ instanceId: node.instance.id, input }, "no output found for the input")
210
+ this.logger.warn({ instanceId: node.instance.id, input }, "no output found for the input")
208
211
  return
209
212
  }
210
213
 
@@ -219,7 +222,6 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
219
222
  }
220
223
  } else {
221
224
  // if the instance is not evaluated, we a forced to use the input as is
222
-
223
225
  addInstanceResult(inputName, { input, type: componentInput.type })
224
226
  }
225
227
  }
@@ -272,14 +274,15 @@ export const createInputResolver = defineGraphResolver<InputResolverInput, Input
272
274
 
273
275
  return {
274
276
  kind: "instance",
277
+ instance: node.instance,
275
278
  component: node.component,
276
279
  resolvedInputs,
277
280
  resolvedOutputs: node.instance.resolvedOutputs,
278
281
  resolvedInjectionInputs: Array.from(injectionInputs.values()),
279
282
  matchedInjectionInputs: Array.from(matchedInjectionInputs.values()),
280
283
  }
281
- },
282
- })
284
+ }
285
+ }
283
286
 
284
287
  export function getResolvedHubInputs(output: InputResolverOutput): ResolvedInstanceInput[] {
285
288
  if (output.kind !== "hub") {
@@ -1,10 +1,20 @@
1
- import type { GraphResolverFactory } from "./graph-resolver"
2
- import { createInputResolver } from "./input"
3
- import { createInputHashResolver } from "./input-hash"
4
- import { createValidationResolver } from "./validation"
1
+ import type { Logger } from "pino"
2
+ import type { GraphResolver, ResolverOutputHandler } from "./graph-resolver"
3
+ import { InputResolver } from "./input"
4
+ import { InputHashResolver } from "./input-hash"
5
+ import { ValidationResolver } from "./validation"
5
6
 
6
- export const resolverFactories: Record<string, GraphResolverFactory<any, any>> = {
7
- [createInputResolver.factoryName]: createInputResolver,
8
- [createInputHashResolver.factoryName]: createInputHashResolver,
9
- [createValidationResolver.factoryName]: createValidationResolver,
10
- }
7
+ export type GraphResolverType = "InputResolver" | "InputHashResolver" | "ValidationResolver"
8
+
9
+ export const resolverFactories = {
10
+ InputResolver,
11
+ InputHashResolver,
12
+ ValidationResolver,
13
+ } as Record<
14
+ GraphResolverType,
15
+ new (
16
+ nodes: ReadonlyMap<string, unknown>,
17
+ logger: Logger,
18
+ outputHandler?: ResolverOutputHandler<unknown>,
19
+ ) => GraphResolver<unknown, unknown>
20
+ >
@@ -1,15 +1,15 @@
1
1
  import type { ComponentModel, InstanceModel } from "@highstate/contract"
2
2
  import type { ResolvedInstanceInput } from "./input"
3
3
  import { Ajv } from "ajv"
4
- import { defineGraphResolver } from "./graph-resolver"
4
+ import { GraphResolver } from "./graph-resolver"
5
5
 
6
- export type ValidationResolverInput = {
6
+ export type ValidationNode = {
7
7
  instance: InstanceModel
8
8
  component: ComponentModel
9
9
  resolvedInputs: Record<string, ResolvedInstanceInput[]>
10
10
  }
11
11
 
12
- export type ValidationResolverOutput =
12
+ export type ValidationOutput =
13
13
  | {
14
14
  status: "ok"
15
15
  }
@@ -25,14 +25,8 @@ export type ValidationResolverOutput =
25
25
  /**
26
26
  * Validates the instance based on its arguments and inputs.
27
27
  */
28
- export const createValidationResolver = defineGraphResolver<
29
- ValidationResolverInput,
30
- ValidationResolverOutput
31
- >({
32
- name: "validation-resolver",
33
- getNodeId: node => node.instance.id,
34
-
35
- getNodeDependencies({ resolvedInputs }) {
28
+ export class ValidationResolver extends GraphResolver<ValidationNode, ValidationOutput> {
29
+ getNodeDependencies({ resolvedInputs }: ValidationNode): string[] {
36
30
  const dependencies: string[] = []
37
31
 
38
32
  for (const inputs of Object.values(resolvedInputs)) {
@@ -42,12 +36,12 @@ export const createValidationResolver = defineGraphResolver<
42
36
  }
43
37
 
44
38
  return dependencies
45
- },
39
+ }
46
40
 
47
- process({ instance, component, resolvedInputs }, dependencies, logger) {
41
+ processNode({ instance, component, resolvedInputs }: ValidationNode): ValidationOutput {
48
42
  const ajv = new Ajv({ strict: false })
49
43
 
50
- logger.debug({ instanceId: instance.id }, "validating instance")
44
+ this.logger.debug({ instanceId: instance.id }, "validating instance")
51
45
 
52
46
  for (const [name, argument] of Object.entries(component.args)) {
53
47
  if (!argument.required && !instance.args?.[name]) {
@@ -55,7 +49,7 @@ export const createValidationResolver = defineGraphResolver<
55
49
  }
56
50
 
57
51
  if (!ajv.validate(argument.schema, instance.args?.[name])) {
58
- logger.debug({ instanceId: instance.id, argumentName: name }, "invalid argument")
52
+ this.logger.debug({ instanceId: instance.id, argumentName: name }, "invalid argument")
59
53
 
60
54
  return {
61
55
  status: "invalid-args",
@@ -66,7 +60,7 @@ export const createValidationResolver = defineGraphResolver<
66
60
 
67
61
  for (const inputs of Object.values(resolvedInputs)) {
68
62
  for (const input of inputs) {
69
- const inputInstance = dependencies.get(input.input.instanceId)
63
+ const inputInstance = this.outputs.get(input.input.instanceId)
70
64
  if (inputInstance?.status !== "ok") {
71
65
  return {
72
66
  status: "invalid-inputs",
@@ -90,5 +84,5 @@ export const createValidationResolver = defineGraphResolver<
90
84
  }
91
85
 
92
86
  return { status: "ok" }
93
- },
94
- })
87
+ }
88
+ }
@@ -143,12 +143,11 @@ export interface StateBackend {
143
143
  getCompositeInstance(projectId: string, instanceId: string): Promise<CompositeInstance | null>
144
144
 
145
145
  /**
146
- * Gets the input hash of the evaluated composite instance.
146
+ * Gets the input hashes of the evaluated composite instances.
147
147
  *
148
148
  * @param projectId The ID of the project.
149
- * @param instanceId The ID of the instance.
150
149
  */
151
- getCompositeInstanceInputHash(projectId: string, instanceId: string): Promise<string | null>
150
+ getCompositeInstanceInputHashes(projectId: string): Promise<Record<string, string>>
152
151
 
153
152
  /**
154
153
  * Puts the evaluated composite instances of the project to the state.
@@ -219,14 +219,15 @@ export class LocalStateBackend implements StateBackend {
219
219
  return this.getSublevelItem(sublevel, compositeInstanceSchema, instanceId)
220
220
  }
221
221
 
222
- async getCompositeInstanceInputHash(
223
- projectId: string,
224
- instanceId: string,
225
- ): Promise<string | null> {
222
+ async getCompositeInstanceInputHashes(projectId: string): Promise<Record<string, string>> {
226
223
  const sublevel = this.getProjectCompositeInstanceInputHashesSublevel(projectId)
227
- const inputHash = await sublevel.get(instanceId)
228
224
 
229
- return inputHash ?? null
225
+ const result: Record<string, string> = {}
226
+ for await (const [key, value] of sublevel.iterator()) {
227
+ result[key] = value
228
+ }
229
+
230
+ return result
230
231
  }
231
232
 
232
233
  async putCompositeInstances(projectId: string, instances: CompositeInstance[]): Promise<void> {
@@ -243,6 +244,12 @@ export class LocalStateBackend implements StateBackend {
243
244
  value: compositeInstanceSchema.parse(instance),
244
245
  sublevel: sublevel,
245
246
  },
247
+ {
248
+ type: "put",
249
+ key: instance.instance.id,
250
+ value: instance.inputHash ?? "",
251
+ sublevel: inputHashesSublevel,
252
+ },
246
253
  ]),
247
254
  )
248
255
  }
@@ -1,5 +1,4 @@
1
1
  import type { ScreenSize, TerminalBackend } from "./shared"
2
- import type { InstanceTerminal, TerminalSession } from "../shared"
3
2
  import type { Logger } from "pino"
4
3
  import type { StateBackend, TerminalHistoryEntry } from "../state"
5
4
  import type { RunnerBackend } from "../runner"
@@ -7,7 +6,8 @@ import { PassThrough, type Stream, type Writable } from "node:stream"
7
6
  import { EventEmitter, on } from "node:events"
8
7
  import { parseInstanceId } from "@highstate/contract"
9
8
  import { nanoid } from "nanoid"
10
- import { createAsyncBatcher, isAbortErrorLike } from "../common"
9
+ import { type InstanceTerminal, type TerminalSession, createAsyncBatcher } from "../shared"
10
+ import { isAbortErrorLike } from "../common"
11
11
 
12
12
  type ManagedTerminal = {
13
13
  readonly session: TerminalSession
@@ -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\nexport type AsyncBatcherOptions = {\n waitMs?: number\n maxWaitTimeMs?: number\n}\n\nexport function createAsyncBatcher<T>(\n fn: (items: T[]) => Promise<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","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 +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/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"],"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})\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 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 * Builds a map where instance id -> instance state ids that directly depend on the instance.\n *\n * @param instanceStates The instance states to build the map from.\n */\nexport function buildDependentInstanceStateMap(\n instanceStates: Map<string, InstanceState>,\n): Map<string, string[]> {\n const dependentMap = new Map<string, string[]>()\n\n for (const state of instanceStates.values()) {\n for (const dependency of state.dependencyIds) {\n let dependents = dependentMap.get(dependency)\n if (!dependents) {\n dependents = []\n dependentMap.set(dependency, dependents)\n }\n\n dependents.push(state.id)\n }\n }\n\n return dependentMap\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 * 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 * 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`.\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 * 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 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 GraphResolverOptions<TNode, TOutput> = {\n name: string\n\n getNodeId(input: TNode): string\n\n getNodeDependencies(input: TNode): string[]\n\n process(\n node: TNode,\n dependencies: ReadonlyMap<string, TOutput>,\n logger: Logger,\n ): TOutput | Promise<TOutput>\n}\n\nexport interface GraphResolverBackend<TOutput> {\n promiseCache: Map<string, Promise<TOutput>>\n\n setOutput?(id: string, value: TOutput): void\n setDependencies?(id: string, dependencies: string[]): void\n}\n\nexport type GraphResolverFactory<TNode, TOutput> = {\n factoryName: string\n} & ((\n nodes: ReadonlyMap<string, TNode>,\n logger: Logger,\n backend?: GraphResolverBackend<TOutput>,\n) => GraphResolver<TOutput>)\n\nexport type GraphResolver<TOutput> = (id: string) => Promise<TOutput>\n\nexport class CircularDependencyError extends Error {\n constructor(path: string[]) {\n super(`Circular dependency detected: ${path.join(\" -> \")}`)\n this.name = \"CircularDependencyError\"\n }\n}\n\nexport function createDefaultGraphResolverBackend<TOutput>(): GraphResolverBackend<TOutput> {\n const promiseCache = new Map<string, Promise<TOutput>>()\n\n return {\n promiseCache,\n }\n}\n\nexport function defineGraphResolver<TInput, TOutput>(\n options: GraphResolverOptions<TInput, TOutput>,\n): GraphResolverFactory<TInput, TOutput> {\n const factory: GraphResolverFactory<TInput, TOutput> = (nodes, logger, backend) => {\n backend ??= createDefaultGraphResolverBackend<TOutput>()\n logger = logger.child({ resolver: options.name })\n\n const outputs = new Map<string, TOutput>()\n\n const resolver = (itemId: string, dependencyChain: string[]) => {\n logger.trace({ itemId }, \"resolving item\")\n\n const existingPromise = backend.promiseCache.get(itemId)\n if (existingPromise) {\n return existingPromise\n }\n\n if (dependencyChain.includes(itemId)) {\n throw new CircularDependencyError([...dependencyChain, itemId])\n }\n\n const item = nodes.get(itemId)\n if (!item) {\n return Promise.resolve(undefined!)\n }\n\n const resolve = async () => {\n const dependencies = unique(options.getNodeDependencies(item))\n\n backend.setDependencies?.(itemId, dependencies)\n logger.trace({ itemId, dependencies }, \"resolving item dependencies\")\n\n const newChain = [...dependencyChain, itemId]\n\n for (const depId of dependencies) {\n await resolver(depId, newChain)\n }\n\n return await options.process(item, outputs, logger)\n }\n\n const promise = resolve().then(result => {\n if (backend.promiseCache.get(itemId) === promise) {\n // persist the result to the state if provided\n // ignore if the promise has been replaced (which means this calculation was invalidated)\n backend.setOutput?.(itemId, result)\n outputs.set(itemId, result)\n }\n\n return result\n })\n\n backend.promiseCache.set(itemId, promise)\n return promise\n }\n\n return id => resolver(id, [])\n }\n\n factory.factoryName = options.name\n return factory\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 { defineGraphResolver } from \"./graph-resolver\"\n\nexport type InputResolverInput =\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 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 const createInputResolver = defineGraphResolver<InputResolverInput, InputResolverOutput>({\n name: \"input-resolver\",\n getNodeId(node) {\n if (node.kind === \"hub\") {\n return `hub:${node.hub.id}`\n }\n\n return `instance:${node.instance.id}`\n },\n\n getNodeDependencies(node) {\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 process(node, dependencies, logger) {\n const getHubOutput = (input: HubInput) => {\n const output = dependencies.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 = dependencies.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\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 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 component: node.component,\n resolvedInputs: mapValues(node.instance.resolvedInputs, (inputs, inputName) => {\n const componentInput = node.component.inputs[inputName]\n if (!componentInput) {\n 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\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 logger.warn({ msg: \"input not found in the component\", input, component: node.component })\n return\n }\n\n const { component, resolvedOutputs } = getInstanceOutput(input)\n\n if (!component) {\n 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\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 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 { ComponentModel, InstanceModel } from \"@highstate/contract\"\nimport type { InstanceState } from \"../state\"\nimport type { ResolvedInstanceInput } from \"./input\"\nimport { sha256 } from \"crypto-hash\"\nimport { defineGraphResolver } from \"./graph-resolver\"\n\nexport type InputHashResolverInput = {\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n state: InstanceState | undefined\n sourceHash: string | undefined\n}\n\nexport type InputHashResolverOutput = {\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 const createInputHashResolver = defineGraphResolver<\n InputHashResolverInput,\n InputHashResolverOutput\n>({\n name: \"input-hash-resolver\",\n getNodeId: node => node.instance.id,\n\n getNodeDependencies({ resolvedInputs }) {\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 process({ instance, component, resolvedInputs, sourceHash, state }, dependencies) {\n let sink = component.definitionHash + JSON.stringify(instance.args ?? {})\n\n if (sourceHash) {\n sink += sourceHash\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 = dependencies.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 { defineGraphResolver } from \"./graph-resolver\"\n\nexport type ValidationResolverInput = {\n instance: InstanceModel\n component: ComponentModel\n resolvedInputs: Record<string, ResolvedInstanceInput[]>\n}\n\nexport type ValidationResolverOutput =\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 const createValidationResolver = defineGraphResolver<\n ValidationResolverInput,\n ValidationResolverOutput\n>({\n name: \"validation-resolver\",\n getNodeId: node => node.instance.id,\n\n getNodeDependencies({ resolvedInputs }) {\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 process({ instance, component, resolvedInputs }, dependencies, logger) {\n const ajv = new Ajv({ strict: false })\n\n 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 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 = dependencies.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 { GraphResolverFactory } from \"./graph-resolver\"\nimport { createInputResolver } from \"./input\"\nimport { createInputHashResolver } from \"./input-hash\"\nimport { createValidationResolver } from \"./validation\"\n\nexport const resolverFactories: Record<string, GraphResolverFactory<any, any>> = {\n [createInputResolver.factoryName]: createInputResolver,\n [createInputHashResolver.factoryName]: createInputHashResolver,\n [createValidationResolver.factoryName]: createValidationResolver,\n}\n","import { z } from \"zod\"\n\nexport const terminalSessionSchema = z.object({\n id: z.string().nanoid(),\n projectId: z.string(),\n instanceId: z.string(),\n terminalName: z.string(),\n terminalTitle: z.string(),\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"],"mappings":"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","names":["z","z","resolvedInputs","z"]}