@proofhound/db 0.1.6
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/LICENSE +190 -0
- package/dist/clean-test-residue.d.ts +2 -0
- package/dist/clean-test-residue.d.ts.map +1 -0
- package/dist/clean-test-residue.js +59 -0
- package/dist/clean-test-residue.js.map +1 -0
- package/dist/client.d.ts +5 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +87 -0
- package/dist/client.js.map +1 -0
- package/dist/ensure-e2e-database.d.ts +2 -0
- package/dist/ensure-e2e-database.d.ts.map +1 -0
- package/dist/ensure-e2e-database.js +87 -0
- package/dist/ensure-e2e-database.js.map +1 -0
- package/dist/fixtures/dev/connectors.d.ts +72 -0
- package/dist/fixtures/dev/connectors.d.ts.map +1 -0
- package/dist/fixtures/dev/connectors.js +90 -0
- package/dist/fixtures/dev/connectors.js.map +1 -0
- package/dist/fixtures/dev/experiments.d.ts +48 -0
- package/dist/fixtures/dev/experiments.d.ts.map +1 -0
- package/dist/fixtures/dev/experiments.js +1168 -0
- package/dist/fixtures/dev/experiments.js.map +1 -0
- package/dist/fixtures/dev/models.d.ts +20 -0
- package/dist/fixtures/dev/models.d.ts.map +1 -0
- package/dist/fixtures/dev/models.js +60 -0
- package/dist/fixtures/dev/models.js.map +1 -0
- package/dist/fixtures/dev/optimizations.d.ts +62 -0
- package/dist/fixtures/dev/optimizations.d.ts.map +1 -0
- package/dist/fixtures/dev/optimizations.js +124 -0
- package/dist/fixtures/dev/optimizations.js.map +1 -0
- package/dist/fixtures/dev/prompts.d.ts +31 -0
- package/dist/fixtures/dev/prompts.d.ts.map +1 -0
- package/dist/fixtures/dev/prompts.js +115 -0
- package/dist/fixtures/dev/prompts.js.map +1 -0
- package/dist/fixtures/dev/tokens.d.ts +10 -0
- package/dist/fixtures/dev/tokens.d.ts.map +1 -0
- package/dist/fixtures/dev/tokens.js +28 -0
- package/dist/fixtures/dev/tokens.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/migrate.d.ts +2 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +34 -0
- package/dist/migrate.js.map +1 -0
- package/dist/migrations/0000_woozy_thunderbolt.sql +688 -0
- package/dist/migrations/0001_webhook_token_scope.sql +28 -0
- package/dist/migrations/0002_tokens_table_unify_scope.sql +50 -0
- package/dist/migrations/0003_models_auto_concurrency.sql +4 -0
- package/dist/migrations/0004_webhook_token_attribution.sql +4 -0
- package/dist/migrations/0005_same_thor_girl.sql +34 -0
- package/dist/reset.d.ts +2 -0
- package/dist/reset.d.ts.map +1 -0
- package/dist/reset.js +78 -0
- package/dist/reset.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +23 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/ph_assets/index.d.ts +2012 -0
- package/dist/schema/ph_assets/index.d.ts.map +1 -0
- package/dist/schema/ph_assets/index.js +272 -0
- package/dist/schema/ph_assets/index.js.map +1 -0
- package/dist/schema/ph_core/index.d.ts +424 -0
- package/dist/schema/ph_core/index.d.ts.map +1 -0
- package/dist/schema/ph_core/index.js +69 -0
- package/dist/schema/ph_core/index.js.map +1 -0
- package/dist/schema/ph_releases/_schema.d.ts +2 -0
- package/dist/schema/ph_releases/_schema.d.ts.map +1 -0
- package/dist/schema/ph_releases/_schema.js +8 -0
- package/dist/schema/ph_releases/_schema.js.map +1 -0
- package/dist/schema/ph_releases/annotation-tasks.d.ts +263 -0
- package/dist/schema/ph_releases/annotation-tasks.d.ts.map +1 -0
- package/dist/schema/ph_releases/annotation-tasks.js +38 -0
- package/dist/schema/ph_releases/annotation-tasks.js.map +1 -0
- package/dist/schema/ph_releases/canary-releases.d.ts +672 -0
- package/dist/schema/ph_releases/canary-releases.d.ts.map +1 -0
- package/dist/schema/ph_releases/canary-releases.js +91 -0
- package/dist/schema/ph_releases/canary-releases.js.map +1 -0
- package/dist/schema/ph_releases/index.d.ts +6 -0
- package/dist/schema/ph_releases/index.d.ts.map +1 -0
- package/dist/schema/ph_releases/index.js +24 -0
- package/dist/schema/ph_releases/index.js.map +1 -0
- package/dist/schema/ph_releases/production-release-events.d.ts +527 -0
- package/dist/schema/ph_releases/production-release-events.d.ts.map +1 -0
- package/dist/schema/ph_releases/production-release-events.js +86 -0
- package/dist/schema/ph_releases/production-release-events.js.map +1 -0
- package/dist/schema/ph_releases/release-lines.d.ts +1442 -0
- package/dist/schema/ph_releases/release-lines.d.ts.map +1 -0
- package/dist/schema/ph_releases/release-lines.js +203 -0
- package/dist/schema/ph_releases/release-lines.js.map +1 -0
- package/dist/schema/ph_runs/_schema.d.ts +2 -0
- package/dist/schema/ph_runs/_schema.d.ts.map +1 -0
- package/dist/schema/ph_runs/_schema.js +6 -0
- package/dist/schema/ph_runs/_schema.js.map +1 -0
- package/dist/schema/ph_runs/experiments.d.ts +984 -0
- package/dist/schema/ph_runs/experiments.d.ts.map +1 -0
- package/dist/schema/ph_runs/experiments.js +134 -0
- package/dist/schema/ph_runs/experiments.js.map +1 -0
- package/dist/schema/ph_runs/index.d.ts +1027 -0
- package/dist/schema/ph_runs/index.d.ts.map +1 -0
- package/dist/schema/ph_runs/index.js +135 -0
- package/dist/schema/ph_runs/index.js.map +1 -0
- package/dist/seed-dev.d.ts +2 -0
- package/dist/seed-dev.d.ts.map +1 -0
- package/dist/seed-dev.js +605 -0
- package/dist/seed-dev.js.map +1 -0
- package/dist/seed.d.ts +2 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +13 -0
- package/dist/seed.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ph_releases.production_release_events — production release event stream
|
|
3
|
+
// See docs/specs/06-database-schema.md §6.3 and docs/specs/27-releases.md
|
|
4
|
+
// Event-sourced: new release / config change / rollback / force-stop are each one record; commit means running, no approval step.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.productionReleaseEvents = void 0;
|
|
7
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
8
|
+
const pg_core_1 = require("drizzle-orm/pg-core");
|
|
9
|
+
const index_1 = require("../ph_assets/index");
|
|
10
|
+
const index_2 = require("../ph_core/index");
|
|
11
|
+
const experiments_1 = require("../ph_runs/experiments");
|
|
12
|
+
const canary_releases_1 = require("./canary-releases");
|
|
13
|
+
const _schema_1 = require("./_schema");
|
|
14
|
+
exports.productionReleaseEvents = _schema_1.phReleases.table('production_release_events', {
|
|
15
|
+
id: (0, pg_core_1.uuid)('id')
|
|
16
|
+
.primaryKey()
|
|
17
|
+
.default((0, drizzle_orm_1.sql) `gen_random_uuid()`),
|
|
18
|
+
projectId: (0, pg_core_1.uuid)('project_id')
|
|
19
|
+
.notNull()
|
|
20
|
+
.references(() => index_2.projects.id, { onDelete: 'cascade' }),
|
|
21
|
+
promptId: (0, pg_core_1.uuid)('prompt_id').notNull(),
|
|
22
|
+
eventType: (0, pg_core_1.text)('event_type').notNull(),
|
|
23
|
+
// Target config snapshot
|
|
24
|
+
promptVersionId: (0, pg_core_1.uuid)('prompt_version_id').notNull(),
|
|
25
|
+
modelId: (0, pg_core_1.uuid)('model_id')
|
|
26
|
+
.notNull()
|
|
27
|
+
.references(() => index_1.models.id),
|
|
28
|
+
// force_stop may keep the original upstream snapshot; legacy data is also allowed to be empty ("no backfill after takedown" semantics)
|
|
29
|
+
inputConnectorId: (0, pg_core_1.uuid)('input_connector_id').references(() => index_1.connectors.id),
|
|
30
|
+
outputConnectorIds: (0, pg_core_1.uuid)('output_connector_ids')
|
|
31
|
+
.array()
|
|
32
|
+
.notNull()
|
|
33
|
+
.default((0, drizzle_orm_1.sql) `ARRAY[]::uuid[]`),
|
|
34
|
+
runConfig: (0, pg_core_1.jsonb)('run_config').notNull(),
|
|
35
|
+
variableMapping: (0, pg_core_1.jsonb)('variable_mapping')
|
|
36
|
+
.notNull()
|
|
37
|
+
.default((0, drizzle_orm_1.sql) `'{}'::jsonb`),
|
|
38
|
+
filterRules: (0, pg_core_1.jsonb)('filter_rules'),
|
|
39
|
+
recordMode: (0, pg_core_1.text)('record_mode').notNull().default('all'),
|
|
40
|
+
externalIdField: (0, pg_core_1.text)('external_id_field'),
|
|
41
|
+
retentionDays: (0, pg_core_1.integer)('retention_days'),
|
|
42
|
+
// State machine
|
|
43
|
+
status: (0, pg_core_1.text)('status').notNull().default('running'),
|
|
44
|
+
createdBy: (0, pg_core_1.uuid)('created_by').notNull(),
|
|
45
|
+
submitReason: (0, pg_core_1.text)('submit_reason').notNull(),
|
|
46
|
+
// Source snapshot
|
|
47
|
+
sourceExperimentId: (0, pg_core_1.uuid)('source_experiment_id').references(() => experiments_1.experiments.id),
|
|
48
|
+
sourceCanaryId: (0, pg_core_1.uuid)('source_canary_id').references(() => canary_releases_1.canaryReleases.id),
|
|
49
|
+
sourceMetricsSnapshot: (0, pg_core_1.jsonb)('source_metrics_snapshot'),
|
|
50
|
+
promptSnapshot: (0, pg_core_1.jsonb)('prompt_snapshot')
|
|
51
|
+
.notNull()
|
|
52
|
+
.default((0, drizzle_orm_1.sql) `'{}'::jsonb`),
|
|
53
|
+
promptVersionSnapshot: (0, pg_core_1.jsonb)('prompt_version_snapshot')
|
|
54
|
+
.notNull()
|
|
55
|
+
.default((0, drizzle_orm_1.sql) `'{}'::jsonb`),
|
|
56
|
+
// Rollback target (self-reference)
|
|
57
|
+
rollbackTargetEventId: (0, pg_core_1.uuid)('rollback_target_event_id').references(() => exports.productionReleaseEvents.id),
|
|
58
|
+
// Runtime
|
|
59
|
+
controlState: (0, pg_core_1.text)('control_state'),
|
|
60
|
+
startedAt: (0, pg_core_1.timestamp)('started_at', { withTimezone: true }),
|
|
61
|
+
finishedAt: (0, pg_core_1.timestamp)('finished_at', { withTimezone: true }),
|
|
62
|
+
stopReason: (0, pg_core_1.text)('stop_reason'),
|
|
63
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).notNull().defaultNow(),
|
|
64
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
|
65
|
+
}, (t) => [
|
|
66
|
+
(0, pg_core_1.check)('production_release_events_event_type_check', (0, drizzle_orm_1.sql) `${t.eventType} IN ('from_prompt', 'from_experiment', 'from_canary', 'config_change', 'rollback', 'force_stop')`),
|
|
67
|
+
(0, pg_core_1.check)('production_release_events_record_mode_check', (0, drizzle_orm_1.sql) `${t.recordMode} IN ('all', 'correct_only')`),
|
|
68
|
+
(0, pg_core_1.check)('production_release_events_status_check', (0, drizzle_orm_1.sql) `${t.status} IN ('running', 'success', 'failed', 'stopped')`),
|
|
69
|
+
(0, pg_core_1.check)('production_release_events_control_state_check', (0, drizzle_orm_1.sql) `${t.controlState} IN ('stop', 'resume', 'cancel') OR ${t.controlState} IS NULL`),
|
|
70
|
+
(0, pg_core_1.check)('production_release_events_stop_reason_check', (0, drizzle_orm_1.sql) `${t.stopReason} IN ('replaced', 'rolled_back', 'force_stopped', 'error') OR ${t.stopReason} IS NULL`),
|
|
71
|
+
(0, pg_core_1.check)('production_release_events_source_experiment_required', (0, drizzle_orm_1.sql) `${t.eventType} <> 'from_experiment' OR ${t.sourceExperimentId} IS NOT NULL`),
|
|
72
|
+
(0, pg_core_1.check)('production_release_events_source_canary_required', (0, drizzle_orm_1.sql) `${t.eventType} <> 'from_canary' OR ${t.sourceCanaryId} IS NOT NULL`),
|
|
73
|
+
(0, pg_core_1.check)('production_release_events_rollback_target_required', (0, drizzle_orm_1.sql) `${t.eventType} <> 'rollback' OR ${t.rollbackTargetEventId} IS NOT NULL`),
|
|
74
|
+
// At most one running per prompt at any time
|
|
75
|
+
(0, pg_core_1.uniqueIndex)('uniq_running_release_per_prompt')
|
|
76
|
+
.on(t.promptId)
|
|
77
|
+
.where((0, drizzle_orm_1.sql) `${t.status} = 'running'`),
|
|
78
|
+
// At most one running occupancy per input connector at any time
|
|
79
|
+
(0, pg_core_1.uniqueIndex)('uniq_running_release_per_input_connector')
|
|
80
|
+
.on(t.inputConnectorId)
|
|
81
|
+
.where((0, drizzle_orm_1.sql) `${t.status} = 'running' AND ${t.inputConnectorId} IS NOT NULL`),
|
|
82
|
+
// List / history queries
|
|
83
|
+
(0, pg_core_1.index)('idx_release_events_status_created').on(t.projectId, t.status, t.createdAt),
|
|
84
|
+
(0, pg_core_1.index)('idx_release_events_prompt_created').on(t.projectId, t.promptId, t.createdAt),
|
|
85
|
+
]);
|
|
86
|
+
//# sourceMappingURL=production-release-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"production-release-events.js","sourceRoot":"","sources":["../../../src/schema/ph_releases/production-release-events.ts"],"names":[],"mappings":"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"}
|