@vouched-dev/schema 0.1.0

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 (53) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +12 -0
  3. package/dist/agent-id.d.ts +13 -0
  4. package/dist/agent-id.js +29 -0
  5. package/dist/api.d.ts +475 -0
  6. package/dist/api.js +260 -0
  7. package/dist/base64url.d.ts +4 -0
  8. package/dist/base64url.js +43 -0
  9. package/dist/credential.d.ts +85 -0
  10. package/dist/credential.js +67 -0
  11. package/dist/db/agents.d.ts +128 -0
  12. package/dist/db/agents.js +31 -0
  13. package/dist/db/client.d.ts +1443 -0
  14. package/dist/db/client.js +28 -0
  15. package/dist/db/credentials.d.ts +143 -0
  16. package/dist/db/credentials.js +16 -0
  17. package/dist/db/events.d.ts +160 -0
  18. package/dist/db/events.js +23 -0
  19. package/dist/db/feed-items.d.ts +109 -0
  20. package/dist/db/feed-items.js +16 -0
  21. package/dist/db/index.d.ts +43 -0
  22. package/dist/db/index.js +17 -0
  23. package/dist/db/migrate.d.ts +1 -0
  24. package/dist/db/migrate.js +30 -0
  25. package/dist/db/migrator.d.ts +2 -0
  26. package/dist/db/migrator.js +20 -0
  27. package/dist/db/operators.d.ts +109 -0
  28. package/dist/db/operators.js +11 -0
  29. package/dist/db/quota-counters.d.ts +92 -0
  30. package/dist/db/quota-counters.js +11 -0
  31. package/dist/db/ratings.d.ts +160 -0
  32. package/dist/db/ratings.js +27 -0
  33. package/dist/db/scores.d.ts +160 -0
  34. package/dist/db/scores.js +15 -0
  35. package/dist/db/task-outcomes.d.ts +126 -0
  36. package/dist/db/task-outcomes.js +18 -0
  37. package/dist/db/tasks.d.ts +251 -0
  38. package/dist/db/tasks.js +26 -0
  39. package/dist/db/timestamps.d.ts +4 -0
  40. package/dist/db/timestamps.js +24 -0
  41. package/dist/db/url.d.ts +12 -0
  42. package/dist/db/url.js +25 -0
  43. package/dist/dimensions.d.ts +20 -0
  44. package/dist/dimensions.js +11 -0
  45. package/dist/envelope.d.ts +16 -0
  46. package/dist/envelope.js +70 -0
  47. package/dist/events.d.ts +153 -0
  48. package/dist/events.js +96 -0
  49. package/dist/index.d.ts +9 -0
  50. package/dist/index.js +9 -0
  51. package/dist/tasks.d.ts +46 -0
  52. package/dist/tasks.js +41 -0
  53. package/package.json +52 -0
@@ -0,0 +1,28 @@
1
+ import { drizzle } from 'drizzle-orm/postgres-js';
2
+ import postgres from 'postgres';
3
+ import { agents } from './agents.js';
4
+ import { credentials } from './credentials.js';
5
+ import { events } from './events.js';
6
+ import { feedItems } from './feed-items.js';
7
+ import { operators } from './operators.js';
8
+ import { quotaCounters } from './quota-counters.js';
9
+ import { ratings } from './ratings.js';
10
+ import { scores } from './scores.js';
11
+ import { taskOutcomes } from './task-outcomes.js';
12
+ import { tasks } from './tasks.js';
13
+ import { pgArgs } from './url.js';
14
+ const schema = {
15
+ operators,
16
+ agents,
17
+ events,
18
+ tasks,
19
+ taskOutcomes,
20
+ ratings,
21
+ credentials,
22
+ scores,
23
+ quotaCounters,
24
+ feedItems,
25
+ };
26
+ export function createDb(url) {
27
+ return drizzle(postgres(...pgArgs(url)), { schema });
28
+ }
@@ -0,0 +1,143 @@
1
+ export declare const credentials: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
+ name: "credentials";
3
+ schema: undefined;
4
+ columns: {
5
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
6
+ name: "created_at";
7
+ tableName: "credentials";
8
+ dataType: "date";
9
+ columnType: "PgTimestamp";
10
+ data: Date;
11
+ driverParam: string;
12
+ notNull: true;
13
+ hasDefault: true;
14
+ isPrimaryKey: false;
15
+ isAutoincrement: false;
16
+ hasRuntimeDefault: false;
17
+ enumValues: undefined;
18
+ baseColumn: never;
19
+ identity: undefined;
20
+ generated: undefined;
21
+ }, {}, {}>;
22
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
23
+ name: "updated_at";
24
+ tableName: "credentials";
25
+ dataType: "date";
26
+ columnType: "PgTimestamp";
27
+ data: Date;
28
+ driverParam: string;
29
+ notNull: true;
30
+ hasDefault: true;
31
+ isPrimaryKey: false;
32
+ isAutoincrement: false;
33
+ hasRuntimeDefault: false;
34
+ enumValues: undefined;
35
+ baseColumn: never;
36
+ identity: undefined;
37
+ generated: undefined;
38
+ }, {}, {}>;
39
+ id: import("drizzle-orm/pg-core").PgColumn<{
40
+ name: "id";
41
+ tableName: "credentials";
42
+ dataType: "string";
43
+ columnType: "PgUUID";
44
+ data: string;
45
+ driverParam: string;
46
+ notNull: true;
47
+ hasDefault: false;
48
+ isPrimaryKey: true;
49
+ isAutoincrement: false;
50
+ hasRuntimeDefault: false;
51
+ enumValues: undefined;
52
+ baseColumn: never;
53
+ identity: undefined;
54
+ generated: undefined;
55
+ }, {}, {}>;
56
+ agentId: import("drizzle-orm/pg-core").PgColumn<{
57
+ name: "agent_id";
58
+ tableName: "credentials";
59
+ dataType: "string";
60
+ columnType: "PgText";
61
+ data: string;
62
+ driverParam: string;
63
+ notNull: true;
64
+ hasDefault: false;
65
+ isPrimaryKey: false;
66
+ isAutoincrement: false;
67
+ hasRuntimeDefault: false;
68
+ enumValues: [string, ...string[]];
69
+ baseColumn: never;
70
+ identity: undefined;
71
+ generated: undefined;
72
+ }, {}, {}>;
73
+ kid: import("drizzle-orm/pg-core").PgColumn<{
74
+ name: "kid";
75
+ tableName: "credentials";
76
+ dataType: "string";
77
+ columnType: "PgText";
78
+ data: string;
79
+ driverParam: string;
80
+ notNull: true;
81
+ hasDefault: false;
82
+ isPrimaryKey: false;
83
+ isAutoincrement: false;
84
+ hasRuntimeDefault: false;
85
+ enumValues: [string, ...string[]];
86
+ baseColumn: never;
87
+ identity: undefined;
88
+ generated: undefined;
89
+ }, {}, {}>;
90
+ jws: import("drizzle-orm/pg-core").PgColumn<{
91
+ name: "jws";
92
+ tableName: "credentials";
93
+ dataType: "string";
94
+ columnType: "PgText";
95
+ data: string;
96
+ driverParam: string;
97
+ notNull: true;
98
+ hasDefault: false;
99
+ isPrimaryKey: false;
100
+ isAutoincrement: false;
101
+ hasRuntimeDefault: false;
102
+ enumValues: [string, ...string[]];
103
+ baseColumn: never;
104
+ identity: undefined;
105
+ generated: undefined;
106
+ }, {}, {}>;
107
+ issuedAt: import("drizzle-orm/pg-core").PgColumn<{
108
+ name: "issued_at";
109
+ tableName: "credentials";
110
+ dataType: "date";
111
+ columnType: "PgTimestamp";
112
+ data: Date;
113
+ driverParam: string;
114
+ notNull: true;
115
+ hasDefault: false;
116
+ isPrimaryKey: false;
117
+ isAutoincrement: false;
118
+ hasRuntimeDefault: false;
119
+ enumValues: undefined;
120
+ baseColumn: never;
121
+ identity: undefined;
122
+ generated: undefined;
123
+ }, {}, {}>;
124
+ expiresAt: import("drizzle-orm/pg-core").PgColumn<{
125
+ name: "expires_at";
126
+ tableName: "credentials";
127
+ dataType: "date";
128
+ columnType: "PgTimestamp";
129
+ data: Date;
130
+ driverParam: string;
131
+ notNull: true;
132
+ hasDefault: false;
133
+ isPrimaryKey: false;
134
+ isAutoincrement: false;
135
+ hasRuntimeDefault: false;
136
+ enumValues: undefined;
137
+ baseColumn: never;
138
+ identity: undefined;
139
+ generated: undefined;
140
+ }, {}, {}>;
141
+ };
142
+ dialect: 'pg';
143
+ }>;
@@ -0,0 +1,16 @@
1
+ import { index, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core';
2
+ import { agents } from './agents.js';
3
+ import { timestamps } from './timestamps.js';
4
+ export const credentials = pgTable('credentials', {
5
+ id: uuid('id').primaryKey(),
6
+ agentId: text('agent_id')
7
+ .notNull()
8
+ .references(() => agents.id),
9
+ kid: text('kid').notNull(),
10
+ jws: text('jws').notNull(),
11
+ issuedAt: timestamp('issued_at', { withTimezone: true }).notNull(),
12
+ expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(),
13
+ ...timestamps,
14
+ }, (t) => [
15
+ index('credentials_agent_id_expires_at_idx').on(t.agentId, t.expiresAt),
16
+ ]);
@@ -0,0 +1,160 @@
1
+ export declare const events: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
+ name: "events";
3
+ schema: undefined;
4
+ columns: {
5
+ id: import("drizzle-orm/pg-core").PgColumn<{
6
+ name: "id";
7
+ tableName: "events";
8
+ dataType: "number";
9
+ columnType: "PgBigInt53";
10
+ data: number;
11
+ driverParam: string | number;
12
+ notNull: true;
13
+ hasDefault: true;
14
+ isPrimaryKey: true;
15
+ isAutoincrement: false;
16
+ hasRuntimeDefault: false;
17
+ enumValues: undefined;
18
+ baseColumn: never;
19
+ identity: "always";
20
+ generated: undefined;
21
+ }, {}, {}>;
22
+ agentId: import("drizzle-orm/pg-core").PgColumn<{
23
+ name: "agent_id";
24
+ tableName: "events";
25
+ dataType: "string";
26
+ columnType: "PgText";
27
+ data: string;
28
+ driverParam: string;
29
+ notNull: true;
30
+ hasDefault: false;
31
+ isPrimaryKey: false;
32
+ isAutoincrement: false;
33
+ hasRuntimeDefault: false;
34
+ enumValues: [string, ...string[]];
35
+ baseColumn: never;
36
+ identity: undefined;
37
+ generated: undefined;
38
+ }, {}, {}>;
39
+ eventId: import("drizzle-orm/pg-core").PgColumn<{
40
+ name: "event_id";
41
+ tableName: "events";
42
+ dataType: "string";
43
+ columnType: "PgUUID";
44
+ data: string;
45
+ driverParam: string;
46
+ notNull: true;
47
+ hasDefault: false;
48
+ isPrimaryKey: false;
49
+ isAutoincrement: false;
50
+ hasRuntimeDefault: false;
51
+ enumValues: undefined;
52
+ baseColumn: never;
53
+ identity: undefined;
54
+ generated: undefined;
55
+ }, {}, {}>;
56
+ type: import("drizzle-orm/pg-core").PgColumn<{
57
+ name: "type";
58
+ tableName: "events";
59
+ dataType: "string";
60
+ columnType: "PgText";
61
+ data: string;
62
+ driverParam: string;
63
+ notNull: true;
64
+ hasDefault: false;
65
+ isPrimaryKey: false;
66
+ isAutoincrement: false;
67
+ hasRuntimeDefault: false;
68
+ enumValues: [string, ...string[]];
69
+ baseColumn: never;
70
+ identity: undefined;
71
+ generated: undefined;
72
+ }, {}, {}>;
73
+ version: import("drizzle-orm/pg-core").PgColumn<{
74
+ name: "version";
75
+ tableName: "events";
76
+ dataType: "string";
77
+ columnType: "PgText";
78
+ data: string;
79
+ driverParam: string;
80
+ notNull: true;
81
+ hasDefault: false;
82
+ isPrimaryKey: false;
83
+ isAutoincrement: false;
84
+ hasRuntimeDefault: false;
85
+ enumValues: [string, ...string[]];
86
+ baseColumn: never;
87
+ identity: undefined;
88
+ generated: undefined;
89
+ }, {}, {}>;
90
+ payload: import("drizzle-orm/pg-core").PgColumn<{
91
+ name: "payload";
92
+ tableName: "events";
93
+ dataType: "json";
94
+ columnType: "PgJsonb";
95
+ data: unknown;
96
+ driverParam: unknown;
97
+ notNull: true;
98
+ hasDefault: false;
99
+ isPrimaryKey: false;
100
+ isAutoincrement: false;
101
+ hasRuntimeDefault: false;
102
+ enumValues: undefined;
103
+ baseColumn: never;
104
+ identity: undefined;
105
+ generated: undefined;
106
+ }, {}, {}>;
107
+ envelope: import("drizzle-orm/pg-core").PgColumn<{
108
+ name: "envelope";
109
+ tableName: "events";
110
+ dataType: "string";
111
+ columnType: "PgText";
112
+ data: string;
113
+ driverParam: string;
114
+ notNull: true;
115
+ hasDefault: false;
116
+ isPrimaryKey: false;
117
+ isAutoincrement: false;
118
+ hasRuntimeDefault: false;
119
+ enumValues: [string, ...string[]];
120
+ baseColumn: never;
121
+ identity: undefined;
122
+ generated: undefined;
123
+ }, {}, {}>;
124
+ occurredAt: import("drizzle-orm/pg-core").PgColumn<{
125
+ name: "occurred_at";
126
+ tableName: "events";
127
+ dataType: "date";
128
+ columnType: "PgTimestamp";
129
+ data: Date;
130
+ driverParam: string;
131
+ notNull: true;
132
+ hasDefault: false;
133
+ isPrimaryKey: false;
134
+ isAutoincrement: false;
135
+ hasRuntimeDefault: false;
136
+ enumValues: undefined;
137
+ baseColumn: never;
138
+ identity: undefined;
139
+ generated: undefined;
140
+ }, {}, {}>;
141
+ receivedAt: import("drizzle-orm/pg-core").PgColumn<{
142
+ name: "received_at";
143
+ tableName: "events";
144
+ dataType: "date";
145
+ columnType: "PgTimestamp";
146
+ data: Date;
147
+ driverParam: string;
148
+ notNull: true;
149
+ hasDefault: true;
150
+ isPrimaryKey: false;
151
+ isAutoincrement: false;
152
+ hasRuntimeDefault: false;
153
+ enumValues: undefined;
154
+ baseColumn: never;
155
+ identity: undefined;
156
+ generated: undefined;
157
+ }, {}, {}>;
158
+ };
159
+ dialect: 'pg';
160
+ }>;
@@ -0,0 +1,23 @@
1
+ import { bigint, index, jsonb, pgTable, text, timestamp, unique, uuid, } from 'drizzle-orm/pg-core';
2
+ import { agents } from './agents.js';
3
+ // Append only. No created_at or updated_at, received_at is the server timestamp.
4
+ export const events = pgTable('events', {
5
+ id: bigint('id', { mode: 'number' })
6
+ .primaryKey()
7
+ .generatedAlwaysAsIdentity(),
8
+ agentId: text('agent_id')
9
+ .notNull()
10
+ .references(() => agents.id),
11
+ eventId: uuid('event_id').notNull(),
12
+ type: text('type').notNull(),
13
+ version: text('version').notNull(),
14
+ payload: jsonb('payload').notNull(),
15
+ envelope: text('envelope').notNull(),
16
+ occurredAt: timestamp('occurred_at', { withTimezone: true }).notNull(),
17
+ receivedAt: timestamp('received_at', { withTimezone: true })
18
+ .notNull()
19
+ .defaultNow(),
20
+ }, (t) => [
21
+ unique('events_agent_id_event_id_unique').on(t.agentId, t.eventId),
22
+ index('events_agent_id_occurred_at_idx').on(t.agentId, t.occurredAt),
23
+ ]);
@@ -0,0 +1,109 @@
1
+ export declare const feedItems: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
+ name: "feed_items";
3
+ schema: undefined;
4
+ columns: {
5
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
6
+ name: "created_at";
7
+ tableName: "feed_items";
8
+ dataType: "date";
9
+ columnType: "PgTimestamp";
10
+ data: Date;
11
+ driverParam: string;
12
+ notNull: true;
13
+ hasDefault: true;
14
+ isPrimaryKey: false;
15
+ isAutoincrement: false;
16
+ hasRuntimeDefault: false;
17
+ enumValues: undefined;
18
+ baseColumn: never;
19
+ identity: undefined;
20
+ generated: undefined;
21
+ }, {}, {}>;
22
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
23
+ name: "updated_at";
24
+ tableName: "feed_items";
25
+ dataType: "date";
26
+ columnType: "PgTimestamp";
27
+ data: Date;
28
+ driverParam: string;
29
+ notNull: true;
30
+ hasDefault: true;
31
+ isPrimaryKey: false;
32
+ isAutoincrement: false;
33
+ hasRuntimeDefault: false;
34
+ enumValues: undefined;
35
+ baseColumn: never;
36
+ identity: undefined;
37
+ generated: undefined;
38
+ }, {}, {}>;
39
+ id: import("drizzle-orm/pg-core").PgColumn<{
40
+ name: "id";
41
+ tableName: "feed_items";
42
+ dataType: "number";
43
+ columnType: "PgBigInt53";
44
+ data: number;
45
+ driverParam: string | number;
46
+ notNull: true;
47
+ hasDefault: true;
48
+ isPrimaryKey: true;
49
+ isAutoincrement: false;
50
+ hasRuntimeDefault: false;
51
+ enumValues: undefined;
52
+ baseColumn: never;
53
+ identity: "always";
54
+ generated: undefined;
55
+ }, {}, {}>;
56
+ kind: import("drizzle-orm/pg-core").PgColumn<{
57
+ name: "kind";
58
+ tableName: "feed_items";
59
+ dataType: "string";
60
+ columnType: "PgText";
61
+ data: string;
62
+ driverParam: string;
63
+ notNull: true;
64
+ hasDefault: false;
65
+ isPrimaryKey: false;
66
+ isAutoincrement: false;
67
+ hasRuntimeDefault: false;
68
+ enumValues: [string, ...string[]];
69
+ baseColumn: never;
70
+ identity: undefined;
71
+ generated: undefined;
72
+ }, {}, {}>;
73
+ agentId: import("drizzle-orm/pg-core").PgColumn<{
74
+ name: "agent_id";
75
+ tableName: "feed_items";
76
+ dataType: "string";
77
+ columnType: "PgText";
78
+ data: string;
79
+ driverParam: string;
80
+ notNull: false;
81
+ hasDefault: false;
82
+ isPrimaryKey: false;
83
+ isAutoincrement: false;
84
+ hasRuntimeDefault: false;
85
+ enumValues: [string, ...string[]];
86
+ baseColumn: never;
87
+ identity: undefined;
88
+ generated: undefined;
89
+ }, {}, {}>;
90
+ payload: import("drizzle-orm/pg-core").PgColumn<{
91
+ name: "payload";
92
+ tableName: "feed_items";
93
+ dataType: "json";
94
+ columnType: "PgJsonb";
95
+ data: unknown;
96
+ driverParam: unknown;
97
+ notNull: true;
98
+ hasDefault: false;
99
+ isPrimaryKey: false;
100
+ isAutoincrement: false;
101
+ hasRuntimeDefault: false;
102
+ enumValues: undefined;
103
+ baseColumn: never;
104
+ identity: undefined;
105
+ generated: undefined;
106
+ }, {}, {}>;
107
+ };
108
+ dialect: 'pg';
109
+ }>;
@@ -0,0 +1,16 @@
1
+ import { bigint, index, jsonb, pgTable, text } from 'drizzle-orm/pg-core';
2
+ import { agents } from './agents.js';
3
+ import { timestamps } from './timestamps.js';
4
+ // The public feed. One row per public fact, written in the same transaction
5
+ // as the change it describes. The identity id is the SSE event id, so a
6
+ // client resumes with Last-Event-ID. The payload holds public facts only,
7
+ // shaped by FeedItem in api.ts.
8
+ export const feedItems = pgTable('feed_items', {
9
+ id: bigint('id', { mode: 'number' })
10
+ .primaryKey()
11
+ .generatedAlwaysAsIdentity(),
12
+ kind: text('kind').notNull(),
13
+ agentId: text('agent_id').references(() => agents.id),
14
+ payload: jsonb('payload').notNull(),
15
+ ...timestamps,
16
+ }, (t) => [index('feed_items_created_at_idx').on(t.createdAt)]);
@@ -0,0 +1,43 @@
1
+ import type { credentials } from './credentials.js';
2
+ import type { events } from './events.js';
3
+ import type { feedItems } from './feed-items.js';
4
+ import type { operators } from './operators.js';
5
+ import type { quotaCounters } from './quota-counters.js';
6
+ import type { ratings } from './ratings.js';
7
+ import type { scores } from './scores.js';
8
+ import type { taskOutcomes } from './task-outcomes.js';
9
+ import type { tasks } from './tasks.js';
10
+ export { and, asc, desc, eq, gt, inArray, isNotNull, isNull, lt, lte, ne, notInArray, or, sql, } from 'drizzle-orm';
11
+ export type { Agent, NewAgent } from './agents.js';
12
+ export { agents } from './agents.js';
13
+ export { createDb, type Db, type Tx } from './client.js';
14
+ export { credentials } from './credentials.js';
15
+ export { events } from './events.js';
16
+ export { feedItems } from './feed-items.js';
17
+ export { migrationsFolder, runMigrations } from './migrator.js';
18
+ export { operators } from './operators.js';
19
+ export { quotaCounters } from './quota-counters.js';
20
+ export { ratings } from './ratings.js';
21
+ export { scores } from './scores.js';
22
+ export { taskOutcomes } from './task-outcomes.js';
23
+ export { tasks } from './tasks.js';
24
+ export { timestamps } from './timestamps.js';
25
+ export { pgArgs } from './url.js';
26
+ export type Operator = typeof operators.$inferSelect;
27
+ export type NewOperator = typeof operators.$inferInsert;
28
+ export type Event = typeof events.$inferSelect;
29
+ export type NewEvent = typeof events.$inferInsert;
30
+ export type Task = typeof tasks.$inferSelect;
31
+ export type NewTask = typeof tasks.$inferInsert;
32
+ export type TaskOutcome = typeof taskOutcomes.$inferSelect;
33
+ export type NewTaskOutcome = typeof taskOutcomes.$inferInsert;
34
+ export type Rating = typeof ratings.$inferSelect;
35
+ export type NewRating = typeof ratings.$inferInsert;
36
+ export type Credential = typeof credentials.$inferSelect;
37
+ export type NewCredential = typeof credentials.$inferInsert;
38
+ export type Score = typeof scores.$inferSelect;
39
+ export type NewScore = typeof scores.$inferInsert;
40
+ export type QuotaCounter = typeof quotaCounters.$inferSelect;
41
+ export type NewQuotaCounter = typeof quotaCounters.$inferInsert;
42
+ export type FeedItem = typeof feedItems.$inferSelect;
43
+ export type NewFeedItem = typeof feedItems.$inferInsert;
@@ -0,0 +1,17 @@
1
+ // The query helpers the API needs beyond the relational query API. The API
2
+ // takes them from here so drizzle-orm stays a dependency of this package only.
3
+ export { and, asc, desc, eq, gt, inArray, isNotNull, isNull, lt, lte, ne, notInArray, or, sql, } from 'drizzle-orm';
4
+ export { agents } from './agents.js';
5
+ export { createDb } from './client.js';
6
+ export { credentials } from './credentials.js';
7
+ export { events } from './events.js';
8
+ export { feedItems } from './feed-items.js';
9
+ export { migrationsFolder, runMigrations } from './migrator.js';
10
+ export { operators } from './operators.js';
11
+ export { quotaCounters } from './quota-counters.js';
12
+ export { ratings } from './ratings.js';
13
+ export { scores } from './scores.js';
14
+ export { taskOutcomes } from './task-outcomes.js';
15
+ export { tasks } from './tasks.js';
16
+ export { timestamps } from './timestamps.js';
17
+ export { pgArgs } from './url.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ // Applies the SQL migrations in packages/schema/drizzle to DATABASE_URL.
2
+ // This is what the vouched-migrate Cloud Run Job runs, so the image needs
3
+ // drizzle-orm only and not drizzle-kit. Local dev keeps `pnpm db:migrate`.
4
+ // @types/node is a devDependency only for this script, migrator.ts and url.ts.
5
+ /// <reference types="node" />
6
+ import { runMigrations } from './migrator.js';
7
+ const url = process.env.DATABASE_URL;
8
+ if (!url) {
9
+ console.error('DATABASE_URL is not set');
10
+ process.exit(1);
11
+ }
12
+ try {
13
+ await runMigrations(url);
14
+ console.log(JSON.stringify({ msg: 'migrations applied' }));
15
+ }
16
+ catch (err) {
17
+ // Log messages and the error code only, never the error object or the URL,
18
+ // which carry the password. Drizzle wraps connection and auth failures as
19
+ // a failed query, so the real reason is in err.cause.
20
+ const msg = err instanceof Error ? err.message : 'unknown error';
21
+ const cause = err instanceof Error && err.cause instanceof Error ? err.cause : undefined;
22
+ const code = cause?.code;
23
+ console.error(JSON.stringify({
24
+ msg: 'migration failed',
25
+ error: msg,
26
+ cause: cause?.message,
27
+ code,
28
+ }));
29
+ process.exit(1);
30
+ }
@@ -0,0 +1,2 @@
1
+ export declare const migrationsFolder: string;
2
+ export declare function runMigrations(databaseUrl: string): Promise<void>;
@@ -0,0 +1,20 @@
1
+ // The one drizzle migrator. migrate.ts (the vouched-migrate job) and the API
2
+ // test helper both call runMigrations, so there is a single code path.
3
+ /// <reference types="node" />
4
+ import { fileURLToPath } from 'node:url';
5
+ import { drizzle } from 'drizzle-orm/postgres-js';
6
+ import { migrate } from 'drizzle-orm/postgres-js/migrator';
7
+ import postgres from 'postgres';
8
+ import { pgArgs } from './url.js';
9
+ // Resolves to packages/schema/drizzle from both src/db and dist/db.
10
+ export const migrationsFolder = fileURLToPath(new URL('../../drizzle', import.meta.url));
11
+ export async function runMigrations(databaseUrl) {
12
+ const [connUrl, options] = pgArgs(databaseUrl);
13
+ const sql = postgres(connUrl, { ...options, max: 1, onnotice: () => { } });
14
+ try {
15
+ await migrate(drizzle(sql), { migrationsFolder });
16
+ }
17
+ finally {
18
+ await sql.end();
19
+ }
20
+ }