mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-20 16:07:11 +08:00
225 lines
7.6 KiB
TypeScript
225 lines
7.6 KiB
TypeScript
import { definePostgresSqlMigration } from './sqlMigration';
|
|
|
|
export const POSTGRESQL_RUN_TABLE = 'runs';
|
|
export const POSTGRESQL_RUN_ATTEMPT_TABLE = 'run_attempts';
|
|
export const POSTGRESQL_RUN_EVENT_TABLE = 'run_events';
|
|
|
|
export const pg0002RunCoreMigration = definePostgresSqlMigration({
|
|
id: 'pg-0002-run-core',
|
|
statements: [
|
|
`
|
|
CREATE TABLE "ql3"."${POSTGRESQL_RUN_TABLE}" (
|
|
id varchar(36) PRIMARY KEY,
|
|
project_id varchar(128) NOT NULL,
|
|
task_id varchar(255) NOT NULL,
|
|
task_revision varchar(128) NOT NULL,
|
|
task_name varchar(255),
|
|
task_snapshot_ref varchar(512),
|
|
parent_run_id varchar(36),
|
|
retry_of_run_id varchar(36),
|
|
trigger_id varchar(36),
|
|
trigger_type varchar(64) NOT NULL,
|
|
execution_origin varchar(64) NOT NULL,
|
|
execution_owner varchar(16) NOT NULL
|
|
CONSTRAINT ql3_runs_execution_owner_check
|
|
CHECK (execution_owner = 'runtime'),
|
|
triggered_by varchar(255),
|
|
request_id varchar(128),
|
|
scheduled_for_ms bigint
|
|
CONSTRAINT ql3_runs_scheduled_for_check
|
|
CHECK (scheduled_for_ms IS NULL OR scheduled_for_ms >= 0),
|
|
status varchar(32) NOT NULL
|
|
CONSTRAINT ql3_runs_status_check
|
|
CHECK (status IN (
|
|
'created', 'queued', 'dispatching', 'running', 'waiting_approval',
|
|
'retry_wait', 'lost', 'succeeded', 'failed', 'cancelled', 'timed_out'
|
|
)),
|
|
version integer NOT NULL DEFAULT 0
|
|
CONSTRAINT ql3_runs_version_check
|
|
CHECK (version >= 0),
|
|
event_sequence integer NOT NULL DEFAULT 0
|
|
CONSTRAINT ql3_runs_event_sequence_check
|
|
CHECK (event_sequence >= 0),
|
|
priority integer NOT NULL DEFAULT 0,
|
|
idempotency_key varchar(255),
|
|
input_ref varchar(512),
|
|
output_ref varchar(512),
|
|
created_at_ms bigint NOT NULL
|
|
CONSTRAINT ql3_runs_created_at_check
|
|
CHECK (created_at_ms >= 0),
|
|
queued_at_ms bigint
|
|
CONSTRAINT ql3_runs_queued_at_check
|
|
CHECK (queued_at_ms IS NULL OR queued_at_ms >= 0),
|
|
started_at_ms bigint
|
|
CONSTRAINT ql3_runs_started_at_check
|
|
CHECK (started_at_ms IS NULL OR started_at_ms >= 0),
|
|
finished_at_ms bigint
|
|
CONSTRAINT ql3_runs_finished_at_check
|
|
CHECK (finished_at_ms IS NULL OR finished_at_ms >= 0),
|
|
cancel_requested_at_ms bigint
|
|
CONSTRAINT ql3_runs_cancel_requested_at_check
|
|
CHECK (cancel_requested_at_ms IS NULL OR cancel_requested_at_ms >= 0),
|
|
cancel_reason varchar(16)
|
|
CONSTRAINT ql3_runs_cancel_reason_check
|
|
CHECK (cancel_reason IS NULL OR cancel_reason IN (
|
|
'user', 'policy', 'shutdown', 'reconcile', 'timeout'
|
|
)),
|
|
error_code varchar(128),
|
|
error_summary varchar(1024),
|
|
CONSTRAINT ql3_runs_parent_fk
|
|
FOREIGN KEY (parent_run_id) REFERENCES "ql3"."${POSTGRESQL_RUN_TABLE}" (id),
|
|
CONSTRAINT ql3_runs_retry_of_fk
|
|
FOREIGN KEY (retry_of_run_id) REFERENCES "ql3"."${POSTGRESQL_RUN_TABLE}" (id)
|
|
)
|
|
`.trim(),
|
|
`
|
|
CREATE UNIQUE INDEX ql3_runs_project_idempotency_uidx
|
|
ON "ql3"."${POSTGRESQL_RUN_TABLE}" (project_id, idempotency_key)
|
|
WHERE idempotency_key IS NOT NULL
|
|
`.trim(),
|
|
`
|
|
CREATE INDEX ql3_runs_project_created_idx
|
|
ON "ql3"."${POSTGRESQL_RUN_TABLE}" (project_id, created_at_ms, id)
|
|
`.trim(),
|
|
`
|
|
CREATE INDEX ql3_runs_task_created_idx
|
|
ON "ql3"."${POSTGRESQL_RUN_TABLE}" (task_id, created_at_ms, id)
|
|
`.trim(),
|
|
`
|
|
CREATE INDEX ql3_runs_dispatch_candidates_idx
|
|
ON "ql3"."${POSTGRESQL_RUN_TABLE}" (priority DESC, queued_at_ms, id)
|
|
WHERE execution_owner = 'runtime'
|
|
AND status IN ('queued', 'dispatching')
|
|
AND cancel_requested_at_ms IS NULL
|
|
AND queued_at_ms IS NOT NULL
|
|
`.trim(),
|
|
`
|
|
CREATE TABLE "ql3"."${POSTGRESQL_RUN_ATTEMPT_TABLE}" (
|
|
id varchar(36) PRIMARY KEY,
|
|
run_id varchar(36) NOT NULL,
|
|
step_run_id varchar(36),
|
|
attempt integer NOT NULL
|
|
CONSTRAINT ql3_run_attempts_attempt_check
|
|
CHECK (attempt >= 1),
|
|
status varchar(32) NOT NULL
|
|
CONSTRAINT ql3_run_attempts_status_check
|
|
CHECK (status IN (
|
|
'claimed', 'starting', 'running', 'succeeded', 'failed',
|
|
'cancelled', 'timed_out', 'lost'
|
|
)),
|
|
executor_type varchar(64) NOT NULL,
|
|
worker_id varchar(128),
|
|
executor_handle varchar(2048),
|
|
pid integer
|
|
CONSTRAINT ql3_run_attempts_pid_check
|
|
CHECK (pid IS NULL OR pid >= 1),
|
|
log_artifact_id varchar(36),
|
|
lease_token varchar(128),
|
|
lease_expires_at_ms bigint
|
|
CONSTRAINT ql3_run_attempts_lease_expiry_check
|
|
CHECK (lease_expires_at_ms IS NULL OR lease_expires_at_ms >= 0),
|
|
deadline_at_ms bigint
|
|
CONSTRAINT ql3_run_attempts_deadline_check
|
|
CHECK (deadline_at_ms IS NULL OR deadline_at_ms >= 0),
|
|
callback_token_hash varchar(128),
|
|
callback_sequence integer NOT NULL DEFAULT 0
|
|
CONSTRAINT ql3_run_attempts_callback_sequence_check
|
|
CHECK (callback_sequence >= 0),
|
|
created_at_ms bigint NOT NULL
|
|
CONSTRAINT ql3_run_attempts_created_at_check
|
|
CHECK (created_at_ms >= 0),
|
|
started_at_ms bigint
|
|
CONSTRAINT ql3_run_attempts_started_at_check
|
|
CHECK (started_at_ms IS NULL OR started_at_ms >= 0),
|
|
finished_at_ms bigint
|
|
CONSTRAINT ql3_run_attempts_finished_at_check
|
|
CHECK (finished_at_ms IS NULL OR finished_at_ms >= 0),
|
|
exit_code integer,
|
|
error_code varchar(128),
|
|
error_summary varchar(1024),
|
|
CONSTRAINT ql3_run_attempts_run_fk
|
|
FOREIGN KEY (run_id) REFERENCES "ql3"."${POSTGRESQL_RUN_TABLE}" (id)
|
|
)
|
|
`.trim(),
|
|
`
|
|
CREATE UNIQUE INDEX ql3_run_attempts_run_attempt_uidx
|
|
ON "ql3"."${POSTGRESQL_RUN_ATTEMPT_TABLE}" (run_id, attempt)
|
|
`.trim(),
|
|
`
|
|
CREATE INDEX ql3_run_attempts_dispatch_candidates_idx
|
|
ON "ql3"."${POSTGRESQL_RUN_ATTEMPT_TABLE}" (status, run_id, created_at_ms, id)
|
|
`.trim(),
|
|
`
|
|
CREATE INDEX ql3_run_attempts_lease_idx
|
|
ON "ql3"."${POSTGRESQL_RUN_ATTEMPT_TABLE}" (lease_expires_at_ms, id)
|
|
WHERE lease_expires_at_ms IS NOT NULL
|
|
`.trim(),
|
|
`
|
|
CREATE TABLE "ql3"."${POSTGRESQL_RUN_EVENT_TABLE}" (
|
|
id varchar(36) PRIMARY KEY,
|
|
run_id varchar(36) NOT NULL,
|
|
sequence integer NOT NULL
|
|
CONSTRAINT ql3_run_events_sequence_check
|
|
CHECK (sequence >= 1),
|
|
type varchar(128) NOT NULL,
|
|
dedupe_key varchar(255),
|
|
actor_type varchar(64) NOT NULL
|
|
CONSTRAINT ql3_run_events_actor_type_check
|
|
CHECK (actor_type IN (
|
|
'user', 'api_app', 'trigger', 'agent', 'mcp_client', 'worker',
|
|
'executor', 'system', 'legacy_shell', 'scheduler', 'reconciler',
|
|
'compatibility'
|
|
)),
|
|
actor_id varchar(255),
|
|
attempt_id varchar(36),
|
|
step_run_id varchar(36),
|
|
payload jsonb NOT NULL
|
|
CONSTRAINT ql3_run_events_payload_check
|
|
CHECK (jsonb_typeof(payload) = 'object'),
|
|
created_at_ms bigint NOT NULL
|
|
CONSTRAINT ql3_run_events_created_at_check
|
|
CHECK (created_at_ms >= 0),
|
|
CONSTRAINT ql3_run_events_run_fk
|
|
FOREIGN KEY (run_id) REFERENCES "ql3"."${POSTGRESQL_RUN_TABLE}" (id),
|
|
CONSTRAINT ql3_run_events_attempt_fk
|
|
FOREIGN KEY (attempt_id) REFERENCES "ql3"."${POSTGRESQL_RUN_ATTEMPT_TABLE}" (id)
|
|
)
|
|
`.trim(),
|
|
`
|
|
CREATE UNIQUE INDEX ql3_run_events_run_sequence_uidx
|
|
ON "ql3"."${POSTGRESQL_RUN_EVENT_TABLE}" (run_id, sequence)
|
|
`.trim(),
|
|
`
|
|
CREATE UNIQUE INDEX ql3_run_events_run_dedupe_uidx
|
|
ON "ql3"."${POSTGRESQL_RUN_EVENT_TABLE}" (run_id, dedupe_key)
|
|
WHERE dedupe_key IS NOT NULL
|
|
`.trim(),
|
|
`
|
|
CREATE INDEX ql3_run_events_run_created_idx
|
|
ON "ql3"."${POSTGRESQL_RUN_EVENT_TABLE}" (run_id, created_at_ms, id)
|
|
`.trim(),
|
|
`
|
|
INSERT INTO "ql3"."schema_capabilities" (
|
|
contract_name,
|
|
contract_version,
|
|
migration_id,
|
|
capabilities,
|
|
updated_at_ms
|
|
)
|
|
VALUES (
|
|
'control-core',
|
|
1,
|
|
'pg-0002-run-core',
|
|
'{"run_core":1}'::jsonb,
|
|
floor(extract(epoch FROM transaction_timestamp()) * 1000)::bigint
|
|
)
|
|
ON CONFLICT (contract_name) DO UPDATE
|
|
SET contract_version = EXCLUDED.contract_version,
|
|
migration_id = EXCLUDED.migration_id,
|
|
capabilities = EXCLUDED.capabilities,
|
|
updated_at_ms = EXCLUDED.updated_at_ms
|
|
WHERE "schema_capabilities".contract_version < EXCLUDED.contract_version
|
|
`.trim(),
|
|
],
|
|
});
|