@revisium/orchestrator 0.2.0-alpha.3 → 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 +394 -1122
- 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/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/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 +497 -94
- 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/merge-override-audit.js +2 -2
- package/dist/control-plane/merge-override-audit.js.map +1 -1
- 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 +158 -24
- 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/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 +3 -2
- package/dist/mcp/mcp-capabilities.js.map +1 -1
- package/dist/mcp/mcp-facade.service.js +21 -0
- package/dist/mcp/mcp-facade.service.js.map +1 -1
- package/dist/mcp/mcp-tools.js +35 -1
- package/dist/mcp/mcp-tools.js.map +1 -1
- package/dist/pipeline/data-driven-task.workflow.js +276 -57
- 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 +257 -93
- 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 +225 -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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { getConfig, repoRoot } from '../config.js';
|
|
4
|
+
import { applyEngineBootstrapTables, createEngineTransport, ensureControlPlaneProject, } from './engine-transport.js';
|
|
5
|
+
import { validateBootstrapJsonFields } from './bootstrap-json-validator.js';
|
|
6
6
|
function isNotFoundError(err) {
|
|
7
7
|
if (err && typeof err === 'object') {
|
|
8
8
|
const e = err;
|
|
@@ -14,54 +14,41 @@ function isNotFoundError(err) {
|
|
|
14
14
|
export function bootstrapConfigPath() {
|
|
15
15
|
return join(repoRoot, 'control-plane', 'bootstrap.config.json');
|
|
16
16
|
}
|
|
17
|
-
export async function
|
|
18
|
-
const {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
await projectScope.get();
|
|
26
|
-
}
|
|
27
|
-
catch (err) {
|
|
28
|
-
if (!isNotFoundError(err))
|
|
29
|
-
throw err;
|
|
30
|
-
projectExists = false;
|
|
31
|
-
}
|
|
32
|
-
if (!projectExists) {
|
|
33
|
-
await orgScope.createProject({ projectName: project, branchName: branch });
|
|
34
|
-
}
|
|
35
|
-
const endpoints = await projectScope.getEndpoints();
|
|
36
|
-
if (!endpoints.some((endpoint) => endpoint.type === 'REST_API')) {
|
|
37
|
-
await projectScope.createEndpoint({ type: 'REST_API' });
|
|
38
|
-
}
|
|
39
|
-
const draft = await client.revision({ org, project, branch, revision: 'draft' });
|
|
40
|
-
const migration = await applyAdditiveSchemaMigration(draft, configPath);
|
|
41
|
-
let createdRows = 0;
|
|
17
|
+
export async function bootstrapEngineControlPlane(engine, prisma) {
|
|
18
|
+
const { project, branch } = getConfig();
|
|
19
|
+
const config = JSON.parse(readFileSync(bootstrapConfigPath(), 'utf8'));
|
|
20
|
+
validateBootstrapJsonFields(config.rows ?? []);
|
|
21
|
+
await ensureControlPlaneProject(prisma);
|
|
22
|
+
let changes = await applyEngineBootstrapTables(engine, prisma, config.tables ?? []);
|
|
23
|
+
const draft = createEngineTransport('draft', engine, prisma);
|
|
42
24
|
for (const row of config.rows ?? []) {
|
|
43
|
-
let
|
|
25
|
+
let exists = true;
|
|
44
26
|
try {
|
|
45
27
|
await draft.getRow(row.tableId, row.rowId);
|
|
46
28
|
}
|
|
47
29
|
catch (err) {
|
|
30
|
+
if (!(err instanceof Error) && typeof err !== 'object')
|
|
31
|
+
throw err;
|
|
48
32
|
if (!isNotFoundError(err))
|
|
49
33
|
throw err;
|
|
50
|
-
|
|
34
|
+
exists = false;
|
|
51
35
|
}
|
|
52
|
-
if (!
|
|
36
|
+
if (!exists) {
|
|
53
37
|
await draft.createRow(row.tableId, row.rowId, row.data);
|
|
54
|
-
|
|
38
|
+
changes += 1;
|
|
55
39
|
}
|
|
56
40
|
}
|
|
57
|
-
if (
|
|
58
|
-
await
|
|
41
|
+
if (changes > 0) {
|
|
42
|
+
await engine.createRevision({
|
|
43
|
+
projectId: project,
|
|
44
|
+
branchName: branch,
|
|
45
|
+
comment: config.commitMessage ?? 'revo control-plane bootstrap',
|
|
46
|
+
});
|
|
47
|
+
draft.invalidate?.();
|
|
59
48
|
}
|
|
60
49
|
}
|
|
61
|
-
export async function
|
|
62
|
-
const
|
|
63
|
-
const head = await client.revision({ org, project, branch, revision: 'head' });
|
|
64
|
-
const rows = await head.getRows('playbooks', { first: 1000 });
|
|
50
|
+
export async function listInstalledPlaybooksFromTransport(head) {
|
|
51
|
+
const rows = await head.listRows('playbooks', { first: 1000 });
|
|
65
52
|
return (rows.edges ?? []).flatMap((edge) => {
|
|
66
53
|
if (!edge.node)
|
|
67
54
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/control-plane/bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/control-plane/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import pg from 'pg';
|
|
2
|
-
import {
|
|
2
|
+
import { ensureStorage, getActiveStorage } from '../storage/ensure-storage.js';
|
|
3
3
|
export const CONTROL_PLANE_CHANGE_CHANNEL = 'revo_control_plane_changes';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const PG_NOTIFY_PAYLOAD_SOFT_LIMIT_BYTES = 7000;
|
|
5
|
+
function rowRunId(table, rowId, row) {
|
|
6
|
+
if (table === 'task_runs')
|
|
7
|
+
return rowId;
|
|
8
|
+
const candidate = row.data.run_id;
|
|
9
|
+
return typeof candidate === 'string' && candidate.length > 0
|
|
10
|
+
? candidate
|
|
11
|
+
: undefined;
|
|
6
12
|
}
|
|
7
|
-
export function controlPlaneNotificationDatabaseUrl() {
|
|
8
|
-
|
|
9
|
-
if (!runtime || !isAlive(runtime.pid))
|
|
10
|
-
return null;
|
|
11
|
-
return notificationDatabaseUrl(runtime.pgPort);
|
|
13
|
+
export async function controlPlaneNotificationDatabaseUrl() {
|
|
14
|
+
return (await ensureStorage()).revoDatabaseUrl;
|
|
12
15
|
}
|
|
13
16
|
let pool = null;
|
|
14
17
|
let poolUrl = '';
|
|
@@ -20,15 +23,43 @@ function getPool(url) {
|
|
|
20
23
|
}
|
|
21
24
|
return pool;
|
|
22
25
|
}
|
|
26
|
+
export async function closeControlPlaneNotificationPool() {
|
|
27
|
+
const current = pool;
|
|
28
|
+
pool = null;
|
|
29
|
+
poolUrl = '';
|
|
30
|
+
await current?.end().catch(() => undefined);
|
|
31
|
+
}
|
|
23
32
|
export async function notifyControlPlaneChange(change) {
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
33
|
+
const storage = getActiveStorage();
|
|
34
|
+
if (!storage)
|
|
26
35
|
return;
|
|
27
|
-
const payload = JSON.stringify({ ...change, emittedAt: new Date().toISOString() });
|
|
28
36
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
const emittedAt = new Date().toISOString();
|
|
38
|
+
const runId = change.runId ??
|
|
39
|
+
(change.row
|
|
40
|
+
? rowRunId(change.table, change.rowId, change.row)
|
|
41
|
+
: undefined);
|
|
42
|
+
const fullChange = {
|
|
43
|
+
...change,
|
|
44
|
+
...(runId ? { runId } : {}),
|
|
45
|
+
emittedAt,
|
|
46
|
+
};
|
|
47
|
+
let payload = JSON.stringify(fullChange);
|
|
48
|
+
if (Buffer.byteLength(payload, 'utf8') > PG_NOTIFY_PAYLOAD_SOFT_LIMIT_BYTES) {
|
|
49
|
+
payload = JSON.stringify({
|
|
50
|
+
table: change.table,
|
|
51
|
+
action: change.action,
|
|
52
|
+
rowId: change.rowId,
|
|
53
|
+
...(runId ? { runId } : {}),
|
|
54
|
+
rowOmitted: true,
|
|
55
|
+
emittedAt,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
await getPool(storage.revoDatabaseUrl).query('SELECT pg_notify($1, $2)', [
|
|
59
|
+
CONTROL_PLANE_CHANGE_CHANNEL,
|
|
60
|
+
payload,
|
|
61
|
+
]);
|
|
32
62
|
}
|
|
63
|
+
catch { }
|
|
33
64
|
}
|
|
34
65
|
//# sourceMappingURL=change-notifications.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-notifications.js","sourceRoot":"","sources":["../../src/control-plane/change-notifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"change-notifications.js","sourceRoot":"","sources":["../../src/control-plane/change-notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,107 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { deserializeData, serializeData, serializePatches } from './json-fields.js';
|
|
3
|
-
import { createClientTransport, } from './client-transport.js';
|
|
4
|
-
import { notifyControlPlaneChange } from './change-notifications.js';
|
|
5
|
-
import { isRuntimeTable } from './tables.js';
|
|
6
|
-
function assertRuntimeTable(table) {
|
|
7
|
-
if (!isRuntimeTable(table)) {
|
|
8
|
-
throw new ControlPlaneError('VALIDATION_FAILURE', `Unsupported runtime table: ${String(table)}`, {
|
|
9
|
-
details: { table },
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
function rowPath(table, rowId) {
|
|
14
|
-
return `${table}/${rowId}`;
|
|
15
|
-
}
|
|
16
|
-
function mapRow(table, row, cursor) {
|
|
17
|
-
return {
|
|
18
|
-
rowId: row.id,
|
|
19
|
-
data: deserializeData(table, row.id, row.data ?? {}),
|
|
20
|
-
cursor,
|
|
21
|
-
readonly: row.readonly,
|
|
22
|
-
createdAt: row.createdAt,
|
|
23
|
-
updatedAt: row.updatedAt,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
export function createControlPlaneDataAccessForTransport(transport) {
|
|
27
|
-
function guardHead() {
|
|
28
|
-
if (transport.mode === 'head') {
|
|
29
|
-
throw new ControlPlaneError('VALIDATION_FAILURE', 'Writes are not allowed on head revision');
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return {
|
|
33
|
-
assertReady: () => transport.assertReady(),
|
|
34
|
-
async listRows(table, listOptions = {}) {
|
|
35
|
-
assertRuntimeTable(table);
|
|
36
|
-
const result = await transport.listRows(table, listOptions);
|
|
37
|
-
return (result.edges ?? []).map((edge) => {
|
|
38
|
-
if (!edge.node) {
|
|
39
|
-
throw new ControlPlaneError('HTTP_ERROR', `Malformed list response for ${table}`, { details: result });
|
|
40
|
-
}
|
|
41
|
-
return mapRow(table, edge.node, edge.cursor);
|
|
42
|
-
});
|
|
43
|
-
},
|
|
44
|
-
async getRow(table, rowId) {
|
|
45
|
-
assertRuntimeTable(table);
|
|
46
|
-
try {
|
|
47
|
-
return mapRow(table, await transport.getRow(table, rowId));
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
if (error instanceof ControlPlaneError && error.code === 'ROW_NOT_FOUND')
|
|
51
|
-
return null;
|
|
52
|
-
throw error;
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
async createRow(table, rowId, data) {
|
|
56
|
-
guardHead();
|
|
57
|
-
assertRuntimeTable(table);
|
|
58
|
-
const serialized = serializeData(table, rowId, data);
|
|
59
|
-
const row = mapRow(table, await transport.createRow(table, rowId, serialized));
|
|
60
|
-
await notifyControlPlaneChange({ table, action: 'create', rowId, row });
|
|
61
|
-
return row;
|
|
62
|
-
},
|
|
63
|
-
async updateRow(table, rowId, data) {
|
|
64
|
-
guardHead();
|
|
65
|
-
assertRuntimeTable(table);
|
|
66
|
-
const serialized = serializeData(table, rowId, data);
|
|
67
|
-
try {
|
|
68
|
-
const row = mapRow(table, await transport.updateRow(table, rowId, serialized));
|
|
69
|
-
await notifyControlPlaneChange({ table, action: 'update', rowId, row });
|
|
70
|
-
return row;
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
if (error instanceof ControlPlaneError && error.code === 'ROW_NOT_FOUND') {
|
|
74
|
-
throw new ControlPlaneError('ROW_NOT_FOUND', `Cannot update missing row: ${rowPath(table, rowId)}`, {
|
|
75
|
-
status: error.status,
|
|
76
|
-
details: error.details,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
throw error;
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
async patchRow(table, rowId, patches) {
|
|
83
|
-
guardHead();
|
|
84
|
-
assertRuntimeTable(table);
|
|
85
|
-
const serialized = serializePatches(table, patches);
|
|
86
|
-
try {
|
|
87
|
-
const row = mapRow(table, await transport.patchRow(table, rowId, serialized));
|
|
88
|
-
await notifyControlPlaneChange({ table, action: 'patch', rowId, row });
|
|
89
|
-
return row;
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
if (error instanceof ControlPlaneError && error.code === 'ROW_NOT_FOUND') {
|
|
93
|
-
throw new ControlPlaneError('ROW_NOT_FOUND', `Cannot patch missing row: ${rowPath(table, rowId)}`, {
|
|
94
|
-
status: error.status,
|
|
95
|
-
details: error.details,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
throw error;
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
export function createControlPlaneDataAccess(options) {
|
|
104
|
-
const mode = options?.revision ?? 'draft';
|
|
105
|
-
return createControlPlaneDataAccessForTransport(createClientTransport(mode));
|
|
106
|
-
}
|
|
1
|
+
export {};
|
|
107
2
|
//# sourceMappingURL=data-access.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-access.js","sourceRoot":"","sources":["../../src/control-plane/data-access.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data-access.js","sourceRoot":"","sources":["../../src/control-plane/data-access.ts"],"names":[],"mappings":""}
|