@highstate/backend 0.9.18 → 0.9.19

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 (331) hide show
  1. package/dist/chunk-5WVU2AK4.js +1535 -0
  2. package/dist/chunk-5WVU2AK4.js.map +1 -0
  3. package/dist/{chunk-OU5OQBLB.js → chunk-I7BWSAN6.js} +3 -28
  4. package/dist/{chunk-OU5OQBLB.js.map → chunk-I7BWSAN6.js.map} +1 -1
  5. package/dist/chunk-VB4YL327.js +139 -0
  6. package/dist/chunk-VB4YL327.js.map +1 -0
  7. package/dist/database/local/prisma.config.js +26 -0
  8. package/dist/database/local/prisma.config.js.map +1 -0
  9. package/dist/highstate.manifest.json +2 -1
  10. package/dist/index.js +7587 -7291
  11. package/dist/index.js.map +1 -1
  12. package/dist/library/package-resolution-worker.js +1 -1
  13. package/dist/library/package-resolution-worker.js.map +1 -1
  14. package/dist/library/worker/main.js +35 -29
  15. package/dist/library/worker/main.js.map +1 -1
  16. package/dist/shared/index.js +2 -2
  17. package/package.json +18 -9
  18. package/prisma/backend/_schema/layout.prisma +7 -0
  19. package/prisma/backend/_schema/library.prisma +17 -0
  20. package/prisma/backend/_schema/project.prisma +101 -0
  21. package/prisma/backend/_schema/pulumi.prisma +17 -0
  22. package/prisma/backend/postgresql/main.prisma +17 -0
  23. package/prisma/backend/sqlite/main.prisma +17 -0
  24. package/prisma/backend/sqlite/migrations/20250817070609_initiial/migration.sql +34 -0
  25. package/prisma/backend/sqlite/migrations/20250817104948_add_fields/migration.sql +59 -0
  26. package/prisma/backend/sqlite/migrations/20250818082732_add_models/migration.sql +41 -0
  27. package/prisma/backend/sqlite/migrations/20250818083106_a/migration.sql +19 -0
  28. package/prisma/backend/sqlite/migrations/20250818101945_hi/migration.sql +1 -0
  29. package/prisma/backend/sqlite/migrations/20250819082315_a/migration.sql +5 -0
  30. package/prisma/backend/sqlite/migrations/migration_lock.toml +3 -0
  31. package/prisma/project/api-key.prisma +27 -0
  32. package/prisma/project/artifact.prisma +52 -0
  33. package/prisma/project/custom-status.prisma +46 -0
  34. package/prisma/project/evaluation.prisma +35 -0
  35. package/prisma/project/instance.prisma +160 -0
  36. package/prisma/project/layout.prisma +23 -0
  37. package/prisma/project/lock.prisma +18 -0
  38. package/prisma/project/main.prisma +17 -0
  39. package/prisma/project/migrations/20250816081310_initial/migration.sql +300 -0
  40. package/prisma/project/migrations/20250816082523_test/migration.sql +72 -0
  41. package/prisma/project/migrations/20250818065643_update/migration.sql +42 -0
  42. package/prisma/project/migrations/20250818070758_a/migration.sql +8 -0
  43. package/prisma/project/migrations/20250818070913_a/migration.sql +8 -0
  44. package/prisma/project/migrations/20250818082720_add_motels/migration.sql +11 -0
  45. package/prisma/project/migrations/20250818112523_hello/migration.sql +35 -0
  46. package/prisma/project/migrations/20250819082305_a/migration.sql +14 -0
  47. package/prisma/project/migrations/20250819165004_add_missing_fields/migration.sql +216 -0
  48. package/prisma/project/migrations/20250819171309_a/migration.sql +22 -0
  49. package/prisma/project/migrations/20250820113949_a/migration.sql +66 -0
  50. package/prisma/project/migrations/20250820144256_b/migration.sql +31 -0
  51. package/prisma/project/migrations/20250820145547_a/migration.sql +24 -0
  52. package/prisma/project/migrations/20250820182517_b/migration.sql +2 -0
  53. package/prisma/project/migrations/20250821172324_a/migration.sql +2 -0
  54. package/prisma/project/migrations/20250822081339_a/migration.sql +219 -0
  55. package/prisma/project/migrations/20250822083742_b/migration.sql +1 -0
  56. package/prisma/project/migrations/20250822105134_boom/migration.sql +1 -0
  57. package/prisma/project/migrations/20250822141028_b/migration.sql +1 -0
  58. package/prisma/project/migrations/20250822142342_b/migration.sql +16 -0
  59. package/prisma/project/migrations/20250824072720_a/migration.sql +1 -0
  60. package/prisma/project/migrations/20250824093656_b/migration.sql +21 -0
  61. package/prisma/project/migrations/20250825082518_a/migration.sql +1 -0
  62. package/prisma/project/migrations/20250825085343_b/migration.sql +1 -0
  63. package/prisma/project/migrations/20250825091312_a/migration.sql +1 -0
  64. package/prisma/project/migrations/20250903095431_hi/migration.sql +44 -0
  65. package/prisma/project/migrations/20250903174255_a/migration.sql +24 -0
  66. package/prisma/project/migrations/20250908095205_hi/migration.sql +18 -0
  67. package/prisma/project/migrations/20250909155857_hi/migration.sql +15 -0
  68. package/prisma/project/migrations/migration_lock.toml +3 -0
  69. package/prisma/project/model.prisma +37 -0
  70. package/prisma/project/operation.prisma +148 -0
  71. package/prisma/project/page.prisma +41 -0
  72. package/prisma/project/secret.prisma +42 -0
  73. package/prisma/project/service-account.prisma +36 -0
  74. package/prisma/project/terminal.prisma +90 -0
  75. package/prisma/project/trigger.prisma +31 -0
  76. package/prisma/project/unlock-method.prisma +32 -0
  77. package/prisma/project/worker.prisma +138 -0
  78. package/src/artifact/abstractions.ts +13 -13
  79. package/src/artifact/encryption.ts +30 -54
  80. package/src/artifact/factory.ts +6 -9
  81. package/src/artifact/local.ts +33 -46
  82. package/src/business/api-key.ts +24 -36
  83. package/src/business/artifact.test.ts +978 -0
  84. package/src/business/artifact.ts +136 -216
  85. package/src/business/evaluation.ts +328 -0
  86. package/src/business/index.ts +5 -2
  87. package/src/business/instance-lock.test.ts +1060 -0
  88. package/src/business/instance-lock.ts +387 -78
  89. package/src/business/instance-state.test.ts +735 -0
  90. package/src/business/instance-state.ts +582 -337
  91. package/src/business/operation.test.ts +439 -0
  92. package/src/business/operation.ts +174 -208
  93. package/src/business/project-model.ts +258 -0
  94. package/src/business/project-unlock.ts +168 -126
  95. package/src/business/project.ts +287 -179
  96. package/src/business/secret.test.ts +465 -130
  97. package/src/business/secret.ts +186 -217
  98. package/src/business/settings.test.ts +695 -0
  99. package/src/business/settings.ts +855 -0
  100. package/src/business/terminal-session.ts +90 -0
  101. package/src/business/unit-extra.test.ts +539 -0
  102. package/src/business/unit-extra.ts +160 -0
  103. package/src/business/worker.test.ts +356 -579
  104. package/src/business/worker.ts +238 -339
  105. package/src/common/codebase.ts +65 -0
  106. package/src/common/index.ts +3 -5
  107. package/src/common/logger.ts +5 -0
  108. package/src/common/utils.ts +4 -3
  109. package/src/config.ts +10 -11
  110. package/src/database/_generated/backend/postgresql/client.ts +72 -0
  111. package/src/database/_generated/backend/postgresql/commonInputTypes.ts +350 -0
  112. package/src/database/_generated/backend/postgresql/enums.ts +13 -0
  113. package/src/database/_generated/backend/postgresql/internal/class.ts +320 -0
  114. package/src/database/_generated/backend/postgresql/internal/prismaNamespace.ts +1238 -0
  115. package/src/database/_generated/backend/postgresql/models/Library.ts +1263 -0
  116. package/src/database/_generated/backend/postgresql/models/Project.ts +2175 -0
  117. package/src/database/_generated/backend/postgresql/models/ProjectModelStorage.ts +1263 -0
  118. package/src/database/_generated/backend/postgresql/models/ProjectSpace.ts +1602 -0
  119. package/src/database/_generated/backend/postgresql/models/PulumiBackend.ts +1263 -0
  120. package/src/database/_generated/backend/postgresql/models/UserWorkspaseLayout.ts +1065 -0
  121. package/src/database/_generated/backend/postgresql/models.ts +16 -0
  122. package/src/database/_generated/backend/postgresql/pjtg.ts +182 -0
  123. package/src/database/_generated/backend/sqlite/client.ts +72 -0
  124. package/src/database/_generated/backend/sqlite/commonInputTypes.ts +331 -0
  125. package/src/database/_generated/backend/sqlite/enums.ts +13 -0
  126. package/src/database/_generated/backend/sqlite/internal/class.ts +318 -0
  127. package/src/database/_generated/backend/sqlite/internal/prismaNamespace.ts +1207 -0
  128. package/src/database/_generated/backend/sqlite/models/Library.ts +1261 -0
  129. package/src/database/_generated/backend/sqlite/models/Project.ts +2169 -0
  130. package/src/database/_generated/backend/sqlite/models/ProjectModelStorage.ts +1261 -0
  131. package/src/database/_generated/backend/sqlite/models/ProjectSpace.ts +1599 -0
  132. package/src/database/_generated/backend/sqlite/models/PulumiBackend.ts +1261 -0
  133. package/src/database/_generated/backend/sqlite/models/UserWorkspaseLayout.ts +1063 -0
  134. package/src/database/_generated/backend/sqlite/models.ts +16 -0
  135. package/src/database/_generated/backend/sqlite/pjtg.ts +182 -0
  136. package/src/database/_generated/project/client.ts +204 -0
  137. package/src/database/_generated/project/commonInputTypes.ts +827 -0
  138. package/src/database/_generated/project/enums.ts +104 -0
  139. package/src/database/_generated/project/internal/class.ts +479 -0
  140. package/src/database/_generated/project/internal/prismaNamespace.ts +2974 -0
  141. package/src/database/_generated/project/models/ApiKey.ts +1506 -0
  142. package/src/database/_generated/project/models/Artifact.ts +2051 -0
  143. package/src/database/_generated/project/models/HubModel.ts +1125 -0
  144. package/src/database/_generated/project/models/InstanceCustomStatus.ts +1713 -0
  145. package/src/database/_generated/project/models/InstanceEvaluationState.ts +1312 -0
  146. package/src/database/_generated/project/models/InstanceLock.ts +1268 -0
  147. package/src/database/_generated/project/models/InstanceModel.ts +1125 -0
  148. package/src/database/_generated/project/models/InstanceOperationState.ts +1707 -0
  149. package/src/database/_generated/project/models/InstanceState.ts +4613 -0
  150. package/src/database/_generated/project/models/Operation.ts +1647 -0
  151. package/src/database/_generated/project/models/OperationLog.ts +1455 -0
  152. package/src/database/_generated/project/models/Page.ts +1838 -0
  153. package/src/database/_generated/project/models/Secret.ts +1692 -0
  154. package/src/database/_generated/project/models/ServiceAccount.ts +2165 -0
  155. package/src/database/_generated/project/models/Terminal.ts +2038 -0
  156. package/src/database/_generated/project/models/TerminalSession.ts +1454 -0
  157. package/src/database/_generated/project/models/TerminalSessionLog.ts +1280 -0
  158. package/src/database/_generated/project/models/Trigger.ts +1430 -0
  159. package/src/database/_generated/project/models/UnlockMethod.ts +1220 -0
  160. package/src/database/_generated/project/models/UserCompositeViewport.ts +1280 -0
  161. package/src/database/_generated/project/models/UserProjectViewport.ts +1059 -0
  162. package/src/database/_generated/project/models/Worker.ts +1459 -0
  163. package/src/database/_generated/project/models/WorkerUnitRegistration.ts +1524 -0
  164. package/src/database/_generated/project/models/WorkerVersion.ts +1974 -0
  165. package/src/database/_generated/project/models/WorkerVersionLog.ts +1318 -0
  166. package/src/database/_generated/project/models.ts +35 -0
  167. package/src/database/_generated/project/pjtg.ts +182 -0
  168. package/src/database/abstractions.ts +19 -0
  169. package/src/database/factory.ts +37 -0
  170. package/src/database/index.ts +6 -0
  171. package/src/database/local/backend.ts +134 -0
  172. package/src/database/local/index.ts +3 -0
  173. package/src/database/local/meta.ts +46 -0
  174. package/src/database/local/prisma.config.ts +25 -0
  175. package/src/database/local/project.ts +39 -0
  176. package/src/database/manager.ts +181 -0
  177. package/src/database/migrate.ts +35 -0
  178. package/src/database/prisma.ts +56 -0
  179. package/src/database/well-known.ts +38 -0
  180. package/src/index.ts +4 -4
  181. package/src/library/abstractions.ts +3 -5
  182. package/src/library/factory.ts +1 -1
  183. package/src/library/local.ts +81 -26
  184. package/src/library/package-resolution-worker.ts +1 -1
  185. package/src/library/worker/evaluator.ts +40 -23
  186. package/src/library/worker/loader.lite.ts +1 -1
  187. package/src/library/worker/main.ts +3 -10
  188. package/src/library/worker/protocol.ts +0 -1
  189. package/src/lock/index.ts +0 -1
  190. package/src/lock/manager.ts +0 -10
  191. package/src/orchestrator/manager.ts +190 -104
  192. package/src/orchestrator/operation-context.ts +357 -0
  193. package/src/orchestrator/operation-plan.destroy.test.md +357 -0
  194. package/src/orchestrator/operation-plan.destroy.test.ts +775 -0
  195. package/src/orchestrator/operation-plan.fixtures.ts +213 -0
  196. package/src/orchestrator/operation-plan.md +198 -0
  197. package/src/orchestrator/operation-plan.refresh.test.md +199 -0
  198. package/src/orchestrator/operation-plan.refresh.test.ts +367 -0
  199. package/src/orchestrator/operation-plan.ts +709 -0
  200. package/src/orchestrator/operation-plan.update.test.md +485 -0
  201. package/src/orchestrator/operation-plan.update.test.ts +1066 -0
  202. package/src/orchestrator/operation-workset.ts +233 -578
  203. package/src/orchestrator/operation.ts +435 -948
  204. package/src/orchestrator/plan-test-builder.ts +267 -0
  205. package/src/project-model/abstractions.ts +118 -0
  206. package/src/project-model/backends/codebase.ts +365 -0
  207. package/src/project-model/backends/database.ts +440 -0
  208. package/src/project-model/errors.ts +81 -0
  209. package/src/project-model/factory.ts +24 -0
  210. package/src/project-model/index.ts +4 -0
  211. package/src/project-model/utils.test.ts +544 -0
  212. package/src/project-model/utils.ts +242 -0
  213. package/src/pubsub/abstractions.ts +10 -1
  214. package/src/pubsub/factory.ts +4 -4
  215. package/src/pubsub/index.ts +1 -0
  216. package/src/pubsub/manager.ts +29 -13
  217. package/src/pubsub/memory.ts +31 -0
  218. package/src/runner/abstractions.ts +33 -41
  219. package/src/runner/artifact-env.ts +19 -8
  220. package/src/runner/factory.ts +6 -6
  221. package/src/runner/force-abort.ts +3 -6
  222. package/src/runner/local.ts +64 -67
  223. package/src/runner/pulumi.ts +23 -63
  224. package/src/services.ts +181 -123
  225. package/src/shared/models/backend/index.ts +3 -1
  226. package/src/shared/models/backend/library.ts +9 -1
  227. package/src/shared/models/backend/project.ts +43 -42
  228. package/src/shared/models/backend/pulumi.ts +14 -0
  229. package/src/shared/models/backend/unlock-method.ts +1 -1
  230. package/src/shared/models/backend/well-known.ts +58 -0
  231. package/src/shared/models/base.ts +40 -26
  232. package/src/shared/models/errors.ts +82 -1
  233. package/src/shared/models/index.ts +3 -2
  234. package/src/shared/models/prisma.ts +36 -0
  235. package/src/shared/models/project/api-key.ts +37 -59
  236. package/src/shared/models/project/artifact.ts +16 -76
  237. package/src/shared/models/project/custom-status.ts +12 -0
  238. package/src/shared/models/project/index.ts +8 -7
  239. package/src/shared/models/project/lock.ts +10 -78
  240. package/src/shared/models/project/model.ts +19 -1
  241. package/src/shared/models/project/operation.ts +222 -99
  242. package/src/shared/models/project/page.ts +37 -48
  243. package/src/shared/models/project/secret.ts +29 -89
  244. package/src/shared/models/project/service-account.ts +12 -17
  245. package/src/shared/models/project/state.ts +100 -407
  246. package/src/shared/models/project/terminal.ts +75 -88
  247. package/src/shared/models/project/trigger.ts +13 -49
  248. package/src/shared/models/project/unlock-method.ts +20 -26
  249. package/src/shared/models/project/worker.ts +89 -90
  250. package/src/shared/resolvers/graph-resolver.ts +21 -0
  251. package/src/shared/resolvers/index.ts +1 -1
  252. package/src/shared/resolvers/input-hash.ts +24 -14
  253. package/src/shared/resolvers/input.ts +1 -1
  254. package/src/shared/resolvers/registry.ts +5 -4
  255. package/src/shared/resolvers/state.ts +12 -1
  256. package/src/shared/resolvers/validation.ts +7 -3
  257. package/src/shared/utils/index.ts +1 -2
  258. package/src/shared/utils/promise-tracker.ts +30 -3
  259. package/src/terminal/abstractions.ts +1 -1
  260. package/src/terminal/docker.ts +3 -3
  261. package/src/terminal/manager.ts +102 -118
  262. package/src/test-utils/database.ts +119 -0
  263. package/src/test-utils/index.ts +2 -0
  264. package/src/test-utils/services.ts +134 -0
  265. package/src/unlock/abstractions.ts +5 -23
  266. package/src/unlock/memory.ts +9 -14
  267. package/src/worker/abstractions.ts +7 -4
  268. package/src/worker/docker.ts +14 -19
  269. package/src/worker/manager.ts +366 -97
  270. package/dist/chunk-NAAIDR4U.js +0 -8499
  271. package/dist/chunk-NAAIDR4U.js.map +0 -1
  272. package/dist/chunk-Y7DXREVO.js +0 -1745
  273. package/dist/chunk-Y7DXREVO.js.map +0 -1
  274. package/dist/magic-string.es-5ABAC4JN.js +0 -1292
  275. package/dist/magic-string.es-5ABAC4JN.js.map +0 -1
  276. package/src/business/__traces__/secret/update-instance-secrets/create-and-delete-secrets-simultaneously.md +0 -356
  277. package/src/business/__traces__/secret/update-instance-secrets/create-new-secrets-for-instance.md +0 -274
  278. package/src/business/__traces__/secret/update-instance-secrets/delete-existing-secrets.md +0 -223
  279. package/src/business/__traces__/secret/update-instance-secrets/no-op-when-no-changes.md +0 -147
  280. package/src/business/__traces__/secret/update-instance-secrets/update-existing-secrets.md +0 -280
  281. package/src/business/__traces__/worker/update-unit-registrations/add-new-unit-registration-when-other-exists.md +0 -360
  282. package/src/business/__traces__/worker/update-unit-registrations/add-new-unit-registration.md +0 -215
  283. package/src/business/__traces__/worker/update-unit-registrations/create-multiple-workers-with-different-identities.md +0 -427
  284. package/src/business/__traces__/worker/update-unit-registrations/handle-nonexistent-registration-id-gracefully.md +0 -217
  285. package/src/business/__traces__/worker/update-unit-registrations/no-op-when-no-changes.md +0 -132
  286. package/src/business/__traces__/worker/update-unit-registrations/recreate-worker-when-image-changes.md +0 -454
  287. package/src/business/__traces__/worker/update-unit-registrations/recreate-worker-when-image-version-changes.md +0 -426
  288. package/src/business/__traces__/worker/update-unit-registrations/recreate-worker-with-same-identity-reuses-service-account.md +0 -372
  289. package/src/business/__traces__/worker/update-unit-registrations/remove-one-of-multiple-unit-registrations.md +0 -383
  290. package/src/business/__traces__/worker/update-unit-registrations/remove-unit-registration.md +0 -245
  291. package/src/business/__traces__/worker/update-unit-registrations/update-existing-unit-registration-when-params-change.md +0 -174
  292. package/src/business/__traces__/worker/update-unit-registrations/update-params-and-image-simultaneously.md +0 -432
  293. package/src/business/__traces__/worker/update-unit-registrations/worker-with-multiple-registrations-not-deleted-when-one-removed.md +0 -220
  294. package/src/business/backend-unlock.ts +0 -10
  295. package/src/common/clock.ts +0 -18
  296. package/src/common/performance.ts +0 -44
  297. package/src/common/random.ts +0 -68
  298. package/src/common/test/index.ts +0 -2
  299. package/src/common/test/render.ts +0 -98
  300. package/src/common/test/tracer.ts +0 -359
  301. package/src/hotstate/abstractions.ts +0 -48
  302. package/src/hotstate/factory.ts +0 -17
  303. package/src/hotstate/index.ts +0 -3
  304. package/src/hotstate/manager.ts +0 -192
  305. package/src/hotstate/memory.ts +0 -100
  306. package/src/hotstate/validation.ts +0 -100
  307. package/src/lock/test.ts +0 -108
  308. package/src/project/abstractions.ts +0 -78
  309. package/src/project/evaluation.ts +0 -248
  310. package/src/project/factory.ts +0 -11
  311. package/src/project/index.ts +0 -3
  312. package/src/project/local.ts +0 -417
  313. package/src/pubsub/local.ts +0 -36
  314. package/src/pubsub/validation.ts +0 -33
  315. package/src/shared/utils/args.ts +0 -25
  316. package/src/state/abstractions.ts +0 -289
  317. package/src/state/encryption.ts +0 -98
  318. package/src/state/factory.ts +0 -20
  319. package/src/state/index.ts +0 -7
  320. package/src/state/local/backend.ts +0 -106
  321. package/src/state/local/collection.ts +0 -361
  322. package/src/state/local/index.ts +0 -2
  323. package/src/state/manager.ts +0 -890
  324. package/src/state/memory/backend.ts +0 -70
  325. package/src/state/memory/collection.ts +0 -270
  326. package/src/state/memory/index.ts +0 -2
  327. package/src/state/repository/index.ts +0 -2
  328. package/src/state/repository/repository.index.ts +0 -193
  329. package/src/state/repository/repository.ts +0 -507
  330. package/src/state/test.ts +0 -457
  331. /package/src/{state → database/local}/keyring.ts +0 -0
@@ -1,449 +1,142 @@
1
- /* eslint-disable @typescript-eslint/no-unsafe-argument */
2
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
4
- /* eslint-disable @typescript-eslint/no-explicit-any */
5
-
1
+ import type { InstanceId } from "@highstate/contract"
2
+ import type {
3
+ InstanceState as DatabaseInstanceState,
4
+ InstanceCustomStatus,
5
+ InstanceEvaluationState,
6
+ InstanceOperationState,
7
+ InstanceOperationStatus,
8
+ } from "../../../database"
6
9
  import { z } from "zod"
7
- import { objectMetaSchema, userObjectMetaSchema } from "@highstate/contract"
8
-
9
- export const instanceOperationStatusEnumSchema = z.enum([
10
- // transient statuses
11
- "updating",
12
- "processing-triggers",
13
- "previewing",
14
- "destroying",
15
- "refreshing",
16
- "pending",
17
- "cancelling",
18
-
19
- // stable statuses
20
- "created",
21
- "error",
22
- ])
23
-
24
- export const instanceOperationStatusSchema = z.object({
25
- /**
26
- * The enum representing the current status of the instance from the operation perspective.
27
- */
28
- status: instanceOperationStatusEnumSchema,
29
-
30
- /**
31
- * The ID of the latest operation that this instance is associated with.
32
- */
33
- latestOperationId: z.string(),
34
-
35
- /**
36
- * The IDs of the instances that this instance depends on at the moment of latest operation.
37
- */
38
- dependencyIds: z.array(z.string()),
39
-
40
- /**
41
- * The some human-readable message describing the current status.
42
- * Typically used to show the error message if the status is "error".
43
- */
44
- message: z.string().optional(),
45
-
46
- /**
47
- * The current count of the Pulumi resources being managed by this instance.
48
- */
49
- currentResourceCount: z.number().optional(),
50
-
51
- /**
52
- * The total count of the Pulumi resources that this instance is expected to manage.
53
- */
54
- totalResourceCount: z.number().optional(),
55
10
 
11
+ /**
12
+ * The instance state aggregate including all related states.
13
+ */
14
+ export type InstanceState = DatabaseInstanceState & {
56
15
  /**
57
- * The calculated instance CRC32 input hash at the moment of latest operation completion.
16
+ * The ID of the parent instance, if any.
58
17
  *
59
- * This hash covers:
60
- * - the instance's configuration (name, args, secret hashes);
61
- * - the component definition hash;
62
- * - the unit's source hash (if applicable);
63
- * - the input hashes and output hashes of all input instances.
18
+ * Not to be confused with `parentId` which is the surrogate ID of the parent state.
64
19
  */
65
- inputHash: z.number().optional(),
20
+ parentInstanceId?: InstanceId | null
66
21
 
67
22
  /**
68
- * The random 32-bit nonce used in input hash calculation.
69
- *
70
- * It is changed every time the instance secrets are updated,
71
- * to invalidate the input hash and force running the instance again.
72
- */
73
- inputHashNonce: z.number().optional(),
74
-
75
- /**
76
- * The sha256 of the output produced by the instance at the moment of latest operation completion.
77
- *
78
- * Does not depend on anything except the instance's output.
79
- */
80
- outputHash: z.string().optional(),
81
-
82
- /**
83
- * The calculated sha256 dependency output hash at the moment of latest operation completion.
84
- *
85
- * This hash is calculated as combination of output hashes of all input instances and nothing else.
86
- *
87
- * The primary use case of this hash is to "short-circuit" execution:
88
- * if the outputs of input instances have not changed, dependent instances can skip execution,
89
- * even if their input hashes changed due to upstream config changes.
90
- * This prevents unnecessary re-execution of the entire dependency graph when only non-output-affecting inputs are modified.
91
- */
92
- dependencyOutputHash: z.string().optional(),
93
-
94
- /**
95
- * The arguments of the instances at the moment of latest operation start.
23
+ * The names of the instance secrets which have values set.
96
24
  */
97
- args: z.record(z.string(), z.unknown()).optional(),
98
- })
99
-
100
- export const instanceEvaludationStatusEnumSchema = z.enum([
101
- // transient statuses
102
- "evaluating",
25
+ secretNames?: string[]
103
26
 
104
- // stable statuses
105
- "evaluated",
106
- "error",
107
- ])
108
-
109
- export const instanceEvaluationStatusSchema = z.object({
110
27
  /**
111
- * The enum representing the current status of the instance from the evaluation perspective.
112
- *
113
- * The stable status when instance is not evaludated is forbidden.
28
+ * The last operation state of the instance.
114
29
  */
115
- status: instanceEvaludationStatusEnumSchema,
30
+ lastOperationState?: InstanceOperationState | null
116
31
 
117
32
  /**
118
- * The message describing the evaluation status.
119
- * Typically used to show the error message if the status is "error".
33
+ * The evaluation state of the instance.
120
34
  */
121
- message: z.string().optional(),
122
- })
35
+ evaluationState?: InstanceEvaluationState | null
123
36
 
124
- export enum WellKnownInstanceCustomStatus {
125
37
  /**
126
- * The instance is in a healthy state.
38
+ * The IDs of the terminals produced by this unit instance.
127
39
  */
128
- Healthy = "healthy",
40
+ terminalIds?: string[]
129
41
 
130
42
  /**
131
- * The instance is in a degraded state.
43
+ * The IDs of the pages produced by this unit instance.
132
44
  */
133
- Degraded = "degraded",
45
+ pageIds?: string[]
134
46
 
135
47
  /**
136
- * The instance is in a down state/completely broken.
48
+ * The IDs of the triggers produced by this unit instance.
137
49
  */
138
- Down = "down",
50
+ triggerIds?: string[]
139
51
 
140
52
  /**
141
- * The instance is in a warning state.
53
+ * The custom statuses attached to this instance.
142
54
  */
143
- Warning = "warning",
144
-
145
- /**
146
- * The instance is progressing with some external sync operation,
147
- * such as a deployment or a data migration.
148
- */
149
- Progressing = "progressing",
150
-
151
- /**
152
- * The instance is in an error state.
153
- */
154
- Error = "error",
55
+ customStatuses?: InstanceCustomStatus[]
155
56
  }
156
57
 
157
- export const instanceCustomStatusSchema = z.object({
158
- /**
159
- * The name of the instance's extra status.
160
- *
161
- * Must be unique within the instance state.
162
- */
163
- name: z.string(),
164
-
165
- /**
166
- * The enum value of the instance's extra status.
167
- *
168
- * May be on of the `WellKnownExtraInstanceStatus` values or a custom value.
169
- */
170
- status: z.string(),
171
-
172
- /**
173
- * The title of the instance's extra status.
174
- */
175
- title: z.string(),
176
-
177
- /**
178
- * The `iconify` icon representing the instance's extra status.
179
- *
180
- * If not provided and status is a well-known value, the icon will be derived from the status.
181
- */
182
- icon: z.string().optional(),
183
-
184
- /**
185
- * The HEX color of the status badge.
186
- *
187
- * If not provided and status is a well-known value, the color will be derived from the status.
188
- */
189
- color: z.string().optional(),
190
-
191
- /**
192
- * The message describing the instance's extra status.
193
- *
194
- * Can be used to provide additional context or information about the status.
195
- *
196
- * The message will be displayed in the 800x600 ANSI terminal in the UI,
197
- * so differenet TUI elements should be drawn within this area.
198
- */
199
- message: z.string().optional(),
200
-
201
- /**
202
- * The order of the status in the list of statuses.
203
- *
204
- * Must be in the range from `0` to `100`, lower values are displayed first.
205
- *
206
- * If not provided, the default is `50`.
207
- */
208
- order: z.number().min(0).max(100).optional(),
209
- })
210
-
211
- export const instanceStatusFieldValueSchema = z.union([
212
- z.string(),
213
- z.number(),
214
- z.boolean(),
215
- z.array(z.string()),
58
+ export const instanceStateEventSchema = z.discriminatedUnion("type", [
59
+ z.object({
60
+ type: z.literal("updated"),
61
+ state: z.custom<InstanceState>(),
62
+ }),
63
+ z.object({
64
+ type: z.literal("patched"),
65
+ stateId: z.string(),
66
+ patch: z.custom<Partial<InstanceState>>(),
67
+ }),
68
+ z.object({
69
+ type: z.literal("deleted"),
70
+ stateId: z.string(),
71
+ }),
216
72
  ])
217
73
 
218
- export const instanceStatusFieldSchema = z.object({
219
- name: z.string(),
220
- meta: objectMetaSchema,
221
-
222
- complementaryTo: z.string().optional(),
223
-
224
- value: instanceStatusFieldValueSchema.optional(),
225
- })
226
-
227
- export const unitInstanceStatusFieldSchema = instanceStatusFieldSchema.omit({ meta: true }).extend({
228
- meta: userObjectMetaSchema,
229
- })
230
-
231
- export const instanceStateExtraSchema = z.object({
232
- /**
233
- * The status fields reported by the unit or attached via the API.
234
- *
235
- * Do not confuse with `customStatuses`.
236
- *
237
- * These fields are used to store additional information about the instance,
238
- * such as URLs, display names, and other metadata.
239
- */
240
- statusFields: z.array(instanceStatusFieldSchema).optional(),
241
-
242
- /**
243
- * The extra statuses of the instance reported by the unit or attached via the API.
244
- *
245
- * Do not confuse with `statusFields.
246
- */
247
- customStatuses: z.array(instanceCustomStatusSchema).optional(),
248
-
249
- /**
250
- * The IDs of the pages that are owned by this instance.
251
- *
252
- * The keys are the local page names, and the values are the page IDs.
253
- */
254
- pageIds: z.record(z.string(), z.string()).optional(),
255
-
256
- /**
257
- * The IDs of the terminals that are owned by this instance.
258
- *
259
- * The keys are the local terminal names, and the values are the terminal IDs.
260
- */
261
- terminalIds: z.record(z.string(), z.string()).optional(),
262
-
263
- /**
264
- * The IDs of the triggers that are owned by this instance.
265
- *
266
- * The keys are the local trigger names, and the values are the trigger IDs.
267
- */
268
- triggerIds: z.record(z.string(), z.string()).optional(),
269
-
270
- /**
271
- * The IDs of the artifacts that this instance exports via outputs.
272
- *
273
- * The keys are the output keys, and the values are the artifact IDs.
274
- *
275
- * These artifacts can be both: produced by this instance or reexported from input instances.
276
- */
277
- exportedArtifactIds: z.record(z.string(), z.array(z.string())).optional(),
278
-
279
- /**
280
- * The IDs of the secrets that this instance exports via outputs.
281
- *
282
- * The keys are the output keys, and the values are the secret IDs.
283
- *
284
- * These secrets can be both: produced by this instance or reexported from input instances.
285
- */
286
- exportedSecretIds: z.record(z.string(), z.string().array()).optional(),
287
-
288
- /**
289
- * The IDs of the worker registrations that are owned by this instance.
290
- *
291
- * The keys are the unit worker names, and the values are the registration IDs.
292
- */
293
- workerRegistrationIds: z.record(z.string(), z.string()).optional(),
294
- })
295
-
296
- export const instanceStateSchema = z.object({
297
- /**
298
- * The unique identifier of the instance.
299
- * The format is `{componentType}:{instanceName}`, so each instance must have a unique name within its component type.
300
- */
301
- id: z.string(),
302
-
303
- /**
304
- * The ID of the parent instance, if this instance is a child of another composite instance.
305
- */
306
- parentId: z.string().optional(),
307
-
308
- /**
309
- * The names of the secrets that has values in this instance.
310
- */
311
- secretNames: z.array(z.string()).optional(),
312
-
313
- /**
314
- * The current status of the instance from the operation perspective.
315
- *
316
- * This status persists in the storage only when the operation is completed.
317
- *
318
- * If the operation was interrupted, the status will be "error" with corresponding error message.
319
- *
320
- * If the instance was not created or was successfully destroyed, the whole "operationStatus" field will be undefined.
321
- */
322
- operationStatus: instanceOperationStatusSchema.optional(),
323
-
324
- /**
325
- * The current status of the instance from the evaluation perspective.
326
- *
327
- * Only applies to composite instances, will always be `undefined` for unit instances.
328
- */
329
- evaluationStatus: instanceEvaluationStatusSchema.optional(),
330
-
331
- /**
332
- * The extra components of the instance.
333
- *
334
- * Applies to both unit and composite instances.
335
- */
336
- extra: instanceStateExtraSchema.optional(),
337
- })
338
-
339
- export type InstanceStatusFieldValue = z.infer<typeof instanceStatusFieldValueSchema>
340
- export type InstanceStatusField = z.infer<typeof instanceStatusFieldSchema>
341
- export type UnitInstanceStatusField = z.infer<typeof unitInstanceStatusFieldSchema>
342
-
343
- export type InstanceOperationStatus = z.infer<typeof instanceOperationStatusSchema>
344
- export type InstanceOperataionStatusEnum = z.infer<typeof instanceOperationStatusEnumSchema>
345
-
346
- export type InstanceEvaluationStatus = z.infer<typeof instanceEvaluationStatusSchema>
347
- export type InstanceEvaluationStatusEnum = z.infer<typeof instanceEvaludationStatusEnumSchema>
348
-
349
- export type InstanceCustomStatus = z.infer<typeof instanceCustomStatusSchema>
350
-
351
- export type InstanceState = z.infer<typeof instanceStateSchema>
352
-
353
- export type NullableRecord<T extends Record<string, any>> = {
354
- [K in keyof T]: T[K] | null
74
+ /**
75
+ * Checks if the given instance state represents a "virtual ghost" instance.
76
+ *
77
+ * Note: The evaluation state must be loaded, otherwise this function will always return true.
78
+ *
79
+ * @param state The instance state to check.
80
+ * @returns True if the instance is a virtual ghost, false otherwise.
81
+ */
82
+ export function isVirtualGhostInstance(
83
+ state: Pick<InstanceState, "status" | "source" | "evaluationState">,
84
+ ): boolean {
85
+ if (state.source !== "virtual") return false
86
+ if (state.status === "undeployed") return false
87
+
88
+ return !state.evaluationState
355
89
  }
356
90
 
357
- export const instanceStateExtraPath = z.object({
358
- statusFields: z.array(instanceStatusFieldSchema).optional().nullable(),
359
- customStatuses: z.array(instanceCustomStatusSchema).optional().nullable(),
360
- pageIds: z.record(z.string(), z.string()).optional().nullable(),
361
- terminalIds: z.record(z.string(), z.string()).optional().nullable(),
362
- triggerIds: z.record(z.string(), z.string()).optional().nullable(),
363
- exportedArtifactIds: z.record(z.string(), z.array(z.string())).optional().nullable(),
364
- exportedSecretIds: z.record(z.string(), z.string().array()).optional().nullable(),
365
- workerRegistrationIds: z.record(z.string(), z.string()).optional().nullable(),
366
- })
367
-
368
- export const instanceStatePatchSchema = z.object({
369
- id: z.string(),
370
- parentId: z.string().nullish(),
371
- secretNames: z.array(z.string()).nullish(),
372
- operationStatus: instanceOperationStatusSchema.partial().nullish(),
373
- evaluationStatus: instanceEvaluationStatusSchema.partial().nullish(),
374
- extra: instanceStateExtraPath.nullish(),
375
- })
376
-
377
- export type InstanceStatePatch = z.infer<typeof instanceStatePatchSchema>
378
-
379
- export function applyStatePatch(
380
- existingState: InstanceState | null | undefined,
381
- patch: InstanceStatePatch,
382
- ): InstanceState {
383
- const state: any = existingState ? { ...existingState } : { id: patch.id }
384
-
385
- const anyPatch = patch as any
386
-
387
- // merge the patch with the existing state with 2-level deep merge
388
- // (merge objects nested in the state, but replace objects inside these nested objects)
389
- for (const key of Object.keys(patch)) {
390
- if (typeof anyPatch[key] === "undefined") {
391
- // ignore undefined values
392
- continue
393
- }
394
-
395
- if (
396
- typeof anyPatch[key] !== "object" ||
397
- anyPatch[key] === null ||
398
- Array.isArray(anyPatch[key])
399
- ) {
400
- // if the value is not an object, just replace it
401
- // transform null to undefined
402
- state[key] = anyPatch[key] === null ? undefined : anyPatch[key]
403
- continue
404
- }
405
-
406
- // if the value is an object, merge it with the existing state
407
- const existingValue = state[key] ? { ...state[key] } : {}
408
-
409
- for (const subKey of Object.keys(anyPatch[key])) {
410
- existingValue[subKey] = anyPatch[key][subKey]
411
- }
412
-
413
- state[key] = existingValue
414
- }
415
-
416
- return state as InstanceState
417
- }
418
-
419
- export function isStateEmpty(state: InstanceState): boolean {
420
- return (
421
- !state.operationStatus &&
422
- !state.evaluationStatus &&
423
- (!state.extra || Object.keys(state.extra).length === 0) &&
424
- (!state.secretNames || state.secretNames.length === 0)
425
- )
91
+ /**
92
+ * Checks if the given instance state represents a deployed instance.
93
+ *
94
+ * An instance is considered deployed if the state exists and its status is not "undeployed".
95
+ *
96
+ * @param state The instance state to check (can be undefined).
97
+ * @returns True if the instance is deployed, false otherwise.
98
+ */
99
+ export function isInstanceDeployed(state: InstanceState | undefined): boolean {
100
+ return !!state && state.status !== "undeployed"
426
101
  }
427
102
 
428
- export function isTransientOperationStatus(status: InstanceOperataionStatusEnum): boolean {
429
- return status !== "created" && status !== "error"
103
+ export type {
104
+ InstanceEvaluationState,
105
+ InstanceEvaluationStatus,
106
+ InstanceOperationState,
107
+ InstanceOperationStatus,
108
+ InstanceStatus,
109
+ } from "../../../database"
110
+
111
+ export const finalInstanceOperationStatuses: InstanceOperationStatus[] = [
112
+ "destroyed",
113
+ "updated",
114
+ "cancelled",
115
+ "destroyed",
116
+ "failed",
117
+ "skipped",
118
+ ]
119
+
120
+ /**
121
+ * Checks if an instance operation status exists and is final transient (not stable).
122
+ *
123
+ * @param status The instance operation status to check
124
+ * @returns True if the status is transient
125
+ */
126
+ export function isTransientInstanceOperationStatus(status?: InstanceOperationStatus): boolean {
127
+ return !!status && !finalInstanceOperationStatuses.includes(status)
430
128
  }
431
129
 
432
- export function isStableOperationStatus(status: InstanceOperataionStatusEnum): boolean {
433
- return status === "created" || status === "error"
434
- }
435
-
436
- export const instanceStateEventSchema = z.discriminatedUnion("type", [
437
- z.object({
438
- type: z.literal("patched"),
439
- patch: instanceStatePatchSchema,
440
- }),
130
+ export const workerUnitRegistrationEventSchema = z.discriminatedUnion("type", [
441
131
  z.object({
442
- type: z.literal("updated"),
443
- state: instanceStateSchema,
132
+ type: z.literal("registered"),
133
+ instanceId: z.string(),
134
+ params: z.record(z.string(), z.unknown()),
444
135
  }),
445
136
  z.object({
446
- type: z.literal("deleted"),
137
+ type: z.literal("deregistered"),
447
138
  instanceId: z.string(),
448
139
  }),
449
140
  ])
141
+
142
+ export type WorkerUnitRegistrationEvent = z.infer<typeof workerUnitRegistrationEventSchema>