@fideliosai/db 0.0.51 → 0.0.53

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.
@@ -0,0 +1,22 @@
1
+ CREATE TABLE IF NOT EXISTS "merge_locks" (
2
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
3
+ "company_id" uuid NOT NULL REFERENCES "companies"("id"),
4
+ "holder_run_id" uuid NOT NULL REFERENCES "heartbeat_runs"("id") ON DELETE CASCADE,
5
+ "holder_agent_id" uuid NOT NULL REFERENCES "agents"("id") ON DELETE CASCADE,
6
+ "issue_id" uuid REFERENCES "issues"("id") ON DELETE SET NULL,
7
+ "pr_number" integer,
8
+ "acquired_at" timestamp with time zone DEFAULT now() NOT NULL,
9
+ "expires_at" timestamp with time zone NOT NULL,
10
+ "released_at" timestamp with time zone,
11
+ "release_reason" text,
12
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
13
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
14
+ );
15
+
16
+ -- The core invariant: at most one active (unreleased) merge slot per company.
17
+ CREATE UNIQUE INDEX IF NOT EXISTS "merge_locks_active_company_uq"
18
+ ON "merge_locks" ("company_id")
19
+ WHERE "released_at" IS NULL;
20
+
21
+ CREATE INDEX IF NOT EXISTS "merge_locks_company_acquired_idx"
22
+ ON "merge_locks" ("company_id", "acquired_at");
@@ -26,6 +26,7 @@ export { projectGoals } from "./project_goals.js";
26
26
  export { goals } from "./goals.js";
27
27
  export { issues } from "./issues.js";
28
28
  export { issueRelations } from "./issue_relations.js";
29
+ export { mergeLocks } from "./merge_locks.js";
29
30
  export { routines, routineTriggers, routineRuns } from "./routines.js";
30
31
  export { issueWorkProducts } from "./issue_work_products.js";
31
32
  export { labels } from "./labels.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ export { projectGoals } from "./project_goals.js";
26
26
  export { goals } from "./goals.js";
27
27
  export { issues } from "./issues.js";
28
28
  export { issueRelations } from "./issue_relations.js";
29
+ export { mergeLocks } from "./merge_locks.js";
29
30
  export { routines, routineTriggers, routineRuns } from "./routines.js";
30
31
  export { issueWorkProducts } from "./issue_work_products.js";
31
32
  export { labels } from "./labels.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Per-company merge slot — the FideliOS-native equivalent of a GitHub merge
3
+ * queue, without an Enterprise plan.
4
+ *
5
+ * An engineer agent acquires this slot before merging its PR into the trunk
6
+ * so that parallel agents in the same company never merge into the integration
7
+ * branch concurrently (which can land two PRs that were each CI-green against
8
+ * an older trunk and break it together).
9
+ *
10
+ * Invariant: at most one *active* row (`released_at IS NULL`) per company —
11
+ * enforced at the database level by the partial unique index below. The
12
+ * service mirrors the `issues` checkout-lock pattern: a conditional write is
13
+ * the entire concurrency primitive. Released rows are retained as an audit
14
+ * trail of who merged when.
15
+ */
16
+ export declare const mergeLocks: import("drizzle-orm/pg-core").PgTableWithColumns<{
17
+ name: "merge_locks";
18
+ schema: undefined;
19
+ columns: {
20
+ id: import("drizzle-orm/pg-core").PgColumn<{
21
+ name: "id";
22
+ tableName: "merge_locks";
23
+ dataType: "string";
24
+ columnType: "PgUUID";
25
+ data: string;
26
+ driverParam: string;
27
+ notNull: true;
28
+ hasDefault: true;
29
+ isPrimaryKey: true;
30
+ isAutoincrement: false;
31
+ hasRuntimeDefault: false;
32
+ enumValues: undefined;
33
+ baseColumn: never;
34
+ identity: undefined;
35
+ generated: undefined;
36
+ }, {}, {}>;
37
+ companyId: import("drizzle-orm/pg-core").PgColumn<{
38
+ name: "company_id";
39
+ tableName: "merge_locks";
40
+ dataType: "string";
41
+ columnType: "PgUUID";
42
+ data: string;
43
+ driverParam: string;
44
+ notNull: true;
45
+ hasDefault: false;
46
+ isPrimaryKey: false;
47
+ isAutoincrement: false;
48
+ hasRuntimeDefault: false;
49
+ enumValues: undefined;
50
+ baseColumn: never;
51
+ identity: undefined;
52
+ generated: undefined;
53
+ }, {}, {}>;
54
+ holderRunId: import("drizzle-orm/pg-core").PgColumn<{
55
+ name: "holder_run_id";
56
+ tableName: "merge_locks";
57
+ dataType: "string";
58
+ columnType: "PgUUID";
59
+ data: string;
60
+ driverParam: string;
61
+ notNull: true;
62
+ hasDefault: false;
63
+ isPrimaryKey: false;
64
+ isAutoincrement: false;
65
+ hasRuntimeDefault: false;
66
+ enumValues: undefined;
67
+ baseColumn: never;
68
+ identity: undefined;
69
+ generated: undefined;
70
+ }, {}, {}>;
71
+ holderAgentId: import("drizzle-orm/pg-core").PgColumn<{
72
+ name: "holder_agent_id";
73
+ tableName: "merge_locks";
74
+ dataType: "string";
75
+ columnType: "PgUUID";
76
+ data: string;
77
+ driverParam: string;
78
+ notNull: true;
79
+ hasDefault: false;
80
+ isPrimaryKey: false;
81
+ isAutoincrement: false;
82
+ hasRuntimeDefault: false;
83
+ enumValues: undefined;
84
+ baseColumn: never;
85
+ identity: undefined;
86
+ generated: undefined;
87
+ }, {}, {}>;
88
+ issueId: import("drizzle-orm/pg-core").PgColumn<{
89
+ name: "issue_id";
90
+ tableName: "merge_locks";
91
+ dataType: "string";
92
+ columnType: "PgUUID";
93
+ data: string;
94
+ driverParam: string;
95
+ notNull: false;
96
+ hasDefault: false;
97
+ isPrimaryKey: false;
98
+ isAutoincrement: false;
99
+ hasRuntimeDefault: false;
100
+ enumValues: undefined;
101
+ baseColumn: never;
102
+ identity: undefined;
103
+ generated: undefined;
104
+ }, {}, {}>;
105
+ prNumber: import("drizzle-orm/pg-core").PgColumn<{
106
+ name: "pr_number";
107
+ tableName: "merge_locks";
108
+ dataType: "number";
109
+ columnType: "PgInteger";
110
+ data: number;
111
+ driverParam: string | number;
112
+ notNull: false;
113
+ hasDefault: false;
114
+ isPrimaryKey: false;
115
+ isAutoincrement: false;
116
+ hasRuntimeDefault: false;
117
+ enumValues: undefined;
118
+ baseColumn: never;
119
+ identity: undefined;
120
+ generated: undefined;
121
+ }, {}, {}>;
122
+ acquiredAt: import("drizzle-orm/pg-core").PgColumn<{
123
+ name: "acquired_at";
124
+ tableName: "merge_locks";
125
+ dataType: "date";
126
+ columnType: "PgTimestamp";
127
+ data: Date;
128
+ driverParam: string;
129
+ notNull: true;
130
+ hasDefault: true;
131
+ isPrimaryKey: false;
132
+ isAutoincrement: false;
133
+ hasRuntimeDefault: false;
134
+ enumValues: undefined;
135
+ baseColumn: never;
136
+ identity: undefined;
137
+ generated: undefined;
138
+ }, {}, {}>;
139
+ expiresAt: import("drizzle-orm/pg-core").PgColumn<{
140
+ name: "expires_at";
141
+ tableName: "merge_locks";
142
+ dataType: "date";
143
+ columnType: "PgTimestamp";
144
+ data: Date;
145
+ driverParam: string;
146
+ notNull: true;
147
+ hasDefault: false;
148
+ isPrimaryKey: false;
149
+ isAutoincrement: false;
150
+ hasRuntimeDefault: false;
151
+ enumValues: undefined;
152
+ baseColumn: never;
153
+ identity: undefined;
154
+ generated: undefined;
155
+ }, {}, {}>;
156
+ releasedAt: import("drizzle-orm/pg-core").PgColumn<{
157
+ name: "released_at";
158
+ tableName: "merge_locks";
159
+ dataType: "date";
160
+ columnType: "PgTimestamp";
161
+ data: Date;
162
+ driverParam: string;
163
+ notNull: false;
164
+ hasDefault: false;
165
+ isPrimaryKey: false;
166
+ isAutoincrement: false;
167
+ hasRuntimeDefault: false;
168
+ enumValues: undefined;
169
+ baseColumn: never;
170
+ identity: undefined;
171
+ generated: undefined;
172
+ }, {}, {}>;
173
+ releaseReason: import("drizzle-orm/pg-core").PgColumn<{
174
+ name: "release_reason";
175
+ tableName: "merge_locks";
176
+ dataType: "string";
177
+ columnType: "PgText";
178
+ data: string;
179
+ driverParam: string;
180
+ notNull: false;
181
+ hasDefault: false;
182
+ isPrimaryKey: false;
183
+ isAutoincrement: false;
184
+ hasRuntimeDefault: false;
185
+ enumValues: [string, ...string[]];
186
+ baseColumn: never;
187
+ identity: undefined;
188
+ generated: undefined;
189
+ }, {}, {}>;
190
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
191
+ name: "created_at";
192
+ tableName: "merge_locks";
193
+ dataType: "date";
194
+ columnType: "PgTimestamp";
195
+ data: Date;
196
+ driverParam: string;
197
+ notNull: true;
198
+ hasDefault: true;
199
+ isPrimaryKey: false;
200
+ isAutoincrement: false;
201
+ hasRuntimeDefault: false;
202
+ enumValues: undefined;
203
+ baseColumn: never;
204
+ identity: undefined;
205
+ generated: undefined;
206
+ }, {}, {}>;
207
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
208
+ name: "updated_at";
209
+ tableName: "merge_locks";
210
+ dataType: "date";
211
+ columnType: "PgTimestamp";
212
+ data: Date;
213
+ driverParam: string;
214
+ notNull: true;
215
+ hasDefault: true;
216
+ isPrimaryKey: false;
217
+ isAutoincrement: false;
218
+ hasRuntimeDefault: false;
219
+ enumValues: undefined;
220
+ baseColumn: never;
221
+ identity: undefined;
222
+ generated: undefined;
223
+ }, {}, {}>;
224
+ };
225
+ dialect: "pg";
226
+ }>;
227
+ //# sourceMappingURL=merge_locks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge_locks.d.ts","sourceRoot":"","sources":["../../src/schema/merge_locks.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCtB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { sql } from "drizzle-orm";
2
+ import { pgTable, uuid, text, integer, timestamp, index, uniqueIndex } from "drizzle-orm/pg-core";
3
+ import { companies } from "./companies.js";
4
+ import { agents } from "./agents.js";
5
+ import { heartbeatRuns } from "./heartbeat_runs.js";
6
+ import { issues } from "./issues.js";
7
+ /**
8
+ * Per-company merge slot — the FideliOS-native equivalent of a GitHub merge
9
+ * queue, without an Enterprise plan.
10
+ *
11
+ * An engineer agent acquires this slot before merging its PR into the trunk
12
+ * so that parallel agents in the same company never merge into the integration
13
+ * branch concurrently (which can land two PRs that were each CI-green against
14
+ * an older trunk and break it together).
15
+ *
16
+ * Invariant: at most one *active* row (`released_at IS NULL`) per company —
17
+ * enforced at the database level by the partial unique index below. The
18
+ * service mirrors the `issues` checkout-lock pattern: a conditional write is
19
+ * the entire concurrency primitive. Released rows are retained as an audit
20
+ * trail of who merged when.
21
+ */
22
+ export const mergeLocks = pgTable("merge_locks", {
23
+ id: uuid("id").primaryKey().defaultRandom(),
24
+ companyId: uuid("company_id")
25
+ .notNull()
26
+ .references(() => companies.id),
27
+ /** The heartbeat run that holds the slot. A terminal run releases it (reaper / lazy steal). */
28
+ holderRunId: uuid("holder_run_id")
29
+ .notNull()
30
+ .references(() => heartbeatRuns.id, { onDelete: "cascade" }),
31
+ /** Denormalized for cheap status display ("Engineer X is merging") and a self-contained audit trail. */
32
+ holderAgentId: uuid("holder_agent_id")
33
+ .notNull()
34
+ .references(() => agents.id, { onDelete: "cascade" }),
35
+ /** Informational: which issue/PR is being merged under this slot. */
36
+ issueId: uuid("issue_id").references(() => issues.id, { onDelete: "set null" }),
37
+ prNumber: integer("pr_number"),
38
+ acquiredAt: timestamp("acquired_at", { withTimezone: true }).notNull().defaultNow(),
39
+ /** TTL backstop — a stuck holder never blocks the company past this. */
40
+ expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),
41
+ releasedAt: timestamp("released_at", { withTimezone: true }),
42
+ /** released | reclaimed_dead_run | reclaimed_expired | reaped_dead_run | reaped_expired | force_released */
43
+ releaseReason: text("release_reason"),
44
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
45
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
46
+ }, (table) => ({
47
+ // The core invariant: one live merge slot per company.
48
+ activeCompanyIdx: uniqueIndex("merge_locks_active_company_uq")
49
+ .on(table.companyId)
50
+ .where(sql `${table.releasedAt} is null`),
51
+ companyAcquiredIdx: index("merge_locks_company_acquired_idx").on(table.companyId, table.acquiredAt),
52
+ }));
53
+ //# sourceMappingURL=merge_locks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge_locks.js","sourceRoot":"","sources":["../../src/schema/merge_locks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAC/B,aAAa,EACb;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;IAC3C,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;SAC1B,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;IACjC,+FAA+F;IAC/F,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC;SAC/B,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC9D,wGAAwG;IACxG,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC;SACnC,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACvD,qEAAqE;IACrE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAC/E,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC;IAC9B,UAAU,EAAE,SAAS,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;IACnF,wEAAwE;IACxE,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACpE,UAAU,EAAE,SAAS,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAC5D,4GAA4G;IAC5G,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;IACjF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CAClF,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,uDAAuD;IACvD,gBAAgB,EAAE,WAAW,CAAC,+BAA+B,CAAC;SAC3D,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;SACnB,KAAK,CAAC,GAAG,CAAA,GAAG,KAAK,CAAC,UAAU,UAAU,CAAC;IAC1C,kBAAkB,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAC9D,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,UAAU,CACjB;CACF,CAAC,CACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fideliosai/db",
3
- "version": "0.0.51",
3
+ "version": "0.0.53",
4
4
  "license": "MIT",
5
5
  "homepage": "https://github.com/fideliosai/fidelios",
6
6
  "bugs": {
@@ -30,7 +30,7 @@
30
30
  ],
31
31
  "dependencies": {
32
32
  "@aws-sdk/client-s3": "^3.888.0",
33
- "@fideliosai/shared": "0.0.51",
33
+ "@fideliosai/shared": "0.0.53",
34
34
  "drizzle-orm": "^0.38.4",
35
35
  "embedded-postgres": "^18.1.0-beta.16",
36
36
  "postgres": "^3.4.5"
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=analytics.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics.test.d.ts","sourceRoot":"","sources":["../src/analytics.test.ts"],"names":[],"mappings":""}
@@ -1,195 +0,0 @@
1
- import { afterEach, describe, expect, it } from "vitest";
2
- import postgres from "postgres";
3
- import { getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase, } from "./test-embedded-postgres.js";
4
- const cleanups = [];
5
- const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport();
6
- const describeEmbeddedPostgres = embeddedPostgresSupport.supported
7
- ? describe
8
- : describe.skip;
9
- async function createTempDatabase() {
10
- const db = await startEmbeddedPostgresTestDatabase("fidelios-db-analytics-");
11
- cleanups.push(db.cleanup);
12
- return db.connectionString;
13
- }
14
- afterEach(async () => {
15
- while (cleanups.length > 0) {
16
- const cleanup = cleanups.pop();
17
- await cleanup?.();
18
- }
19
- });
20
- if (!embeddedPostgresSupport.supported) {
21
- console.warn(`Skipping analytics tests: ${embeddedPostgresSupport.reason ?? "unsupported environment"}`);
22
- }
23
- describeEmbeddedPostgres("analytics schema", () => {
24
- it("creates all 4 analytics tables with correct structure", async () => {
25
- const connectionString = await createTempDatabase();
26
- const sql = postgres(connectionString, { max: 1, onnotice: () => { } });
27
- try {
28
- const tables = await sql `
29
- SELECT tablename FROM pg_tables
30
- WHERE tablename LIKE 'analytics_%'
31
- ORDER BY tablename
32
- `;
33
- expect(tables.map((r) => r.tablename)).toEqual([
34
- "analytics_articles",
35
- "analytics_markets",
36
- "analytics_price_history",
37
- "analytics_signals",
38
- ]);
39
- }
40
- finally {
41
- await sql.end();
42
- }
43
- }, { timeout: 120_000 });
44
- it("pgvector extension is enabled and vector columns work", async () => {
45
- const connectionString = await createTempDatabase();
46
- const sql = postgres(connectionString, { max: 1, onnotice: () => { } });
47
- try {
48
- const extensions = await sql `
49
- SELECT extname FROM pg_extension WHERE extname = 'vector'
50
- `;
51
- expect(extensions).toHaveLength(1);
52
- // Insert article with embedding
53
- const embedding = new Array(768).fill(0).map((_, i) => Math.sin(i / 100));
54
- const embeddingStr = `[${embedding.join(",")}]`;
55
- await sql `
56
- INSERT INTO analytics_articles (title, content, published_at, source, tags, embedding)
57
- VALUES (
58
- 'Test Vector Article',
59
- 'Testing pgvector embeddings for similarity search',
60
- '2026-04-01T00:00:00Z',
61
- 'test',
62
- ${sql.array(["test", "vector"])},
63
- ${embeddingStr}::vector
64
- )
65
- `;
66
- const rows = await sql `SELECT id, embedding FROM analytics_articles LIMIT 1`;
67
- expect(rows).toHaveLength(1);
68
- expect(rows[0].embedding).toBeTruthy();
69
- }
70
- finally {
71
- await sql.end();
72
- }
73
- }, { timeout: 120_000 });
74
- it("tsvector search_vector column is auto-generated", async () => {
75
- const connectionString = await createTempDatabase();
76
- const sql = postgres(connectionString, { max: 1, onnotice: () => { } });
77
- try {
78
- await sql `
79
- INSERT INTO analytics_articles (title, content, published_at)
80
- VALUES ('Prediction Markets Rise', 'Polymarket sees record volume in election markets', '2026-04-01T00:00:00Z')
81
- `;
82
- const rows = await sql `
83
- SELECT search_vector::text FROM analytics_articles
84
- WHERE search_vector @@ to_tsquery('english', 'market')
85
- `;
86
- expect(rows).toHaveLength(1);
87
- const noRows = await sql `
88
- SELECT id FROM analytics_articles
89
- WHERE search_vector @@ to_tsquery('english', 'blockchain')
90
- `;
91
- expect(noRows).toHaveLength(0);
92
- }
93
- finally {
94
- await sql.end();
95
- }
96
- }, { timeout: 120_000 });
97
- it("inserts sample rows into all 4 tables with foreign key relationships", async () => {
98
- const connectionString = await createTempDatabase();
99
- const sql = postgres(connectionString, { max: 1, onnotice: () => { } });
100
- try {
101
- // Insert article
102
- const [article] = await sql `
103
- INSERT INTO analytics_articles (title, content, published_at, source, tags)
104
- VALUES ('Election Coverage', 'Detailed analysis of prediction market movements', '2026-04-01T00:00:00Z', 'reuters', ARRAY['politics', 'markets']::text[])
105
- RETURNING id
106
- `;
107
- // Insert market
108
- const [market] = await sql `
109
- INSERT INTO analytics_markets (external_id, question, description, category, outcome_prices, volume_total)
110
- VALUES ('poly-123', 'Will candidate X win?', 'Presidential election market', 'politics', '{"Yes": 0.65, "No": 0.35}'::jsonb, 1500000)
111
- RETURNING id
112
- `;
113
- // Insert price history
114
- await sql `
115
- INSERT INTO analytics_price_history (market_id, timestamp, price)
116
- VALUES
117
- (${market.id}, '2026-04-01T00:00:00Z', 0.55),
118
- (${market.id}, '2026-04-02T00:00:00Z', 0.60),
119
- (${market.id}, '2026-04-03T00:00:00Z', 0.65)
120
- `;
121
- // Insert signal
122
- await sql `
123
- INSERT INTO analytics_signals (article_id, market_id, similarity_score, time_delta_hours, price_at_publish, signal_quality)
124
- VALUES (${article.id}, ${market.id}, 0.87, 12, 0.55, 'high')
125
- `;
126
- // Verify counts
127
- const articleCount = await sql `SELECT count(*) as c FROM analytics_articles`;
128
- const marketCount = await sql `SELECT count(*) as c FROM analytics_markets`;
129
- const priceCount = await sql `SELECT count(*) as c FROM analytics_price_history`;
130
- const signalCount = await sql `SELECT count(*) as c FROM analytics_signals`;
131
- expect(Number(articleCount[0].c)).toBe(1);
132
- expect(Number(marketCount[0].c)).toBe(1);
133
- expect(Number(priceCount[0].c)).toBe(3);
134
- expect(Number(signalCount[0].c)).toBe(1);
135
- }
136
- finally {
137
- await sql.end();
138
- }
139
- }, { timeout: 120_000 });
140
- it("hybrid search (RRF) query returns ranked results", async () => {
141
- const connectionString = await createTempDatabase();
142
- const sql = postgres(connectionString, { max: 1, onnotice: () => { } });
143
- try {
144
- // Insert multiple articles with embeddings
145
- const baseEmbedding = new Array(768).fill(0).map((_, i) => Math.sin(i / 100));
146
- const similarEmbedding = baseEmbedding.map((v) => v + Math.random() * 0.01);
147
- const differentEmbedding = new Array(768).fill(0).map((_, i) => Math.cos(i / 50));
148
- await sql `
149
- INSERT INTO analytics_articles (title, content, published_at, embedding) VALUES
150
- ('Prediction Markets Surge', 'Polymarket trading volume hits all-time high as election approaches', '2026-04-01T00:00:00Z', ${`[${baseEmbedding.join(",")}]`}::vector),
151
- ('Market Analysis Report', 'Election prediction markets show increased activity and accuracy', '2026-04-02T00:00:00Z', ${`[${similarEmbedding.join(",")}]`}::vector),
152
- ('Weather Forecast Today', 'Sunny skies expected across the region with mild temperatures', '2026-04-03T00:00:00Z', ${`[${differentEmbedding.join(",")}]`}::vector)
153
- `;
154
- // Hybrid search: combine full-text search with vector similarity using RRF
155
- const queryEmbedding = `[${baseEmbedding.join(",")}]`;
156
- const searchQuery = "prediction markets election";
157
- const k = 60; // RRF constant
158
- const results = await sql `
159
- WITH text_ranked AS (
160
- SELECT id, title,
161
- ROW_NUMBER() OVER (ORDER BY ts_rank(search_vector, websearch_to_tsquery('english', ${searchQuery})) DESC) as text_rank
162
- FROM analytics_articles
163
- WHERE search_vector @@ websearch_to_tsquery('english', ${searchQuery})
164
- ),
165
- vector_ranked AS (
166
- SELECT id, title,
167
- ROW_NUMBER() OVER (ORDER BY embedding <=> ${queryEmbedding}::vector) as vec_rank
168
- FROM analytics_articles
169
- WHERE embedding IS NOT NULL
170
- ORDER BY embedding <=> ${queryEmbedding}::vector
171
- LIMIT 10
172
- )
173
- SELECT
174
- COALESCE(t.id, v.id) as id,
175
- COALESCE(t.title, v.title) as title,
176
- COALESCE(1.0 / (${k} + t.text_rank), 0) + COALESCE(1.0 / (${k} + v.vec_rank), 0) as rrf_score
177
- FROM text_ranked t
178
- FULL OUTER JOIN vector_ranked v ON t.id = v.id
179
- ORDER BY rrf_score DESC
180
- `;
181
- // The prediction markets article should rank highest (matches both text and vector)
182
- expect(results.length).toBeGreaterThanOrEqual(2);
183
- expect(results[0].title).toBe("Prediction Markets Surge");
184
- // The weather article should rank lower or not appear in text search
185
- const weatherResult = results.find((r) => r.title === "Weather Forecast Today");
186
- if (weatherResult) {
187
- expect(Number(weatherResult.rrf_score)).toBeLessThan(Number(results[0].rrf_score));
188
- }
189
- }
190
- finally {
191
- await sql.end();
192
- }
193
- }, { timeout: 120_000 });
194
- });
195
- //# sourceMappingURL=analytics.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics.test.js","sourceRoot":"","sources":["../src/analytics.test.ts"],"names":[],"mappings":"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"}
@@ -1,603 +0,0 @@
1
- export declare const analyticsArticles: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
- name: "analytics_articles";
3
- schema: undefined;
4
- columns: {
5
- id: import("drizzle-orm/pg-core").PgColumn<{
6
- name: "id";
7
- tableName: "analytics_articles";
8
- dataType: "string";
9
- columnType: "PgUUID";
10
- data: string;
11
- driverParam: string;
12
- notNull: true;
13
- hasDefault: true;
14
- isPrimaryKey: true;
15
- isAutoincrement: false;
16
- hasRuntimeDefault: false;
17
- enumValues: undefined;
18
- baseColumn: never;
19
- identity: undefined;
20
- generated: undefined;
21
- }, {}, {}>;
22
- title: import("drizzle-orm/pg-core").PgColumn<{
23
- name: "title";
24
- tableName: "analytics_articles";
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
- content: import("drizzle-orm/pg-core").PgColumn<{
40
- name: "content";
41
- tableName: "analytics_articles";
42
- dataType: "string";
43
- columnType: "PgText";
44
- data: string;
45
- driverParam: string;
46
- notNull: true;
47
- hasDefault: false;
48
- isPrimaryKey: false;
49
- isAutoincrement: false;
50
- hasRuntimeDefault: false;
51
- enumValues: [string, ...string[]];
52
- baseColumn: never;
53
- identity: undefined;
54
- generated: undefined;
55
- }, {}, {}>;
56
- publishedAt: import("drizzle-orm/pg-core").PgColumn<{
57
- name: "published_at";
58
- tableName: "analytics_articles";
59
- dataType: "date";
60
- columnType: "PgTimestamp";
61
- data: Date;
62
- driverParam: string;
63
- notNull: true;
64
- hasDefault: false;
65
- isPrimaryKey: false;
66
- isAutoincrement: false;
67
- hasRuntimeDefault: false;
68
- enumValues: undefined;
69
- baseColumn: never;
70
- identity: undefined;
71
- generated: undefined;
72
- }, {}, {}>;
73
- source: import("drizzle-orm/pg-core").PgColumn<{
74
- name: "source";
75
- tableName: "analytics_articles";
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
- sourceUrl: import("drizzle-orm/pg-core").PgColumn<{
91
- name: "source_url";
92
- tableName: "analytics_articles";
93
- dataType: "string";
94
- columnType: "PgText";
95
- data: string;
96
- driverParam: string;
97
- notNull: false;
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
- tags: import("drizzle-orm/pg-core").PgColumn<{
108
- name: "tags";
109
- tableName: "analytics_articles";
110
- dataType: "array";
111
- columnType: "PgArray";
112
- data: string[];
113
- driverParam: string | string[];
114
- notNull: false;
115
- hasDefault: false;
116
- isPrimaryKey: false;
117
- isAutoincrement: false;
118
- hasRuntimeDefault: false;
119
- enumValues: [string, ...string[]];
120
- baseColumn: import("drizzle-orm").Column<{
121
- name: "tags";
122
- tableName: "analytics_articles";
123
- dataType: "string";
124
- columnType: "PgText";
125
- data: string;
126
- driverParam: string;
127
- notNull: false;
128
- hasDefault: false;
129
- isPrimaryKey: false;
130
- isAutoincrement: false;
131
- hasRuntimeDefault: false;
132
- enumValues: [string, ...string[]];
133
- baseColumn: never;
134
- identity: undefined;
135
- generated: undefined;
136
- }, {}, {}>;
137
- identity: undefined;
138
- generated: undefined;
139
- }, {}, {
140
- baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
141
- name: "tags";
142
- dataType: "string";
143
- columnType: "PgText";
144
- data: string;
145
- enumValues: [string, ...string[]];
146
- driverParam: string;
147
- }, {}, {}, import("drizzle-orm").ColumnBuilderExtraConfig>;
148
- size: undefined;
149
- }>;
150
- embedding: import("drizzle-orm/pg-core").PgColumn<{
151
- name: "embedding";
152
- tableName: "analytics_articles";
153
- dataType: "array";
154
- columnType: "PgVector";
155
- data: number[];
156
- driverParam: string;
157
- notNull: false;
158
- hasDefault: false;
159
- isPrimaryKey: false;
160
- isAutoincrement: false;
161
- hasRuntimeDefault: false;
162
- enumValues: undefined;
163
- baseColumn: never;
164
- identity: undefined;
165
- generated: undefined;
166
- }, {}, {
167
- dimensions: 768;
168
- }>;
169
- };
170
- dialect: "pg";
171
- }>;
172
- export declare const analyticsMarkets: import("drizzle-orm/pg-core").PgTableWithColumns<{
173
- name: "analytics_markets";
174
- schema: undefined;
175
- columns: {
176
- id: import("drizzle-orm/pg-core").PgColumn<{
177
- name: "id";
178
- tableName: "analytics_markets";
179
- dataType: "string";
180
- columnType: "PgUUID";
181
- data: string;
182
- driverParam: string;
183
- notNull: true;
184
- hasDefault: true;
185
- isPrimaryKey: true;
186
- isAutoincrement: false;
187
- hasRuntimeDefault: false;
188
- enumValues: undefined;
189
- baseColumn: never;
190
- identity: undefined;
191
- generated: undefined;
192
- }, {}, {}>;
193
- externalId: import("drizzle-orm/pg-core").PgColumn<{
194
- name: "external_id";
195
- tableName: "analytics_markets";
196
- dataType: "string";
197
- columnType: "PgText";
198
- data: string;
199
- driverParam: string;
200
- notNull: false;
201
- hasDefault: false;
202
- isPrimaryKey: false;
203
- isAutoincrement: false;
204
- hasRuntimeDefault: false;
205
- enumValues: [string, ...string[]];
206
- baseColumn: never;
207
- identity: undefined;
208
- generated: undefined;
209
- }, {}, {}>;
210
- question: import("drizzle-orm/pg-core").PgColumn<{
211
- name: "question";
212
- tableName: "analytics_markets";
213
- dataType: "string";
214
- columnType: "PgText";
215
- data: string;
216
- driverParam: string;
217
- notNull: true;
218
- hasDefault: false;
219
- isPrimaryKey: false;
220
- isAutoincrement: false;
221
- hasRuntimeDefault: false;
222
- enumValues: [string, ...string[]];
223
- baseColumn: never;
224
- identity: undefined;
225
- generated: undefined;
226
- }, {}, {}>;
227
- description: import("drizzle-orm/pg-core").PgColumn<{
228
- name: "description";
229
- tableName: "analytics_markets";
230
- dataType: "string";
231
- columnType: "PgText";
232
- data: string;
233
- driverParam: string;
234
- notNull: false;
235
- hasDefault: false;
236
- isPrimaryKey: false;
237
- isAutoincrement: false;
238
- hasRuntimeDefault: false;
239
- enumValues: [string, ...string[]];
240
- baseColumn: never;
241
- identity: undefined;
242
- generated: undefined;
243
- }, {}, {}>;
244
- category: import("drizzle-orm/pg-core").PgColumn<{
245
- name: "category";
246
- tableName: "analytics_markets";
247
- dataType: "string";
248
- columnType: "PgText";
249
- data: string;
250
- driverParam: string;
251
- notNull: false;
252
- hasDefault: false;
253
- isPrimaryKey: false;
254
- isAutoincrement: false;
255
- hasRuntimeDefault: false;
256
- enumValues: [string, ...string[]];
257
- baseColumn: never;
258
- identity: undefined;
259
- generated: undefined;
260
- }, {}, {}>;
261
- outcome: import("drizzle-orm/pg-core").PgColumn<{
262
- name: "outcome";
263
- tableName: "analytics_markets";
264
- dataType: "string";
265
- columnType: "PgText";
266
- data: string;
267
- driverParam: string;
268
- notNull: false;
269
- hasDefault: false;
270
- isPrimaryKey: false;
271
- isAutoincrement: false;
272
- hasRuntimeDefault: false;
273
- enumValues: [string, ...string[]];
274
- baseColumn: never;
275
- identity: undefined;
276
- generated: undefined;
277
- }, {}, {}>;
278
- outcomePrices: import("drizzle-orm/pg-core").PgColumn<{
279
- name: "outcome_prices";
280
- tableName: "analytics_markets";
281
- dataType: "json";
282
- columnType: "PgJsonb";
283
- data: unknown;
284
- driverParam: unknown;
285
- notNull: false;
286
- hasDefault: false;
287
- isPrimaryKey: false;
288
- isAutoincrement: false;
289
- hasRuntimeDefault: false;
290
- enumValues: undefined;
291
- baseColumn: never;
292
- identity: undefined;
293
- generated: undefined;
294
- }, {}, {}>;
295
- closedAt: import("drizzle-orm/pg-core").PgColumn<{
296
- name: "closed_at";
297
- tableName: "analytics_markets";
298
- dataType: "date";
299
- columnType: "PgTimestamp";
300
- data: Date;
301
- driverParam: string;
302
- notNull: false;
303
- hasDefault: false;
304
- isPrimaryKey: false;
305
- isAutoincrement: false;
306
- hasRuntimeDefault: false;
307
- enumValues: undefined;
308
- baseColumn: never;
309
- identity: undefined;
310
- generated: undefined;
311
- }, {}, {}>;
312
- createdAt: import("drizzle-orm/pg-core").PgColumn<{
313
- name: "created_at";
314
- tableName: "analytics_markets";
315
- dataType: "date";
316
- columnType: "PgTimestamp";
317
- data: Date;
318
- driverParam: string;
319
- notNull: false;
320
- hasDefault: false;
321
- isPrimaryKey: false;
322
- isAutoincrement: false;
323
- hasRuntimeDefault: false;
324
- enumValues: undefined;
325
- baseColumn: never;
326
- identity: undefined;
327
- generated: undefined;
328
- }, {}, {}>;
329
- volumeTotal: import("drizzle-orm/pg-core").PgColumn<{
330
- name: "volume_total";
331
- tableName: "analytics_markets";
332
- dataType: "string";
333
- columnType: "PgNumeric";
334
- data: string;
335
- driverParam: string;
336
- notNull: false;
337
- hasDefault: false;
338
- isPrimaryKey: false;
339
- isAutoincrement: false;
340
- hasRuntimeDefault: false;
341
- enumValues: undefined;
342
- baseColumn: never;
343
- identity: undefined;
344
- generated: undefined;
345
- }, {}, {}>;
346
- clobTokenId: import("drizzle-orm/pg-core").PgColumn<{
347
- name: "clob_token_id";
348
- tableName: "analytics_markets";
349
- dataType: "string";
350
- columnType: "PgText";
351
- data: string;
352
- driverParam: string;
353
- notNull: false;
354
- hasDefault: false;
355
- isPrimaryKey: false;
356
- isAutoincrement: false;
357
- hasRuntimeDefault: false;
358
- enumValues: [string, ...string[]];
359
- baseColumn: never;
360
- identity: undefined;
361
- generated: undefined;
362
- }, {}, {}>;
363
- embedding: import("drizzle-orm/pg-core").PgColumn<{
364
- name: "embedding";
365
- tableName: "analytics_markets";
366
- dataType: "array";
367
- columnType: "PgVector";
368
- data: number[];
369
- driverParam: string;
370
- notNull: false;
371
- hasDefault: false;
372
- isPrimaryKey: false;
373
- isAutoincrement: false;
374
- hasRuntimeDefault: false;
375
- enumValues: undefined;
376
- baseColumn: never;
377
- identity: undefined;
378
- generated: undefined;
379
- }, {}, {
380
- dimensions: 768;
381
- }>;
382
- };
383
- dialect: "pg";
384
- }>;
385
- export declare const analyticsPriceHistory: import("drizzle-orm/pg-core").PgTableWithColumns<{
386
- name: "analytics_price_history";
387
- schema: undefined;
388
- columns: {
389
- marketId: import("drizzle-orm/pg-core").PgColumn<{
390
- name: "market_id";
391
- tableName: "analytics_price_history";
392
- dataType: "string";
393
- columnType: "PgUUID";
394
- data: string;
395
- driverParam: string;
396
- notNull: true;
397
- hasDefault: false;
398
- isPrimaryKey: false;
399
- isAutoincrement: false;
400
- hasRuntimeDefault: false;
401
- enumValues: undefined;
402
- baseColumn: never;
403
- identity: undefined;
404
- generated: undefined;
405
- }, {}, {}>;
406
- timestamp: import("drizzle-orm/pg-core").PgColumn<{
407
- name: "timestamp";
408
- tableName: "analytics_price_history";
409
- dataType: "date";
410
- columnType: "PgTimestamp";
411
- data: Date;
412
- driverParam: string;
413
- notNull: true;
414
- hasDefault: false;
415
- isPrimaryKey: false;
416
- isAutoincrement: false;
417
- hasRuntimeDefault: false;
418
- enumValues: undefined;
419
- baseColumn: never;
420
- identity: undefined;
421
- generated: undefined;
422
- }, {}, {}>;
423
- price: import("drizzle-orm/pg-core").PgColumn<{
424
- name: "price";
425
- tableName: "analytics_price_history";
426
- dataType: "string";
427
- columnType: "PgNumeric";
428
- data: string;
429
- driverParam: string;
430
- notNull: true;
431
- hasDefault: false;
432
- isPrimaryKey: false;
433
- isAutoincrement: false;
434
- hasRuntimeDefault: false;
435
- enumValues: undefined;
436
- baseColumn: never;
437
- identity: undefined;
438
- generated: undefined;
439
- }, {}, {}>;
440
- };
441
- dialect: "pg";
442
- }>;
443
- export declare const analyticsSignals: import("drizzle-orm/pg-core").PgTableWithColumns<{
444
- name: "analytics_signals";
445
- schema: undefined;
446
- columns: {
447
- id: import("drizzle-orm/pg-core").PgColumn<{
448
- name: "id";
449
- tableName: "analytics_signals";
450
- dataType: "string";
451
- columnType: "PgUUID";
452
- data: string;
453
- driverParam: string;
454
- notNull: true;
455
- hasDefault: true;
456
- isPrimaryKey: true;
457
- isAutoincrement: false;
458
- hasRuntimeDefault: false;
459
- enumValues: undefined;
460
- baseColumn: never;
461
- identity: undefined;
462
- generated: undefined;
463
- }, {}, {}>;
464
- articleId: import("drizzle-orm/pg-core").PgColumn<{
465
- name: "article_id";
466
- tableName: "analytics_signals";
467
- dataType: "string";
468
- columnType: "PgUUID";
469
- data: string;
470
- driverParam: string;
471
- notNull: false;
472
- hasDefault: false;
473
- isPrimaryKey: false;
474
- isAutoincrement: false;
475
- hasRuntimeDefault: false;
476
- enumValues: undefined;
477
- baseColumn: never;
478
- identity: undefined;
479
- generated: undefined;
480
- }, {}, {}>;
481
- marketId: import("drizzle-orm/pg-core").PgColumn<{
482
- name: "market_id";
483
- tableName: "analytics_signals";
484
- dataType: "string";
485
- columnType: "PgUUID";
486
- data: string;
487
- driverParam: string;
488
- notNull: false;
489
- hasDefault: false;
490
- isPrimaryKey: false;
491
- isAutoincrement: false;
492
- hasRuntimeDefault: false;
493
- enumValues: undefined;
494
- baseColumn: never;
495
- identity: undefined;
496
- generated: undefined;
497
- }, {}, {}>;
498
- similarityScore: import("drizzle-orm/pg-core").PgColumn<{
499
- name: "similarity_score";
500
- tableName: "analytics_signals";
501
- dataType: "string";
502
- columnType: "PgNumeric";
503
- data: string;
504
- driverParam: string;
505
- notNull: false;
506
- hasDefault: false;
507
- isPrimaryKey: false;
508
- isAutoincrement: false;
509
- hasRuntimeDefault: false;
510
- enumValues: undefined;
511
- baseColumn: never;
512
- identity: undefined;
513
- generated: undefined;
514
- }, {}, {}>;
515
- timeDeltaHours: import("drizzle-orm/pg-core").PgColumn<{
516
- name: "time_delta_hours";
517
- tableName: "analytics_signals";
518
- dataType: "number";
519
- columnType: "PgInteger";
520
- data: number;
521
- driverParam: string | number;
522
- notNull: false;
523
- hasDefault: false;
524
- isPrimaryKey: false;
525
- isAutoincrement: false;
526
- hasRuntimeDefault: false;
527
- enumValues: undefined;
528
- baseColumn: never;
529
- identity: undefined;
530
- generated: undefined;
531
- }, {}, {}>;
532
- priceAtPublish: import("drizzle-orm/pg-core").PgColumn<{
533
- name: "price_at_publish";
534
- tableName: "analytics_signals";
535
- dataType: "string";
536
- columnType: "PgNumeric";
537
- data: string;
538
- driverParam: string;
539
- notNull: false;
540
- hasDefault: false;
541
- isPrimaryKey: false;
542
- isAutoincrement: false;
543
- hasRuntimeDefault: false;
544
- enumValues: undefined;
545
- baseColumn: never;
546
- identity: undefined;
547
- generated: undefined;
548
- }, {}, {}>;
549
- priceAtResolution: import("drizzle-orm/pg-core").PgColumn<{
550
- name: "price_at_resolution";
551
- tableName: "analytics_signals";
552
- dataType: "string";
553
- columnType: "PgNumeric";
554
- data: string;
555
- driverParam: string;
556
- notNull: false;
557
- hasDefault: false;
558
- isPrimaryKey: false;
559
- isAutoincrement: false;
560
- hasRuntimeDefault: false;
561
- enumValues: undefined;
562
- baseColumn: never;
563
- identity: undefined;
564
- generated: undefined;
565
- }, {}, {}>;
566
- signalQuality: import("drizzle-orm/pg-core").PgColumn<{
567
- name: "signal_quality";
568
- tableName: "analytics_signals";
569
- dataType: "string";
570
- columnType: "PgText";
571
- data: string;
572
- driverParam: string;
573
- notNull: false;
574
- hasDefault: false;
575
- isPrimaryKey: false;
576
- isAutoincrement: false;
577
- hasRuntimeDefault: false;
578
- enumValues: [string, ...string[]];
579
- baseColumn: never;
580
- identity: undefined;
581
- generated: undefined;
582
- }, {}, {}>;
583
- createdAt: import("drizzle-orm/pg-core").PgColumn<{
584
- name: "created_at";
585
- tableName: "analytics_signals";
586
- dataType: "date";
587
- columnType: "PgTimestamp";
588
- data: Date;
589
- driverParam: string;
590
- notNull: false;
591
- hasDefault: true;
592
- isPrimaryKey: false;
593
- isAutoincrement: false;
594
- hasRuntimeDefault: false;
595
- enumValues: undefined;
596
- baseColumn: never;
597
- identity: undefined;
598
- generated: undefined;
599
- }, {}, {}>;
600
- };
601
- dialect: "pg";
602
- }>;
603
- //# sourceMappingURL=analytics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/schema/analytics.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqB7B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB5B,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYjC,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU3B,CAAC"}
@@ -1,55 +0,0 @@
1
- import { pgTable, uuid, text, timestamp, numeric, integer, jsonb, index, primaryKey, } from "drizzle-orm/pg-core";
2
- import { vector } from "drizzle-orm/pg-core";
3
- // Note: search_vector (tsvector GENERATED ALWAYS AS) is added via raw SQL in the migration
4
- // because Drizzle does not support generated tsvector columns natively.
5
- export const analyticsArticles = pgTable("analytics_articles", {
6
- id: uuid("id").primaryKey().defaultRandom(),
7
- title: text("title").notNull(),
8
- content: text("content").notNull(),
9
- publishedAt: timestamp("published_at", { withTimezone: true }).notNull(),
10
- source: text("source"),
11
- sourceUrl: text("source_url"),
12
- tags: text("tags").array(),
13
- embedding: vector("embedding", { dimensions: 768 }),
14
- }, (table) => ({
15
- embeddingIdx: index("analytics_articles_embedding_idx").using("hnsw", table.embedding.op("vector_cosine_ops")),
16
- publishedAtIdx: index("analytics_articles_published_at_idx").on(table.publishedAt),
17
- }));
18
- export const analyticsMarkets = pgTable("analytics_markets", {
19
- id: uuid("id").primaryKey().defaultRandom(),
20
- externalId: text("external_id").unique(),
21
- question: text("question").notNull(),
22
- description: text("description"),
23
- category: text("category"),
24
- outcome: text("outcome"),
25
- outcomePrices: jsonb("outcome_prices"),
26
- closedAt: timestamp("closed_at", { withTimezone: true }),
27
- createdAt: timestamp("created_at", { withTimezone: true }),
28
- volumeTotal: numeric("volume_total"),
29
- clobTokenId: text("clob_token_id"),
30
- embedding: vector("embedding", { dimensions: 768 }),
31
- }, (table) => ({
32
- embeddingIdx: index("analytics_markets_embedding_idx").using("hnsw", table.embedding.op("vector_cosine_ops")),
33
- closedAtIdx: index("analytics_markets_closed_at_idx").on(table.closedAt),
34
- }));
35
- export const analyticsPriceHistory = pgTable("analytics_price_history", {
36
- marketId: uuid("market_id")
37
- .notNull()
38
- .references(() => analyticsMarkets.id),
39
- timestamp: timestamp("timestamp", { withTimezone: true }).notNull(),
40
- price: numeric("price").notNull(),
41
- }, (table) => ({
42
- pk: primaryKey({ columns: [table.marketId, table.timestamp] }),
43
- }));
44
- export const analyticsSignals = pgTable("analytics_signals", {
45
- id: uuid("id").primaryKey().defaultRandom(),
46
- articleId: uuid("article_id").references(() => analyticsArticles.id),
47
- marketId: uuid("market_id").references(() => analyticsMarkets.id),
48
- similarityScore: numeric("similarity_score"),
49
- timeDeltaHours: integer("time_delta_hours"),
50
- priceAtPublish: numeric("price_at_publish"),
51
- priceAtResolution: numeric("price_at_resolution"),
52
- signalQuality: text("signal_quality"),
53
- createdAt: timestamp("created_at", { withTimezone: true }).defaultNow(),
54
- });
55
- //# sourceMappingURL=analytics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/schema/analytics.ts"],"names":[],"mappings":"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"}