@highstate/backend 0.9.26 → 0.9.28

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 (99) hide show
  1. package/dist/{chunk-GJTMJQUW.js → chunk-QSHSXLO2.js} +18 -9
  2. package/dist/chunk-QSHSXLO2.js.map +1 -0
  3. package/dist/index.js +292 -132
  4. package/dist/index.js.map +1 -1
  5. package/dist/shared/index.js +1 -1
  6. package/package.json +3 -3
  7. package/prisma/backend/_schema/layout.prisma +3 -1
  8. package/prisma/backend/_schema/project.prisma +4 -2
  9. package/prisma/backend/_schema/unlock-method.prisma +19 -0
  10. package/prisma/backend/sqlite/migrations/{20250818082732_add_models → 20250928124105_initial_migration}/migration.sql +48 -16
  11. package/prisma/project/api-key.prisma +3 -1
  12. package/prisma/project/artifact.prisma +2 -2
  13. package/prisma/project/custom-status.prisma +1 -1
  14. package/prisma/project/layout.prisma +4 -0
  15. package/prisma/project/migrations/{20250816081310_initial → 20250928130725_initial_migration}/migration.sql +132 -46
  16. package/prisma/project/terminal.prisma +2 -2
  17. package/prisma/project/unlock-method.prisma +1 -1
  18. package/prisma/project/worker.prisma +1 -1
  19. package/src/business/backend-unlock.test.ts +133 -0
  20. package/src/business/backend-unlock.ts +76 -0
  21. package/src/business/index.ts +1 -0
  22. package/src/business/settings.test.ts +3 -2
  23. package/src/database/_generated/backend/postgresql/client.ts +9 -4
  24. package/src/database/_generated/backend/postgresql/internal/class.ts +147 -168
  25. package/src/database/_generated/backend/postgresql/internal/prismaNamespace.ts +127 -40
  26. package/src/database/_generated/backend/postgresql/models/BackendUnlockMethod.ts +1156 -0
  27. package/src/database/_generated/backend/postgresql/models/Project.ts +2 -2
  28. package/src/database/_generated/backend/postgresql/models/ProjectSpace.ts +7 -1
  29. package/src/database/_generated/backend/postgresql/models/UserWorkspaceLayout.ts +1067 -0
  30. package/src/database/_generated/backend/postgresql/models.ts +2 -1
  31. package/src/database/_generated/backend/sqlite/client.ts +9 -4
  32. package/src/database/_generated/backend/sqlite/internal/class.ts +146 -165
  33. package/src/database/_generated/backend/sqlite/internal/prismaNamespace.ts +127 -40
  34. package/src/database/_generated/backend/sqlite/models/BackendUnlockMethod.ts +1154 -0
  35. package/src/database/_generated/backend/sqlite/models/Project.ts +2 -2
  36. package/src/database/_generated/backend/sqlite/models/ProjectSpace.ts +7 -1
  37. package/src/database/_generated/backend/sqlite/models/UserWorkspaceLayout.ts +1065 -0
  38. package/src/database/_generated/backend/sqlite/models.ts +2 -1
  39. package/src/database/_generated/project/commonInputTypes.ts +26 -26
  40. package/src/database/_generated/project/internal/class.ts +7 -8
  41. package/src/database/_generated/project/internal/prismaNamespace.ts +8 -7
  42. package/src/database/_generated/project/models/ApiKey.ts +2 -0
  43. package/src/database/_generated/project/models/Artifact.ts +2 -2
  44. package/src/database/_generated/project/models/InstanceCustomStatus.ts +1 -1
  45. package/src/database/_generated/project/models/OperationLog.ts +49 -1
  46. package/src/database/_generated/project/models/UnlockMethod.ts +2 -2
  47. package/src/database/_generated/project/models/UserCompositeViewport.ts +16 -14
  48. package/src/database/_generated/project/models/UserProjectViewport.ts +11 -9
  49. package/src/database/_generated/project/models/WorkerVersion.ts +1 -5
  50. package/src/database/abstractions.ts +25 -3
  51. package/src/database/factory.ts +5 -6
  52. package/src/database/local/backend.ts +148 -18
  53. package/src/database/manager.ts +30 -2
  54. package/src/database/prisma.ts +1 -0
  55. package/src/orchestrator/operation-plan.ts +0 -19
  56. package/src/orchestrator/operation.ts +21 -4
  57. package/src/services.ts +12 -3
  58. package/src/shared/models/backend/unlock-method.ts +7 -13
  59. package/src/shared/models/errors.ts +14 -0
  60. package/src/shared/models/prisma.ts +10 -2
  61. package/src/test-utils/database.ts +34 -6
  62. package/dist/chunk-GJTMJQUW.js.map +0 -1
  63. package/prisma/backend/sqlite/migrations/20250817070609_initiial/migration.sql +0 -34
  64. package/prisma/backend/sqlite/migrations/20250817104948_add_fields/migration.sql +0 -59
  65. package/prisma/backend/sqlite/migrations/20250818083106_a/migration.sql +0 -19
  66. package/prisma/backend/sqlite/migrations/20250818101945_hi/migration.sql +0 -1
  67. package/prisma/backend/sqlite/migrations/20250819082315_a/migration.sql +0 -5
  68. package/prisma/project/migrations/20250816082523_test/migration.sql +0 -72
  69. package/prisma/project/migrations/20250818065643_update/migration.sql +0 -42
  70. package/prisma/project/migrations/20250818070758_a/migration.sql +0 -8
  71. package/prisma/project/migrations/20250818070913_a/migration.sql +0 -8
  72. package/prisma/project/migrations/20250818082720_add_motels/migration.sql +0 -11
  73. package/prisma/project/migrations/20250818112523_hello/migration.sql +0 -35
  74. package/prisma/project/migrations/20250819082305_a/migration.sql +0 -14
  75. package/prisma/project/migrations/20250819165004_add_missing_fields/migration.sql +0 -216
  76. package/prisma/project/migrations/20250819171309_a/migration.sql +0 -22
  77. package/prisma/project/migrations/20250820113949_a/migration.sql +0 -66
  78. package/prisma/project/migrations/20250820144256_b/migration.sql +0 -31
  79. package/prisma/project/migrations/20250820145547_a/migration.sql +0 -24
  80. package/prisma/project/migrations/20250820182517_b/migration.sql +0 -2
  81. package/prisma/project/migrations/20250821172324_a/migration.sql +0 -2
  82. package/prisma/project/migrations/20250822081339_a/migration.sql +0 -219
  83. package/prisma/project/migrations/20250822083742_b/migration.sql +0 -1
  84. package/prisma/project/migrations/20250822105134_boom/migration.sql +0 -1
  85. package/prisma/project/migrations/20250822141028_b/migration.sql +0 -1
  86. package/prisma/project/migrations/20250822142342_b/migration.sql +0 -16
  87. package/prisma/project/migrations/20250824072720_a/migration.sql +0 -1
  88. package/prisma/project/migrations/20250824093656_b/migration.sql +0 -21
  89. package/prisma/project/migrations/20250825082518_a/migration.sql +0 -1
  90. package/prisma/project/migrations/20250825085343_b/migration.sql +0 -1
  91. package/prisma/project/migrations/20250825091312_a/migration.sql +0 -1
  92. package/prisma/project/migrations/20250903095431_hi/migration.sql +0 -44
  93. package/prisma/project/migrations/20250903174255_a/migration.sql +0 -24
  94. package/prisma/project/migrations/20250908095205_hi/migration.sql +0 -18
  95. package/prisma/project/migrations/20250909155857_hi/migration.sql +0 -15
  96. package/prisma/project/migrations/20250921092621_b/migration.sql +0 -33
  97. package/prisma/project/migrations/20250921093911_b/migration.sql +0 -1
  98. package/src/database/_generated/backend/postgresql/models/UserWorkspaseLayout.ts +0 -1065
  99. package/src/database/_generated/backend/sqlite/models/UserWorkspaseLayout.ts +0 -1063
@@ -1,4 +1,4 @@
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, operationLaunchInputSchema, operationMetaSchema, operationOptionsSchema, operationOutputSchema, operationPhaseInstanceSchema, operationPhaseSchema, operationPhaseTypeSchema, operationPlanInputSchema, 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-GJTMJQUW.js';
1
+ export { AccessError, BackendError, BackendUnlockMethodNotFoundError, CannotDeleteLastBackendUnlockMethodError, 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, backendUnlockMethodInputSchema, backendUnlockMethodMetaSchema, 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, operationLaunchInputSchema, operationMetaSchema, operationOptionsSchema, operationOutputSchema, operationPhaseInstanceSchema, operationPhaseSchema, operationPhaseTypeSchema, operationPlanInputSchema, 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-QSHSXLO2.js';
2
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.26",
3
+ "version": "0.9.28",
4
4
  "type": "module",
5
5
  "highstate": {
6
6
  "sourceHash": {
@@ -41,7 +41,7 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@aws-crypto/crc32": "^5.2.0",
44
- "@highstate/contract": "^0.9.26",
44
+ "@highstate/contract": "^0.9.28",
45
45
  "@msgpack/msgpack": "^3.1.2",
46
46
  "@napi-rs/keyring": "^1.1.8",
47
47
  "@noble/ciphers": "^1.3.0",
@@ -98,5 +98,5 @@
98
98
  "type-fest": "^4.41.0",
99
99
  "vitest": "^3.2.4"
100
100
  },
101
- "gitHead": "64e8a656a17dfcce88727c24969f9a3b73539ac9"
101
+ "gitHead": "6de09d98fa66e808c42aba7fe65e6e0762945b9b"
102
102
  }
@@ -1,7 +1,9 @@
1
- model UserWorkspaseLayout {
1
+ model UserWorkspaceLayout {
2
2
  /// The opaque ID of the user to which this layout belongs.
3
3
  userId String @id
4
4
 
5
5
  /// The layout of the user workspace managed by the frontend.
6
+ ///
7
+ /// ![unknown]
6
8
  layout Json
7
9
  }
@@ -34,10 +34,10 @@ model Project {
34
34
  /// This is used to determine if the project needs to be migrated.
35
35
  databaseVersion Int
36
36
 
37
- /// The date and time when the project was created.
37
+ /// The time when the project was created.
38
38
  createdAt DateTime @default(now())
39
39
 
40
- /// The date and time when the project was last updated.
40
+ /// The time when the project was last updated.
41
41
  updatedAt DateTime @updatedAt
42
42
 
43
43
  /// The project space this project belongs to.
@@ -80,6 +80,8 @@ model ProjectSpace {
80
80
 
81
81
  /// The child project spaces, if any.
82
82
  children ProjectSpace[] @relation("ProjectSpaceHierarchy")
83
+
84
+ @@unique([parentId, name])
83
85
  }
84
86
 
85
87
  model ProjectModelStorage {
@@ -0,0 +1,19 @@
1
+ /// Unlock methods describe trusted identities that can decrypt the backend master key.
2
+ model BackendUnlockMethod {
3
+ /// The CUIDv2 of the unlock method.
4
+ id String @id @default(cuid(2))
5
+
6
+ /// The metadata of the unlock method managed by the backend.
7
+ ///
8
+ /// [BackendUnlockMethodMeta]
9
+ meta Json
10
+
11
+ /// The AGE recipient for this unlock method.
12
+ recipient String @unique
13
+
14
+ /// The time when the unlock method was created.
15
+ createdAt DateTime @default(now())
16
+
17
+ /// The time when the unlock method was last updated.
18
+ updatedAt DateTime @updatedAt
19
+ }
@@ -1,21 +1,18 @@
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.
1
+ -- CreateTable
2
+ CREATE TABLE "UserWorkspaceLayout" (
3
+ "userId" TEXT NOT NULL PRIMARY KEY,
4
+ "layout" JSONB NOT NULL
5
+ );
5
6
 
6
- */
7
7
  -- CreateTable
8
- CREATE TABLE "ProjectModelStorage" (
8
+ CREATE TABLE "Library" (
9
9
  "id" TEXT NOT NULL PRIMARY KEY,
10
- "projectId" TEXT NOT NULL,
11
10
  "meta" JSONB NOT NULL,
12
11
  "spec" JSONB NOT NULL
13
12
  );
14
13
 
15
- -- RedefineTables
16
- PRAGMA defer_foreign_keys=ON;
17
- PRAGMA foreign_keys=OFF;
18
- CREATE TABLE "new_Project" (
14
+ -- CreateTable
15
+ CREATE TABLE "Project" (
19
16
  "id" TEXT NOT NULL PRIMARY KEY,
20
17
  "meta" JSONB NOT NULL,
21
18
  "name" TEXT NOT NULL,
@@ -33,9 +30,44 @@ CREATE TABLE "new_Project" (
33
30
  CONSTRAINT "Project_libraryId_fkey" FOREIGN KEY ("libraryId") REFERENCES "Library" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
34
31
  CONSTRAINT "Project_pulumiBackendId_fkey" FOREIGN KEY ("pulumiBackendId") REFERENCES "PulumiBackend" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
35
32
  );
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";
33
+
34
+ -- CreateTable
35
+ CREATE TABLE "ProjectSpace" (
36
+ "id" TEXT NOT NULL PRIMARY KEY,
37
+ "name" TEXT,
38
+ "parentId" TEXT,
39
+ "meta" JSONB NOT NULL,
40
+ CONSTRAINT "ProjectSpace_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "ProjectSpace" ("id") ON DELETE SET NULL ON UPDATE CASCADE
41
+ );
42
+
43
+ -- CreateTable
44
+ CREATE TABLE "ProjectModelStorage" (
45
+ "id" TEXT NOT NULL PRIMARY KEY,
46
+ "meta" JSONB NOT NULL,
47
+ "spec" JSONB NOT NULL
48
+ );
49
+
50
+ -- CreateTable
51
+ CREATE TABLE "PulumiBackend" (
52
+ "id" TEXT NOT NULL PRIMARY KEY,
53
+ "meta" JSONB NOT NULL,
54
+ "spec" JSONB NOT NULL
55
+ );
56
+
57
+ -- CreateTable
58
+ CREATE TABLE "BackendUnlockMethod" (
59
+ "id" TEXT NOT NULL PRIMARY KEY,
60
+ "meta" JSONB NOT NULL,
61
+ "recipient" TEXT NOT NULL,
62
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
63
+ "updatedAt" DATETIME NOT NULL
64
+ );
65
+
66
+ -- CreateIndex
39
67
  CREATE UNIQUE INDEX "Project_spaceId_name_key" ON "Project"("spaceId", "name");
40
- PRAGMA foreign_keys=ON;
41
- PRAGMA defer_foreign_keys=OFF;
68
+
69
+ -- CreateIndex
70
+ CREATE UNIQUE INDEX "ProjectSpace_parentId_name_key" ON "ProjectSpace"("parentId", "name");
71
+
72
+ -- CreateIndex
73
+ CREATE UNIQUE INDEX "BackendUnlockMethod_recipient_key" ON "BackendUnlockMethod"("recipient");
@@ -16,6 +16,8 @@ model ApiKey {
16
16
  serviceAccountId String
17
17
 
18
18
  /// The API token for authentication.
19
+ ///
20
+ /// Should be treated as a secret and only shown once at creation/regeneration.
19
21
  token String @unique
20
22
 
21
23
  /// The time when the API key was created.
@@ -28,5 +30,5 @@ model ApiKey {
28
30
  worker WorkerVersion?
29
31
 
30
32
  /// The service account which this API key impersonates.
31
- serviceAccount ServiceAccount @relation(fields: [serviceAccountId], references: [id], onDelete: Cascade)
33
+ serviceAccount ServiceAccount @relation(fields: [serviceAccountId], references: [id])
32
34
  }
@@ -32,10 +32,10 @@ model Artifact {
32
32
  /// Used to split the artifact into smaller chunks for storage.
33
33
  chunkSize Int
34
34
 
35
- /// The timestamp when the artifact fist appeared in the system.
35
+ /// The time when the artifact first appeared in the system.
36
36
  createdAt DateTime @default(now())
37
37
 
38
- /// The timestamp when the artifact was last updated.
38
+ /// The time when the artifact was last updated.
39
39
  updatedAt DateTime @updatedAt
40
40
 
41
41
  /// The service accounts using this artifact.
@@ -21,7 +21,7 @@ model InstanceCustomStatus {
21
21
  /// Can be used to provide additional context or information about the status.
22
22
  ///
23
23
  /// The message will be displayed in the 800x600 ANSI terminal in the UI,
24
- /// so differenet TUI elements should be drawn within this area.
24
+ /// so different TUI elements should be drawn within this area.
25
25
  message String?
26
26
 
27
27
  /// The order of the custom status in the list of statuses.
@@ -3,6 +3,8 @@ model UserProjectViewport {
3
3
  userId String @id
4
4
 
5
5
  /// The viewport of the user project managed by the frontend.
6
+ ///
7
+ /// ![unknown]
6
8
  viewport Json
7
9
  }
8
10
 
@@ -14,6 +16,8 @@ model UserCompositeViewport {
14
16
  stateId String
15
17
 
16
18
  /// The viewport of the user composite instance managed by the frontend.
19
+ ///
20
+ /// ![unknown]
17
21
  viewport Json
18
22
 
19
23
  /// The instance state to which this viewport belongs.
@@ -2,8 +2,11 @@
2
2
  CREATE TABLE "ApiKey" (
3
3
  "id" TEXT NOT NULL PRIMARY KEY,
4
4
  "meta" JSONB NOT NULL,
5
- "scopes" JSONB NOT NULL,
6
- "token" TEXT NOT NULL
5
+ "serviceAccountId" TEXT NOT NULL,
6
+ "token" TEXT NOT NULL,
7
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
8
+ "updatedAt" DATETIME NOT NULL,
9
+ CONSTRAINT "ApiKey_serviceAccountId_fkey" FOREIGN KEY ("serviceAccountId") REFERENCES "ServiceAccount" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
7
10
  );
8
11
 
9
12
  -- CreateTable
@@ -12,52 +15,97 @@ CREATE TABLE "Artifact" (
12
15
  "meta" JSONB NOT NULL,
13
16
  "hash" TEXT NOT NULL,
14
17
  "size" INTEGER NOT NULL,
18
+ "chunkSize" INTEGER NOT NULL,
15
19
  "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
16
20
  "updatedAt" DATETIME NOT NULL
17
21
  );
18
22
 
19
23
  -- CreateTable
20
24
  CREATE TABLE "InstanceCustomStatus" (
21
- "instanceId" TEXT NOT NULL,
25
+ "stateId" TEXT NOT NULL,
26
+ "serviceAccountId" TEXT NOT NULL,
22
27
  "name" TEXT NOT NULL,
23
28
  "meta" JSONB NOT NULL,
24
29
  "value" TEXT NOT NULL,
25
30
  "message" TEXT,
26
31
  "order" INTEGER NOT NULL DEFAULT 50,
32
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
33
+ "updatedAt" DATETIME NOT NULL,
27
34
 
28
- PRIMARY KEY ("instanceId", "name"),
29
- CONSTRAINT "InstanceCustomStatus_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
35
+ PRIMARY KEY ("stateId", "serviceAccountId", "name"),
36
+ CONSTRAINT "InstanceCustomStatus_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
37
+ CONSTRAINT "InstanceCustomStatus_serviceAccountId_fkey" FOREIGN KEY ("serviceAccountId") REFERENCES "ServiceAccount" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
30
38
  );
31
39
 
32
40
  -- CreateTable
33
41
  CREATE TABLE "InstanceEvaluationState" (
34
- "instanceId" TEXT NOT NULL PRIMARY KEY,
42
+ "stateId" TEXT NOT NULL PRIMARY KEY,
35
43
  "status" TEXT NOT NULL,
36
44
  "message" TEXT,
37
45
  "model" JSONB,
38
- CONSTRAINT "InstanceEvaluationState_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
46
+ "evaluatedAt" DATETIME NOT NULL,
47
+ CONSTRAINT "InstanceEvaluationState_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
39
48
  );
40
49
 
41
50
  -- CreateTable
42
51
  CREATE TABLE "InstanceState" (
43
52
  "id" TEXT NOT NULL PRIMARY KEY,
53
+ "instanceId" TEXT NOT NULL,
44
54
  "status" TEXT NOT NULL,
55
+ "source" TEXT NOT NULL,
45
56
  "kind" TEXT NOT NULL,
57
+ "parentId" TEXT,
46
58
  "inputHashNonce" INTEGER,
47
- "lastOperationId" TEXT,
48
- "statusFields" JSONB,
49
59
  "inputHash" INTEGER,
50
60
  "outputHash" INTEGER,
51
61
  "dependencyOutputHash" INTEGER,
52
- CONSTRAINT "InstanceState_lastOperationId_fkey" FOREIGN KEY ("lastOperationId") REFERENCES "Operation" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
53
- CONSTRAINT "InstanceState_id_lastOperationId_fkey" FOREIGN KEY ("id", "lastOperationId") REFERENCES "InstanceOperationState" ("instanceId", "operationId") ON DELETE RESTRICT ON UPDATE CASCADE
62
+ "exportedArtifactIds" JSONB,
63
+ "model" JSONB,
64
+ "resolvedInputs" JSONB,
65
+ "currentResourceCount" INTEGER,
66
+ "statusFields" JSONB,
67
+ CONSTRAINT "InstanceState_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE
68
+ );
69
+
70
+ -- CreateTable
71
+ CREATE TABLE "UserProjectViewport" (
72
+ "userId" TEXT NOT NULL PRIMARY KEY,
73
+ "viewport" JSONB NOT NULL
74
+ );
75
+
76
+ -- CreateTable
77
+ CREATE TABLE "UserCompositeViewport" (
78
+ "userId" TEXT NOT NULL,
79
+ "stateId" TEXT NOT NULL,
80
+ "viewport" JSONB NOT NULL,
81
+
82
+ PRIMARY KEY ("userId", "stateId"),
83
+ CONSTRAINT "UserCompositeViewport_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
54
84
  );
55
85
 
56
86
  -- CreateTable
57
87
  CREATE TABLE "InstanceLock" (
58
- "instanceId" TEXT NOT NULL PRIMARY KEY,
88
+ "stateId" TEXT NOT NULL PRIMARY KEY,
59
89
  "meta" JSONB NOT NULL,
60
- CONSTRAINT "InstanceLock_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
90
+ "token" TEXT NOT NULL,
91
+ "acquiredAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
92
+ CONSTRAINT "InstanceLock_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
93
+ );
94
+
95
+ -- CreateTable
96
+ CREATE TABLE "InstanceModel" (
97
+ "id" TEXT NOT NULL PRIMARY KEY,
98
+ "model" JSONB NOT NULL,
99
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
100
+ "updatedAt" DATETIME NOT NULL
101
+ );
102
+
103
+ -- CreateTable
104
+ CREATE TABLE "HubModel" (
105
+ "id" TEXT NOT NULL PRIMARY KEY,
106
+ "model" JSONB NOT NULL,
107
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
108
+ "updatedAt" DATETIME NOT NULL
61
109
  );
62
110
 
63
111
  -- CreateTable
@@ -65,47 +113,54 @@ CREATE TABLE "Operation" (
65
113
  "id" TEXT NOT NULL PRIMARY KEY,
66
114
  "meta" JSONB NOT NULL,
67
115
  "type" TEXT NOT NULL,
116
+ "status" TEXT NOT NULL DEFAULT 'pending',
68
117
  "options" JSONB NOT NULL,
69
118
  "requestedInstanceIds" JSONB NOT NULL,
119
+ "phases" JSONB,
70
120
  "startedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
71
- "completedAt" DATETIME
121
+ "updatedAt" DATETIME NOT NULL,
122
+ "finishedAt" DATETIME
72
123
  );
73
124
 
74
125
  -- CreateTable
75
126
  CREATE TABLE "InstanceOperationState" (
76
127
  "operationId" TEXT NOT NULL,
77
- "instanceId" TEXT NOT NULL,
78
- "parentId" TEXT,
128
+ "stateId" TEXT NOT NULL,
79
129
  "status" TEXT NOT NULL,
80
- "message" TEXT,
81
130
  "currentResourceCount" INTEGER,
82
131
  "totalResourceCount" INTEGER,
83
- "args" JSONB NOT NULL,
132
+ "model" JSONB NOT NULL,
84
133
  "resolvedInputs" JSONB NOT NULL,
134
+ "startedAt" DATETIME,
135
+ "finishedAt" DATETIME,
85
136
 
86
- PRIMARY KEY ("operationId", "instanceId"),
137
+ PRIMARY KEY ("operationId", "stateId"),
87
138
  CONSTRAINT "InstanceOperationState_operationId_fkey" FOREIGN KEY ("operationId") REFERENCES "Operation" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
88
- CONSTRAINT "InstanceOperationState_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
139
+ CONSTRAINT "InstanceOperationState_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
89
140
  );
90
141
 
91
142
  -- CreateTable
92
143
  CREATE TABLE "OperationLog" (
93
144
  "id" TEXT NOT NULL PRIMARY KEY,
94
145
  "operationId" TEXT NOT NULL,
95
- "instanceId" TEXT,
146
+ "stateId" TEXT,
147
+ "isSystem" BOOLEAN NOT NULL DEFAULT false,
96
148
  "content" TEXT NOT NULL,
97
149
  CONSTRAINT "OperationLog_operationId_fkey" FOREIGN KEY ("operationId") REFERENCES "Operation" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
98
- CONSTRAINT "OperationLog_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE
150
+ CONSTRAINT "OperationLog_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE
99
151
  );
100
152
 
101
153
  -- CreateTable
102
154
  CREATE TABLE "Page" (
103
155
  "id" TEXT NOT NULL PRIMARY KEY,
104
156
  "meta" JSONB NOT NULL,
105
- "instanceId" TEXT,
157
+ "stateId" TEXT,
158
+ "name" TEXT,
106
159
  "serviceAccountId" TEXT,
107
160
  "content" JSONB NOT NULL,
108
- CONSTRAINT "Page_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
161
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
162
+ "updatedAt" DATETIME NOT NULL,
163
+ CONSTRAINT "Page_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
109
164
  CONSTRAINT "Page_serviceAccountId_fkey" FOREIGN KEY ("serviceAccountId") REFERENCES "ServiceAccount" ("id") ON DELETE SET NULL ON UPDATE CASCADE
110
165
  );
111
166
 
@@ -113,39 +168,47 @@ CREATE TABLE "Page" (
113
168
  CREATE TABLE "Secret" (
114
169
  "id" TEXT NOT NULL PRIMARY KEY,
115
170
  "meta" JSONB NOT NULL,
116
- "instanceId" TEXT,
171
+ "stateId" TEXT,
117
172
  "name" TEXT,
118
173
  "systemName" TEXT,
119
174
  "serviceAccountId" TEXT,
120
175
  "content" JSONB NOT NULL,
121
- CONSTRAINT "Secret_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
176
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
177
+ "updatedAt" DATETIME NOT NULL,
178
+ CONSTRAINT "Secret_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
122
179
  CONSTRAINT "Secret_serviceAccountId_fkey" FOREIGN KEY ("serviceAccountId") REFERENCES "ServiceAccount" ("id") ON DELETE SET NULL ON UPDATE CASCADE
123
180
  );
124
181
 
125
182
  -- CreateTable
126
183
  CREATE TABLE "ServiceAccount" (
127
184
  "id" TEXT NOT NULL PRIMARY KEY,
128
- "meta" JSONB NOT NULL
185
+ "meta" JSONB NOT NULL,
186
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
187
+ "updatedAt" DATETIME NOT NULL
129
188
  );
130
189
 
131
190
  -- CreateTable
132
191
  CREATE TABLE "Terminal" (
133
192
  "id" TEXT NOT NULL PRIMARY KEY,
134
193
  "meta" JSONB NOT NULL,
194
+ "status" TEXT NOT NULL DEFAULT 'active',
135
195
  "spec" JSONB NOT NULL,
136
- "instanceId" TEXT,
196
+ "stateId" TEXT,
137
197
  "name" TEXT,
138
198
  "serviceAccountId" TEXT,
139
- CONSTRAINT "Terminal_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
199
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
200
+ "updatedAt" DATETIME NOT NULL,
201
+ CONSTRAINT "Terminal_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
140
202
  CONSTRAINT "Terminal_serviceAccountId_fkey" FOREIGN KEY ("serviceAccountId") REFERENCES "ServiceAccount" ("id") ON DELETE SET NULL ON UPDATE CASCADE
141
203
  );
142
204
 
143
205
  -- CreateTable
144
206
  CREATE TABLE "TerminalSession" (
145
207
  "id" TEXT NOT NULL PRIMARY KEY,
146
- "meta" JSONB NOT NULL,
147
208
  "terminalId" TEXT NOT NULL,
148
- CONSTRAINT "TerminalSession_terminalId_fkey" FOREIGN KEY ("terminalId") REFERENCES "Terminal" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
209
+ "startedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
210
+ "finishedAt" DATETIME,
211
+ CONSTRAINT "TerminalSession_terminalId_fkey" FOREIGN KEY ("terminalId") REFERENCES "Terminal" ("id") ON DELETE CASCADE ON UPDATE CASCADE
149
212
  );
150
213
 
151
214
  -- CreateTable
@@ -153,17 +216,19 @@ CREATE TABLE "TerminalSessionLog" (
153
216
  "id" TEXT NOT NULL PRIMARY KEY,
154
217
  "sessionId" TEXT NOT NULL,
155
218
  "content" TEXT NOT NULL,
156
- CONSTRAINT "TerminalSessionLog_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "TerminalSession" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
219
+ CONSTRAINT "TerminalSessionLog_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "TerminalSession" ("id") ON DELETE CASCADE ON UPDATE CASCADE
157
220
  );
158
221
 
159
222
  -- CreateTable
160
223
  CREATE TABLE "Trigger" (
161
224
  "id" TEXT NOT NULL PRIMARY KEY,
162
225
  "meta" JSONB NOT NULL,
163
- "instanceId" TEXT NOT NULL,
226
+ "stateId" TEXT NOT NULL,
164
227
  "name" TEXT NOT NULL,
165
228
  "spec" JSONB NOT NULL,
166
- CONSTRAINT "Trigger_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
229
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
230
+ "updatedAt" DATETIME NOT NULL,
231
+ CONSTRAINT "Trigger_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
167
232
  );
168
233
 
169
234
  -- CreateTable
@@ -172,7 +237,9 @@ CREATE TABLE "UnlockMethod" (
172
237
  "meta" JSONB NOT NULL,
173
238
  "type" TEXT NOT NULL,
174
239
  "encryptedIdentity" TEXT NOT NULL,
175
- "recipient" TEXT NOT NULL
240
+ "recipient" TEXT NOT NULL,
241
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
242
+ "updatedAt" DATETIME NOT NULL
176
243
  );
177
244
 
178
245
  -- CreateTable
@@ -187,24 +254,40 @@ CREATE TABLE "Worker" (
187
254
  -- CreateTable
188
255
  CREATE TABLE "WorkerVersion" (
189
256
  "id" TEXT NOT NULL PRIMARY KEY,
257
+ "meta" JSONB NOT NULL,
258
+ "status" TEXT NOT NULL DEFAULT 'unknown',
259
+ "enabled" BOOLEAN NOT NULL DEFAULT true,
260
+ "runtimeId" TEXT,
190
261
  "workerId" TEXT NOT NULL,
191
262
  "digest" TEXT NOT NULL,
192
263
  "apiKeyId" TEXT NOT NULL,
193
264
  "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
265
+ "updatedAt" DATETIME NOT NULL,
266
+ CONSTRAINT "WorkerVersion_workerId_fkey" FOREIGN KEY ("workerId") REFERENCES "Worker" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
194
267
  CONSTRAINT "WorkerVersion_apiKeyId_fkey" FOREIGN KEY ("apiKeyId") REFERENCES "ApiKey" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
195
268
  );
196
269
 
197
270
  -- CreateTable
198
271
  CREATE TABLE "WorkerUnitRegistration" (
199
- "workerVersionId" TEXT NOT NULL,
200
- "instanceId" TEXT NOT NULL,
272
+ "stateId" TEXT NOT NULL,
273
+ "name" TEXT NOT NULL,
201
274
  "params" JSONB NOT NULL,
275
+ "workerVersionId" TEXT NOT NULL,
202
276
  "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
203
277
  "updatedAt" DATETIME NOT NULL,
204
278
 
205
- PRIMARY KEY ("workerVersionId", "instanceId"),
206
- CONSTRAINT "WorkerUnitRegistration_workerVersionId_fkey" FOREIGN KEY ("workerVersionId") REFERENCES "WorkerVersion" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
207
- CONSTRAINT "WorkerUnitRegistration_instanceId_fkey" FOREIGN KEY ("instanceId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
279
+ PRIMARY KEY ("stateId", "name"),
280
+ CONSTRAINT "WorkerUnitRegistration_stateId_fkey" FOREIGN KEY ("stateId") REFERENCES "InstanceState" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
281
+ CONSTRAINT "WorkerUnitRegistration_workerVersionId_fkey" FOREIGN KEY ("workerVersionId") REFERENCES "WorkerVersion" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
282
+ );
283
+
284
+ -- CreateTable
285
+ CREATE TABLE "WorkerVersionLog" (
286
+ "id" TEXT NOT NULL PRIMARY KEY,
287
+ "workerVersionId" TEXT NOT NULL,
288
+ "content" TEXT NOT NULL,
289
+ "isSystem" BOOLEAN NOT NULL DEFAULT false,
290
+ CONSTRAINT "WorkerVersionLog_workerVersionId_fkey" FOREIGN KEY ("workerVersionId") REFERENCES "WorkerVersion" ("id") ON DELETE CASCADE ON UPDATE CASCADE
208
291
  );
209
292
 
210
293
  -- CreateTable
@@ -246,22 +329,25 @@ CREATE UNIQUE INDEX "ApiKey_token_key" ON "ApiKey"("token");
246
329
  CREATE UNIQUE INDEX "Artifact_hash_key" ON "Artifact"("hash");
247
330
 
248
331
  -- CreateIndex
249
- CREATE UNIQUE INDEX "InstanceState_id_lastOperationId_key" ON "InstanceState"("id", "lastOperationId");
332
+ CREATE UNIQUE INDEX "InstanceState_instanceId_key" ON "InstanceState"("instanceId");
333
+
334
+ -- CreateIndex
335
+ CREATE UNIQUE INDEX "Page_stateId_name_key" ON "Page"("stateId", "name");
250
336
 
251
337
  -- CreateIndex
252
- CREATE INDEX "Page_instanceId_idx" ON "Page"("instanceId");
338
+ CREATE UNIQUE INDEX "Secret_systemName_key" ON "Secret"("systemName");
253
339
 
254
340
  -- CreateIndex
255
- CREATE INDEX "Page_serviceAccountId_idx" ON "Page"("serviceAccountId");
341
+ CREATE UNIQUE INDEX "Secret_stateId_name_key" ON "Secret"("stateId", "name");
256
342
 
257
343
  -- CreateIndex
258
- CREATE INDEX "Terminal_serviceAccountId_idx" ON "Terminal"("serviceAccountId");
344
+ CREATE UNIQUE INDEX "Terminal_stateId_name_key" ON "Terminal"("stateId", "name");
259
345
 
260
346
  -- CreateIndex
261
- CREATE UNIQUE INDEX "Terminal_instanceId_name_key" ON "Terminal"("instanceId", "name");
347
+ CREATE UNIQUE INDEX "Trigger_stateId_name_key" ON "Trigger"("stateId", "name");
262
348
 
263
349
  -- CreateIndex
264
- CREATE UNIQUE INDEX "Trigger_instanceId_name_key" ON "Trigger"("instanceId", "name");
350
+ CREATE UNIQUE INDEX "UnlockMethod_recipient_key" ON "UnlockMethod"("recipient");
265
351
 
266
352
  -- CreateIndex
267
353
  CREATE UNIQUE INDEX "Worker_identity_key" ON "Worker"("identity");
@@ -52,10 +52,10 @@ model Terminal {
52
52
  updatedAt DateTime @updatedAt
53
53
 
54
54
  /// The instance this terminal belongs to.
55
- state InstanceState? @relation(fields: [stateId], references: [id], onDelete: Cascade)
55
+ state InstanceState? @relation(fields: [stateId], references: [id])
56
56
 
57
57
  /// The service account this terminal belongs to.
58
- serviceAccount ServiceAccount? @relation(fields: [serviceAccountId], references: [id], onDelete: Cascade)
58
+ serviceAccount ServiceAccount? @relation(fields: [serviceAccountId], references: [id])
59
59
 
60
60
  /// The terminal sessions associated with this terminal.
61
61
  sessions TerminalSession[]
@@ -36,7 +36,7 @@ model UnlockMethod {
36
36
  encryptedIdentity String
37
37
 
38
38
  /// The AGE recipient for this unlock method.
39
- recipient String
39
+ recipient String @unique
40
40
 
41
41
  /// The time when the unlock method was created.
42
42
  createdAt DateTime @default(now())
@@ -84,7 +84,7 @@ model WorkerVersion {
84
84
  workerId String
85
85
 
86
86
  /// The digest of the worker version used to identify it.
87
- /// The format is raw SHA256 digest without the `sha256:` prefix.
87
+ /// The format is raw SHA256 digest without the `sha256:` prefix in lowercase hex.
88
88
  digest String @unique
89
89
 
90
90
  /// The ID of the API key this worker version uses.