@revisium/orchestrator 0.2.0-alpha.2 → 0.2.0-alpha.4
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.
- package/README.md +3 -3
- package/control-plane/bootstrap.config.json +104 -550
- package/control-plane/default-playbook/catalog/pipelines.json +405 -1065
- package/control-plane/default-playbook/catalog/run-profiles.json +208 -0
- package/control-plane/default-playbook/package.json +1 -1
- package/control-plane/default-playbook/playbook.json +2 -1
- package/control-plane/default-playbook/prompts/developer.md +6 -6
- package/dist/__generated__/client/browser.js +18 -0
- package/dist/__generated__/client/browser.js.map +1 -0
- package/dist/__generated__/client/client.js +32 -0
- package/dist/__generated__/client/client.js.map +1 -0
- package/dist/__generated__/client/commonInputTypes.js +11 -0
- package/dist/__generated__/client/commonInputTypes.js.map +1 -0
- package/dist/__generated__/client/enums.js +19 -0
- package/dist/__generated__/client/enums.js.map +1 -0
- package/dist/__generated__/client/internal/class.js +53 -0
- package/dist/__generated__/client/internal/class.js.map +1 -0
- package/dist/__generated__/client/internal/prismaNamespace.js +451 -0
- package/dist/__generated__/client/internal/prismaNamespace.js.map +1 -0
- package/dist/__generated__/client/internal/prismaNamespaceBrowser.js +422 -0
- package/dist/__generated__/client/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/__generated__/client/models/Branch.js +2 -0
- package/dist/__generated__/client/models/Branch.js.map +1 -0
- package/dist/__generated__/client/models/CostLedgerEntry.js +2 -0
- package/dist/__generated__/client/models/CostLedgerEntry.js.map +1 -0
- package/dist/__generated__/client/models/FileBlob.js +2 -0
- package/dist/__generated__/client/models/FileBlob.js.map +1 -0
- package/dist/__generated__/client/models/InboxItem.js +2 -0
- package/dist/__generated__/client/models/InboxItem.js.map +1 -0
- package/dist/__generated__/client/models/ProjectFileUsage.js +2 -0
- package/dist/__generated__/client/models/ProjectFileUsage.js.map +1 -0
- package/dist/__generated__/client/models/Revision.js +2 -0
- package/dist/__generated__/client/models/Revision.js.map +1 -0
- package/dist/__generated__/client/models/RevoProject.js +2 -0
- package/dist/__generated__/client/models/RevoProject.js.map +1 -0
- package/dist/__generated__/client/models/Row.js +2 -0
- package/dist/__generated__/client/models/Row.js.map +1 -0
- package/dist/__generated__/client/models/RunAttempt.js +2 -0
- package/dist/__generated__/client/models/RunAttempt.js.map +1 -0
- package/dist/__generated__/client/models/RunEvent.js +2 -0
- package/dist/__generated__/client/models/RunEvent.js.map +1 -0
- package/dist/__generated__/client/models/RunOutput.js +2 -0
- package/dist/__generated__/client/models/RunOutput.js.map +1 -0
- package/dist/__generated__/client/models/RunTask.js +2 -0
- package/dist/__generated__/client/models/RunTask.js.map +1 -0
- package/dist/__generated__/client/models/Table.js +2 -0
- package/dist/__generated__/client/models/Table.js.map +1 -0
- package/dist/__generated__/client/models/TableMigration.js +2 -0
- package/dist/__generated__/client/models/TableMigration.js.map +1 -0
- package/dist/__generated__/client/models/TaskRun.js +2 -0
- package/dist/__generated__/client/models/TaskRun.js.map +1 -0
- package/dist/__generated__/client/models.js +2 -0
- package/dist/__generated__/client/models.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/pubsub.module.js +2 -1
- package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -1
- package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +110 -28
- package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -1
- package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +3 -1
- package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -1
- package/dist/api/graphql-api/inbox/inputs/resolve-gate.input.js +46 -0
- package/dist/api/graphql-api/inbox/inputs/resolve-gate.input.js.map +1 -1
- package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +6 -0
- package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -1
- package/dist/api/graphql-api/registerGraphqlEnums.js +2 -0
- package/dist/api/graphql-api/registerGraphqlEnums.js.map +1 -1
- package/dist/api/graphql-api/runs/inputs/create-run.input.js +17 -0
- package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -1
- package/dist/api/graphql-api/runs/inputs/execution-profile.input.js +85 -0
- package/dist/api/graphql-api/runs/inputs/execution-profile.input.js.map +1 -0
- package/dist/api/graphql-api/runs/inputs/simulate-route.input.js +11 -0
- package/dist/api/graphql-api/runs/inputs/simulate-route.input.js.map +1 -1
- package/dist/api/graphql-api/runs/model/run-workflow.model.js +5 -0
- package/dist/api/graphql-api/runs/model/run-workflow.model.js.map +1 -1
- package/dist/api/graphql-api/share/model/issue-action.model.js +7 -0
- package/dist/api/graphql-api/share/model/issue-action.model.js.map +1 -0
- package/dist/cli/commands/doctor-report.js +1 -13
- package/dist/cli/commands/doctor-report.js.map +1 -1
- package/dist/cli/commands/lifecycle.js +50 -65
- package/dist/cli/commands/lifecycle.js.map +1 -1
- package/dist/cli/commands/{revisium-helpers.js → process-helpers.js} +1 -24
- package/dist/cli/commands/process-helpers.js.map +1 -0
- package/dist/config.js +17 -55
- package/dist/config.js.map +1 -1
- package/dist/control-plane/audit-validation-helpers.js +31 -0
- package/dist/control-plane/audit-validation-helpers.js.map +1 -0
- package/dist/control-plane/bootstrap-json-validator.js +65 -0
- package/dist/control-plane/bootstrap-json-validator.js.map +1 -0
- package/dist/control-plane/bootstrap.js +25 -38
- package/dist/control-plane/bootstrap.js.map +1 -1
- package/dist/control-plane/change-notifications.js +45 -14
- package/dist/control-plane/change-notifications.js.map +1 -1
- package/dist/control-plane/data-access.js +1 -106
- package/dist/control-plane/data-access.js.map +1 -1
- package/dist/control-plane/default-playbook-policy.js +499 -78
- package/dist/control-plane/default-playbook-policy.js.map +1 -1
- package/dist/control-plane/definitions.js +4 -5
- package/dist/control-plane/definitions.js.map +1 -1
- package/dist/control-plane/engine-transport.js +381 -0
- package/dist/control-plane/engine-transport.js.map +1 -0
- package/dist/control-plane/inbox.js +15 -7
- package/dist/control-plane/inbox.js.map +1 -1
- package/dist/control-plane/index.js +0 -1
- package/dist/control-plane/index.js.map +1 -1
- package/dist/control-plane/manual-adoption-audit.js +3 -24
- package/dist/control-plane/manual-adoption-audit.js.map +1 -1
- package/dist/control-plane/merge-override-audit.js +44 -0
- package/dist/control-plane/merge-override-audit.js.map +1 -0
- package/dist/control-plane/pipeline-coverage-registry.js +478 -0
- package/dist/control-plane/pipeline-coverage-registry.js.map +1 -0
- package/dist/control-plane/query-types.js +2 -0
- package/dist/control-plane/query-types.js.map +1 -0
- package/dist/control-plane/run-profiles.js +89 -0
- package/dist/control-plane/run-profiles.js.map +1 -0
- package/dist/control-plane/schema-migration.js +0 -35
- package/dist/control-plane/schema-migration.js.map +1 -1
- package/dist/control-plane/seed-default-playbook.js +2 -31
- package/dist/control-plane/seed-default-playbook.js.map +1 -1
- package/dist/control-plane/tables.js +8 -0
- package/dist/control-plane/tables.js.map +1 -1
- package/dist/control-plane/transport.js +16 -0
- package/dist/control-plane/transport.js.map +1 -0
- package/dist/control-plane/versioned-meaning.js +56 -14
- package/dist/control-plane/versioned-meaning.js.map +1 -1
- package/dist/e2e/kit/agents.js +60 -6
- package/dist/e2e/kit/agents.js.map +1 -1
- package/dist/e2e/kit/assertions.js +13 -1
- package/dist/e2e/kit/assertions.js.map +1 -1
- package/dist/e2e/kit/drive.js +46 -11
- package/dist/e2e/kit/drive.js.map +1 -1
- package/dist/e2e/kit/env.js +17 -1
- package/dist/e2e/kit/env.js.map +1 -1
- package/dist/e2e/kit/fake-integrator.js +25 -5
- package/dist/e2e/kit/fake-integrator.js.map +1 -1
- package/dist/e2e/kit/gh-emulator.js +172 -40
- package/dist/e2e/kit/gh-emulator.js.map +1 -1
- package/dist/e2e/kit/harness.js +44 -10
- package/dist/e2e/kit/harness.js.map +1 -1
- package/dist/e2e/kit/index.js +1 -0
- package/dist/e2e/kit/index.js.map +1 -1
- package/dist/e2e/kit/scenario.js +165 -0
- package/dist/e2e/kit/scenario.js.map +1 -0
- package/dist/e2e/kit/scenarios.js +12 -18
- package/dist/e2e/kit/scenarios.js.map +1 -1
- package/dist/engine/dbos.service.js +8 -1
- package/dist/engine/dbos.service.js.map +1 -1
- package/dist/features/inbox/commands/impl/resolve-gate.command.js.map +1 -1
- package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -1
- package/dist/features/runs/commands/impl/create-run.command.js.map +1 -1
- package/dist/host/daemon.js +32 -8
- package/dist/host/daemon.js.map +1 -1
- package/dist/host/ensure-host.js +3 -3
- package/dist/host/ensure-host.js.map +1 -1
- package/dist/host/host-runtime.js.map +1 -1
- package/dist/host/host.lifecycle.js +3 -16
- package/dist/host/host.lifecycle.js.map +1 -1
- package/dist/http/graphql-host.js +17 -8
- package/dist/http/graphql-host.js.map +1 -1
- package/dist/mcp/mcp-capabilities.js +12 -11
- package/dist/mcp/mcp-capabilities.js.map +1 -1
- package/dist/mcp/mcp-facade.service.js +45 -5
- package/dist/mcp/mcp-facade.service.js.map +1 -1
- package/dist/mcp/mcp-tools.js +59 -5
- package/dist/mcp/mcp-tools.js.map +1 -1
- package/dist/mcp/monitoring-directive.js +43 -0
- package/dist/mcp/monitoring-directive.js.map +1 -0
- package/dist/pipeline/data-driven-task.workflow.js +393 -182
- package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
- package/dist/pipeline/pipeline.service.js +27 -5
- package/dist/pipeline/pipeline.service.js.map +1 -1
- package/dist/pipeline/route-contract.js +123 -3
- package/dist/pipeline/route-contract.js.map +1 -1
- package/dist/pipeline-core/condition-scopes.js +15 -0
- package/dist/pipeline-core/condition-scopes.js.map +1 -0
- package/dist/pipeline-core/index.js +2 -0
- package/dist/pipeline-core/index.js.map +1 -1
- package/dist/pipeline-core/kit/fixtures.js +81 -44
- package/dist/pipeline-core/kit/fixtures.js.map +1 -1
- package/dist/pipeline-core/materialize.js +221 -0
- package/dist/pipeline-core/materialize.js.map +1 -0
- package/dist/pipeline-core/types.js +5 -0
- package/dist/pipeline-core/types.js.map +1 -1
- package/dist/pipeline-core/validate-loops.js +2 -15
- package/dist/pipeline-core/validate-loops.js.map +1 -1
- package/dist/pipeline-core/validate-resilience.js +257 -0
- package/dist/pipeline-core/validate-resilience.js.map +1 -0
- package/dist/pipeline-core/validate.js +2 -0
- package/dist/pipeline-core/validate.js.map +1 -1
- package/dist/playbook/catalog-loader.js +39 -2
- package/dist/playbook/catalog-loader.js.map +1 -1
- package/dist/playbook/catalog-schema-validator.js +438 -0
- package/dist/playbook/catalog-schema-validator.js.map +1 -0
- package/dist/playbook/import-mapper.js +41 -0
- package/dist/playbook/import-mapper.js.map +1 -1
- package/dist/playbook/manifest.js +5 -0
- package/dist/playbook/manifest.js.map +1 -1
- package/dist/playbook/playbook-installer.js +17 -1
- package/dist/playbook/playbook-installer.js.map +1 -1
- package/dist/poller/pr-readiness-core.js +280 -94
- package/dist/poller/pr-readiness-core.js.map +1 -1
- package/dist/poller/pr-readiness.js +2 -2
- package/dist/poller/pr-readiness.js.map +1 -1
- package/dist/revisium/inbox.service.js +8 -8
- package/dist/revisium/inbox.service.js.map +1 -1
- package/dist/revisium/playbooks.service.js +116 -21
- package/dist/revisium/playbooks.service.js.map +1 -1
- package/dist/revisium/revisium.module.js +8 -8
- package/dist/revisium/revisium.module.js.map +1 -1
- package/dist/revisium/roles.service.js +3 -1
- package/dist/revisium/roles.service.js.map +1 -1
- package/dist/revisium/run.service.js +9 -8
- package/dist/revisium/run.service.js.map +1 -1
- package/dist/revisium/tokens.js +0 -1
- package/dist/revisium/tokens.js.map +1 -1
- package/dist/run/create-run.js +1 -1
- package/dist/run/create-run.js.map +1 -1
- package/dist/run/inspect-run.js +32 -28
- package/dist/run/inspect-run.js.map +1 -1
- package/dist/run/issue-ref.js +97 -2
- package/dist/run/issue-ref.js.map +1 -1
- package/dist/run/prisma-runtime-data-access.js +619 -0
- package/dist/run/prisma-runtime-data-access.js.map +1 -0
- package/dist/run/run-outputs.js +39 -14
- package/dist/run/run-outputs.js.map +1 -1
- package/dist/run/terminal-run-status.js.map +1 -1
- package/dist/runners/integrator.js +657 -56
- package/dist/runners/integrator.js.map +1 -1
- package/dist/runners/worktree.service.js +10 -8
- package/dist/runners/worktree.service.js.map +1 -1
- package/dist/schema/ajv-errors.js +15 -0
- package/dist/schema/ajv-errors.js.map +1 -0
- package/dist/smoke/isolation.js +7 -16
- package/dist/smoke/isolation.js.map +1 -1
- package/dist/storage/ensure-storage.js +117 -0
- package/dist/storage/ensure-storage.js.map +1 -0
- package/dist/storage/revo-database.js +39 -0
- package/dist/storage/revo-database.js.map +1 -0
- package/dist/storage/revo-prisma.service.js +31 -0
- package/dist/storage/revo-prisma.service.js.map +1 -0
- package/dist/storage/revo-storage.module.js +18 -0
- package/dist/storage/revo-storage.module.js.map +1 -0
- package/dist/task-control-plane/pr-readiness.service.js +5 -2
- package/dist/task-control-plane/pr-readiness.service.js.map +1 -1
- package/dist/task-control-plane/run-watch.service.js +3 -6
- package/dist/task-control-plane/run-watch.service.js.map +1 -1
- package/dist/task-control-plane/task-control-plane-api.service.js +234 -43
- package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
- package/dist/testing/runtime-data-access.js +175 -0
- package/dist/testing/runtime-data-access.js.map +1 -0
- package/dist/worker/build-context.js +178 -2
- package/dist/worker/build-context.js.map +1 -1
- package/dist/worker/claude-code-runner.js +22 -3
- package/dist/worker/claude-code-runner.js.map +1 -1
- package/dist/worker/codex-runner.js +6 -1
- package/dist/worker/codex-runner.js.map +1 -1
- package/package.json +20 -7
- package/prisma/migrations/20260707080500_initial_schema/migration.sql +259 -0
- package/prisma/migrations/20260707103000_prisma_runtime_tables/migration.sql +235 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +339 -0
- package/prisma.config.ts +11 -0
- package/dist/cli/commands/revisium-helpers.js.map +0 -1
- package/dist/control-plane/client-transport.js +0 -168
- package/dist/control-plane/client-transport.js.map +0 -1
- package/dist/engine/ensure-postgres.js +0 -46
- package/dist/engine/ensure-postgres.js.map +0 -1
- package/dist/host/ensure-revisium.js +0 -135
- package/dist/host/ensure-revisium.js.map +0 -1
- package/revisium.config.json +0 -10
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
generator client {
|
|
2
|
+
provider = "prisma-client"
|
|
3
|
+
output = "../src/__generated__/client"
|
|
4
|
+
moduleFormat = "cjs"
|
|
5
|
+
previewFeatures = ["fullTextSearchPostgres", "typedSql"]
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
datasource db {
|
|
9
|
+
provider = "postgresql"
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
enum RevoProjectKind {
|
|
13
|
+
USER
|
|
14
|
+
SYSTEM
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
enum RevoProjectStatus {
|
|
18
|
+
ACTIVE
|
|
19
|
+
ARCHIVED
|
|
20
|
+
DELETED
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
model RevoProject {
|
|
24
|
+
id String @id @default(cuid())
|
|
25
|
+
createdAt DateTime @default(now())
|
|
26
|
+
updatedAt DateTime @updatedAt
|
|
27
|
+
deletedAt DateTime?
|
|
28
|
+
kind RevoProjectKind @default(USER)
|
|
29
|
+
name String
|
|
30
|
+
slug String @unique
|
|
31
|
+
status RevoProjectStatus @default(ACTIVE)
|
|
32
|
+
|
|
33
|
+
revisiumBranches Branch[]
|
|
34
|
+
taskRuns TaskRun[]
|
|
35
|
+
|
|
36
|
+
@@index([status])
|
|
37
|
+
@@index([kind, status])
|
|
38
|
+
@@index([deletedAt])
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
model TaskRun {
|
|
42
|
+
id String @id
|
|
43
|
+
createdAt DateTime @default(now())
|
|
44
|
+
updatedAt DateTime @updatedAt
|
|
45
|
+
projectId String?
|
|
46
|
+
project RevoProject? @relation(fields: [projectId], references: [id], onDelete: Restrict)
|
|
47
|
+
title String
|
|
48
|
+
description String @default("")
|
|
49
|
+
status String
|
|
50
|
+
repos String[]
|
|
51
|
+
scope String @default("")
|
|
52
|
+
priority Int @default(0)
|
|
53
|
+
playbookId String @default("")
|
|
54
|
+
pipelineId String @default("")
|
|
55
|
+
params Json @default("{}")
|
|
56
|
+
routeDecision Json @default("{}")
|
|
57
|
+
executionProfile Json @default("{}")
|
|
58
|
+
createdBy String @default("")
|
|
59
|
+
|
|
60
|
+
tasks RunTask[]
|
|
61
|
+
events RunEvent[]
|
|
62
|
+
attempts RunAttempt[]
|
|
63
|
+
inbox InboxItem[]
|
|
64
|
+
outputs RunOutput[]
|
|
65
|
+
costItems CostLedgerEntry[]
|
|
66
|
+
|
|
67
|
+
@@index([projectId])
|
|
68
|
+
@@index([status])
|
|
69
|
+
@@index([playbookId, pipelineId])
|
|
70
|
+
@@index([createdAt])
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
model RunTask {
|
|
74
|
+
id String @id
|
|
75
|
+
createdAt DateTime @default(now())
|
|
76
|
+
updatedAt DateTime @updatedAt
|
|
77
|
+
runId String
|
|
78
|
+
run TaskRun @relation(fields: [runId], references: [id], onDelete: Cascade)
|
|
79
|
+
repoRef String @default("")
|
|
80
|
+
roleHint String @default("")
|
|
81
|
+
title String
|
|
82
|
+
status String
|
|
83
|
+
dependsOn String[]
|
|
84
|
+
scope String @default("")
|
|
85
|
+
priority Int @default(0)
|
|
86
|
+
|
|
87
|
+
@@index([runId])
|
|
88
|
+
@@index([status])
|
|
89
|
+
@@index([createdAt])
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
model RunEvent {
|
|
93
|
+
id String @id
|
|
94
|
+
createdAt DateTime @default(now())
|
|
95
|
+
sequence Int @default(autoincrement())
|
|
96
|
+
runId String
|
|
97
|
+
run TaskRun @relation(fields: [runId], references: [id], onDelete: Cascade)
|
|
98
|
+
taskId String @default("")
|
|
99
|
+
stepId String @default("")
|
|
100
|
+
type String
|
|
101
|
+
payload Json @default("{}")
|
|
102
|
+
actor String @default("")
|
|
103
|
+
|
|
104
|
+
@@unique([runId, sequence])
|
|
105
|
+
@@index([runId])
|
|
106
|
+
@@index([runId, createdAt])
|
|
107
|
+
@@index([runId, sequence])
|
|
108
|
+
@@index([type])
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
model RunAttempt {
|
|
112
|
+
id String @id
|
|
113
|
+
createdAt DateTime @default(now())
|
|
114
|
+
updatedAt DateTime @updatedAt
|
|
115
|
+
runId String
|
|
116
|
+
run TaskRun @relation(fields: [runId], references: [id], onDelete: Cascade)
|
|
117
|
+
stepId String
|
|
118
|
+
workerId String @default("")
|
|
119
|
+
attemptNo Int @default(0)
|
|
120
|
+
iteration Int @default(0)
|
|
121
|
+
status String
|
|
122
|
+
idempotencyKey String @default("")
|
|
123
|
+
modelProfile String @default("")
|
|
124
|
+
verdict String @default("")
|
|
125
|
+
inputTokens Int @default(0)
|
|
126
|
+
outputTokens Int @default(0)
|
|
127
|
+
costAmount Decimal @default(0) @db.Decimal(20, 12)
|
|
128
|
+
currency String @default("USD")
|
|
129
|
+
durationMs Int @default(0)
|
|
130
|
+
outputSummary String @default("")
|
|
131
|
+
artifactRef String @default("")
|
|
132
|
+
stdoutTail String @default("")
|
|
133
|
+
stderrTail String @default("")
|
|
134
|
+
lesson String @default("")
|
|
135
|
+
error String @default("")
|
|
136
|
+
startedAt DateTime @default(now())
|
|
137
|
+
finishedAt DateTime @default(now())
|
|
138
|
+
|
|
139
|
+
@@index([runId])
|
|
140
|
+
@@index([runId, stepId])
|
|
141
|
+
@@index([status])
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
model InboxItem {
|
|
145
|
+
id String @id
|
|
146
|
+
createdAt DateTime @default(now())
|
|
147
|
+
updatedAt DateTime @updatedAt
|
|
148
|
+
kind String
|
|
149
|
+
runId String?
|
|
150
|
+
run TaskRun? @relation(fields: [runId], references: [id], onDelete: Cascade)
|
|
151
|
+
taskId String @default("")
|
|
152
|
+
stepId String @default("")
|
|
153
|
+
projectId String @default("")
|
|
154
|
+
title String
|
|
155
|
+
context Json @default("{}")
|
|
156
|
+
options String[]
|
|
157
|
+
status String
|
|
158
|
+
answer Json?
|
|
159
|
+
resolvedBy String @default("")
|
|
160
|
+
resolvedAt DateTime?
|
|
161
|
+
|
|
162
|
+
@@index([runId])
|
|
163
|
+
@@index([status])
|
|
164
|
+
@@index([createdAt])
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
model RunOutput {
|
|
168
|
+
id String @id
|
|
169
|
+
createdAt DateTime @default(now())
|
|
170
|
+
runId String
|
|
171
|
+
run TaskRun @relation(fields: [runId], references: [id], onDelete: Cascade)
|
|
172
|
+
nodeId String
|
|
173
|
+
ordinal Int
|
|
174
|
+
name String
|
|
175
|
+
schemaRef String @default("")
|
|
176
|
+
payload Json @default("{}")
|
|
177
|
+
payloadRef String @default("")
|
|
178
|
+
attemptId String @default("")
|
|
179
|
+
producedAt DateTime @default(now())
|
|
180
|
+
|
|
181
|
+
@@unique([runId, nodeId, ordinal])
|
|
182
|
+
@@index([runId])
|
|
183
|
+
@@index([nodeId])
|
|
184
|
+
@@index([producedAt])
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
model CostLedgerEntry {
|
|
188
|
+
id String @id
|
|
189
|
+
createdAt DateTime @default(now())
|
|
190
|
+
runId String
|
|
191
|
+
run TaskRun @relation(fields: [runId], references: [id], onDelete: Cascade)
|
|
192
|
+
stepId String @default("")
|
|
193
|
+
attemptId String @default("")
|
|
194
|
+
modelProfile String @default("")
|
|
195
|
+
inputTokens Int @default(0)
|
|
196
|
+
outputTokens Int @default(0)
|
|
197
|
+
costAmount Decimal @default(0) @db.Decimal(20, 12)
|
|
198
|
+
currency String @default("USD")
|
|
199
|
+
recordedAt DateTime @default(now())
|
|
200
|
+
|
|
201
|
+
@@index([runId])
|
|
202
|
+
@@index([attemptId])
|
|
203
|
+
@@index([recordedAt])
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
model Branch {
|
|
207
|
+
id String @id
|
|
208
|
+
createdAt DateTime @default(now())
|
|
209
|
+
isRoot Boolean @default(false)
|
|
210
|
+
name String
|
|
211
|
+
projectId String
|
|
212
|
+
revoProject RevoProject @relation(fields: [projectId], references: [id], onDelete: Restrict)
|
|
213
|
+
revisions Revision[]
|
|
214
|
+
|
|
215
|
+
@@unique([name, projectId])
|
|
216
|
+
@@index([projectId])
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
model Revision {
|
|
220
|
+
id String @id
|
|
221
|
+
sequence Int @unique @default(autoincrement())
|
|
222
|
+
createdAt DateTime @default(now())
|
|
223
|
+
comment String @default("")
|
|
224
|
+
isHead Boolean @default(false)
|
|
225
|
+
isDraft Boolean @default(false)
|
|
226
|
+
isStart Boolean @default(false)
|
|
227
|
+
hasChanges Boolean @default(false)
|
|
228
|
+
|
|
229
|
+
branchId String
|
|
230
|
+
branch Branch @relation(fields: [branchId], references: [id], onDelete: Cascade)
|
|
231
|
+
parentId String?
|
|
232
|
+
parent Revision? @relation("parentRevision", fields: [parentId], references: [id], onDelete: SetNull)
|
|
233
|
+
children Revision[] @relation("parentRevision")
|
|
234
|
+
tables Table[]
|
|
235
|
+
|
|
236
|
+
@@index([branchId])
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
model Table {
|
|
240
|
+
versionId String @id
|
|
241
|
+
createdId String
|
|
242
|
+
id String
|
|
243
|
+
|
|
244
|
+
readonly Boolean @default(false)
|
|
245
|
+
|
|
246
|
+
createdAt DateTime @default(now())
|
|
247
|
+
updatedAt DateTime @default(now())
|
|
248
|
+
|
|
249
|
+
system Boolean @default(false)
|
|
250
|
+
|
|
251
|
+
revisions Revision[]
|
|
252
|
+
rows Row[]
|
|
253
|
+
|
|
254
|
+
@@index([id])
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
model Row {
|
|
258
|
+
versionId String @id
|
|
259
|
+
createdId String
|
|
260
|
+
id String
|
|
261
|
+
|
|
262
|
+
readonly Boolean @default(false)
|
|
263
|
+
|
|
264
|
+
createdAt DateTime @default(now())
|
|
265
|
+
updatedAt DateTime @default(now())
|
|
266
|
+
publishedAt DateTime @default(now())
|
|
267
|
+
|
|
268
|
+
data Json
|
|
269
|
+
meta Json @default("{}")
|
|
270
|
+
hash String
|
|
271
|
+
schemaHash String
|
|
272
|
+
|
|
273
|
+
tables Table[]
|
|
274
|
+
fileBlobs FileBlob[] @relation("FileBlobToRow")
|
|
275
|
+
|
|
276
|
+
@@index([data], type: Gin)
|
|
277
|
+
@@index([id])
|
|
278
|
+
@@index([hash])
|
|
279
|
+
@@index([schemaHash])
|
|
280
|
+
@@index([publishedAt])
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
model FileBlob {
|
|
284
|
+
id String @id @default(nanoid())
|
|
285
|
+
createdAt DateTime @default(now())
|
|
286
|
+
deletedAt DateTime?
|
|
287
|
+
|
|
288
|
+
projectId String
|
|
289
|
+
hash String
|
|
290
|
+
size BigInt
|
|
291
|
+
|
|
292
|
+
rows Row[] @relation("FileBlobToRow")
|
|
293
|
+
|
|
294
|
+
@@unique([projectId, hash])
|
|
295
|
+
@@index([projectId])
|
|
296
|
+
@@index([hash])
|
|
297
|
+
@@index([deletedAt])
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
model ProjectFileUsage {
|
|
301
|
+
projectId String @id
|
|
302
|
+
fileBytes BigInt @default(0)
|
|
303
|
+
updatedAt DateTime @updatedAt
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
model TableMigration {
|
|
307
|
+
id String @id @default(cuid())
|
|
308
|
+
revisionId String
|
|
309
|
+
tableId String
|
|
310
|
+
sourceTableVersionId String
|
|
311
|
+
shadowTableVersionId String?
|
|
312
|
+
status String @default("PENDING")
|
|
313
|
+
phase String @default("INIT")
|
|
314
|
+
patches Json
|
|
315
|
+
previousSchema Json
|
|
316
|
+
previousSchemaHash String
|
|
317
|
+
targetSchemaHash String
|
|
318
|
+
totalRows Int
|
|
319
|
+
copiedRows Int @default(0)
|
|
320
|
+
lastCopiedRowId String?
|
|
321
|
+
batchSize Int @default(1000)
|
|
322
|
+
currentBatch Int @default(0)
|
|
323
|
+
totalBatches Int @default(0)
|
|
324
|
+
createdAt DateTime @default(now())
|
|
325
|
+
startedAt DateTime?
|
|
326
|
+
completedAt DateTime?
|
|
327
|
+
lastProgressAt DateTime?
|
|
328
|
+
lockedBy String?
|
|
329
|
+
lockedAt DateTime?
|
|
330
|
+
heartbeatAt DateTime?
|
|
331
|
+
errorMessage String?
|
|
332
|
+
retryCount Int @default(0)
|
|
333
|
+
maxRetries Int @default(3)
|
|
334
|
+
|
|
335
|
+
@@unique([revisionId, tableId])
|
|
336
|
+
@@index([status])
|
|
337
|
+
@@index([lockedBy])
|
|
338
|
+
@@index([status, heartbeatAt])
|
|
339
|
+
}
|
package/prisma.config.ts
ADDED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"revisium-helpers.js","sourceRoot":"","sources":["../../../src/cli/commands/revisium-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,SAAS,CAAC,KAAyB,EAAE,QAAgB;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,SAAS,GAAG,OAAO;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpE,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG;gBAAE,OAAO,IAAI,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;QACT,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAC/D,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAsB;IAC1D,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;QACT,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,SAAiB;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { RevisiumClient, sdk } from '@revisium/client';
|
|
2
|
-
import { baseUrl, getConfig, isAlive, isHealthy, readRuntime } from '../config.js';
|
|
3
|
-
import { ControlPlaneError } from './errors.js';
|
|
4
|
-
import { runtimeTables } from './tables.js';
|
|
5
|
-
const REQUEST_TIMEOUT_MS = 15_000;
|
|
6
|
-
export function withRequestTimeout(baseFetch, timeoutMs) {
|
|
7
|
-
return (input, init) => {
|
|
8
|
-
const timeout = AbortSignal.timeout(timeoutMs);
|
|
9
|
-
const signal = init?.signal ? AbortSignal.any([init.signal, timeout]) : timeout;
|
|
10
|
-
return baseFetch(input, { ...init, signal });
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
export function makeRecoverableScopeResolver(loadScope) {
|
|
14
|
-
let cachedScope;
|
|
15
|
-
return {
|
|
16
|
-
resolve() {
|
|
17
|
-
cachedScope ??= loadScope().catch((error) => {
|
|
18
|
-
cachedScope = undefined;
|
|
19
|
-
throw error;
|
|
20
|
-
});
|
|
21
|
-
return cachedScope;
|
|
22
|
-
},
|
|
23
|
-
invalidate() {
|
|
24
|
-
cachedScope = undefined;
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
function mapApiError(err, context) {
|
|
29
|
-
if (err instanceof ControlPlaneError)
|
|
30
|
-
return err;
|
|
31
|
-
const apiErr = err;
|
|
32
|
-
const status = apiErr.statusCode;
|
|
33
|
-
const message = apiErr.message ?? String(err);
|
|
34
|
-
if (status === 404) {
|
|
35
|
-
return new ControlPlaneError('ROW_NOT_FOUND', `Row not found: ${context}`, { status, details: err });
|
|
36
|
-
}
|
|
37
|
-
if (status === 409 || (status === 400 && message.startsWith('Rows already exist:'))) {
|
|
38
|
-
return new ControlPlaneError('ROW_CONFLICT', `Row conflict: ${context}`, { status, details: err });
|
|
39
|
-
}
|
|
40
|
-
if (status === 400 || status === 422) {
|
|
41
|
-
return new ControlPlaneError('VALIDATION_FAILURE', `Validation failure: ${context}`, { status, details: err });
|
|
42
|
-
}
|
|
43
|
-
return new ControlPlaneError('HTTP_ERROR', `HTTP error ${status ?? 'unknown'}: ${context}: ${message}`, {
|
|
44
|
-
status,
|
|
45
|
-
details: err,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
function toTransportRow(row) {
|
|
49
|
-
return {
|
|
50
|
-
id: row.id,
|
|
51
|
-
data: row.data,
|
|
52
|
-
readonly: row.readonly,
|
|
53
|
-
createdAt: row.createdAt,
|
|
54
|
-
updatedAt: row.updatedAt,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
export function mapTransportListEdges(edges) {
|
|
58
|
-
return edges.flatMap((edge) => edge.node ? [{ cursor: edge.cursor, node: toTransportRow(edge.node) }] : []);
|
|
59
|
-
}
|
|
60
|
-
export function extractMutationRow(result) {
|
|
61
|
-
const row = result.data?.row;
|
|
62
|
-
if (!row)
|
|
63
|
-
throw new ControlPlaneError('HTTP_ERROR', 'Malformed response');
|
|
64
|
-
return row;
|
|
65
|
-
}
|
|
66
|
-
async function getScope(mode) {
|
|
67
|
-
const runtime = readRuntime();
|
|
68
|
-
if (!runtime || !isAlive(runtime.pid) || !(await isHealthy(runtime.httpPort))) {
|
|
69
|
-
throw new ControlPlaneError('DAEMON_NOT_RUNNING', 'Local Revisium daemon is not running or healthy');
|
|
70
|
-
}
|
|
71
|
-
const { org, project, branch } = getConfig();
|
|
72
|
-
const revisiumClient = new RevisiumClient({ baseUrl: baseUrl(runtime.httpPort) });
|
|
73
|
-
const clientInstance = revisiumClient.client;
|
|
74
|
-
clientInstance.setConfig({ fetch: withRequestTimeout(globalThis.fetch, REQUEST_TIMEOUT_MS) });
|
|
75
|
-
const result = mode === 'draft'
|
|
76
|
-
? await sdk.draftRevision({ client: clientInstance, path: { organizationId: org, projectName: project, branchName: branch } })
|
|
77
|
-
: await sdk.headRevision({ client: clientInstance, path: { organizationId: org, projectName: project, branchName: branch } });
|
|
78
|
-
if (result.error) {
|
|
79
|
-
const err = result.error;
|
|
80
|
-
if (err.statusCode === 404) {
|
|
81
|
-
throw new ControlPlaneError('BOOTSTRAP_NOT_APPLIED', `Control-plane bootstrap is missing or not committed: ${org}/${project}/${branch}`, { status: 404, details: result.error });
|
|
82
|
-
}
|
|
83
|
-
throw mapApiError(result.error, `${org}/${project}/${branch}:${mode}`);
|
|
84
|
-
}
|
|
85
|
-
return { revisionId: result.data.id, client: clientInstance };
|
|
86
|
-
}
|
|
87
|
-
export function createClientTransport(mode) {
|
|
88
|
-
const resolveScope = makeRecoverableScopeResolver(() => getScope(mode));
|
|
89
|
-
async function withScopeRetry(operation, context) {
|
|
90
|
-
const firstScope = await resolveScope.resolve();
|
|
91
|
-
const first = await operation(firstScope);
|
|
92
|
-
if (!first.error)
|
|
93
|
-
return first.data;
|
|
94
|
-
const err = first.error;
|
|
95
|
-
if (mode === 'draft' && err.statusCode === 404) {
|
|
96
|
-
resolveScope.invalidate();
|
|
97
|
-
const secondScope = await resolveScope.resolve();
|
|
98
|
-
const second = await operation(secondScope);
|
|
99
|
-
if (!second.error)
|
|
100
|
-
return second.data;
|
|
101
|
-
throw mapApiError(second.error, context);
|
|
102
|
-
}
|
|
103
|
-
throw mapApiError(first.error, context);
|
|
104
|
-
}
|
|
105
|
-
async function assertReady() {
|
|
106
|
-
let resultData;
|
|
107
|
-
try {
|
|
108
|
-
resultData = await withScopeRetry(({ revisionId, client }) => sdk.tables({ client, path: { revisionId }, query: { first: 100 } }), '/tables');
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
if (error instanceof ControlPlaneError && error.status === 404) {
|
|
112
|
-
throw new ControlPlaneError('BOOTSTRAP_NOT_APPLIED', 'Control-plane bootstrap is missing or not committed', {
|
|
113
|
-
status: 404,
|
|
114
|
-
details: error.details,
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
throw error;
|
|
118
|
-
}
|
|
119
|
-
const tableIds = new Set((resultData?.edges ?? []).flatMap((edge) => edge.node ? [edge.node.id] : []));
|
|
120
|
-
const missing = runtimeTables.filter((t) => !tableIds.has(t));
|
|
121
|
-
if (missing.length > 0) {
|
|
122
|
-
throw new ControlPlaneError('BOOTSTRAP_NOT_APPLIED', 'Control-plane bootstrap is missing runtime tables', {
|
|
123
|
-
details: { missing },
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
async function listRows(table, options) {
|
|
128
|
-
const body = {
|
|
129
|
-
first: options?.first ?? 100,
|
|
130
|
-
after: options?.after,
|
|
131
|
-
where: options?.where,
|
|
132
|
-
orderBy: options?.orderBy,
|
|
133
|
-
};
|
|
134
|
-
const data = await withScopeRetry(({ revisionId, client }) => sdk.rows({ client, path: { revisionId, tableId: table }, body }), `${table}/rows`);
|
|
135
|
-
const edges = mapTransportListEdges((data?.edges ?? []));
|
|
136
|
-
return { edges };
|
|
137
|
-
}
|
|
138
|
-
async function getRow(table, rowId) {
|
|
139
|
-
const data = await withScopeRetry(({ revisionId, client }) => sdk.row({ client, path: { revisionId, tableId: table, rowId } }), `${table}/${rowId}`);
|
|
140
|
-
return toTransportRow(data);
|
|
141
|
-
}
|
|
142
|
-
async function createRow(table, rowId, data) {
|
|
143
|
-
const resultData = await withScopeRetry(({ revisionId, client }) => sdk.createRow({
|
|
144
|
-
client,
|
|
145
|
-
path: { revisionId, tableId: table },
|
|
146
|
-
body: { rowId, data: data },
|
|
147
|
-
}), `${table}/${rowId}`);
|
|
148
|
-
return toTransportRow(resultData.row);
|
|
149
|
-
}
|
|
150
|
-
async function updateRow(table, rowId, data) {
|
|
151
|
-
const resultData = await withScopeRetry(({ revisionId, client }) => sdk.updateRow({
|
|
152
|
-
client,
|
|
153
|
-
path: { revisionId, tableId: table, rowId },
|
|
154
|
-
body: { data: data },
|
|
155
|
-
}), `${table}/${rowId}`);
|
|
156
|
-
return toTransportRow(extractMutationRow({ data: resultData }));
|
|
157
|
-
}
|
|
158
|
-
async function patchRow(table, rowId, patches) {
|
|
159
|
-
const resultData = await withScopeRetry(({ revisionId, client }) => sdk.patchRow({
|
|
160
|
-
client,
|
|
161
|
-
path: { revisionId, tableId: table, rowId },
|
|
162
|
-
body: { patches: patches },
|
|
163
|
-
}), `${table}/${rowId}`);
|
|
164
|
-
return toTransportRow(extractMutationRow({ data: resultData }));
|
|
165
|
-
}
|
|
166
|
-
return { mode, assertReady, listRows, getRow, createRow, updateRow, patchRow, invalidate: () => resolveScope.invalidate() };
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=client-transport.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-transport.js","sourceRoot":"","sources":["../../src/control-plane/client-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import pg from 'pg';
|
|
2
|
-
import { PROFILES, resolveProfileName } from '../config.js';
|
|
3
|
-
export function resolveDbosDbName() {
|
|
4
|
-
const name = process.env['REVO_DBOS_DB'] ?? PROFILES[resolveProfileName()].dbosDb;
|
|
5
|
-
if (!/^[a-z_][a-z0-9_]*$/i.test(name)) {
|
|
6
|
-
throw new Error(`Invalid REVO_DBOS_DB '${name}': must be a SQL identifier (/^[a-z_][a-z0-9_]*$/i)`);
|
|
7
|
-
}
|
|
8
|
-
return name;
|
|
9
|
-
}
|
|
10
|
-
const MAINTENANCE_DB = 'postgres';
|
|
11
|
-
const PG_SQLSTATE_DUPLICATE_DATABASE = '42P04';
|
|
12
|
-
const DEFAULT_CREDS = {
|
|
13
|
-
user: 'revisium',
|
|
14
|
-
password: 'password',
|
|
15
|
-
adminDb: MAINTENANCE_DB,
|
|
16
|
-
};
|
|
17
|
-
export async function ensurePostgres(pgPort, opts = {}, deps = {}) {
|
|
18
|
-
const dbosDbName = resolveDbosDbName();
|
|
19
|
-
const { user, password, adminDb } = { ...DEFAULT_CREDS, ...opts };
|
|
20
|
-
const pgClientFactory = () => new pg.Client({ host: 'localhost', port: pgPort, user, password, database: adminDb });
|
|
21
|
-
const createClient = deps.createClient ?? pgClientFactory;
|
|
22
|
-
const client = createClient();
|
|
23
|
-
try {
|
|
24
|
-
await client.connect();
|
|
25
|
-
const result = await client.query(`SELECT count(*)::text AS count FROM pg_database WHERE datname = $1`, [dbosDbName]);
|
|
26
|
-
const exists = result.rows[0]?.count !== '0';
|
|
27
|
-
if (!exists) {
|
|
28
|
-
try {
|
|
29
|
-
await client.query(`CREATE DATABASE ${dbosDbName}`);
|
|
30
|
-
}
|
|
31
|
-
catch (err) {
|
|
32
|
-
if (err.code === PG_SQLSTATE_DUPLICATE_DATABASE) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
throw err;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
await client.end();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
export function dbosSystemDatabaseUrl(pgPort, user = 'revisium', password = 'password') {
|
|
44
|
-
return `postgresql://${encodeURIComponent(user)}:${encodeURIComponent(password)}@localhost:${pgPort}/${resolveDbosDbName()}`;
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=ensure-postgres.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-postgres.js","sourceRoot":"","sources":["../../src/engine/ensure-postgres.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAM5D,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC;IAClF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,qDAAqD,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,cAAc,GAAG,UAAU,CAAC;AAGlC,MAAM,8BAA8B,GAAG,OAAO,CAAC;AAQ/C,MAAM,aAAa,GAAwB;IACzC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,cAAc;CACxB,CAAC;AAoBF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,OAAqC,EAAE,EACvC,OAA2B,EAAE;IAE7B,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,IAAI,EAAE,CAAC;IAClE,MAAM,eAAe,GAAG,GAAe,EAAE,CACvC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAA0B,CAAC;IACjH,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,eAAe,CAAC;IAE1D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,oEAAoE,EACpE,CAAC,UAAU,CAAC,CACb,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,GAAG,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAAyB,CAAC,IAAI,KAAK,8BAA8B,EAAE,CAAC;oBACvE,OAAO;gBACT,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AASD,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,IAAI,GAAG,UAAU,EACjB,QAAQ,GAAG,UAAU;IAErB,OAAO,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,cAAc,MAAM,IAAI,iBAAiB,EAAE,EAAE,CAAC;AAC/H,CAAC"}
|