@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
@@ -35,7 +35,7 @@ for (const packageName of packageNames) {
35
35
  }
36
36
  }
37
37
  }
38
- parentPort.postMessage({
38
+ parentPort?.postMessage({
39
39
  type: "result",
40
40
  results
41
41
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/library/package-resolution-worker.ts"],"names":[],"mappings":";;;;;;;AA8BA,IAAM,EAAE,YAAA,EAAc,QAAA,EAAS,GAAI,UAAA;AAEnC,IAAM,MAAA,GAAS,KAAK,EAAE,IAAA,EAAM,4BAA4B,KAAA,EAAO,QAAA,IAAY,UAAU,CAAA;AAErF,IAAM,UAA2B,EAAC;AAElC,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,WAAA,EAAa,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AACzD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,WAAW,CAAA,WAAA,CAAa,CAAA;AAAA,IACtD;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAM,SAAA;AAAA,MACN,WAAA;AAAA,MACA,eAAA,EAAiB,MAAM,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAC;AAAA,KAC9C,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAM,EAAG,kCAAkC,WAAW,CAAA;AAErE,IAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACjE,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,WAAA;AAAA,QACN;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,OAAA;AAAA,QACN,WAAA;AAAA,QACA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAEA,UAAA,CAAY,WAAA,CAAY;AAAA,EACtB,IAAA,EAAM,QAAA;AAAA,EACN;AACF,CAAC,CAAA","file":"package-resolution-worker.js","sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\"\nimport { dirname } from \"node:path\"\nimport { findPackageJSON } from \"node:module\"\nimport { realpath } from \"node:fs/promises\"\nimport pino, { type Level } from \"pino\"\n\nexport type PackageResolutionWorkerData = {\n packageNames: string[]\n logLevel?: Level\n}\n\nexport type PackageResult = { packageName: string } & (\n | {\n type: \"success\"\n packageRootPath: string\n }\n | {\n type: \"not-found\"\n }\n | {\n type: \"error\"\n error: string\n }\n)\n\nexport type PackageResolutionResponse = {\n type: \"result\"\n results: PackageResult[]\n}\n\nconst { packageNames, logLevel } = workerData as PackageResolutionWorkerData\n\nconst logger = pino({ name: \"source-resolution-worker\", level: logLevel ?? \"silent\" })\n\nconst results: PackageResult[] = []\n\nfor (const packageName of packageNames) {\n try {\n const path = findPackageJSON(packageName, import.meta.url)\n if (!path) {\n throw new Error(`Package \"${packageName}\" not found`)\n }\n\n results.push({\n type: \"success\",\n packageName,\n packageRootPath: await realpath(dirname(path)),\n })\n } catch (error) {\n logger.error({ error }, `failed to resolve package \"%s\"`, packageName)\n\n if (error instanceof Error && error.message.includes(\"not found\")) {\n results.push({\n type: \"not-found\",\n packageName,\n })\n } else {\n results.push({\n type: \"error\",\n packageName,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n}\n\nparentPort!.postMessage({\n type: \"result\",\n results,\n})\n"]}
1
+ {"version":3,"sources":["../../src/library/package-resolution-worker.ts"],"names":[],"mappings":";;;;;;;AA8BA,IAAM,EAAE,YAAA,EAAc,QAAA,EAAS,GAAI,UAAA;AAEnC,IAAM,MAAA,GAAS,KAAK,EAAE,IAAA,EAAM,4BAA4B,KAAA,EAAO,QAAA,IAAY,UAAU,CAAA;AAErF,IAAM,UAA2B,EAAC;AAElC,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,WAAA,EAAa,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AACzD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,WAAW,CAAA,WAAA,CAAa,CAAA;AAAA,IACtD;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAM,SAAA;AAAA,MACN,WAAA;AAAA,MACA,eAAA,EAAiB,MAAM,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAC;AAAA,KAC9C,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAM,EAAG,kCAAkC,WAAW,CAAA;AAErE,IAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACjE,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,WAAA;AAAA,QACN;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,OAAA;AAAA,QACN,WAAA;AAAA,QACA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAEA,UAAA,EAAY,WAAA,CAAY;AAAA,EACtB,IAAA,EAAM,QAAA;AAAA,EACN;AACF,CAAC,CAAA","file":"package-resolution-worker.js","sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\"\nimport { dirname } from \"node:path\"\nimport { findPackageJSON } from \"node:module\"\nimport { realpath } from \"node:fs/promises\"\nimport pino, { type Level } from \"pino\"\n\nexport type PackageResolutionWorkerData = {\n packageNames: string[]\n logLevel?: Level\n}\n\nexport type PackageResult = { packageName: string } & (\n | {\n type: \"success\"\n packageRootPath: string\n }\n | {\n type: \"not-found\"\n }\n | {\n type: \"error\"\n error: string\n }\n)\n\nexport type PackageResolutionResponse = {\n type: \"result\"\n results: PackageResult[]\n}\n\nconst { packageNames, logLevel } = workerData as PackageResolutionWorkerData\n\nconst logger = pino({ name: \"source-resolution-worker\", level: logLevel ?? \"silent\" })\n\nconst results: PackageResult[] = []\n\nfor (const packageName of packageNames) {\n try {\n const path = findPackageJSON(packageName, import.meta.url)\n if (!path) {\n throw new Error(`Package \"${packageName}\" not found`)\n }\n\n results.push({\n type: \"success\",\n packageName,\n packageRootPath: await realpath(dirname(path)),\n })\n } catch (error) {\n logger.error({ error }, `failed to resolve package \"%s\"`, packageName)\n\n if (error instanceof Error && error.message.includes(\"not found\")) {\n results.push({\n type: \"not-found\",\n packageName,\n })\n } else {\n results.push({\n type: \"error\",\n packageName,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n}\n\nparentPort?.postMessage({\n type: \"result\",\n results,\n})\n"]}
@@ -1,19 +1,18 @@
1
- import { errorToString } from '../../chunk-NAAIDR4U.js';
2
- import '../../chunk-OU5OQBLB.js';
1
+ import { errorToString } from '../../chunk-VB4YL327.js';
2
+ import '../../chunk-I7BWSAN6.js';
3
3
  import { workerData, parentPort } from 'node:worker_threads';
4
4
  import { pino } from 'pino';
5
5
  import { InstanceNameConflictError, getRuntimeInstances, isComponent } from '@highstate/contract';
6
6
 
7
- function evaluateProject(logger2, components, allInstances, resolvedInputs, instanceIds) {
8
- const errors = {};
7
+ function evaluateProject(logger2, components, allInstances, resolvedInputs) {
9
8
  const allInstancesMap = new Map(allInstances.map((instance) => [instance.id, instance]));
9
+ const instanceErrors = {};
10
+ const topLevelErrors = {};
10
11
  const instanceOutputs = /* @__PURE__ */ new Map();
11
- for (const instanceId of instanceIds ?? []) {
12
+ for (const instance of allInstances) {
12
13
  try {
13
- logger2.debug({ instanceId }, "evaluating top-level instance");
14
- evaluateInstance(instanceId);
14
+ evaluateInstance(instance.id);
15
15
  } catch (error) {
16
- errors[instanceId] = errorToString(error);
17
16
  if (error instanceof InstanceNameConflictError) {
18
17
  return {
19
18
  success: false,
@@ -24,25 +23,38 @@ function evaluateProject(logger2, components, allInstances, resolvedInputs, inst
24
23
  }
25
24
  return {
26
25
  success: true,
27
- virtualInstances: getRuntimeInstances().map((instance) => instance.instance).filter((instance) => instanceIds.includes(instance.id) || !allInstancesMap.has(instance.id)),
28
- topLevelErrors: errors
26
+ virtualInstances: getRuntimeInstances().map((instance) => instance.instance).filter((instance) => instance.kind === "composite" || !allInstancesMap.has(instance.id)),
27
+ topLevelErrors
29
28
  };
30
29
  function evaluateInstance(instanceId) {
31
30
  let outputs = instanceOutputs.get(instanceId);
32
- if (!outputs) {
33
- outputs = _evaluateInstance(instanceId);
34
- instanceOutputs.set(instanceId, outputs);
31
+ if (outputs) {
32
+ return outputs;
33
+ }
34
+ const error = instanceErrors[instanceId];
35
+ if (error) {
36
+ throw error;
35
37
  }
36
- return outputs;
37
- }
38
- function _evaluateInstance(instanceId) {
39
- const inputs = {};
40
38
  const instance = allInstancesMap.get(instanceId);
41
- logger2.debug("evaluating instance", { instanceId });
42
39
  if (!instance) {
43
40
  throw new Error(`Instance not found: ${instanceId}`);
44
41
  }
45
- for (const [inputName, input] of Object.entries(resolvedInputs[instanceId] ?? {})) {
42
+ try {
43
+ outputs = _evaluateInstance(instance);
44
+ instanceOutputs.set(instanceId, outputs);
45
+ return outputs;
46
+ } catch (error2) {
47
+ if (instance.kind === "composite" || !allInstancesMap.has(instance.id)) {
48
+ topLevelErrors[instance.id] = errorToString(error2);
49
+ }
50
+ instanceErrors[instanceId] = error2;
51
+ throw error2;
52
+ }
53
+ }
54
+ function _evaluateInstance(instance) {
55
+ const inputs = {};
56
+ logger2.debug("evaluating instance", { instanceId: instance.id });
57
+ for (const [inputName, input] of Object.entries(resolvedInputs[instance.id] ?? {})) {
46
58
  inputs[inputName] = input.map((input2) => {
47
59
  const evaluated = evaluateInstance(input2.input.instanceId);
48
60
  return evaluated[input2.input.output];
@@ -50,7 +62,7 @@ function evaluateProject(logger2, components, allInstances, resolvedInputs, inst
50
62
  }
51
63
  const component = components[instance.type];
52
64
  if (!component) {
53
- throw new Error(`Component not found: ${instance.type}, required by instance: ${instanceId}`);
65
+ throw new Error(`Component not found: ${instance.type}, required by instance: ${instance.id}`);
54
66
  }
55
67
  return component({
56
68
  name: instance.name,
@@ -102,17 +114,11 @@ var data = workerData;
102
114
  var logger = pino({ name: "library-worker" });
103
115
  try {
104
116
  const library = await loadComponents(logger, data.libraryModulePaths);
105
- const result = evaluateProject(
106
- logger,
107
- library,
108
- data.allInstances,
109
- data.resolvedInputs,
110
- data.instanceIds
111
- );
112
- parentPort.postMessage(result);
117
+ const result = evaluateProject(logger, library, data.allInstances, data.resolvedInputs);
118
+ parentPort?.postMessage(result);
113
119
  } catch (error) {
114
120
  logger.error({ error }, "failed to evaluate project");
115
- parentPort.postMessage({
121
+ parentPort?.postMessage({
116
122
  success: false,
117
123
  error: errorToString(error)
118
124
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/library/worker/evaluator.ts","../../../src/library/worker/loader.lite.ts","../../../src/library/worker/main.ts"],"names":["logger","input"],"mappings":"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","file":"main.js","sourcesContent":["import type { Logger } from \"pino\"\nimport type { ProjectEvaluationResult } from \"../abstractions\"\nimport type { ResolvedInstanceInput } from \"../../shared\"\nimport {\n getRuntimeInstances,\n InstanceNameConflictError,\n type Component,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { errorToString } from \"../../common\"\n\nexport function evaluateProject(\n logger: Logger,\n components: Readonly<Record<string, Component>>,\n allInstances: InstanceModel[],\n resolvedInputs: Record<string, Record<string, ResolvedInstanceInput[]>>,\n instanceIds: string[],\n): ProjectEvaluationResult {\n const errors: Record<string, string> = {}\n const allInstancesMap = new Map(allInstances.map(instance => [instance.id, instance]))\n const instanceOutputs = new Map<string, Record<string, unknown>>()\n\n for (const instanceId of instanceIds ?? []) {\n try {\n logger.debug({ instanceId }, \"evaluating top-level instance\")\n\n evaluateInstance(instanceId as InstanceModel[\"id\"])\n } catch (error) {\n errors[instanceId] = errorToString(error)\n\n if (error instanceof InstanceNameConflictError) {\n // fail the whole evaluation if there's a name conflict\n return {\n success: false,\n error: error.message,\n }\n }\n }\n }\n\n return {\n success: true,\n virtualInstances: getRuntimeInstances()\n .map(instance => instance.instance)\n // only include top-level composite instances and their children\n .filter(instance => instanceIds.includes(instance.id) || !allInstancesMap.has(instance.id)),\n topLevelErrors: errors,\n }\n\n function evaluateInstance(instanceId: InstanceModel[\"id\"]): Record<string, unknown> {\n let outputs = instanceOutputs.get(instanceId)\n\n if (!outputs) {\n outputs = _evaluateInstance(instanceId)\n instanceOutputs.set(instanceId, outputs)\n }\n\n return outputs\n }\n\n function _evaluateInstance(instanceId: InstanceModel[\"id\"]): Record<string, unknown> {\n const inputs: Record<string, unknown> = {}\n const instance = allInstancesMap.get(instanceId)\n\n logger.debug(\"evaluating instance\", { instanceId })\n\n if (!instance) {\n throw new Error(`Instance not found: ${instanceId}`)\n }\n\n for (const [inputName, input] of Object.entries(resolvedInputs[instanceId] ?? {})) {\n inputs[inputName] = input.map(input => {\n const evaluated = evaluateInstance(input.input.instanceId)\n\n return evaluated[input.input.output]\n })\n }\n\n const component = components[instance.type]\n if (!component) {\n throw new Error(`Component not found: ${instance.type}, required by instance: ${instanceId}`)\n }\n\n return component({\n name: instance.name,\n args: instance.args as Record<string, never>,\n inputs: inputs as Record<string, never>,\n })\n }\n}\n","import type { Logger } from \"pino\"\nimport { isComponent, type Component } from \"@highstate/contract\"\n\nexport async function loadComponents(\n logger: Logger,\n modulePaths: string[],\n): Promise<Readonly<Record<string, Component>>> {\n const modules: Record<string, unknown> = {}\n for (const modulePath of modulePaths) {\n try {\n logger.debug({ modulePath }, \"loading module\")\n modules[modulePath] = await import(modulePath)\n\n logger.debug({ modulePath }, \"module loaded\")\n } catch (err) {\n logger.error({ modulePath, err }, \"module load failed\")\n }\n }\n\n const components: Record<string, Component> = {}\n\n await _loadLibrary(modules, components)\n logger.debug(\"library loaded with %s components\", Object.keys(components).length)\n\n return components\n}\n\nasync function _loadLibrary(value: unknown, components: Record<string, Component>): Promise<void> {\n if (isComponent(value)) {\n components[value.model.type] = value\n return\n }\n\n if (typeof value !== \"object\" || value === null) {\n return\n }\n\n if (\"_zod\" in value) {\n // this is a zod schema, we can skip it\n return\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n await _loadLibrary(item, components)\n }\n\n return\n }\n\n for (const key in value) {\n await _loadLibrary((value as Record<string, unknown>)[key], components)\n }\n}\n","import type { WorkerData } from \"./protocol\"\nimport { parentPort, workerData } from \"node:worker_threads\"\nimport { pino } from \"pino\"\nimport { errorToString } from \"../../common\"\nimport { evaluateProject } from \"./evaluator\"\nimport { loadComponents } from \"./loader.lite\"\n\nconst data = workerData as WorkerData\n\nconst logger = pino({ name: \"library-worker\" })\n\ntry {\n const library = await loadComponents(logger, data.libraryModulePaths)\n\n const result = evaluateProject(\n logger,\n library,\n data.allInstances,\n data.resolvedInputs,\n data.instanceIds,\n )\n\n parentPort!.postMessage(result)\n} catch (error) {\n logger.error({ error }, \"failed to evaluate project\")\n\n parentPort!.postMessage({\n success: false,\n error: errorToString(error),\n })\n}\n"]}
1
+ {"version":3,"sources":["../../../src/library/worker/evaluator.ts","../../../src/library/worker/loader.lite.ts","../../../src/library/worker/main.ts"],"names":["logger","error","input"],"mappings":"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","file":"main.js","sourcesContent":["import type { Logger } from \"pino\"\nimport type { ProjectEvaluationResult } from \"../abstractions\"\nimport type { ResolvedInstanceInput } from \"../../shared\"\nimport {\n getRuntimeInstances,\n InstanceNameConflictError,\n type Component,\n type InstanceModel,\n} from \"@highstate/contract\"\nimport { errorToString } from \"../../common\"\n\nexport function evaluateProject(\n logger: Logger,\n components: Readonly<Record<string, Component>>,\n allInstances: InstanceModel[],\n resolvedInputs: Record<string, Record<string, ResolvedInstanceInput[]>>,\n): ProjectEvaluationResult {\n const allInstancesMap = new Map(allInstances.map(instance => [instance.id, instance]))\n\n const instanceErrors: Record<string, unknown> = {}\n const topLevelErrors: Record<string, string> = {}\n\n const instanceOutputs = new Map<string, Record<string, unknown>>()\n\n for (const instance of allInstances) {\n try {\n evaluateInstance(instance.id)\n } catch (error) {\n if (error instanceof InstanceNameConflictError) {\n // fail the whole evaluation if there's a name conflict\n return {\n success: false,\n error: error.message,\n }\n }\n }\n }\n\n return {\n success: true,\n\n virtualInstances: getRuntimeInstances()\n .map(instance => instance.instance)\n // only include top-level composite instances and their children\n .filter(instance => instance.kind === \"composite\" || !allInstancesMap.has(instance.id)),\n\n topLevelErrors,\n }\n\n function evaluateInstance(instanceId: InstanceModel[\"id\"]): Record<string, unknown> {\n let outputs = instanceOutputs.get(instanceId)\n if (outputs) {\n return outputs\n }\n\n // do not evaluate instance if it has an error, just rethrow it\n const error = instanceErrors[instanceId]\n if (error) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error\n }\n\n const instance = allInstancesMap.get(instanceId)\n if (!instance) {\n throw new Error(`Instance not found: ${instanceId}`)\n }\n\n try {\n outputs = _evaluateInstance(instance)\n\n instanceOutputs.set(instanceId, outputs)\n return outputs\n } catch (error) {\n if (instance.kind === \"composite\" || !allInstancesMap.has(instance.id)) {\n topLevelErrors[instance.id] = errorToString(error)\n }\n\n instanceErrors[instanceId] = error\n throw error\n }\n }\n\n function _evaluateInstance(instance: InstanceModel): Record<string, unknown> {\n const inputs: Record<string, unknown> = {}\n\n logger.debug(\"evaluating instance\", { instanceId: instance.id })\n\n for (const [inputName, input] of Object.entries(resolvedInputs[instance.id] ?? {})) {\n inputs[inputName] = input.map(input => {\n const evaluated = evaluateInstance(input.input.instanceId)\n\n return evaluated[input.input.output]\n })\n }\n\n const component = components[instance.type]\n if (!component) {\n throw new Error(`Component not found: ${instance.type}, required by instance: ${instance.id}`)\n }\n\n return component({\n name: instance.name,\n args: instance.args as Record<string, never>,\n inputs: inputs as Record<string, never>,\n })\n }\n}\n","import type { Logger } from \"pino\"\nimport { type Component, isComponent } from \"@highstate/contract\"\n\nexport async function loadComponents(\n logger: Logger,\n modulePaths: string[],\n): Promise<Readonly<Record<string, Component>>> {\n const modules: Record<string, unknown> = {}\n for (const modulePath of modulePaths) {\n try {\n logger.debug({ modulePath }, \"loading module\")\n modules[modulePath] = await import(modulePath)\n\n logger.debug({ modulePath }, \"module loaded\")\n } catch (err) {\n logger.error({ modulePath, err }, \"module load failed\")\n }\n }\n\n const components: Record<string, Component> = {}\n\n await _loadLibrary(modules, components)\n logger.debug(\"library loaded with %s components\", Object.keys(components).length)\n\n return components\n}\n\nasync function _loadLibrary(value: unknown, components: Record<string, Component>): Promise<void> {\n if (isComponent(value)) {\n components[value.model.type] = value\n return\n }\n\n if (typeof value !== \"object\" || value === null) {\n return\n }\n\n if (\"_zod\" in value) {\n // this is a zod schema, we can skip it\n return\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n await _loadLibrary(item, components)\n }\n\n return\n }\n\n for (const key in value) {\n await _loadLibrary((value as Record<string, unknown>)[key], components)\n }\n}\n","import type { WorkerData } from \"./protocol\"\nimport { parentPort, workerData } from \"node:worker_threads\"\nimport { pino } from \"pino\"\nimport { errorToString } from \"../../common\"\nimport { evaluateProject } from \"./evaluator\"\nimport { loadComponents } from \"./loader.lite\"\n\nconst data = workerData as WorkerData\n\nconst logger = pino({ name: \"library-worker\" })\n\ntry {\n const library = await loadComponents(logger, data.libraryModulePaths)\n const result = evaluateProject(logger, library, data.allInstances, data.resolvedInputs)\n\n parentPort?.postMessage(result)\n} catch (error) {\n logger.error({ error }, \"failed to evaluate project\")\n\n parentPort?.postMessage({\n success: false,\n error: errorToString(error),\n })\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { AccessError, GraphResolver, InputHashResolver, InputResolver, MAX_WORKER_START_ATTEMPTS, PromiseTracker, ValidationResolver, WellKnownInstanceCustomStatus, WellKnownSecretDescriptors, applyLibraryUpdate, applyStatePatch, artifactSchema, artifactUsageSchema, backendUnlockMethodSchema, collectionQuerySchema, compareArtifactUsage, compareInstanceLockSpecs, createAsyncBatcher, diffLibraries, fileMetaSchema, formatSecretDescriptor, getAllDependents, getMatchedInjectionInstanceInputs, getResolvedHubInputs, getResolvedInjectionInstanceInputs, getResolvedInstanceInputs, getResolvedInstanceOutputs, getWorkerIdentity, hasObjectMeta, inputUnlockMethodSchema, instanceActionSchema, instanceCustomStatusSchema, instanceEvaluationStatusSchema, instanceEvaludationStatusEnumSchema, instanceLockEventSchema, instanceLockSchema, instanceLockSpecSchema, instanceOperationStatusEnumSchema, instanceOperationStatusSchema, instanceStateEventSchema, instanceStateExtraPath, instanceStateExtraSchema, instanceStatePatchSchema, instanceStateSchema, instanceStatusFieldSchema, instanceStatusFieldValueSchema, int32ToBytes, isFinalOperationStatus, isStableOperationStatus, isStateEmpty, isTransientOperationStatus, operationEventSchema, operationLogEntrySchema, operationOptionsSchema, operationRequestSchema, operationSchema, operationStatusSchema, operationTypeSchema, pageBlockSchema, pageContentSchema, pageSchema, parseArgumentValue, parseSecretDescriptor, projectAccessActionDescriptions, projectAccessScope, projectApiKeySchema, projectModelEventSchema, projectModelSchema, projectSchema, projectUnlockStateSchema, projectUnlockSuiteSchema, resolverFactories, secretDescriptorSchema, secretSchema, serviceAccountActionSchema, serviceAccountSchema, terminalSchema, terminalSessionSchema, terminalSpecSchema, triggerInvocationSchema, triggerSchema, triggerSpecSchema, unitInstanceStatusFieldSchema, unitPageSchema, unitTerminalSchema, unitTriggerSchema, unitWorkerSchema, unlockMethodSchema, unlockMethodType, validateInstanceAccess, workerSchema, workerStatus, workerUnitRegistrationSchema } from '../chunk-Y7DXREVO.js';
2
- import '../chunk-OU5OQBLB.js';
1
+ export { AccessError, BackendError, CannotDeleteLastUnlockMethodError, GraphResolver, InputHashResolver, InputResolver, InstanceLockLostError, InstanceLockedError, InstanceNotFoundError, InstanceStateNotFoundError, InvalidInstanceKindError, MAX_WORKER_START_ATTEMPTS, OperationNotFoundError, ProjectLockedError, ProjectNotFoundError, PromiseTracker, SystemSecretNames, ValidationResolver, WorkerVersionNotFoundError, apiKeyMetaSchema, apiKeyOutputSchema, apiKeyQuerySchema, applyLibraryUpdate, artifactOutputSchema, artifactQuerySchema, backendUnlockMethodSchema, codebaseLibrary, codebaseProjectModelStorage, collectionQueryResult, collectionQuerySchema, createAsyncBatcher, databaseProjectModelStorage, diffLibraries, extractDigestFromImage, finalInstanceOperationStatuses, finalOperationStatuses, forSchema, getAllDependents, getMatchedInjectionInstanceInputs, getResolvedHubInputs, getResolvedInjectionInstanceInputs, getResolvedInstanceInputs, getResolvedInstanceOutputs, getWorkerIdentity, globalProjectSpace, hasObjectMeta, hostPulumiBackend, instanceCustomStatusInputSchema, instanceLockEventSchema, instanceLockOutputSchema, instanceStateEventSchema, int32ToBytes, isFinalOperationStatus, isInstanceDeployed, isTransientInstanceOperationStatus, isTransientOperationStatus, isVirtualGhostInstance, librarySpecSchema, operationEventSchema, operationInputSchema, operationMetaSchema, operationOptionsSchema, operationOutputSchema, operationPhaseInstanceSchema, operationPhaseSchema, operationPhaseTypeSchema, operationStatusSchema, operationTypeSchema, pageDetailsOutputSchema, pageOutputSchema, pageQuerySchema, projectInputSchema, projectModelEventSchema, projectModelStorageSpecSchema, projectOutputSchema, projectUnlockStateSchema, projectUnlockSuiteSchema, pulumiBackendSpecSchema, resolverFactories, secretOutputSchema, secretQuerySchema, serviceAccountOutputSchema, serviceAccountQuerySchema, terminalDetailsOutputSchema, terminalOutputSchema, terminalQuerySchema, terminalSessionOutputSchema, terminalStatusSchema, toApiKeyOutput, toPageOutput, toSecretOutput, toTerminalDetailsOutput, toTerminalOutput, toTerminalSessionOutput, toWorkerOutput, toWorkerVersionOutput, triggerOutputSchema, triggerQuerySchema, unlockMethodInputSchema, unlockMethodMetaSchema, unlockMethodOutputSchema, unlockMethodType, waitAll, workerOutputSchema, workerQuerySchema, workerUnitRegistrationEventSchema, workerVersionOutputSchema, workerVersionStatusSchema } from '../chunk-5WVU2AK4.js';
2
+ import '../chunk-I7BWSAN6.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@highstate/backend",
3
- "version": "0.9.18",
3
+ "version": "0.9.19",
4
4
  "type": "module",
5
5
  "highstate": {
6
6
  "sourceHash": {
@@ -11,7 +11,7 @@
11
11
  "files": [
12
12
  "dist",
13
13
  "src",
14
- "patches"
14
+ "prisma"
15
15
  ],
16
16
  "exports": {
17
17
  ".": {
@@ -23,22 +23,31 @@
23
23
  "default": "./dist/shared/index.js"
24
24
  },
25
25
  "./library-worker": "./dist/library/worker/main.js",
26
- "./package-resolution-worker": "./dist/library/package-resolution-worker.js"
26
+ "./package-resolution-worker": "./dist/library/package-resolution-worker.js",
27
+ "./prisma-config": "./dist/database/local/prisma.config.js"
27
28
  },
28
29
  "publishConfig": {
29
30
  "access": "public"
30
31
  },
31
32
  "scripts": {
32
33
  "build": "highstate build",
33
- "test": "vitest --run"
34
+ "typecheck": "tsc --noEmit --skipLibCheck",
35
+ "test": "vitest --run",
36
+ "generate:project": "yarn prisma generate --schema prisma/project",
37
+ "generate:backend": "yarn prisma generate --schema prisma/backend/postgresql && yarn prisma generate --schema prisma/backend/sqlite",
38
+ "migrate": "yarn prisma migrate deploy --config dist/database/local/prisma.config.js"
34
39
  },
35
40
  "dependencies": {
36
41
  "@aws-crypto/crc32": "^5.2.0",
37
- "@highstate/contract": "^0.9.18",
42
+ "@highstate/contract": "^0.9.19",
38
43
  "@msgpack/msgpack": "^3.1.2",
39
44
  "@napi-rs/keyring": "^1.1.8",
40
45
  "@noble/ciphers": "^1.3.0",
41
46
  "@noble/hashes": "^1.8.0",
47
+ "@paralleldrive/cuid2": "^2.2.2",
48
+ "@prisma/adapter-libsql": "^6.14.0",
49
+ "@prisma/client": "^6.14.0",
50
+ "@prisma/driver-adapter-utils": "^6.14.0",
42
51
  "@types/node": "^22.10.1",
43
52
  "age-encryption": "^0.2.3",
44
53
  "ajv": "^8.17.1",
@@ -49,15 +58,14 @@
49
58
  "crypto-hash": "^3.1.0",
50
59
  "dotenv": "^16.4.7",
51
60
  "execa": "^9.6.0",
52
- "flexsearch": "^0.8.205",
53
61
  "import-meta-resolve": "^4.1.0",
54
62
  "lru-cache": "^11.1.0",
55
63
  "nano-spawn": "^0.2.0",
56
- "nypm": "^0.6.0",
64
+ "nypm": "^0.6.1",
57
65
  "pino": "^9.6.0",
58
66
  "pkg-types": "^1.2.1",
67
+ "prisma": "^6.14.0",
59
68
  "remeda": "^2.21.0",
60
- "rev-dep": "^1.5.4",
61
69
  "ulid": "^3.0.1",
62
70
  "uuid": "^11.1.0",
63
71
  "watcher": "^2.3.1",
@@ -80,11 +88,12 @@
80
88
  "classic-level": "^3.0.0",
81
89
  "highstate-cli-bootstrap": "patch:@highstate/cli@npm%3A0.9.16#~/.yarn/patches/@highstate-cli-npm-0.9.16-e03b564691.patch",
82
90
  "pino-pretty": "^13.0.0",
91
+ "prisma-json-types-generator": "^3.5.2",
83
92
  "rollup": "^4.28.1",
84
93
  "ts-markdown-builder": "^0.4.1",
85
94
  "type-fest": "^4.41.0",
86
95
  "typescript": "^5.7.2",
87
96
  "vitest": "^3.2.4"
88
97
  },
89
- "gitHead": "9ebcd7da56b00b8ca08bf52cc8438f527338cd64"
98
+ "gitHead": "e77d292335556c6e5b6275acda1a3d1609d786a1"
90
99
  }
@@ -0,0 +1,7 @@
1
+ model UserWorkspaseLayout {
2
+ /// The opaque ID of the user to which this layout belongs.
3
+ userId String @id
4
+
5
+ /// The layout of the user workspace managed by the frontend.
6
+ layout Json
7
+ }
@@ -0,0 +1,17 @@
1
+ model Library {
2
+ /// The CUIDv2 of the library.
3
+ id String @id @default(cuid(2))
4
+
5
+ /// The metadata of the library managed by the backend.
6
+ ///
7
+ /// [CommonObjectMeta]
8
+ meta Json
9
+
10
+ /// The spec of the library.
11
+ ///
12
+ /// [LibrarySpec]
13
+ spec Json
14
+
15
+ /// The projects using this library.
16
+ projects Project[]
17
+ }
@@ -0,0 +1,101 @@
1
+ model Project {
2
+ /// The CUIDv2 of the project.
3
+ id String @id @default(cuid(2))
4
+
5
+ /// Project meta managed by the backend.
6
+ ///
7
+ /// [CommonObjectMeta]
8
+ meta Json
9
+
10
+ /// The name of the project within the space.
11
+ name String
12
+
13
+ /// The ID of the project space this project belongs to.
14
+ spaceId String
15
+
16
+ /// The ID of the project model storage this project uses.
17
+ modelStorageId String
18
+
19
+ /// The ID of the library used by this project.
20
+ libraryId String
21
+
22
+ /// The ID of the Pulumi backend used by this project.
23
+ pulumiBackendId String
24
+
25
+ /// Encrypted project master key in AGE format.
26
+ encryptedMasterKey String
27
+
28
+ /// The unlock suite for this project.
29
+ ///
30
+ /// [ProjectUnlockSuite]
31
+ unlockSuite Json
32
+
33
+ /// The current version of the project database.
34
+ /// This is used to determine if the project needs to be migrated.
35
+ databaseVersion Int
36
+
37
+ /// The date and time when the project was created.
38
+ createdAt DateTime @default(now())
39
+
40
+ /// The date and time when the project was last updated.
41
+ updatedAt DateTime @updatedAt
42
+
43
+ /// The project space this project belongs to.
44
+ space ProjectSpace @relation(fields: [spaceId], references: [id])
45
+
46
+ /// The project model storage this project uses.
47
+ modelStorage ProjectModelStorage @relation(fields: [modelStorageId], references: [id])
48
+
49
+ /// The library used by this project.
50
+ library Library @relation(fields: [libraryId], references: [id])
51
+
52
+ /// The Pulumi backend used by this project.
53
+ pulumiBackend PulumiBackend @relation(fields: [pulumiBackendId], references: [id])
54
+
55
+ @@unique([spaceId, name])
56
+ }
57
+
58
+ model ProjectSpace {
59
+ /// The CUIDv2 of the project space.
60
+ id String @id @default(cuid(2))
61
+
62
+ /// The name of the project space within the parent space.
63
+ ///
64
+ /// Will be null for the global project space.
65
+ name String?
66
+
67
+ /// The ID of the parent project space, if any.
68
+ parentId String?
69
+
70
+ /// The metadata of the project space managed by the backend.
71
+ ///
72
+ /// [CommonObjectMeta]
73
+ meta Json
74
+
75
+ /// The projects in this project space.
76
+ projects Project[]
77
+
78
+ /// The parent project space, if any.
79
+ parent ProjectSpace? @relation("ProjectSpaceHierarchy", fields: [parentId], references: [id])
80
+
81
+ /// The child project spaces, if any.
82
+ children ProjectSpace[] @relation("ProjectSpaceHierarchy")
83
+ }
84
+
85
+ model ProjectModelStorage {
86
+ /// The CUIDv2 of the project model storage.
87
+ id String @id @default(cuid(2))
88
+
89
+ /// The metadata of the project model storage managed by the backend.
90
+ ///
91
+ /// [CommonObjectMeta]
92
+ meta Json
93
+
94
+ /// The specification of the project model storage.
95
+ ///
96
+ /// [ProjectModelStorageSpec]
97
+ spec Json
98
+
99
+ /// The projects using this model storage.
100
+ projects Project[]
101
+ }
@@ -0,0 +1,17 @@
1
+ model PulumiBackend {
2
+ /// The CUIDv2 of the Pulumi backend.
3
+ id String @id @default(cuid(2))
4
+
5
+ /// The backend meta managed by the backend.
6
+ ///
7
+ /// [CommonObjectMeta]
8
+ meta Json
9
+
10
+ /// The spec of the Pulumi backend.
11
+ ///
12
+ /// [PulumiBackendSpec]
13
+ spec Json
14
+
15
+ /// The projects using this backend.
16
+ projects Project[]
17
+ }
@@ -0,0 +1,17 @@
1
+ datasource db {
2
+ provider = "postgresql"
3
+ url = env("BACKEND_DATABASE_URL")
4
+ }
5
+
6
+ generator client {
7
+ provider = "prisma-client"
8
+ previewFeatures = ["queryCompiler", "driverAdapters"]
9
+ output = "../../../src/database/_generated/backend/postgresql"
10
+ moduleFormat = "esm"
11
+ generatedFileExtension = "ts"
12
+ importFileExtension = "ts"
13
+ }
14
+
15
+ generator json {
16
+ provider = "prisma-json-types-generator"
17
+ }
@@ -0,0 +1,17 @@
1
+ datasource db {
2
+ provider = "sqlite"
3
+ directUrl = env("HIGHSTATE_MIGRATION_DATABASE_URL")
4
+ }
5
+
6
+ generator client {
7
+ provider = "prisma-client"
8
+ previewFeatures = ["queryCompiler", "driverAdapters"]
9
+ output = "../../../src/database/_generated/backend/sqlite"
10
+ moduleFormat = "esm"
11
+ generatedFileExtension = "ts"
12
+ importFileExtension = "ts"
13
+ }
14
+
15
+ generator json {
16
+ provider = "prisma-json-types-generator"
17
+ }
@@ -0,0 +1,34 @@
1
+ -- CreateTable
2
+ CREATE TABLE "Library" (
3
+ "id" TEXT NOT NULL PRIMARY KEY,
4
+ "meta" JSONB NOT NULL
5
+ );
6
+
7
+ -- CreateTable
8
+ CREATE TABLE "Project" (
9
+ "id" TEXT NOT NULL PRIMARY KEY,
10
+ "meta" JSONB NOT NULL,
11
+ "spaceId" TEXT NOT NULL,
12
+ "libraryId" TEXT NOT NULL,
13
+ "pulumiBackendId" TEXT NOT NULL,
14
+ "encryptedMasterKey" TEXT NOT NULL,
15
+ "unlockSuite" JSONB NOT NULL,
16
+ "databaseVersion" INTEGER NOT NULL,
17
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
18
+ "updatedAt" DATETIME NOT NULL,
19
+ CONSTRAINT "Project_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "ProjectSpace" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
20
+ CONSTRAINT "Project_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "Library" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
21
+ CONSTRAINT "Project_pulumiBackendId_fkey" FOREIGN KEY ("pulumiBackendId") REFERENCES "PulumiBackend" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
22
+ );
23
+
24
+ -- CreateTable
25
+ CREATE TABLE "ProjectSpace" (
26
+ "id" TEXT NOT NULL PRIMARY KEY,
27
+ "meta" JSONB NOT NULL
28
+ );
29
+
30
+ -- CreateTable
31
+ CREATE TABLE "PulumiBackend" (
32
+ "id" TEXT NOT NULL PRIMARY KEY,
33
+ "meta" JSONB NOT NULL
34
+ );
@@ -0,0 +1,59 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - Added the required column `spec` to the `Library` table without a default value. This is not possible if the table is not empty.
5
+ - Added the required column `name` to the `Project` table without a default value. This is not possible if the table is not empty.
6
+ - Added the required column `spec` to the `PulumiBackend` table without a default value. This is not possible if the table is not empty.
7
+
8
+ */
9
+ -- RedefineTables
10
+ PRAGMA defer_foreign_keys=ON;
11
+ PRAGMA foreign_keys=OFF;
12
+ CREATE TABLE "new_Library" (
13
+ "id" TEXT NOT NULL PRIMARY KEY,
14
+ "meta" JSONB NOT NULL,
15
+ "spec" JSONB NOT NULL
16
+ );
17
+ INSERT INTO "new_Library" ("id", "meta") SELECT "id", "meta" FROM "Library";
18
+ DROP TABLE "Library";
19
+ ALTER TABLE "new_Library" RENAME TO "Library";
20
+ CREATE TABLE "new_Project" (
21
+ "id" TEXT NOT NULL PRIMARY KEY,
22
+ "meta" JSONB NOT NULL,
23
+ "name" TEXT NOT NULL,
24
+ "spaceId" TEXT NOT NULL,
25
+ "libraryId" TEXT NOT NULL,
26
+ "pulumiBackendId" TEXT NOT NULL,
27
+ "encryptedMasterKey" TEXT NOT NULL,
28
+ "unlockSuite" JSONB NOT NULL,
29
+ "databaseVersion" INTEGER NOT NULL,
30
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
31
+ "updatedAt" DATETIME NOT NULL,
32
+ CONSTRAINT "Project_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "ProjectSpace" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
33
+ CONSTRAINT "Project_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "Library" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
34
+ CONSTRAINT "Project_pulumiBackendId_fkey" FOREIGN KEY ("pulumiBackendId") REFERENCES "PulumiBackend" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
35
+ );
36
+ INSERT INTO "new_Project" ("createdAt", "databaseVersion", "encryptedMasterKey", "id", "libraryId", "meta", "pulumiBackendId", "spaceId", "unlockSuite", "updatedAt") SELECT "createdAt", "databaseVersion", "encryptedMasterKey", "id", "libraryId", "meta", "pulumiBackendId", "spaceId", "unlockSuite", "updatedAt" FROM "Project";
37
+ DROP TABLE "Project";
38
+ ALTER TABLE "new_Project" RENAME TO "Project";
39
+ CREATE UNIQUE INDEX "Project_spaceId_name_key" ON "Project"("spaceId", "name");
40
+ CREATE TABLE "new_ProjectSpace" (
41
+ "id" TEXT NOT NULL PRIMARY KEY,
42
+ "name" TEXT,
43
+ "parentId" TEXT,
44
+ "meta" JSONB NOT NULL,
45
+ CONSTRAINT "ProjectSpace_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "ProjectSpace" ("id") ON DELETE SET NULL ON UPDATE CASCADE
46
+ );
47
+ INSERT INTO "new_ProjectSpace" ("id", "meta") SELECT "id", "meta" FROM "ProjectSpace";
48
+ DROP TABLE "ProjectSpace";
49
+ ALTER TABLE "new_ProjectSpace" RENAME TO "ProjectSpace";
50
+ CREATE TABLE "new_PulumiBackend" (
51
+ "id" TEXT NOT NULL PRIMARY KEY,
52
+ "meta" JSONB NOT NULL,
53
+ "spec" JSONB NOT NULL
54
+ );
55
+ INSERT INTO "new_PulumiBackend" ("id", "meta") SELECT "id", "meta" FROM "PulumiBackend";
56
+ DROP TABLE "PulumiBackend";
57
+ ALTER TABLE "new_PulumiBackend" RENAME TO "PulumiBackend";
58
+ PRAGMA foreign_keys=ON;
59
+ PRAGMA defer_foreign_keys=OFF;
@@ -0,0 +1,41 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - Added the required column `modelStorageId` to the `Project` table without a default value. This is not possible if the table is not empty.
5
+
6
+ */
7
+ -- CreateTable
8
+ CREATE TABLE "ProjectModelStorage" (
9
+ "id" TEXT NOT NULL PRIMARY KEY,
10
+ "projectId" TEXT NOT NULL,
11
+ "meta" JSONB NOT NULL,
12
+ "spec" JSONB NOT NULL
13
+ );
14
+
15
+ -- RedefineTables
16
+ PRAGMA defer_foreign_keys=ON;
17
+ PRAGMA foreign_keys=OFF;
18
+ CREATE TABLE "new_Project" (
19
+ "id" TEXT NOT NULL PRIMARY KEY,
20
+ "meta" JSONB NOT NULL,
21
+ "name" TEXT NOT NULL,
22
+ "spaceId" TEXT NOT NULL,
23
+ "modelStorageId" TEXT NOT NULL,
24
+ "libraryId" TEXT NOT NULL,
25
+ "pulumiBackendId" TEXT NOT NULL,
26
+ "encryptedMasterKey" TEXT NOT NULL,
27
+ "unlockSuite" JSONB NOT NULL,
28
+ "databaseVersion" INTEGER NOT NULL,
29
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
30
+ "updatedAt" DATETIME NOT NULL,
31
+ CONSTRAINT "Project_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "ProjectSpace" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
32
+ CONSTRAINT "Project_modelStorageId_fkey" FOREIGN KEY ("modelStorageId") REFERENCES "ProjectModelStorage" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
33
+ CONSTRAINT "Project_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "Library" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
34
+ CONSTRAINT "Project_pulumiBackendId_fkey" FOREIGN KEY ("pulumiBackendId") REFERENCES "PulumiBackend" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
35
+ );
36
+ INSERT INTO "new_Project" ("createdAt", "databaseVersion", "encryptedMasterKey", "id", "libraryId", "meta", "name", "pulumiBackendId", "spaceId", "unlockSuite", "updatedAt") SELECT "createdAt", "databaseVersion", "encryptedMasterKey", "id", "libraryId", "meta", "name", "pulumiBackendId", "spaceId", "unlockSuite", "updatedAt" FROM "Project";
37
+ DROP TABLE "Project";
38
+ ALTER TABLE "new_Project" RENAME TO "Project";
39
+ CREATE UNIQUE INDEX "Project_spaceId_name_key" ON "Project"("spaceId", "name");
40
+ PRAGMA foreign_keys=ON;
41
+ PRAGMA defer_foreign_keys=OFF;
@@ -0,0 +1,19 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - You are about to drop the column `projectId` on the `ProjectModelStorage` table. All the data in the column will be lost.
5
+
6
+ */
7
+ -- RedefineTables
8
+ PRAGMA defer_foreign_keys=ON;
9
+ PRAGMA foreign_keys=OFF;
10
+ CREATE TABLE "new_ProjectModelStorage" (
11
+ "id" TEXT NOT NULL PRIMARY KEY,
12
+ "meta" JSONB NOT NULL,
13
+ "spec" JSONB NOT NULL
14
+ );
15
+ INSERT INTO "new_ProjectModelStorage" ("id", "meta", "spec") SELECT "id", "meta", "spec" FROM "ProjectModelStorage";
16
+ DROP TABLE "ProjectModelStorage";
17
+ ALTER TABLE "new_ProjectModelStorage" RENAME TO "ProjectModelStorage";
18
+ PRAGMA foreign_keys=ON;
19
+ PRAGMA defer_foreign_keys=OFF;
@@ -0,0 +1 @@
1
+ -- This is an empty migration.
@@ -0,0 +1,5 @@
1
+ -- CreateTable
2
+ CREATE TABLE "UserWorkspaseLayout" (
3
+ "userId" TEXT NOT NULL PRIMARY KEY,
4
+ "layout" JSONB NOT NULL
5
+ );
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (e.g., Git)
3
+ provider = "sqlite"