@tickernelz/wardmote-db 2026.1112.1 → 2026.1114.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.
- package/dist/backup-lib.d.ts.map +1 -1
- package/dist/backup-lib.js +10 -7
- package/dist/backup-lib.js.map +1 -1
- package/dist/backup-lib.test.js +43 -32
- package/dist/backup-lib.test.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +14 -4
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +1 -1
- package/dist/heartbeat-run-issue-privacy-migration.test.js +1 -1
- package/dist/heartbeat-run-issue-privacy-migration.test.js.map +1 -1
- package/dist/migration-lock.test.d.ts +2 -0
- package/dist/migration-lock.test.d.ts.map +1 -0
- package/dist/migration-lock.test.js +37 -0
- package/dist/migration-lock.test.js.map +1 -0
- package/dist/migrations/0374_wardmote_runner_question_key.sql +3 -0
- package/dist/migrations/0375_wardmote_railway_tool_names.sql +8 -0
- package/dist/migrations/0376_wardmote_ai_model_prefix.sql +11 -0
- package/dist/migrations/0377_wardmote_managed_archive_token.sql +8 -0
- package/dist/migrations/0378_wardmote_tool_template_keys.sql +82 -0
- package/dist/migrations/0379_wardmote_tool_selector_names.sql +84 -0
- package/dist/migrations/0380_wardmote_self_tool_names.sql +16 -0
- package/dist/migrations/0381_wardmote_plugin_skill_keys.sql +73 -0
- package/dist/migrations/0382_wardmote_work_product_provider.sql +6 -0
- package/dist/migrations/0383_wardmote_feedback_versions.sql +3 -0
- package/dist/migrations/0384_wardmote_stored_keys.sql +21 -0
- package/dist/migrations/0385_wardmote_package_metadata.sql +12 -0
- package/dist/migrations/0386_wardmote_acpx_permission_mode.sql +9 -0
- package/dist/migrations/0387_wardmote_omp_session_dir.sql +7 -0
- package/dist/migrations/0388_wardmote_identity_link_user_column.sql +8 -0
- package/dist/migrations/meta/_journal.json +105 -0
- package/dist/nested-skill-folders-migration.test.js +1 -1
- package/dist/nested-skill-folders-migration.test.js.map +1 -1
- package/dist/retired-backup-names.d.ts +3 -0
- package/dist/retired-backup-names.d.ts.map +1 -0
- package/dist/retired-backup-names.js +3 -0
- package/dist/retired-backup-names.js.map +1 -0
- package/dist/retired-migration-lock.d.ts +2 -0
- package/dist/retired-migration-lock.d.ts.map +1 -0
- package/dist/retired-migration-lock.js +2 -0
- package/dist/retired-migration-lock.js.map +1 -0
- package/dist/runtime-config.d.ts +1 -1
- package/dist/runtime-config.d.ts.map +1 -1
- package/dist/runtime-config.js +1 -1
- package/dist/runtime-config.js.map +1 -1
- package/dist/runtime-config.test.js +5 -5
- package/dist/runtime-config.test.js.map +1 -1
- package/dist/schema/agent_api_keys.d.ts +4 -4
- package/dist/schema/chat_channels.d.ts +1 -1
- package/dist/schema/chat_channels.js +1 -1
- package/dist/schema/chat_channels.js.map +1 -1
- package/dist/schema/feedback_exports.js +3 -3
- package/dist/schema/feedback_exports.js.map +1 -1
- package/dist/wardmote-acpx-permission-mode-migration.test.d.ts +2 -0
- package/dist/wardmote-acpx-permission-mode-migration.test.d.ts.map +1 -0
- package/dist/wardmote-acpx-permission-mode-migration.test.js +60 -0
- package/dist/wardmote-acpx-permission-mode-migration.test.js.map +1 -0
- package/dist/wardmote-ai-model-prefix-migration.test.d.ts +2 -0
- package/dist/wardmote-ai-model-prefix-migration.test.d.ts.map +1 -0
- package/dist/wardmote-ai-model-prefix-migration.test.js +58 -0
- package/dist/wardmote-ai-model-prefix-migration.test.js.map +1 -0
- package/dist/wardmote-feedback-versions-migration.test.d.ts +2 -0
- package/dist/wardmote-feedback-versions-migration.test.d.ts.map +1 -0
- package/dist/wardmote-feedback-versions-migration.test.js +43 -0
- package/dist/wardmote-feedback-versions-migration.test.js.map +1 -0
- package/dist/wardmote-identity-link-user-column-migration.test.d.ts +2 -0
- package/dist/wardmote-identity-link-user-column-migration.test.d.ts.map +1 -0
- package/dist/wardmote-identity-link-user-column-migration.test.js +40 -0
- package/dist/wardmote-identity-link-user-column-migration.test.js.map +1 -0
- package/dist/wardmote-managed-archive-token-migration.test.d.ts +2 -0
- package/dist/wardmote-managed-archive-token-migration.test.d.ts.map +1 -0
- package/dist/wardmote-managed-archive-token-migration.test.js +64 -0
- package/dist/wardmote-managed-archive-token-migration.test.js.map +1 -0
- package/dist/wardmote-omp-session-dir-migration.test.d.ts +2 -0
- package/dist/wardmote-omp-session-dir-migration.test.d.ts.map +1 -0
- package/dist/wardmote-omp-session-dir-migration.test.js +49 -0
- package/dist/wardmote-omp-session-dir-migration.test.js.map +1 -0
- package/dist/wardmote-package-metadata-migration.test.d.ts +2 -0
- package/dist/wardmote-package-metadata-migration.test.d.ts.map +1 -0
- package/dist/wardmote-package-metadata-migration.test.js +64 -0
- package/dist/wardmote-package-metadata-migration.test.js.map +1 -0
- package/dist/wardmote-plugin-skill-keys-migration.test.d.ts +2 -0
- package/dist/wardmote-plugin-skill-keys-migration.test.d.ts.map +1 -0
- package/dist/wardmote-plugin-skill-keys-migration.test.js +88 -0
- package/dist/wardmote-plugin-skill-keys-migration.test.js.map +1 -0
- package/dist/wardmote-railway-tool-names-migration.test.d.ts +2 -0
- package/dist/wardmote-railway-tool-names-migration.test.d.ts.map +1 -0
- package/dist/wardmote-railway-tool-names-migration.test.js +63 -0
- package/dist/wardmote-railway-tool-names-migration.test.js.map +1 -0
- package/dist/wardmote-runner-question-key-migration.test.d.ts +2 -0
- package/dist/wardmote-runner-question-key-migration.test.d.ts.map +1 -0
- package/dist/wardmote-runner-question-key-migration.test.js +54 -0
- package/dist/wardmote-runner-question-key-migration.test.js.map +1 -0
- package/dist/wardmote-self-tool-names-migration.test.d.ts +2 -0
- package/dist/wardmote-self-tool-names-migration.test.d.ts.map +1 -0
- package/dist/wardmote-self-tool-names-migration.test.js +67 -0
- package/dist/wardmote-self-tool-names-migration.test.js.map +1 -0
- package/dist/wardmote-stored-keys-migration.test.d.ts +2 -0
- package/dist/wardmote-stored-keys-migration.test.d.ts.map +1 -0
- package/dist/wardmote-stored-keys-migration.test.js +69 -0
- package/dist/wardmote-stored-keys-migration.test.js.map +1 -0
- package/dist/wardmote-tool-selector-names-migration.test.d.ts +2 -0
- package/dist/wardmote-tool-selector-names-migration.test.d.ts.map +1 -0
- package/dist/wardmote-tool-selector-names-migration.test.js +91 -0
- package/dist/wardmote-tool-selector-names-migration.test.js.map +1 -0
- package/dist/wardmote-tool-template-keys-migration.test.d.ts +2 -0
- package/dist/wardmote-tool-template-keys-migration.test.d.ts.map +1 -0
- package/dist/wardmote-tool-template-keys-migration.test.js +117 -0
- package/dist/wardmote-tool-template-keys-migration.test.js.map +1 -0
- package/dist/wardmote-work-product-provider-migration.test.d.ts +2 -0
- package/dist/wardmote-work-product-provider-migration.test.d.ts.map +1 -0
- package/dist/wardmote-work-product-provider-migration.test.js +65 -0
- package/dist/wardmote-work-product-provider-migration.test.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
+
import postgres from "postgres";
|
|
5
|
+
import { applyPendingMigrations } from "./client.js";
|
|
6
|
+
import { EMBEDDED_POSTGRES_TEST_TIMEOUT_MS, getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase, } from "./test-embedded-postgres.js";
|
|
7
|
+
const MIGRATION_FILE = "0377_wardmote_managed_archive_token.sql";
|
|
8
|
+
const RETIRED_KEY = "_paperclipManagedArchiveToken";
|
|
9
|
+
const cleanups = [];
|
|
10
|
+
const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport();
|
|
11
|
+
const describeEmbeddedPostgres = embeddedPostgresSupport.supported ? describe : describe.skip;
|
|
12
|
+
async function migrationHash() {
|
|
13
|
+
const content = await fs.promises.readFile(new URL(`./migrations/${MIGRATION_FILE}`, import.meta.url), "utf8");
|
|
14
|
+
return createHash("sha256").update(content).digest("hex");
|
|
15
|
+
}
|
|
16
|
+
describeEmbeddedPostgres("wardmote managed archive token migration", () => {
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await Promise.all(cleanups.splice(0).map((cleanup) => cleanup()));
|
|
19
|
+
});
|
|
20
|
+
it("moves the archive token to the new key and leaves other metadata", async () => {
|
|
21
|
+
const database = await startEmbeddedPostgresTestDatabase("wardmote-managed-archive-token-migration-");
|
|
22
|
+
cleanups.push(database.cleanup);
|
|
23
|
+
const sql = postgres(database.connectionString, { max: 1, onnotice: () => { } });
|
|
24
|
+
cleanups.push(async () => sql.end());
|
|
25
|
+
const companyId = randomUUID();
|
|
26
|
+
const archived = randomUUID();
|
|
27
|
+
const active = randomUUID();
|
|
28
|
+
const bare = randomUUID();
|
|
29
|
+
const archivedBinding = randomUUID();
|
|
30
|
+
const activeBinding = randomUUID();
|
|
31
|
+
await sql `SET session_replication_role = replica`;
|
|
32
|
+
await sql `
|
|
33
|
+
INSERT INTO "environments" ("id", "name", "driver", "status", "metadata")
|
|
34
|
+
VALUES
|
|
35
|
+
(${archived}, 'archived', 'sandbox', 'archived', ${sql.json({ managedByWardmote: true, [RETIRED_KEY]: "token-1" })}),
|
|
36
|
+
(${active}, 'active', 'ssh', 'active', ${sql.json({ owner: "operator" })}),
|
|
37
|
+
(${bare}, 'bare', 'ssh', 'active', NULL)
|
|
38
|
+
`;
|
|
39
|
+
await sql `
|
|
40
|
+
INSERT INTO "built_in_managed_resources" ("id", "company_id", "bundle_key", "resource_kind", "resource_key", "resource_id", "stock_version", "stock_hash", "defaults_json")
|
|
41
|
+
VALUES
|
|
42
|
+
(${archivedBinding}, ${companyId}, 'managed-environment', 'environment', 'managed-sandbox', ${archived}, 'v1', 'h1', ${sql.json({ status: "archived", [RETIRED_KEY]: "token-1" })}),
|
|
43
|
+
(${activeBinding}, ${companyId}, 'managed-environment', 'environment', 'operator-sandbox', ${active}, 'v1', 'h2', ${sql.json({ status: "active" })})
|
|
44
|
+
`;
|
|
45
|
+
await sql `SET session_replication_role = DEFAULT`;
|
|
46
|
+
const hash = await migrationHash();
|
|
47
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
48
|
+
await applyPendingMigrations(database.connectionString);
|
|
49
|
+
const snapshot = async () => ({
|
|
50
|
+
environments: new Map((await sql `SELECT "id", "metadata" FROM "environments" WHERE "id" IN ${sql([archived, active, bare])}`).map((row) => [row.id, row.metadata])),
|
|
51
|
+
bindings: new Map((await sql `SELECT "id", "defaults_json" FROM "built_in_managed_resources" WHERE "company_id" = ${companyId}`).map((row) => [row.id, row.defaults_json])),
|
|
52
|
+
});
|
|
53
|
+
const after = await snapshot();
|
|
54
|
+
expect(after.environments.get(archived)).toEqual({ managedByWardmote: true, _wardmoteManagedArchiveToken: "token-1" });
|
|
55
|
+
expect(after.environments.get(active)).toEqual({ owner: "operator" });
|
|
56
|
+
expect(after.environments.get(bare)).toBeNull();
|
|
57
|
+
expect(after.bindings.get(archivedBinding)).toEqual({ status: "archived", _wardmoteManagedArchiveToken: "token-1" });
|
|
58
|
+
expect(after.bindings.get(activeBinding)).toEqual({ status: "active" });
|
|
59
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
60
|
+
await applyPendingMigrations(database.connectionString);
|
|
61
|
+
expect(await snapshot()).toEqual(after);
|
|
62
|
+
}, EMBEDDED_POSTGRES_TEST_TIMEOUT_MS);
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=wardmote-managed-archive-token-migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-managed-archive-token-migration.test.js","sourceRoot":"","sources":["../src/wardmote-managed-archive-token-migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-omp-session-dir-migration.test.d.ts","sourceRoot":"","sources":["../src/wardmote-omp-session-dir-migration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
+
import postgres from "postgres";
|
|
5
|
+
import { applyPendingMigrations } from "./client.js";
|
|
6
|
+
import { EMBEDDED_POSTGRES_TEST_TIMEOUT_MS, getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase, } from "./test-embedded-postgres.js";
|
|
7
|
+
const MIGRATION_FILE = "0387_wardmote_omp_session_dir.sql";
|
|
8
|
+
const RETIRED_ROOT = ["/home/operator/.omp", "paperclip", "sessions"].join("/");
|
|
9
|
+
const cleanups = [];
|
|
10
|
+
const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport();
|
|
11
|
+
const describeEmbeddedPostgres = embeddedPostgresSupport.supported ? describe : describe.skip;
|
|
12
|
+
async function migrationHash() {
|
|
13
|
+
const content = await fs.promises.readFile(new URL(`./migrations/${MIGRATION_FILE}`, import.meta.url), "utf8");
|
|
14
|
+
return createHash("sha256").update(content).digest("hex");
|
|
15
|
+
}
|
|
16
|
+
describeEmbeddedPostgres("wardmote OMP session directory migration", () => {
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await Promise.all(cleanups.splice(0).map((cleanup) => cleanup()));
|
|
19
|
+
});
|
|
20
|
+
it("moves stored default OMP session directories to the Wardmote root and keeps other directories", async () => {
|
|
21
|
+
const database = await startEmbeddedPostgresTestDatabase("wardmote-omp-session-dir-migration-");
|
|
22
|
+
cleanups.push(database.cleanup);
|
|
23
|
+
const sql = postgres(database.connectionString, { max: 1, onnotice: () => { } });
|
|
24
|
+
cleanups.push(async () => sql.end());
|
|
25
|
+
const companyId = randomUUID();
|
|
26
|
+
const agentId = randomUUID();
|
|
27
|
+
const retired = randomUUID();
|
|
28
|
+
const custom = randomUUID();
|
|
29
|
+
await sql `SET session_replication_role = replica`;
|
|
30
|
+
await sql `
|
|
31
|
+
INSERT INTO "agent_task_sessions" ("id", "company_id", "agent_id", "adapter_type", "task_key", "session_params_json")
|
|
32
|
+
VALUES
|
|
33
|
+
(${retired}, ${companyId}, ${agentId}, 'omp_local', 'a', ${sql.json({ sessionId: "s1", sessionDir: `${RETIRED_ROOT}/${agentId}`, cwd: "/work" })}),
|
|
34
|
+
(${custom}, ${companyId}, ${agentId}, 'omp_local', 'b', ${sql.json({ sessionId: "s2", sessionDir: "/srv/omp-sessions/agent" })})
|
|
35
|
+
`;
|
|
36
|
+
await sql `SET session_replication_role = DEFAULT`;
|
|
37
|
+
const hash = await migrationHash();
|
|
38
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
39
|
+
await applyPendingMigrations(database.connectionString);
|
|
40
|
+
const rows = async () => Object.fromEntries((await sql `SELECT "id", "session_params_json" FROM "agent_task_sessions" WHERE "company_id" = ${companyId}`).map((row) => [row.id, row.session_params_json]));
|
|
41
|
+
const after = await rows();
|
|
42
|
+
expect(after[retired]).toEqual({ sessionId: "s1", sessionDir: `/home/operator/.omp/wardmote/sessions/${agentId}`, cwd: "/work" });
|
|
43
|
+
expect(after[custom]).toEqual({ sessionId: "s2", sessionDir: "/srv/omp-sessions/agent" });
|
|
44
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
45
|
+
await applyPendingMigrations(database.connectionString);
|
|
46
|
+
expect(await rows()).toEqual(after);
|
|
47
|
+
}, EMBEDDED_POSTGRES_TEST_TIMEOUT_MS);
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=wardmote-omp-session-dir-migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-omp-session-dir-migration.test.js","sourceRoot":"","sources":["../src/wardmote-omp-session-dir-migration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,6BAA6B,CAAC;AAErC,MAAM,cAAc,GAAG,mCAAmC,CAAC;AAC3D,MAAM,YAAY,GAAG,CAAC,qBAAqB,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChF,MAAM,QAAQ,GAA+B,EAAE,CAAC;AAChD,MAAM,uBAAuB,GAAG,MAAM,8BAA8B,EAAE,CAAC;AACvE,MAAM,wBAAwB,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAE9F,KAAK,UAAU,aAAa;IAC1B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,gBAAgB,cAAc,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/G,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,wBAAwB,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxE,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC7G,MAAM,QAAQ,GAAG,MAAM,iCAAiC,CAAC,qCAAqC,CAAC,CAAC;QAChG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;QAChF,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAErC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,CAAA,wCAAwC,CAAC;QAClD,MAAM,GAAG,CAAA;;;WAGF,OAAO,KAAK,SAAS,KAAK,OAAO,uBAAuB,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,YAAY,IAAI,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;WAC7I,MAAM,KAAK,SAAS,KAAK,OAAO,uBAAuB,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,yBAAyB,EAAE,CAAC;KACjI,CAAC;QACF,MAAM,GAAG,CAAA,wCAAwC,CAAC;QAElD,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;QACnC,MAAM,GAAG,CAAA,+DAA+D,IAAI,EAAE,CAAC;QAC/E,MAAM,sBAAsB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAA,sFAAsF,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC1M,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,yCAAyC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAClI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAE1F,MAAM,GAAG,CAAA,+DAA+D,IAAI,EAAE,CAAC;QAC/E,MAAM,sBAAsB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,EAAE,iCAAiC,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-package-metadata-migration.test.d.ts","sourceRoot":"","sources":["../src/wardmote-package-metadata-migration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
+
import postgres from "postgres";
|
|
5
|
+
import { applyPendingMigrations } from "./client.js";
|
|
6
|
+
import { EMBEDDED_POSTGRES_TEST_TIMEOUT_MS, getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase, } from "./test-embedded-postgres.js";
|
|
7
|
+
const MIGRATION_FILE = "0385_wardmote_package_metadata.sql";
|
|
8
|
+
const RETIRED_KEY = "paperclip";
|
|
9
|
+
const cleanups = [];
|
|
10
|
+
const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport();
|
|
11
|
+
const describeEmbeddedPostgres = embeddedPostgresSupport.supported ? describe : describe.skip;
|
|
12
|
+
async function migrationHash() {
|
|
13
|
+
const content = await fs.promises.readFile(new URL(`./migrations/${MIGRATION_FILE}`, import.meta.url), "utf8");
|
|
14
|
+
return createHash("sha256").update(content).digest("hex");
|
|
15
|
+
}
|
|
16
|
+
describeEmbeddedPostgres("wardmote package metadata migration", () => {
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await Promise.all(cleanups.splice(0).map((cleanup) => cleanup()));
|
|
19
|
+
});
|
|
20
|
+
it("moves the catalog metadata block of agents and skills to the wardmote key", async () => {
|
|
21
|
+
const database = await startEmbeddedPostgresTestDatabase("wardmote-package-metadata-migration-");
|
|
22
|
+
cleanups.push(database.cleanup);
|
|
23
|
+
const sql = postgres(database.connectionString, { max: 1, onnotice: () => { } });
|
|
24
|
+
cleanups.push(async () => sql.end());
|
|
25
|
+
const companyId = randomUUID();
|
|
26
|
+
const catalogAgent = randomUUID();
|
|
27
|
+
const bothAgent = randomUUID();
|
|
28
|
+
const plainAgent = randomUUID();
|
|
29
|
+
const catalogSkill = randomUUID();
|
|
30
|
+
const plainSkill = randomUUID();
|
|
31
|
+
await sql `SET session_replication_role = replica`;
|
|
32
|
+
await sql `
|
|
33
|
+
INSERT INTO "agents" ("id", "company_id", "name", "metadata")
|
|
34
|
+
VALUES
|
|
35
|
+
(${catalogAgent}, ${companyId}, 'catalog', ${sql.json({ [RETIRED_KEY]: { catalogTeam: { teamId: "team-a" } }, note: "kept" })}),
|
|
36
|
+
(${bothAgent}, ${companyId}, 'both', ${sql.json({ [RETIRED_KEY]: { catalogTeam: { teamId: "old" } }, wardmote: { catalogTeam: { teamId: "new" } } })}),
|
|
37
|
+
(${plainAgent}, ${companyId}, 'plain', ${sql.json({ note: "plain" })})
|
|
38
|
+
`;
|
|
39
|
+
await sql `
|
|
40
|
+
INSERT INTO "company_skills" ("id", "company_id", "key", "slug", "name", "markdown", "metadata")
|
|
41
|
+
VALUES
|
|
42
|
+
(${catalogSkill}, ${companyId}, 'team/review', 'review', 'review', '# review', ${sql.json({ [RETIRED_KEY]: { catalog: { sourceRef: "sha256:abc" } } })}),
|
|
43
|
+
(${plainSkill}, ${companyId}, 'team/plain', 'plain', 'plain', '# plain', ${sql.json({ sourceKind: "local" })})
|
|
44
|
+
`;
|
|
45
|
+
await sql `SET session_replication_role = DEFAULT`;
|
|
46
|
+
const hash = await migrationHash();
|
|
47
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
48
|
+
await applyPendingMigrations(database.connectionString);
|
|
49
|
+
const snapshot = async () => ({
|
|
50
|
+
agents: Object.fromEntries((await sql `SELECT "id", "metadata" FROM "agents" WHERE "company_id" = ${companyId}`).map((row) => [row.id, row.metadata])),
|
|
51
|
+
skills: Object.fromEntries((await sql `SELECT "id", "metadata" FROM "company_skills" WHERE "company_id" = ${companyId}`).map((row) => [row.id, row.metadata])),
|
|
52
|
+
});
|
|
53
|
+
const after = await snapshot();
|
|
54
|
+
expect(after.agents[catalogAgent]).toEqual({ wardmote: { catalogTeam: { teamId: "team-a" } }, note: "kept" });
|
|
55
|
+
expect(after.agents[bothAgent]).toEqual({ wardmote: { catalogTeam: { teamId: "new" } } });
|
|
56
|
+
expect(after.agents[plainAgent]).toEqual({ note: "plain" });
|
|
57
|
+
expect(after.skills[catalogSkill]).toEqual({ wardmote: { catalog: { sourceRef: "sha256:abc" } } });
|
|
58
|
+
expect(after.skills[plainSkill]).toEqual({ sourceKind: "local" });
|
|
59
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
60
|
+
await applyPendingMigrations(database.connectionString);
|
|
61
|
+
expect(await snapshot()).toEqual(after);
|
|
62
|
+
}, EMBEDDED_POSTGRES_TEST_TIMEOUT_MS);
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=wardmote-package-metadata-migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-package-metadata-migration.test.js","sourceRoot":"","sources":["../src/wardmote-package-metadata-migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-plugin-skill-keys-migration.test.d.ts","sourceRoot":"","sources":["../src/wardmote-plugin-skill-keys-migration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
+
import postgres from "postgres";
|
|
5
|
+
import { applyPendingMigrations } from "./client.js";
|
|
6
|
+
import { EMBEDDED_POSTGRES_TEST_TIMEOUT_MS, getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase, } from "./test-embedded-postgres.js";
|
|
7
|
+
const MIGRATION_FILE = "0381_wardmote_plugin_skill_keys.sql";
|
|
8
|
+
const RETIRED = "paperclip";
|
|
9
|
+
const OLD_WIKI = `plugin/${RETIRED}ai-plugin-llm-wiki/`;
|
|
10
|
+
const NEW_WIKI = "plugin/wardmote-plugin-llm-wiki/";
|
|
11
|
+
const cleanups = [];
|
|
12
|
+
const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport();
|
|
13
|
+
const describeEmbeddedPostgres = embeddedPostgresSupport.supported ? describe : describe.skip;
|
|
14
|
+
async function migrationHash() {
|
|
15
|
+
const content = await fs.promises.readFile(new URL(`./migrations/${MIGRATION_FILE}`, import.meta.url), "utf8");
|
|
16
|
+
return createHash("sha256").update(content).digest("hex");
|
|
17
|
+
}
|
|
18
|
+
const skillMarkdown = (key) => `---\nname: "Skill"\nkey: "${key}"\n---\n\n# Skill\n`;
|
|
19
|
+
describeEmbeddedPostgres("wardmote plugin skill keys migration", () => {
|
|
20
|
+
afterEach(async () => {
|
|
21
|
+
await Promise.all(cleanups.splice(0).map((cleanup) => cleanup()));
|
|
22
|
+
});
|
|
23
|
+
it("re-keys first-party plugin skills, the distill skill and their references", async () => {
|
|
24
|
+
const database = await startEmbeddedPostgresTestDatabase("wardmote-plugin-skill-keys-migration-");
|
|
25
|
+
cleanups.push(database.cleanup);
|
|
26
|
+
const sql = postgres(database.connectionString, { max: 1, onnotice: () => { } });
|
|
27
|
+
cleanups.push(async () => sql.end());
|
|
28
|
+
const companyId = randomUUID();
|
|
29
|
+
const ingest = randomUUID();
|
|
30
|
+
const distill = randomUUID();
|
|
31
|
+
const sandbox = randomUUID();
|
|
32
|
+
const thirdParty = randomUUID();
|
|
33
|
+
const agent = randomUUID();
|
|
34
|
+
const binding = randomUUID();
|
|
35
|
+
const wikiPluginId = randomUUID();
|
|
36
|
+
const oldDistill = `${OLD_WIKI}${RETIRED}-distill`;
|
|
37
|
+
const thirdPartyKey = `plugin/${RETIRED}-community-notes/notes`;
|
|
38
|
+
await sql `INSERT INTO "companies" ("id", "name", "issue_prefix") VALUES (${companyId}, 'Plugin skills', 'PSK')`;
|
|
39
|
+
await sql `
|
|
40
|
+
INSERT INTO "plugins" ("id", "plugin_key", "package_name", "version", "manifest_json")
|
|
41
|
+
VALUES (${wikiPluginId}, 'wardmote.plugin-llm-wiki', 'wiki', '1.0.0', ${sql.json({ id: "wardmote.plugin-llm-wiki" })})
|
|
42
|
+
`;
|
|
43
|
+
await sql `SET session_replication_role = replica`;
|
|
44
|
+
await sql `
|
|
45
|
+
INSERT INTO "company_skills" ("id", "company_id", "key", "slug", "name", "markdown")
|
|
46
|
+
VALUES
|
|
47
|
+
(${ingest}, ${companyId}, ${`${OLD_WIKI}wiki-ingest`}, 'wiki-ingest', 'Wiki Ingest', ${skillMarkdown(`${OLD_WIKI}wiki-ingest`)}),
|
|
48
|
+
(${distill}, ${companyId}, ${oldDistill}, ${`${RETIRED}-distill`}, 'Distill', ${skillMarkdown(oldDistill)}),
|
|
49
|
+
(${sandbox}, ${companyId}, ${`plugin/${RETIRED}-daytona-sandbox-provider/setup`}, 'setup', 'Setup', ${skillMarkdown(`plugin/${RETIRED}-daytona-sandbox-provider/setup`)}),
|
|
50
|
+
(${thirdParty}, ${companyId}, ${thirdPartyKey}, 'notes', 'Notes', ${skillMarkdown(thirdPartyKey)})
|
|
51
|
+
`;
|
|
52
|
+
await sql `
|
|
53
|
+
INSERT INTO "agents" ("id", "company_id", "name", "adapter_type", "adapter_config")
|
|
54
|
+
VALUES (${agent}, ${companyId}, 'Wiki Maintainer', 'omp_local', ${sql.json({ wardmoteSkillSync: { desiredSkills: [`${OLD_WIKI}wiki-ingest`, oldDistill, thirdPartyKey] } })})
|
|
55
|
+
`;
|
|
56
|
+
await sql `
|
|
57
|
+
INSERT INTO "company_skill_policies" ("company_id", "revision", "default_effect", "rules")
|
|
58
|
+
VALUES (${companyId}, 1, 'allow', ${sql.json([{ effect: "deny", subject: { type: "all_agents" }, resources: { skillKeys: [oldDistill, thirdPartyKey] } }])})
|
|
59
|
+
`;
|
|
60
|
+
await sql `
|
|
61
|
+
INSERT INTO "plugin_managed_resources" ("id", "company_id", "plugin_id", "plugin_key", "resource_kind", "resource_key", "resource_id", "defaults_json")
|
|
62
|
+
VALUES (${binding}, ${companyId}, ${wikiPluginId}, 'wardmote.plugin-llm-wiki', 'skill', ${`${RETIRED}-distill`}, ${distill}, ${sql.json({ skillKey: `${RETIRED}-distill`, slug: `${RETIRED}-distill`, canonicalKey: oldDistill })})
|
|
63
|
+
`;
|
|
64
|
+
await sql `SET session_replication_role = DEFAULT`;
|
|
65
|
+
const hash = await migrationHash();
|
|
66
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
67
|
+
await applyPendingMigrations(database.connectionString);
|
|
68
|
+
const snapshot = async () => ({
|
|
69
|
+
skills: new Map((await sql `SELECT "id", "key", "slug", "markdown" FROM "company_skills" WHERE "company_id" = ${companyId}`).map((row) => [row.id, [row.key, row.slug, row.markdown]])),
|
|
70
|
+
agent: (await sql `SELECT "adapter_config" FROM "agents" WHERE "id" = ${agent}`)[0]?.adapter_config,
|
|
71
|
+
rules: (await sql `SELECT "rules" FROM "company_skill_policies" WHERE "company_id" = ${companyId}`)[0]?.rules,
|
|
72
|
+
binding: (await sql `SELECT "resource_key", "defaults_json" FROM "plugin_managed_resources" WHERE "id" = ${binding}`)[0],
|
|
73
|
+
});
|
|
74
|
+
const after = await snapshot();
|
|
75
|
+
const newDistill = `${NEW_WIKI}wardmote-distill`;
|
|
76
|
+
expect(after.skills.get(ingest)).toEqual([`${NEW_WIKI}wiki-ingest`, "wiki-ingest", skillMarkdown(`${NEW_WIKI}wiki-ingest`)]);
|
|
77
|
+
expect(after.skills.get(distill)).toEqual([newDistill, "wardmote-distill", skillMarkdown(newDistill)]);
|
|
78
|
+
expect(after.skills.get(sandbox)?.[0]).toBe("plugin/wardmote-daytona-sandbox-provider/setup");
|
|
79
|
+
expect(after.skills.get(thirdParty)).toEqual([thirdPartyKey, "notes", skillMarkdown(thirdPartyKey)]);
|
|
80
|
+
expect(after.agent).toEqual({ wardmoteSkillSync: { desiredSkills: [`${NEW_WIKI}wiki-ingest`, newDistill, thirdPartyKey] } });
|
|
81
|
+
expect(after.rules).toEqual([{ effect: "deny", subject: { type: "all_agents" }, resources: { skillKeys: [newDistill, thirdPartyKey] } }]);
|
|
82
|
+
expect(after.binding).toEqual({ resource_key: "wardmote-distill", defaults_json: { skillKey: "wardmote-distill", slug: "wardmote-distill", canonicalKey: newDistill } });
|
|
83
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
84
|
+
await applyPendingMigrations(database.connectionString);
|
|
85
|
+
expect(await snapshot()).toEqual(after);
|
|
86
|
+
}, EMBEDDED_POSTGRES_TEST_TIMEOUT_MS);
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=wardmote-plugin-skill-keys-migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-plugin-skill-keys-migration.test.js","sourceRoot":"","sources":["../src/wardmote-plugin-skill-keys-migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-railway-tool-names-migration.test.d.ts","sourceRoot":"","sources":["../src/wardmote-railway-tool-names-migration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
+
import postgres from "postgres";
|
|
5
|
+
import { applyPendingMigrations } from "./client.js";
|
|
6
|
+
import { EMBEDDED_POSTGRES_TEST_TIMEOUT_MS, getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase, } from "./test-embedded-postgres.js";
|
|
7
|
+
const MIGRATION_FILE = "0375_wardmote_railway_tool_names.sql";
|
|
8
|
+
const RETIRED_PREFIX = "paperclip-railway-";
|
|
9
|
+
const cleanups = [];
|
|
10
|
+
const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport();
|
|
11
|
+
const describeEmbeddedPostgres = embeddedPostgresSupport.supported ? describe : describe.skip;
|
|
12
|
+
async function migrationHash() {
|
|
13
|
+
const content = await fs.promises.readFile(new URL(`./migrations/${MIGRATION_FILE}`, import.meta.url), "utf8");
|
|
14
|
+
return createHash("sha256").update(content).digest("hex");
|
|
15
|
+
}
|
|
16
|
+
describeEmbeddedPostgres("wardmote railway tool name migration", () => {
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await Promise.all(cleanups.splice(0).map((cleanup) => cleanup()));
|
|
19
|
+
});
|
|
20
|
+
it("renames Railway catalog entries and profile grants and leaves other tools", async () => {
|
|
21
|
+
const database = await startEmbeddedPostgresTestDatabase("wardmote-railway-tool-names-migration-");
|
|
22
|
+
cleanups.push(database.cleanup);
|
|
23
|
+
const sql = postgres(database.connectionString, { max: 1, onnotice: () => { } });
|
|
24
|
+
cleanups.push(async () => sql.end());
|
|
25
|
+
const companyId = randomUUID();
|
|
26
|
+
const connectionId = randomUUID();
|
|
27
|
+
const profileId = randomUUID();
|
|
28
|
+
const railwayEntry = randomUUID();
|
|
29
|
+
const upstreamEntry = randomUUID();
|
|
30
|
+
const railwayGrant = randomUUID();
|
|
31
|
+
const upstreamGrant = randomUUID();
|
|
32
|
+
await sql `SET session_replication_role = replica`;
|
|
33
|
+
await sql `
|
|
34
|
+
INSERT INTO "tool_catalog_entries" ("id", "company_id", "connection_id", "name", "tool_name", "version_hash")
|
|
35
|
+
VALUES
|
|
36
|
+
(${railwayEntry}, ${companyId}, ${connectionId}, ${`${RETIRED_PREFIX}read-logs`}, ${`${RETIRED_PREFIX}read-logs`}, 'h1'),
|
|
37
|
+
(${upstreamEntry}, ${companyId}, ${connectionId}, 'list-services', 'list-services', 'h2')
|
|
38
|
+
`;
|
|
39
|
+
await sql `
|
|
40
|
+
INSERT INTO "tool_profile_entries" ("id", "company_id", "profile_id", "selector_type", "tool_name")
|
|
41
|
+
VALUES
|
|
42
|
+
(${railwayGrant}, ${companyId}, ${profileId}, 'tool', ${`${RETIRED_PREFIX}restart`}),
|
|
43
|
+
(${upstreamGrant}, ${companyId}, ${profileId}, 'tool', 'list-services')
|
|
44
|
+
`;
|
|
45
|
+
await sql `SET session_replication_role = DEFAULT`;
|
|
46
|
+
const hash = await migrationHash();
|
|
47
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
48
|
+
await applyPendingMigrations(database.connectionString);
|
|
49
|
+
const snapshot = async () => ({
|
|
50
|
+
catalog: new Map((await sql `SELECT "id", "name", "tool_name" FROM "tool_catalog_entries" WHERE "company_id" = ${companyId}`).map((row) => [row.id, [row.name, row.tool_name]])),
|
|
51
|
+
grants: new Map((await sql `SELECT "id", "tool_name" FROM "tool_profile_entries" WHERE "company_id" = ${companyId}`).map((row) => [row.id, row.tool_name])),
|
|
52
|
+
});
|
|
53
|
+
const after = await snapshot();
|
|
54
|
+
expect(after.catalog.get(railwayEntry)).toEqual(["wardmote-railway-read-logs", "wardmote-railway-read-logs"]);
|
|
55
|
+
expect(after.catalog.get(upstreamEntry)).toEqual(["list-services", "list-services"]);
|
|
56
|
+
expect(after.grants.get(railwayGrant)).toBe("wardmote-railway-restart");
|
|
57
|
+
expect(after.grants.get(upstreamGrant)).toBe("list-services");
|
|
58
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
59
|
+
await applyPendingMigrations(database.connectionString);
|
|
60
|
+
expect(await snapshot()).toEqual(after);
|
|
61
|
+
}, EMBEDDED_POSTGRES_TEST_TIMEOUT_MS);
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=wardmote-railway-tool-names-migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-railway-tool-names-migration.test.js","sourceRoot":"","sources":["../src/wardmote-railway-tool-names-migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-runner-question-key-migration.test.d.ts","sourceRoot":"","sources":["../src/wardmote-runner-question-key-migration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
+
import postgres from "postgres";
|
|
5
|
+
import { applyPendingMigrations } from "./client.js";
|
|
6
|
+
import { EMBEDDED_POSTGRES_TEST_TIMEOUT_MS, getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase, } from "./test-embedded-postgres.js";
|
|
7
|
+
const MIGRATION_FILE = "0374_wardmote_runner_question_key.sql";
|
|
8
|
+
const RETIRED_PREFIX = "paperclip-runner-question:";
|
|
9
|
+
const cleanups = [];
|
|
10
|
+
const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport();
|
|
11
|
+
const describeEmbeddedPostgres = embeddedPostgresSupport.supported ? describe : describe.skip;
|
|
12
|
+
async function migrationHash() {
|
|
13
|
+
const content = await fs.promises.readFile(new URL(`./migrations/${MIGRATION_FILE}`, import.meta.url), "utf8");
|
|
14
|
+
return createHash("sha256").update(content).digest("hex");
|
|
15
|
+
}
|
|
16
|
+
describeEmbeddedPostgres("wardmote runner question key migration", () => {
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await Promise.all(cleanups.splice(0).map((cleanup) => cleanup()));
|
|
19
|
+
});
|
|
20
|
+
it("moves runner question idempotency keys to the wardmote prefix and leaves other keys", async () => {
|
|
21
|
+
const database = await startEmbeddedPostgresTestDatabase("wardmote-runner-question-key-migration-");
|
|
22
|
+
cleanups.push(database.cleanup);
|
|
23
|
+
const sql = postgres(database.connectionString, { max: 1, onnotice: () => { } });
|
|
24
|
+
cleanups.push(async () => sql.end());
|
|
25
|
+
const companyId = randomUUID();
|
|
26
|
+
const issueId = randomUUID();
|
|
27
|
+
const runId = randomUUID();
|
|
28
|
+
const runnerQuestion = randomUUID();
|
|
29
|
+
const otherKey = randomUUID();
|
|
30
|
+
const noKey = randomUUID();
|
|
31
|
+
await sql `SET session_replication_role = replica`;
|
|
32
|
+
await sql `
|
|
33
|
+
INSERT INTO "issue_thread_interactions" ("id", "company_id", "issue_id", "kind", "idempotency_key", "payload")
|
|
34
|
+
VALUES
|
|
35
|
+
(${runnerQuestion}, ${companyId}, ${issueId}, 'ask_user_questions', ${`${RETIRED_PREFIX}${runId}:request-1`}, '{}'::jsonb),
|
|
36
|
+
(${otherKey}, ${companyId}, ${issueId}, 'ask_user_questions', 'card:plan:1', '{}'::jsonb),
|
|
37
|
+
(${noKey}, ${companyId}, ${issueId}, 'request_confirmation', NULL, '{}'::jsonb)
|
|
38
|
+
`;
|
|
39
|
+
await sql `SET session_replication_role = DEFAULT`;
|
|
40
|
+
const hash = await migrationHash();
|
|
41
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
42
|
+
await applyPendingMigrations(database.connectionString);
|
|
43
|
+
const snapshot = async () => new Map((await sql `SELECT "id", "idempotency_key" FROM "issue_thread_interactions" WHERE "company_id" = ${companyId}`)
|
|
44
|
+
.map((row) => [row.id, row.idempotency_key]));
|
|
45
|
+
const after = await snapshot();
|
|
46
|
+
expect(after.get(runnerQuestion)).toBe(`wardmote-runner-question:${runId}:request-1`);
|
|
47
|
+
expect(after.get(otherKey)).toBe("card:plan:1");
|
|
48
|
+
expect(after.get(noKey)).toBeNull();
|
|
49
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
50
|
+
await applyPendingMigrations(database.connectionString);
|
|
51
|
+
expect(await snapshot()).toEqual(after);
|
|
52
|
+
}, EMBEDDED_POSTGRES_TEST_TIMEOUT_MS);
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=wardmote-runner-question-key-migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-runner-question-key-migration.test.js","sourceRoot":"","sources":["../src/wardmote-runner-question-key-migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-self-tool-names-migration.test.d.ts","sourceRoot":"","sources":["../src/wardmote-self-tool-names-migration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
4
|
+
import postgres from "postgres";
|
|
5
|
+
import { applyPendingMigrations } from "./client.js";
|
|
6
|
+
import { EMBEDDED_POSTGRES_TEST_TIMEOUT_MS, getEmbeddedPostgresTestSupport, startEmbeddedPostgresTestDatabase, } from "./test-embedded-postgres.js";
|
|
7
|
+
const MIGRATION_FILE = "0380_wardmote_self_tool_names.sql";
|
|
8
|
+
const RETIRED = "paperclip-self";
|
|
9
|
+
const cleanups = [];
|
|
10
|
+
const embeddedPostgresSupport = await getEmbeddedPostgresTestSupport();
|
|
11
|
+
const describeEmbeddedPostgres = embeddedPostgresSupport.supported ? describe : describe.skip;
|
|
12
|
+
async function migrationHash() {
|
|
13
|
+
const content = await fs.promises.readFile(new URL(`./migrations/${MIGRATION_FILE}`, import.meta.url), "utf8");
|
|
14
|
+
return createHash("sha256").update(content).digest("hex");
|
|
15
|
+
}
|
|
16
|
+
describeEmbeddedPostgres("wardmote self tool names migration", () => {
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await Promise.all(cleanups.splice(0).map((cleanup) => cleanup()));
|
|
19
|
+
});
|
|
20
|
+
it("renames self tool grants, policies and profile entries", async () => {
|
|
21
|
+
const database = await startEmbeddedPostgresTestDatabase("wardmote-self-tool-names-migration-");
|
|
22
|
+
cleanups.push(database.cleanup);
|
|
23
|
+
const sql = postgres(database.connectionString, { max: 1, onnotice: () => { } });
|
|
24
|
+
cleanups.push(async () => sql.end());
|
|
25
|
+
const companyId = randomUUID();
|
|
26
|
+
const profile = randomUUID();
|
|
27
|
+
const entry = randomUUID();
|
|
28
|
+
const otherEntry = randomUUID();
|
|
29
|
+
const policy = randomUUID();
|
|
30
|
+
const grant = randomUUID();
|
|
31
|
+
await sql `INSERT INTO "companies" ("id", "name", "issue_prefix") VALUES (${companyId}, 'Self tools', 'STN')`;
|
|
32
|
+
await sql `SET session_replication_role = replica`;
|
|
33
|
+
await sql `INSERT INTO "tool_profiles" ("id", "company_id", "profile_key", "name") VALUES (${profile}, ${companyId}, 'profile', 'Profile')`;
|
|
34
|
+
await sql `
|
|
35
|
+
INSERT INTO "tool_profile_entries" ("id", "company_id", "profile_id", "selector_type", "tool_name", "conditions")
|
|
36
|
+
VALUES
|
|
37
|
+
(${entry}, ${companyId}, ${profile}, 'tool_name', ${`${RETIRED}:list_my_issues`}, ${sql.json({ context: { toolName: `${RETIRED}:get_issue_context` } })}),
|
|
38
|
+
(${otherEntry}, ${companyId}, ${profile}, 'tool_name', 'mcp-remote-fixture:echo', NULL)
|
|
39
|
+
`;
|
|
40
|
+
await sql `
|
|
41
|
+
INSERT INTO "tool_policies" ("id", "company_id", "name", "policy_type", "selectors")
|
|
42
|
+
VALUES (${policy}, ${companyId}, 'deny self', 'deny', ${sql.json({ toolNames: [`${RETIRED}:get_issue_context`] })})
|
|
43
|
+
`;
|
|
44
|
+
await sql `
|
|
45
|
+
INSERT INTO "principal_permission_grants" ("id", "company_id", "principal_type", "principal_id", "permission_key", "scope")
|
|
46
|
+
VALUES (${grant}, ${companyId}, 'agent', 'agent-1', 'tools:use', ${sql.json({ allow: [`tool:${RETIRED}:list_my_issues`] })})
|
|
47
|
+
`;
|
|
48
|
+
await sql `SET session_replication_role = DEFAULT`;
|
|
49
|
+
const hash = await migrationHash();
|
|
50
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
51
|
+
await applyPendingMigrations(database.connectionString);
|
|
52
|
+
const snapshot = async () => ({
|
|
53
|
+
entries: new Map((await sql `SELECT "id", "tool_name", "conditions" FROM "tool_profile_entries" WHERE "company_id" = ${companyId}`).map((row) => [row.id, [row.tool_name, row.conditions]])),
|
|
54
|
+
policy: (await sql `SELECT "selectors" FROM "tool_policies" WHERE "id" = ${policy}`)[0]?.selectors,
|
|
55
|
+
grant: (await sql `SELECT "scope" FROM "principal_permission_grants" WHERE "id" = ${grant}`)[0]?.scope,
|
|
56
|
+
});
|
|
57
|
+
const after = await snapshot();
|
|
58
|
+
expect(after.entries.get(entry)).toEqual(["wardmote-self:list_my_issues", { context: { toolName: "wardmote-self:get_issue_context" } }]);
|
|
59
|
+
expect(after.entries.get(otherEntry)).toEqual(["mcp-remote-fixture:echo", null]);
|
|
60
|
+
expect(after.policy).toEqual({ toolNames: ["wardmote-self:get_issue_context"] });
|
|
61
|
+
expect(after.grant).toEqual({ allow: ["tool:wardmote-self:list_my_issues"] });
|
|
62
|
+
await sql `DELETE FROM "drizzle"."__drizzle_migrations" WHERE "hash" = ${hash}`;
|
|
63
|
+
await applyPendingMigrations(database.connectionString);
|
|
64
|
+
expect(await snapshot()).toEqual(after);
|
|
65
|
+
}, EMBEDDED_POSTGRES_TEST_TIMEOUT_MS);
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=wardmote-self-tool-names-migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-self-tool-names-migration.test.js","sourceRoot":"","sources":["../src/wardmote-self-tool-names-migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardmote-stored-keys-migration.test.d.ts","sourceRoot":"","sources":["../src/wardmote-stored-keys-migration.test.ts"],"names":[],"mappings":""}
|