mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-21 08:22:20 +02:00
feat: add opt-in chat provider and data foundation (#13100)
Add dormant provider contracts, qualified patched adapters, tenant-scoped persistence and lifecycle ownership without activating chat routes. Preserve the experimental integration as dependent PR #13038. Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
1 parent
7d84b183fb
commit
6abeb67334
143 files changed
+789391
-162
No files matched your search
@@ -5,6 +5,8 @@ import { execFileSync } from "node:child_process";
|
||||
import { randomUUID } from "node:crypto";
|
||||
import { createServer } from "node:net";
|
||||
import { eq } from "drizzle-orm";
|
||||
import { drizzle } from "drizzle-orm/postgres-js";
|
||||
import { migrate } from "drizzle-orm/postgres-js/migrator";
|
||||
import { afterEach, describe, expect, it, onTestFinished, vi } from "vitest";
|
||||
import {
|
||||
agents,
|
||||
@@ -13,6 +15,8 @@ import {
|
||||
companies,
|
||||
companyMemberships,
|
||||
createDb,
|
||||
closeRegisteredClients,
|
||||
ensurePostgresDatabase,
|
||||
executionWorkspaces,
|
||||
inspectMigrations,
|
||||
issueComments,
|
||||
@@ -1644,17 +1648,32 @@ describe("worktree helpers", () => {
|
||||
const sourceEnvPath = path.join(sourceConfigDir, ".env");
|
||||
const sourceKeyPath = path.join(sourceConfigDir, "secrets", "master.key");
|
||||
const worktreeHome = path.join(tempRoot, ".paperclip-worktrees");
|
||||
const sourceDb = await startEmbeddedPostgresTestDatabase("paperclip-worktree-auth-source-");
|
||||
onTestFinished(() => sourceDb.cleanup());
|
||||
|
||||
await seedValidWorktreeSource(sourceDb.connectionString);
|
||||
const sourceCluster = await startEmbeddedPostgresTestDatabase("paperclip-worktree-auth-source-");
|
||||
const sourceUrl = new URL(sourceCluster.connectionString);
|
||||
sourceUrl.pathname = "/lagging_source";
|
||||
const sourceDb = { connectionString: sourceUrl.toString() };
|
||||
onTestFinished(async () => {
|
||||
await closeRegisteredClients(sourceDb.connectionString);
|
||||
await sourceCluster.cleanup();
|
||||
});
|
||||
await ensurePostgresDatabase(sourceCluster.connectionString, "lagging_source");
|
||||
// A lagging source must also have the prior schema. Deleting only the
|
||||
// newest receipt from a fully migrated schema relied on that particular
|
||||
// migration being idempotent and breaks when the new migration creates a
|
||||
// table. Build the actual all-but-last schema before shuffling its history.
|
||||
const migrationsRoot = new URL("../../../packages/db/src/migrations/", import.meta.url);
|
||||
const journal = JSON.parse(fs.readFileSync(new URL("meta/_journal.json", migrationsRoot), "utf8"));
|
||||
const priorEntries = journal.entries.slice(0, -1);
|
||||
const priorMigrations = path.join(tempRoot, "prior-migrations");
|
||||
fs.mkdirSync(path.join(priorMigrations, "meta"), { recursive: true });
|
||||
fs.writeFileSync(path.join(priorMigrations, "meta", "_journal.json"), JSON.stringify({ ...journal, entries: priorEntries }));
|
||||
for (const entry of priorEntries) {
|
||||
fs.copyFileSync(new URL(`${entry.tag}.sql`, migrationsRoot), path.join(priorMigrations, `${entry.tag}.sql`));
|
||||
}
|
||||
const sourceDbClient = createDb(sourceDb.connectionString);
|
||||
await migrate(drizzle(sourceDbClient.$client), { migrationsFolder: priorMigrations });
|
||||
await seedValidWorktreeSource(sourceDb.connectionString);
|
||||
await sourceDbClient.$client.unsafe(`
|
||||
DELETE FROM "drizzle"."__drizzle_migrations"
|
||||
WHERE "id" = (
|
||||
SELECT max("id") FROM "drizzle"."__drizzle_migrations"
|
||||
);
|
||||
|
||||
WITH pair AS (
|
||||
SELECT
|
||||
array_agg("id" ORDER BY "id" DESC) AS ids,
|
||||
|
||||
Reference in new issue
Block a user