@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,41 +1,42 @@
1
1
  import type { ObjectMeta } from "@highstate/contract"
2
+ import { constant, mapValues } from "remeda"
2
3
  import { z } from "zod"
3
4
 
4
5
  export function hasObjectMeta(value: unknown): value is { meta: ObjectMeta } {
5
6
  return typeof value === "object" && value !== null && "meta" in value
6
7
  }
7
8
 
9
+ const sortBySchema = z.object({
10
+ key: z.string(),
11
+ order: z.enum(["asc", "desc"]),
12
+ })
13
+
14
+ export type GenericEntity = {
15
+ id: string
16
+ meta: ObjectMeta
17
+ createdAt?: Date
18
+ }
19
+
8
20
  export const collectionQuerySchema = z.object({
9
21
  /**
10
22
  * The search string to filter documents by display name, description, or other text fields.
11
- *
12
- * Not implemented yet.
13
23
  */
14
24
  search: z.string().optional(),
15
25
 
16
26
  /**
17
- * The skip count for pagination.
18
- *
19
- * Cannot be used with `cursor`.
20
- */
21
- skip: z.number().int().nonnegative().optional(),
22
-
23
- /**
24
- * The sorting order for the results.
27
+ * The sorting configuration for the results.
25
28
  *
26
- * By default, "asc" is used.
29
+ * Can be a single sort field or an array of sort fields.
30
+ * Each sort field contains the key and order.
27
31
  */
28
- sort: z.enum(["asc", "desc"]).default("asc"),
32
+ sortBy: z.array(sortBySchema).optional(),
29
33
 
30
34
  /**
31
- * The ID of the document to start the query from.
32
- *
33
- * If "asc" sorting is used, this will return results after this ID.
34
- * Otherwise, it will return results before this ID.
35
+ * The number of items to skip.
35
36
  *
36
- * Cannot be used with `skip`.
37
+ * Defaults to 0 if not specified.
37
38
  */
38
- cursor: z.string().optional(),
39
+ skip: z.number().int().nonnegative().default(0).optional(),
39
40
 
40
41
  /**
41
42
  * The count of documents to return.
@@ -43,14 +44,21 @@ export const collectionQuerySchema = z.object({
43
44
  * Defaults to 20 if not specified.
44
45
  * Maximum value is 100.
45
46
  */
46
- count: z.number().int().nonnegative().max(100).optional(),
47
+ count: z.number().int().positive().max(100).default(20).optional(),
47
48
  })
48
49
 
49
50
  export type CollectionQuery = z.infer<typeof collectionQuerySchema>
50
51
 
52
+ export function collectionQueryResult<TSchema extends z.ZodType>(schema: TSchema) {
53
+ return z.object({
54
+ items: z.array(schema),
55
+ total: z.number().int().nonnegative(),
56
+ })
57
+ }
58
+
51
59
  export type CollectionQueryResult<T> = {
52
60
  /**
53
- * The list of objects matching the query.
61
+ * The list of objects matching the query and restricted by pagination.
54
62
  */
55
63
  items: T[]
56
64
 
@@ -58,11 +66,17 @@ export type CollectionQueryResult<T> = {
58
66
  * The total number of documents matching the query.
59
67
  */
60
68
  total: number
69
+ }
61
70
 
62
- /**
63
- * The cursor for the next page of results.
64
- *
65
- * If undefined, there are no more results.
66
- */
67
- nextCursor?: string
71
+ /**
72
+ * Creates a selection object using the provided schema.
73
+ *
74
+ * It can be used in zod pick or prisma select.
75
+ *
76
+ * @param schema The Zod schema to create the selection object from.
77
+ */
78
+ export function forSchema<TSchema extends z.ZodObject>(
79
+ schema: TSchema,
80
+ ): { [K in keyof TSchema["shape"]]: true } {
81
+ return mapValues(schema.shape, constant(true)) as { [K in keyof TSchema["shape"]]: true }
68
82
  }
@@ -1,5 +1,86 @@
1
- export class AccessError extends Error {
1
+ export class BackendError extends Error {
2
+ constructor(message: string, cause?: unknown) {
3
+ super(message, { cause })
4
+ this.name = "BackendError"
5
+ }
6
+ }
7
+
8
+ export class AccessError extends BackendError {
2
9
  constructor(message: string) {
3
10
  super(message)
11
+ this.name = "AccessError"
12
+ }
13
+ }
14
+
15
+ export class ProjectLockedError extends AccessError {
16
+ constructor(projectId: string) {
17
+ super(`The project with ID "${projectId}" is locked, decryption is not possible.`)
18
+ }
19
+ }
20
+
21
+ export class ProjectNotFoundError extends BackendError {
22
+ constructor(projectId: string) {
23
+ super(`Project with ID "${projectId}" not found.`)
24
+ this.name = "ProjectNotFoundError"
25
+ }
26
+ }
27
+
28
+ export class CannotDeleteLastUnlockMethodError extends BackendError {
29
+ constructor(projectId: string) {
30
+ super(`Refused to delete the last unlock method for project "${projectId}".`)
31
+ this.name = "CannotDeleteLastUnlockMethodError"
32
+ }
33
+ }
34
+
35
+ export class InstanceNotFoundError extends BackendError {
36
+ constructor(projectId: string, instanceId: string) {
37
+ super(`Instance with ID "${instanceId}" not found in project "${projectId}".`)
38
+ this.name = "InstanceNotFoundError"
39
+ }
40
+ }
41
+
42
+ export class InvalidInstanceKindError extends BackendError {
43
+ constructor(projectId: string, instanceId: string, expectedKind: string, actualKind: string) {
44
+ super(
45
+ `Instance "${instanceId}" in project "${projectId}" has kind "${actualKind}", but expected "${expectedKind}".`,
46
+ )
47
+ this.name = "InvalidInstanceKindError"
48
+ }
49
+ }
50
+
51
+ export class OperationNotFoundError extends BackendError {
52
+ constructor(projectId: string, operationId: string) {
53
+ super(`Operation with ID "${operationId}" not found in project "${projectId}".`)
54
+ this.name = "OperationNotFoundError"
55
+ }
56
+ }
57
+
58
+ export class InstanceLockLostError extends BackendError {
59
+ constructor(projectId: string, instanceIds: string[], token: string) {
60
+ super(
61
+ `Instance lock lost for instances [${instanceIds.join(", ")}] in project "${projectId}" with token "${token}".`,
62
+ )
63
+ this.name = "InstanceLockLostError"
64
+ }
65
+ }
66
+
67
+ export class InstanceStateNotFoundError extends BackendError {
68
+ constructor(projectId: string, instanceId: string) {
69
+ super(`State for instance with ID "${instanceId}" not found in project "${projectId}".`)
70
+ this.name = "InstanceStateNotFoundError"
71
+ }
72
+ }
73
+
74
+ export class InstanceLockedError extends BackendError {
75
+ constructor(projectId: string, instanceId: string) {
76
+ super(`Instance with ID "${instanceId}" in project "${projectId}" is locked.`)
77
+ this.name = "InstanceLockedError"
78
+ }
79
+ }
80
+
81
+ export class WorkerVersionNotFoundError extends BackendError {
82
+ constructor(projectId: string, workerVersionId: string) {
83
+ super(`Worker version with ID "${workerVersionId}" not found in project "${projectId}".`)
84
+ this.name = "WorkerVersionNotFoundError"
4
85
  }
5
86
  }
@@ -1,4 +1,5 @@
1
- export * from "./base"
2
1
  export * from "./backend"
3
- export * from "./project"
2
+ export * from "./base"
4
3
  export * from "./errors"
4
+ export * from "./prisma"
5
+ export * from "./project"
@@ -0,0 +1,36 @@
1
+ import type * as contract from "@highstate/contract"
2
+ import type * as shared from "../../shared"
3
+
4
+ declare global {
5
+ namespace PrismaJson {
6
+ type LibrarySpec = shared.LibrarySpec
7
+ type CommonObjectMeta = contract.CommonObjectMeta
8
+
9
+ type PulumiBackendSpec = shared.PulumiBackendSpec
10
+
11
+ type ProjectModelStorageSpec = shared.ProjectModelStorageSpec
12
+
13
+ type InstanceId = contract.InstanceId
14
+ type NullableInstanceId = contract.InstanceId | null
15
+ type InstanceIds = contract.InstanceId[]
16
+ type InstanceModel = contract.InstanceModel
17
+
18
+ type InstanceArgs = Record<string, unknown>
19
+ type InstanceResolvedInputs = Record<string, contract.InstanceInput[]>
20
+ type UnlockMethodMeta = shared.UnlockMethodMeta
21
+ type ProjectUnlockSuite = shared.ProjectUnlockSuite
22
+
23
+ type InstanceStatusFields = contract.InstanceStatusField[]
24
+
25
+ type OperationMeta = shared.OperationMeta
26
+ type OperationOptions = shared.OperationOptions
27
+ type OperationPhase = shared.OperationPhase
28
+
29
+ type WorkerUnitRegistrationParams = Record<string, unknown>
30
+
31
+ type ServiceAccountMeta = contract.ServiceAccountMeta
32
+
33
+ type ApiKeyMeta = shared.ApiKeyMeta
34
+ type InstanceArtifactIds = Record<string, string[]>
35
+ }
36
+ }
@@ -1,65 +1,43 @@
1
- import { z } from "zod"
2
- import { objectMetaSchema } from "@highstate/contract"
3
-
4
- export const instanceActionSchema = z.enum(["read", "write"])
5
- export const serviceAccountActionSchema = z.enum(["full"])
6
-
7
- export const projectAccessScope = z.discriminatedUnion("type", [
8
- z.object({
9
- type: z.literal("instance"),
10
- actions: instanceActionSchema.array(),
11
- instanceIds: z.string().array(),
12
- }),
13
- z.object({
14
- type: z.literal("service-account"),
15
- actions: serviceAccountActionSchema.array(),
16
- serviceAccountIds: z.string().array(),
17
- }),
18
- ])
19
-
20
- export const projectApiKeySchema = z.object({
21
- id: z.uuidv7(),
22
- meta: objectMetaSchema,
23
-
24
- /**
25
- * The 256-bit random token used to authenticate API requests.
26
- */
27
- token: z.string(),
28
-
29
- /**
30
- * The scopes granted to this API key.
31
- */
32
- scopes: z.array(projectAccessScope),
1
+ import {
2
+ commonObjectMetaSchema,
3
+ objectMetaSchema,
4
+ serviceAccountMetaSchema,
5
+ z,
6
+ } from "@highstate/contract"
7
+ import { collectionQuerySchema } from "../base"
8
+ import type { ServiceAccount } from "../../../database"
9
+
10
+ export const apiKeyMetaSchema = objectMetaSchema
11
+ .pick({
12
+ title: true,
13
+ description: true,
14
+ })
15
+ .required({ title: true })
16
+
17
+ export type ApiKeyMeta = z.infer<typeof apiKeyMetaSchema>
18
+
19
+ export const apiKeyOutputSchema = z.object({
20
+ id: z.cuid2(),
21
+ meta: commonObjectMetaSchema,
22
+ serviceAccountId: z.cuid2(),
23
+ serviceAccountMeta: serviceAccountMetaSchema.nullable(),
24
+ createdAt: z.date(),
33
25
  })
34
26
 
35
- export type InstanceAction = z.infer<typeof instanceActionSchema>
36
- export type ProjectAccessScope = z.infer<typeof projectAccessScope>
37
- export type ProjectApiKey = z.infer<typeof projectApiKeySchema>
27
+ export type ApiKeyOutput = z.infer<typeof apiKeyOutputSchema>
38
28
 
39
- function hasAll<T>(array: T[], values: T[]): boolean {
40
- return values.every(value => array.includes(value))
41
- }
42
-
43
- export function validateInstanceAccess(
44
- apiKey: ProjectApiKey,
45
- actions: InstanceAction[],
46
- instanceIds: string[],
47
- ): boolean {
48
- return apiKey.scopes
49
- .filter(scope => scope.type === "instance")
50
- .some(scope => hasAll(scope.actions, actions) && hasAll(scope.instanceIds, instanceIds))
51
- }
29
+ export const apiKeyQuerySchema = collectionQuerySchema.extend({
30
+ serviceAccountId: z.string().optional(),
31
+ })
52
32
 
53
- type ActionDescriptionMap<TType extends ProjectAccessScope["type"] = ProjectAccessScope["type"]> = {
54
- [K in TType]: Record<(ProjectAccessScope & { type: K })["actions"][number], string>
55
- }
33
+ export type ApiKeyQuery = z.infer<typeof apiKeyQuerySchema>
56
34
 
57
- export const projectAccessActionDescriptions: ActionDescriptionMap = {
58
- "service-account": {
59
- full: "Full access to the service account and all resources owned by it and granted to it.",
60
- },
61
- instance: {
62
- read: "Read access to the instance, including its state all resources owned by it.",
63
- write: "Write access to the instance, including its state and all resources owned by it.",
64
- },
35
+ export function toApiKeyOutput(
36
+ apiKey: Omit<ApiKeyOutput, "serviceAccountMeta">,
37
+ serviceAccount?: Pick<ServiceAccount, "meta"> | null,
38
+ ): ApiKeyOutput {
39
+ return {
40
+ ...apiKey,
41
+ serviceAccountMeta: serviceAccount?.meta ?? null,
42
+ }
65
43
  }
@@ -1,83 +1,23 @@
1
+ import { commonObjectMetaSchema } from "@highstate/contract"
1
2
  import { z } from "zod"
2
- import { type FileMeta } from "@highstate/contract"
3
- import { objectMetaSchema } from "@highstate/contract"
3
+ import { collectionQuerySchema } from "../base"
4
4
 
5
- export const artifactUsageSchema = z.discriminatedUnion("type", [
6
- z.object({
7
- type: z.literal("instance"),
8
- instanceId: z.string(),
9
- }),
10
- z.object({
11
- type: z.literal("terminal"),
12
- terminalId: z.string(),
13
- }),
14
- z.object({
15
- type: z.literal("service-account"),
16
- serviceAccountId: z.string(),
17
- }),
18
- ])
19
-
20
- export type ArtifactUsage = z.infer<typeof artifactUsageSchema>
21
-
22
- export function compareArtifactUsage(a: ArtifactUsage, b: ArtifactUsage): boolean {
23
- if (a.type === "instance" && b.type === "instance") {
24
- return a.instanceId === b.instanceId
25
- }
26
-
27
- if (a.type === "terminal" && b.type === "terminal") {
28
- return a.terminalId === b.terminalId
29
- }
30
-
31
- if (a.type === "service-account" && b.type === "service-account") {
32
- return a.serviceAccountId === b.serviceAccountId
33
- }
34
-
35
- return false
36
- }
37
-
38
- /**
39
- * File metadata schema.
40
- */
41
- export const fileMetaSchema = z.object({
42
- name: z.string(),
43
- size: z.number().optional(),
44
- isBinary: z.boolean().optional(),
45
- mode: z.number().optional(),
46
- }) satisfies z.ZodType<FileMeta>
47
-
48
- /**
49
- * Complete artifact schema for database storage.
50
- * Contains all artifact information.
51
- */
52
- export const artifactSchema = z.object({
53
- /**
54
- * The UUIDv7 of the artifact generated when the artifact with unique content is first stored.
55
- */
56
- id: z.uuidv7(),
57
-
58
- meta: objectMetaSchema,
59
-
60
- /**
61
- * The SHA-256 hash of the artifact content before encryption.
62
- */
5
+ export const artifactOutputSchema = z.object({
6
+ id: z.cuid2(),
63
7
  hash: z.string(),
64
-
65
- /**
66
- * The list of usages of this artifact.
67
- *
68
- * When became empty, the artifact is garbage collected.
69
- */
70
- usages: artifactUsageSchema.array(),
71
-
72
- /**
73
- * The size of the unencrypted artifact archive in bytes.
74
- */
75
8
  size: z.number(),
9
+ meta: commonObjectMetaSchema,
10
+ createdAt: z.date(),
11
+ updatedAt: z.date(),
12
+ })
13
+
14
+ export type ArtifactOutput = z.infer<typeof artifactOutputSchema>
76
15
 
77
- /**
78
- * The size of each chunk of the artifact which independently encrypted.
79
- */
80
- chunkSize: z.number(),
16
+ export const artifactQuerySchema = collectionQuerySchema.extend({
17
+ stateId: z.string().optional(),
18
+ serviceAccountId: z.string().optional(),
19
+ terminalId: z.string().optional(),
20
+ pageId: z.string().optional(),
81
21
  })
82
22
 
83
- export type Artifact = z.infer<typeof artifactSchema>
23
+ export type ArtifactQuery = z.infer<typeof artifactQuerySchema>
@@ -0,0 +1,12 @@
1
+ import { commonObjectMetaSchema } from "@highstate/contract"
2
+ import { z } from "zod"
3
+
4
+ export const instanceCustomStatusInputSchema = z.object({
5
+ name: z.string(),
6
+ meta: commonObjectMetaSchema,
7
+ value: z.string(),
8
+ message: z.string().optional(),
9
+ order: z.number().min(0).max(100).optional(),
10
+ })
11
+
12
+ export type InstanceCustomStatusInput = z.infer<typeof instanceCustomStatusInputSchema>
@@ -1,13 +1,14 @@
1
+ export * from "./api-key"
2
+ export * from "./artifact"
3
+ export * from "./custom-status"
4
+ export * from "./lock"
1
5
  export * from "./model"
2
- export * from "./state"
3
6
  export * from "./operation"
4
- export * from "./terminal"
5
7
  export * from "./page"
6
- export * from "./artifact"
7
- export * from "./trigger"
8
- export * from "./unlock-method"
9
8
  export * from "./secret"
10
- export * from "./lock"
11
9
  export * from "./service-account"
10
+ export * from "./state"
11
+ export * from "./terminal"
12
+ export * from "./trigger"
13
+ export * from "./unlock-method"
12
14
  export * from "./worker"
13
- export * from "./api-key"
@@ -1,91 +1,23 @@
1
+ import { commonObjectMetaSchema } from "@highstate/contract"
1
2
  import { z } from "zod"
2
- import { instanceIdSchema, objectMetaSchema } from "@highstate/contract"
3
3
 
4
- export const instanceLockSpecSchema = z.union([
5
- z.object({
6
- type: z.literal("operation"),
7
-
8
- /**
9
- * The operation ID. Will be used to fetch the operation and detect whether it is still running or lost.
10
- */
11
- operationId: z.string(),
12
- }),
13
- z.object({
14
- type: z.literal("evaluation"),
15
-
16
- /**
17
- * The internal evaluation ID that is used to detect lost evaluations and restart them.
18
- */
19
- evaluationId: z.string(),
20
- }),
21
- z.object({
22
- type: z.literal("custom"),
23
-
24
- /**
25
- * The ID of the party that holds the lock.
26
- *
27
- * Each locker must only manage the locks it has created.
28
- */
29
- lockerId: z.string(),
30
-
31
- /**
32
- * The ID of the lock provided by the locker.
33
- *
34
- * Must be unique across all locks in the locker system.
35
- */
36
- lockId: z.string(),
37
-
38
- /**
39
- * The optional payload provided by the locker.
40
- *
41
- * Can be used to store additional information about the lock,
42
- * like the ID of the lock in the locker system,
43
- * or any other metadata that is relevant to the lock.
44
- */
45
- payload: z.record(z.string(), z.string()).optional(),
46
- }),
47
- ])
48
-
49
- export const instanceLockSchema = z.object({
50
- id: instanceIdSchema,
51
- meta: objectMetaSchema,
52
- spec: instanceLockSpecSchema,
4
+ export const instanceLockOutputSchema = z.object({
5
+ stateId: z.cuid2(),
6
+ meta: commonObjectMetaSchema,
7
+ acquiredAt: z.date(),
53
8
  })
54
9
 
55
- export type InstanceLock = z.infer<typeof instanceLockSchema>
56
- export type InstanceLockSpec = z.infer<typeof instanceLockSpecSchema>
57
-
58
- /**
59
- * Compares two instance lock specifications for equality.
60
- *
61
- * @param a The first instance lock specification to compare.
62
- * @param b The second instance lock specification to compare.
63
- *
64
- * @returns True if both specifications are of the same type and have matching identifiers, false otherwise.
65
- */
66
- export function compareInstanceLockSpecs(a: InstanceLockSpec, b: InstanceLockSpec): boolean {
67
- if (a.type === "operation" && b.type === "operation") {
68
- return a.operationId === b.operationId
69
- }
70
-
71
- if (a.type === "evaluation" && b.type === "evaluation") {
72
- return a.evaluationId === b.evaluationId
73
- }
74
-
75
- if (a.type === "custom" && b.type === "custom") {
76
- return a.lockerId === b.lockerId && a.lockId === b.lockId
77
- }
78
-
79
- return false
80
- }
10
+ export type InstanceLockOutput = z.infer<typeof instanceLockOutputSchema>
81
11
 
82
12
  export const instanceLockEventSchema = z.discriminatedUnion("type", [
83
13
  z.object({
84
14
  type: z.literal("locked"),
85
- locks: z.array(instanceLockSchema),
15
+ locks: instanceLockOutputSchema.array(),
86
16
  }),
87
17
  z.object({
88
18
  type: z.literal("unlocked"),
89
- instanceIds: z.array(z.string()),
19
+ stateIds: z.array(z.string()),
90
20
  }),
91
21
  ])
22
+
23
+ export type InstanceLockEvent = z.infer<typeof instanceLockEventSchema>
@@ -1,14 +1,32 @@
1
- import { hubModelSchema, instanceIdSchema, instanceModelSchema } from "@highstate/contract"
1
+ import {
2
+ type HubModel,
3
+ hubModelSchema,
4
+ type InstanceModel,
5
+ instanceIdSchema,
6
+ instanceModelSchema,
7
+ } from "@highstate/contract"
2
8
  import { z } from "zod"
3
9
 
4
10
  export const projectModelEventSchema = z.object({
5
11
  updatedInstances: instanceModelSchema.array().optional(),
6
12
  updatedHubs: hubModelSchema.array().optional(),
7
13
  updatedVirtualInstances: instanceModelSchema.array().optional(),
14
+ updatedGhostInstances: instanceModelSchema.array().optional(),
8
15
 
9
16
  deletedInstanceIds: instanceIdSchema.array().optional(),
10
17
  deletedHubIds: z.string().array().optional(),
11
18
  deletedVirtualInstanceIds: instanceIdSchema.array().optional(),
19
+ deletedGhostInstanceIds: instanceIdSchema.array().optional(),
12
20
  })
13
21
 
14
22
  export type ProjectNodeEvent = z.infer<typeof projectModelEventSchema>
23
+
24
+ export type ProjectModel = {
25
+ instances: InstanceModel[]
26
+ hubs: HubModel[]
27
+ }
28
+
29
+ export type FullProjectModel = ProjectModel & {
30
+ virtualInstances: InstanceModel[]
31
+ ghostInstances: InstanceModel[]
32
+ }