@tickernelz/wardmote-db 2026.1109.0 → 2026.1111.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/agent-chat-migration.test.js +2 -2
  2. package/dist/agent-chat-migration.test.js.map +1 -1
  3. package/dist/backup-lib.d.ts +3 -0
  4. package/dist/backup-lib.d.ts.map +1 -1
  5. package/dist/backup-lib.js +27 -4
  6. package/dist/backup-lib.js.map +1 -1
  7. package/dist/backup-lib.test.js +19 -4
  8. package/dist/backup-lib.test.js.map +1 -1
  9. package/dist/backup.js +4 -4
  10. package/dist/backup.js.map +1 -1
  11. package/dist/better-auth-account-issuer-migration.test.js +1 -1
  12. package/dist/better-auth-account-issuer-migration.test.js.map +1 -1
  13. package/dist/built-in-agent-unique-marker-migration.test.js +1 -1
  14. package/dist/built-in-agent-unique-marker-migration.test.js.map +1 -1
  15. package/dist/chat-github-migration.test.js +1 -1
  16. package/dist/chat-github-migration.test.js.map +1 -1
  17. package/dist/chat-identity-migration-reconciliation.test.js +5 -5
  18. package/dist/chat-identity-migration-reconciliation.test.js.map +1 -1
  19. package/dist/chat-openwa-migration.test.js +2 -2
  20. package/dist/chat-openwa-migration.test.js.map +1 -1
  21. package/dist/chat-telegram-draft-ids-migration.test.js +1 -1
  22. package/dist/chat-telegram-draft-ids-migration.test.js.map +1 -1
  23. package/dist/chat-tenant-foreign-keys.test.js +1 -1
  24. package/dist/chat-tenant-foreign-keys.test.js.map +1 -1
  25. package/dist/check-migration-safety.js +2 -2
  26. package/dist/check-migration-safety.js.map +1 -1
  27. package/dist/check-migration-safety.test.js +10 -1
  28. package/dist/check-migration-safety.test.js.map +1 -1
  29. package/dist/client-options.test.js +6 -6
  30. package/dist/client-options.test.js.map +1 -1
  31. package/dist/client.d.ts +1 -22
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +1 -16
  34. package/dist/client.js.map +1 -1
  35. package/dist/client.test.js +10 -10
  36. package/dist/client.test.js.map +1 -1
  37. package/dist/company-secret-proposals-migration.test.js +1 -1
  38. package/dist/company-secret-proposals-migration.test.js.map +1 -1
  39. package/dist/connection-grants-phase4-migration.test.js +1 -1
  40. package/dist/connection-grants-phase4-migration.test.js.map +1 -1
  41. package/dist/connections-v3-schema-core-migration.test.js +2 -2
  42. package/dist/connections-v3-schema-core-migration.test.js.map +1 -1
  43. package/dist/decision-queue-migrations.test.js +1 -1
  44. package/dist/decision-queue-migrations.test.js.map +1 -1
  45. package/dist/embedded-identity.d.ts +12 -0
  46. package/dist/embedded-identity.d.ts.map +1 -0
  47. package/dist/embedded-identity.js +96 -0
  48. package/dist/embedded-identity.js.map +1 -0
  49. package/dist/embedded-identity.test.d.ts +2 -0
  50. package/dist/embedded-identity.test.d.ts.map +1 -0
  51. package/dist/embedded-identity.test.js +91 -0
  52. package/dist/embedded-identity.test.js.map +1 -0
  53. package/dist/embedded-postgres-lifecycle.d.ts +0 -9
  54. package/dist/embedded-postgres-lifecycle.d.ts.map +1 -1
  55. package/dist/embedded-postgres-lifecycle.js +0 -9
  56. package/dist/embedded-postgres-lifecycle.js.map +1 -1
  57. package/dist/embedded-postgres-native.test.js +2 -2
  58. package/dist/embedded-postgres-native.test.js.map +1 -1
  59. package/dist/heartbeat-run-issue-privacy-migration.test.js +4 -4
  60. package/dist/heartbeat-run-issue-privacy-migration.test.js.map +1 -1
  61. package/dist/inbox-archive-agent-policies-migration.test.js +1 -1
  62. package/dist/inbox-archive-agent-policies-migration.test.js.map +1 -1
  63. package/dist/index.d.ts +2 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +2 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/issue-comment-derived-attribution-migration.test.js +1 -1
  68. package/dist/issue-comment-derived-attribution-migration.test.js.map +1 -1
  69. package/dist/issue-comment-on-behalf-migration.test.js +1 -1
  70. package/dist/issue-comment-on-behalf-migration.test.js.map +1 -1
  71. package/dist/migration-runtime.d.ts.map +1 -1
  72. package/dist/migration-runtime.js +21 -11
  73. package/dist/migration-runtime.js.map +1 -1
  74. package/dist/migrations/0359_wardmote_bundled_skill_slugs.sql +100 -0
  75. package/dist/migrations/0360_wardmote_channel_values.sql +11 -0
  76. package/dist/migrations/0361_wardmote_stored_modes.sql +14 -0
  77. package/dist/migrations/0362_wardmote_runner_adapter_type.sql +34 -0
  78. package/dist/migrations/0363_wardmote_camel_keys.sql +57 -0
  79. package/dist/migrations/0364_wardmote_catalog_keys.sql +92 -0
  80. package/dist/migrations/0365_wardmote_plugin_ids.sql +118 -0
  81. package/dist/migrations/0366_wardmote_managed_environment_key.sql +13 -0
  82. package/dist/migrations/0367_wardmote_schema_ids.sql +31 -0
  83. package/dist/migrations/0368_wardmote_mcp_scopes.sql +27 -0
  84. package/dist/migrations/0369_wardmote_chat_state_key.sql +10 -0
  85. package/dist/migrations/0370_wardmote_wake_context_key.sql +4 -0
  86. package/dist/migrations/0371_wardmote_session_config_keys.sql +7 -0
  87. package/dist/migrations/meta/_journal.json +91 -0
  88. package/dist/native-runner-recovery-migration.test.js +1 -1
  89. package/dist/native-runner-recovery-migration.test.js.map +1 -1
  90. package/dist/nested-skill-folders-migration.test.js +2 -2
  91. package/dist/orphaned-claimed-wakeups-migration.test.js +1 -1
  92. package/dist/orphaned-claimed-wakeups-migration.test.js.map +1 -1
  93. package/dist/pipelines-schema.test.js +1 -1
  94. package/dist/pipelines-schema.test.js.map +1 -1
  95. package/dist/postgres-connection-recovery.test.js +1 -1
  96. package/dist/postgres-connection-recovery.test.js.map +1 -1
  97. package/dist/private-task-draft-assets-migration.test.js +1 -1
  98. package/dist/private-task-draft-assets-migration.test.js.map +1 -1
  99. package/dist/run-event-payload.js +1 -1
  100. package/dist/run-event-payload.js.map +1 -1
  101. package/dist/run-event-payload.test.js +1 -1
  102. package/dist/run-event-payload.test.js.map +1 -1
  103. package/dist/run-identity-migration.test.js +1 -1
  104. package/dist/run-identity-migration.test.js.map +1 -1
  105. package/dist/runtime-config.d.ts.map +1 -1
  106. package/dist/runtime-config.js +10 -8
  107. package/dist/runtime-config.js.map +1 -1
  108. package/dist/runtime-config.test.js +11 -11
  109. package/dist/runtime-config.test.js.map +1 -1
  110. package/dist/schema/chat_channels.d.ts +5 -5
  111. package/dist/schema/chat_channels.d.ts.map +1 -1
  112. package/dist/schema/chat_channels.js +4 -19
  113. package/dist/schema/chat_channels.js.map +1 -1
  114. package/dist/schema/company_secrets.js +1 -1
  115. package/dist/schema/company_secrets.js.map +1 -1
  116. package/dist/schema/environments.js +1 -1
  117. package/dist/schema/environments.js.map +1 -1
  118. package/dist/schema/heartbeat_runs.js +1 -1
  119. package/dist/schema/heartbeat_runs.js.map +1 -1
  120. package/dist/schema/issue_autonomy_windows.d.ts +2 -2
  121. package/dist/schema/issue_autonomy_windows.js +1 -1
  122. package/dist/schema/issue_autonomy_windows.js.map +1 -1
  123. package/dist/schema/plugin_entities.d.ts +0 -14
  124. package/dist/schema/plugin_entities.d.ts.map +1 -1
  125. package/dist/schema/plugin_entities.js +0 -14
  126. package/dist/schema/plugin_entities.js.map +1 -1
  127. package/dist/schema/plugin_state.d.ts +0 -23
  128. package/dist/schema/plugin_state.d.ts.map +1 -1
  129. package/dist/schema/plugin_state.js +0 -23
  130. package/dist/schema/plugin_state.js.map +1 -1
  131. package/dist/schema/plugins.d.ts +3 -3
  132. package/dist/schema/plugins.d.ts.map +1 -1
  133. package/dist/schema/plugins.js.map +1 -1
  134. package/dist/schema/tool_access.js +3 -3
  135. package/dist/schema/tool_access.js.map +1 -1
  136. package/dist/schema/user_secret_definitions.js +1 -1
  137. package/dist/schema/user_secret_definitions.js.map +1 -1
  138. package/dist/session-goal-migration.test.js +3 -3
  139. package/dist/session-goal-migration.test.js.map +1 -1
  140. package/dist/speko-voice-migration.test.js +1 -1
  141. package/dist/speko-voice-migration.test.js.map +1 -1
  142. package/dist/status-card-migrations.test.js +1 -1
  143. package/dist/status-card-migrations.test.js.map +1 -1
  144. package/dist/test-embedded-postgres.d.ts.map +1 -1
  145. package/dist/test-embedded-postgres.js +9 -8
  146. package/dist/test-embedded-postgres.js.map +1 -1
  147. package/dist/test-embedded-postgres.test.js +3 -3
  148. package/dist/test-embedded-postgres.test.js.map +1 -1
  149. package/dist/vercel-connect-credential-source-migration.test.js +2 -2
  150. package/dist/vercel-connect-credential-source-migration.test.js.map +1 -1
  151. package/dist/wardmote-camel-key-migration.test.d.ts +2 -0
  152. package/dist/wardmote-camel-key-migration.test.d.ts.map +1 -0
  153. package/dist/wardmote-camel-key-migration.test.js +111 -0
  154. package/dist/wardmote-camel-key-migration.test.js.map +1 -0
  155. package/dist/wardmote-catalog-key-migration.test.d.ts +2 -0
  156. package/dist/wardmote-catalog-key-migration.test.d.ts.map +1 -0
  157. package/dist/wardmote-catalog-key-migration.test.js +140 -0
  158. package/dist/wardmote-catalog-key-migration.test.js.map +1 -0
  159. package/dist/wardmote-chat-state-key-migration.test.d.ts +2 -0
  160. package/dist/wardmote-chat-state-key-migration.test.d.ts.map +1 -0
  161. package/dist/wardmote-chat-state-key-migration.test.js +58 -0
  162. package/dist/wardmote-chat-state-key-migration.test.js.map +1 -0
  163. package/dist/wardmote-managed-environment-key-migration.test.d.ts +2 -0
  164. package/dist/wardmote-managed-environment-key-migration.test.d.ts.map +1 -0
  165. package/dist/wardmote-managed-environment-key-migration.test.js +67 -0
  166. package/dist/wardmote-managed-environment-key-migration.test.js.map +1 -0
  167. package/dist/wardmote-mcp-scope-migration.test.d.ts +2 -0
  168. package/dist/wardmote-mcp-scope-migration.test.d.ts.map +1 -0
  169. package/dist/wardmote-mcp-scope-migration.test.js +93 -0
  170. package/dist/wardmote-mcp-scope-migration.test.js.map +1 -0
  171. package/dist/wardmote-plugin-id-migration.test.d.ts +2 -0
  172. package/dist/wardmote-plugin-id-migration.test.d.ts.map +1 -0
  173. package/dist/wardmote-plugin-id-migration.test.js +127 -0
  174. package/dist/wardmote-plugin-id-migration.test.js.map +1 -0
  175. package/dist/wardmote-runner-adapter-type-migration.test.d.ts +2 -0
  176. package/dist/wardmote-runner-adapter-type-migration.test.d.ts.map +1 -0
  177. package/dist/wardmote-runner-adapter-type-migration.test.js +124 -0
  178. package/dist/wardmote-runner-adapter-type-migration.test.js.map +1 -0
  179. package/dist/wardmote-schema-id-migration.test.d.ts +2 -0
  180. package/dist/wardmote-schema-id-migration.test.d.ts.map +1 -0
  181. package/dist/wardmote-schema-id-migration.test.js +113 -0
  182. package/dist/wardmote-schema-id-migration.test.js.map +1 -0
  183. package/dist/wardmote-session-config-keys-migration.test.d.ts +2 -0
  184. package/dist/wardmote-session-config-keys-migration.test.d.ts.map +1 -0
  185. package/dist/wardmote-session-config-keys-migration.test.js +71 -0
  186. package/dist/wardmote-session-config-keys-migration.test.js.map +1 -0
  187. package/dist/wardmote-skill-slug-migration.test.d.ts +2 -0
  188. package/dist/wardmote-skill-slug-migration.test.d.ts.map +1 -0
  189. package/dist/wardmote-skill-slug-migration.test.js +128 -0
  190. package/dist/wardmote-skill-slug-migration.test.js.map +1 -0
  191. package/dist/wardmote-wake-context-key-migration.test.d.ts +2 -0
  192. package/dist/wardmote-wake-context-key-migration.test.d.ts.map +1 -0
  193. package/dist/wardmote-wake-context-key-migration.test.js +59 -0
  194. package/dist/wardmote-wake-context-key-migration.test.js.map +1 -0
  195. package/package.json +2 -2
@@ -5,6 +5,7 @@ import { ensurePostgresDatabase, getPostgresDataDirectory } from "./client.js";
5
5
  import { createEmbeddedPostgresLogBuffer, formatEmbeddedPostgresError } from "./embedded-postgres-error.js";
6
6
  import { prepareEmbeddedPostgresNativeRuntime } from "./embedded-postgres-native.js";
7
7
  import { resolveDatabaseTarget } from "./runtime-config.js";
8
+ import { EMBEDDED_POSTGRES_USER, EMBEDDED_POSTGRES_PASSWORD, EMBEDDED_POSTGRES_DATABASE, embeddedPostgresUrl, embeddedPostgresAdminUrl, migrateEmbeddedPostgresIdentity } from "./embedded-identity.js";
8
9
  function readRunningPostmasterPid(postmasterPidFile) {
9
10
  if (!existsSync(postmasterPidFile))
10
11
  return null;
@@ -70,20 +71,21 @@ async function ensureEmbeddedPostgresConnection(dataDir, preferredPort) {
70
71
  const pgVersionFile = path.resolve(dataDir, "PG_VERSION");
71
72
  const runningPid = readRunningPostmasterPid(postmasterPidFile);
72
73
  const runningPort = readPidFilePort(postmasterPidFile);
73
- const preferredAdminConnectionString = `postgres://paperclip:paperclip@127.0.0.1:${preferredPort}/postgres`;
74
+ const preferredAdminConnectionString = embeddedPostgresAdminUrl(preferredPort);
74
75
  const logBuffer = createEmbeddedPostgresLogBuffer();
75
76
  if (!runningPid && existsSync(pgVersionFile)) {
76
77
  try {
78
+ await migrateEmbeddedPostgresIdentity({ port: preferredPort, dataDir });
77
79
  const actualDataDir = await getPostgresDataDirectory(preferredAdminConnectionString);
78
80
  const matchesDataDir = typeof actualDataDir === "string" &&
79
81
  path.resolve(actualDataDir) === path.resolve(dataDir);
80
82
  if (!matchesDataDir) {
81
83
  throw new Error("reachable postgres does not use the expected embedded data directory");
82
84
  }
83
- await ensurePostgresDatabase(preferredAdminConnectionString, "paperclip");
85
+ await ensurePostgresDatabase(preferredAdminConnectionString, EMBEDDED_POSTGRES_DATABASE);
84
86
  process.emitWarning(`Adopting an existing PostgreSQL instance on port ${preferredPort} for embedded data dir ${dataDir} because postmaster.pid is missing.`);
85
87
  return {
86
- connectionString: `postgres://paperclip:paperclip@127.0.0.1:${preferredPort}/paperclip`,
88
+ connectionString: embeddedPostgresUrl(preferredPort),
87
89
  source: `embedded-postgres@${preferredPort}`,
88
90
  stop: async () => { },
89
91
  };
@@ -94,18 +96,19 @@ async function ensureEmbeddedPostgresConnection(dataDir, preferredPort) {
94
96
  }
95
97
  if (runningPid) {
96
98
  const port = runningPort ?? preferredPort;
97
- const adminConnectionString = `postgres://paperclip:paperclip@127.0.0.1:${port}/postgres`;
98
- await ensurePostgresDatabase(adminConnectionString, "paperclip");
99
+ await migrateEmbeddedPostgresIdentity({ port, dataDir });
100
+ const adminConnectionString = embeddedPostgresAdminUrl(port);
101
+ await ensurePostgresDatabase(adminConnectionString, EMBEDDED_POSTGRES_DATABASE);
99
102
  return {
100
- connectionString: `postgres://paperclip:paperclip@127.0.0.1:${port}/paperclip`,
103
+ connectionString: embeddedPostgresUrl(port),
101
104
  source: `embedded-postgres@${port}`,
102
105
  stop: async () => { },
103
106
  };
104
107
  }
105
108
  const instance = new EmbeddedPostgres({
106
109
  databaseDir: dataDir,
107
- user: "paperclip",
108
- password: "paperclip",
110
+ user: EMBEDDED_POSTGRES_USER,
111
+ password: EMBEDDED_POSTGRES_PASSWORD,
109
112
  port: selectedPort,
110
113
  persistent: true,
111
114
  initdbFlags: ["--encoding=UTF8", "--locale=C", "--lc-messages=C"],
@@ -135,10 +138,17 @@ async function ensureEmbeddedPostgresConnection(dataDir, preferredPort) {
135
138
  recentLogs: logBuffer.getRecentLogs(),
136
139
  });
137
140
  }
138
- const adminConnectionString = `postgres://paperclip:paperclip@127.0.0.1:${selectedPort}/postgres`;
139
- await ensurePostgresDatabase(adminConnectionString, "paperclip");
141
+ try {
142
+ await migrateEmbeddedPostgresIdentity({ port: selectedPort, dataDir });
143
+ }
144
+ catch (error) {
145
+ await instance.stop();
146
+ throw error;
147
+ }
148
+ const adminConnectionString = embeddedPostgresAdminUrl(selectedPort);
149
+ await ensurePostgresDatabase(adminConnectionString, EMBEDDED_POSTGRES_DATABASE);
140
150
  return {
141
- connectionString: `postgres://paperclip:paperclip@127.0.0.1:${selectedPort}/paperclip`,
151
+ connectionString: embeddedPostgresUrl(selectedPort),
142
152
  source: `embedded-postgres@${selectedPort}`,
143
153
  stop: async () => {
144
154
  await instance.stop();
@@ -1 +1 @@
1
- {"version":3,"file":"migration-runtime.js","sourceRoot":"","sources":["../src/migration-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migration-runtime.js","sourceRoot":"","sources":["../src/migration-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ CREATE OR REPLACE FUNCTION pg_temp.wardmote_skill_ref(ref text) RETURNS text
2
+ LANGUAGE sql IMMUTABLE AS $fn$
3
+ SELECT CASE
4
+ WHEN ref ~ '^(tickernelz/wardmote/)?paperclip(-board|-converting-plans-to-tasks|-create-agent)?$'
5
+ THEN regexp_replace(ref, 'paperclip((-board|-converting-plans-to-tasks|-create-agent)?)$', 'wardmote\1')
6
+ ELSE ref
7
+ END
8
+ $fn$;
9
+ --> statement-breakpoint
10
+ CREATE OR REPLACE FUNCTION pg_temp.wardmote_skill_sync(sync jsonb) RETURNS jsonb
11
+ LANGUAGE sql IMMUTABLE AS $fn$
12
+ SELECT CASE
13
+ WHEN jsonb_typeof(sync -> 'desiredSkills') = 'array' THEN jsonb_set(
14
+ sync,
15
+ '{desiredSkills}',
16
+ (
17
+ SELECT COALESCE(jsonb_agg(
18
+ CASE WHEN jsonb_typeof(skill) = 'string' THEN to_jsonb(pg_temp.wardmote_skill_ref(skill #>> '{}')) ELSE skill END
19
+ ORDER BY position
20
+ ), '[]'::jsonb)
21
+ FROM jsonb_array_elements(sync -> 'desiredSkills') WITH ORDINALITY AS entry(skill, position)
22
+ )
23
+ )
24
+ ELSE sync
25
+ END
26
+ $fn$;
27
+ --> statement-breakpoint
28
+ CREATE OR REPLACE FUNCTION pg_temp.wardmote_adapter_config(config jsonb) RETURNS jsonb
29
+ LANGUAGE sql IMMUTABLE AS $fn$
30
+ SELECT CASE
31
+ WHEN jsonb_typeof(config) = 'object' AND config ? 'paperclipSkillSync' AND NOT config ? 'wardmoteSkillSync'
32
+ THEN (config - 'paperclipSkillSync') || jsonb_build_object('wardmoteSkillSync', pg_temp.wardmote_skill_sync(config -> 'paperclipSkillSync'))
33
+ WHEN jsonb_typeof(config) = 'object' AND config ? 'wardmoteSkillSync'
34
+ THEN jsonb_set(config, '{wardmoteSkillSync}', pg_temp.wardmote_skill_sync(config -> 'wardmoteSkillSync'))
35
+ ELSE config
36
+ END
37
+ $fn$;
38
+ --> statement-breakpoint
39
+ UPDATE "company_skills" AS legacy
40
+ SET
41
+ "key" = pg_temp.wardmote_skill_ref(legacy."key"),
42
+ "slug" = pg_temp.wardmote_skill_ref(legacy."slug"),
43
+ "name" = pg_temp.wardmote_skill_ref(legacy."name"),
44
+ "source_locator" = regexp_replace(
45
+ legacy."source_locator",
46
+ '/skills/paperclip((-board|-converting-plans-to-tasks|-create-agent)?)$',
47
+ '/skills/wardmote\1'
48
+ ),
49
+ "updated_at" = now()
50
+ WHERE legacy."key" ~ '^tickernelz/wardmote/paperclip(-board|-converting-plans-to-tasks|-create-agent)?$'
51
+ AND NOT EXISTS (
52
+ SELECT 1 FROM "company_skills" AS current
53
+ WHERE current."company_id" = legacy."company_id"
54
+ AND current."key" = pg_temp.wardmote_skill_ref(legacy."key")
55
+ );
56
+ --> statement-breakpoint
57
+ UPDATE "company_skills"
58
+ SET
59
+ "metadata" = "metadata"
60
+ || CASE
61
+ WHEN jsonb_typeof("metadata" -> 'skillKey') = 'string'
62
+ THEN jsonb_build_object('skillKey', pg_temp.wardmote_skill_ref("metadata" ->> 'skillKey'))
63
+ ELSE '{}'::jsonb
64
+ END
65
+ || CASE
66
+ WHEN "metadata" ->> 'sourceKind' = 'paperclip_bundled'
67
+ THEN jsonb_build_object('sourceKind', 'wardmote_bundled')
68
+ ELSE '{}'::jsonb
69
+ END,
70
+ "updated_at" = now()
71
+ WHERE jsonb_typeof("metadata") = 'object'
72
+ AND (
73
+ "metadata" ->> 'sourceKind' = 'paperclip_bundled'
74
+ OR "metadata" ->> 'skillKey' ~ '^tickernelz/wardmote/paperclip(-board|-converting-plans-to-tasks|-create-agent)?$'
75
+ );
76
+ --> statement-breakpoint
77
+ UPDATE "agents"
78
+ SET "adapter_config" = pg_temp.wardmote_adapter_config("adapter_config")
79
+ WHERE "adapter_config" IS DISTINCT FROM pg_temp.wardmote_adapter_config("adapter_config");
80
+ --> statement-breakpoint
81
+ UPDATE "agent_config_revisions"
82
+ SET
83
+ "before_config" = CASE
84
+ WHEN jsonb_typeof("before_config" -> 'adapterConfig') = 'object'
85
+ THEN jsonb_set("before_config", '{adapterConfig}', pg_temp.wardmote_adapter_config("before_config" -> 'adapterConfig'))
86
+ ELSE "before_config"
87
+ END,
88
+ "after_config" = CASE
89
+ WHEN jsonb_typeof("after_config" -> 'adapterConfig') = 'object'
90
+ THEN jsonb_set("after_config", '{adapterConfig}', pg_temp.wardmote_adapter_config("after_config" -> 'adapterConfig'))
91
+ ELSE "after_config"
92
+ END
93
+ WHERE pg_temp.wardmote_adapter_config("before_config" -> 'adapterConfig') IS DISTINCT FROM ("before_config" -> 'adapterConfig')
94
+ OR pg_temp.wardmote_adapter_config("after_config" -> 'adapterConfig') IS DISTINCT FROM ("after_config" -> 'adapterConfig');
95
+ --> statement-breakpoint
96
+ DROP FUNCTION pg_temp.wardmote_adapter_config(jsonb);
97
+ --> statement-breakpoint
98
+ DROP FUNCTION pg_temp.wardmote_skill_sync(jsonb);
99
+ --> statement-breakpoint
100
+ DROP FUNCTION pg_temp.wardmote_skill_ref(text);
@@ -0,0 +1,11 @@
1
+ ALTER TABLE "chat_owner_approval_requests" DROP CONSTRAINT "chat_owner_approval_requests_resolved_via_check";--> statement-breakpoint
2
+ ALTER TABLE "chat_owner_grants" DROP CONSTRAINT "chat_owner_grants_approved_via_check";--> statement-breakpoint
3
+ ALTER TABLE "issue_autonomy_windows" DROP CONSTRAINT "issue_autonomy_windows_granted_via_check";--> statement-breakpoint
4
+ UPDATE "chat_owner_approval_requests" SET "resolved_via" = 'wardmote' WHERE "resolved_via" = 'paperclip';--> statement-breakpoint
5
+ UPDATE "chat_owner_grants" SET "approved_via" = 'wardmote' WHERE "approved_via" = 'paperclip';--> statement-breakpoint
6
+ UPDATE "issue_autonomy_windows" SET "granted_via" = 'wardmote' WHERE "granted_via" = 'paperclip';--> statement-breakpoint
7
+ UPDATE "issue_thread_interaction_owner_relays" SET "channel" = 'wardmote' WHERE "channel" = 'paperclip';--> statement-breakpoint
8
+ UPDATE "user" SET "email" = 'local@wardmote.local' WHERE "id" = 'local-board' AND "email" = 'local@paperclip.local';--> statement-breakpoint
9
+ ALTER TABLE "chat_owner_approval_requests" ADD CONSTRAINT "chat_owner_approval_requests_resolved_via_check" CHECK ("chat_owner_approval_requests"."resolved_via" is null or "chat_owner_approval_requests"."resolved_via" in ('whatsapp', 'wardmote'));--> statement-breakpoint
10
+ ALTER TABLE "chat_owner_grants" ADD CONSTRAINT "chat_owner_grants_approved_via_check" CHECK ("chat_owner_grants"."approved_via" in ('whatsapp', 'wardmote'));--> statement-breakpoint
11
+ ALTER TABLE "issue_autonomy_windows" ADD CONSTRAINT "issue_autonomy_windows_granted_via_check" CHECK ("issue_autonomy_windows"."granted_via" in ('whatsapp', 'wardmote'));
@@ -0,0 +1,14 @@
1
+ ALTER TABLE "tool_connections" DROP CONSTRAINT "tool_connections_credential_source_check";--> statement-breakpoint
2
+ ALTER TABLE "tool_connections" DROP CONSTRAINT "tool_connections_credential_source_one_of_check";--> statement-breakpoint
3
+ UPDATE "tool_connections" SET "credential_source" = 'wardmote_vault' WHERE "credential_source" = 'paperclip_vault';--> statement-breakpoint
4
+ UPDATE "company_secrets" SET "managed_mode" = 'wardmote_managed' WHERE "managed_mode" = 'paperclip_managed';--> statement-breakpoint
5
+ UPDATE "user_secret_definitions" SET "managed_mode" = 'wardmote_managed' WHERE "managed_mode" = 'paperclip_managed';--> statement-breakpoint
6
+ ALTER TABLE "company_secrets" ALTER COLUMN "managed_mode" SET DEFAULT 'wardmote_managed';--> statement-breakpoint
7
+ ALTER TABLE "tool_connections" ALTER COLUMN "credential_source" SET DEFAULT 'wardmote_vault';--> statement-breakpoint
8
+ ALTER TABLE "user_secret_definitions" ALTER COLUMN "managed_mode" SET DEFAULT 'wardmote_managed';--> statement-breakpoint
9
+ ALTER TABLE "tool_connections" ADD CONSTRAINT "tool_connections_credential_source_check" CHECK ("tool_connections"."credential_source" in ('wardmote_vault', 'vercel_connect'));--> statement-breakpoint
10
+ ALTER TABLE "tool_connections" ADD CONSTRAINT "tool_connections_credential_source_one_of_check" CHECK ((
11
+ ("tool_connections"."credential_source" = 'wardmote_vault' and "tool_connections"."external_credential" is null)
12
+ or
13
+ ("tool_connections"."credential_source" = 'vercel_connect' and "tool_connections"."external_credential" is not null and jsonb_array_length("tool_connections"."credential_refs") = 0 and jsonb_array_length("tool_connections"."credential_secret_refs") = 0)
14
+ ));
@@ -0,0 +1,34 @@
1
+ UPDATE "agents" SET "adapter_type" = 'wardmote_runner' WHERE "adapter_type" = 'paperclip_runner';--> statement-breakpoint
2
+ UPDATE "agent_runtime_state" SET "adapter_type" = 'wardmote_runner' WHERE "adapter_type" = 'paperclip_runner';--> statement-breakpoint
3
+ UPDATE "agent_task_sessions" AS legacy SET "adapter_type" = 'wardmote_runner'
4
+ WHERE legacy."adapter_type" = 'paperclip_runner'
5
+ AND NOT EXISTS (
6
+ SELECT 1 FROM "agent_task_sessions" AS current
7
+ WHERE current."company_id" = legacy."company_id"
8
+ AND current."agent_id" = legacy."agent_id"
9
+ AND current."adapter_type" = 'wardmote_runner'
10
+ AND current."task_key" = legacy."task_key"
11
+ );--> statement-breakpoint
12
+ UPDATE "adapter_auth_sessions" SET "adapter_type" = 'wardmote_runner' WHERE "adapter_type" = 'paperclip_runner';--> statement-breakpoint
13
+ UPDATE "join_requests" SET "adapter_type" = 'wardmote_runner' WHERE "adapter_type" = 'paperclip_runner';--> statement-breakpoint
14
+ UPDATE "finance_events" SET "execution_adapter_type" = 'wardmote_runner' WHERE "execution_adapter_type" = 'paperclip_runner';--> statement-breakpoint
15
+ UPDATE "agent_config_revisions"
16
+ SET
17
+ "before_config" = CASE
18
+ WHEN "before_config" ->> 'adapterType' = 'paperclip_runner'
19
+ THEN jsonb_set("before_config", '{adapterType}', '"wardmote_runner"')
20
+ ELSE "before_config"
21
+ END,
22
+ "after_config" = CASE
23
+ WHEN "after_config" ->> 'adapterType' = 'paperclip_runner'
24
+ THEN jsonb_set("after_config", '{adapterType}', '"wardmote_runner"')
25
+ ELSE "after_config"
26
+ END
27
+ WHERE "before_config" ->> 'adapterType' = 'paperclip_runner'
28
+ OR "after_config" ->> 'adapterType' = 'paperclip_runner';--> statement-breakpoint
29
+ UPDATE "approvals"
30
+ SET "payload" = jsonb_set("payload", '{adapterType}', '"wardmote_runner"')
31
+ WHERE "payload" ->> 'adapterType' = 'paperclip_runner';--> statement-breakpoint
32
+ UPDATE "issue_comments"
33
+ SET "metadata" = jsonb_set("metadata", '{authorizationReason}', '"wardmote_runner_protocol"')
34
+ WHERE "metadata" ->> 'authorizationReason' = 'paperclip_runner_protocol';
@@ -0,0 +1,57 @@
1
+ CREATE OR REPLACE FUNCTION "wardmote_rename_retired_keys"(value jsonb) RETURNS jsonb LANGUAGE sql IMMUTABLE AS $$
2
+ SELECT CASE jsonb_typeof(value)
3
+ WHEN 'object' THEN (
4
+ SELECT COALESCE(jsonb_object_agg(
5
+ regexp_replace(regexp_replace(entry.key, '^([a-z][A-Za-z0-9]*)?paperclip([A-Z0-9])', '\1wardmote\2'), '([a-z0-9])Paperclip([A-Z0-9])', '\1Wardmote\2', 'g'),
6
+ "wardmote_rename_retired_keys"(entry.value)
7
+ ), '{}'::jsonb)
8
+ FROM jsonb_each(value) AS entry
9
+ )
10
+ WHEN 'array' THEN (
11
+ SELECT COALESCE(jsonb_agg("wardmote_rename_retired_keys"(element.value) ORDER BY element.ordinality), '[]'::jsonb)
12
+ FROM jsonb_array_elements(value) WITH ORDINALITY AS element(value, ordinality)
13
+ )
14
+ ELSE value
15
+ END
16
+ $$;--> statement-breakpoint
17
+ CREATE OR REPLACE FUNCTION "wardmote_has_retired_keys"(value jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE AS $$
18
+ SELECT value IS NOT NULL AND value::text ~ '"([a-z][A-Za-z0-9]*)?(paperclip|[a-z0-9]Paperclip)[A-Z0-9][A-Za-z0-9]*":'
19
+ $$;--> statement-breakpoint
20
+ UPDATE "instance_settings" SET
21
+ "general" = "wardmote_rename_retired_keys"("general"),
22
+ "experimental" = "wardmote_rename_retired_keys"("experimental")
23
+ WHERE "wardmote_has_retired_keys"("general") OR "wardmote_has_retired_keys"("experimental");--> statement-breakpoint
24
+ UPDATE "agents" SET
25
+ "adapter_config" = "wardmote_rename_retired_keys"("adapter_config"),
26
+ "runtime_config" = "wardmote_rename_retired_keys"("runtime_config"),
27
+ "metadata" = "wardmote_rename_retired_keys"("metadata")
28
+ WHERE "wardmote_has_retired_keys"("adapter_config") OR "wardmote_has_retired_keys"("runtime_config") OR "wardmote_has_retired_keys"("metadata");--> statement-breakpoint
29
+ UPDATE "agent_config_revisions" SET
30
+ "before_config" = "wardmote_rename_retired_keys"("before_config"),
31
+ "after_config" = "wardmote_rename_retired_keys"("after_config")
32
+ WHERE "wardmote_has_retired_keys"("before_config") OR "wardmote_has_retired_keys"("after_config");--> statement-breakpoint
33
+ UPDATE "agent_task_sessions" SET "session_params_json" = "wardmote_rename_retired_keys"("session_params_json")
34
+ WHERE "wardmote_has_retired_keys"("session_params_json");--> statement-breakpoint
35
+ UPDATE "agent_wakeup_requests" SET "payload" = "wardmote_rename_retired_keys"("payload")
36
+ WHERE "status" NOT IN ('completed', 'cancelled', 'failed', 'skipped', 'coalesced', 'interrupted') AND "wardmote_has_retired_keys"("payload");--> statement-breakpoint
37
+ UPDATE "plugin_config" SET "config_json" = "wardmote_rename_retired_keys"("config_json")
38
+ WHERE "wardmote_has_retired_keys"("config_json");--> statement-breakpoint
39
+ UPDATE "plugin_company_settings" SET "settings_json" = "wardmote_rename_retired_keys"("settings_json")
40
+ WHERE "wardmote_has_retired_keys"("settings_json");--> statement-breakpoint
41
+ UPDATE "heartbeat_runs" SET "context_snapshot" = (
42
+ SELECT COALESCE(jsonb_object_agg(
43
+ regexp_replace(entry.key, '^paperclip([A-Z0-9])', 'wardmote\1'), entry.value
44
+ ), '{}'::jsonb)
45
+ FROM jsonb_each("heartbeat_runs"."context_snapshot") AS entry
46
+ )
47
+ WHERE jsonb_typeof("context_snapshot") = 'object'
48
+ AND ("status" IN ('queued', 'running') OR "created_at" > now() - interval '14 days' OR "context_snapshot" ? 'paperclipSecretRedactions')
49
+ AND EXISTS (SELECT 1 FROM jsonb_object_keys("heartbeat_runs"."context_snapshot") AS key WHERE key ~ '^paperclip[A-Z0-9]');--> statement-breakpoint
50
+ DROP FUNCTION "wardmote_has_retired_keys"(jsonb);--> statement-breakpoint
51
+ DROP FUNCTION "wardmote_rename_retired_keys"(jsonb);--> statement-breakpoint
52
+ DROP INDEX IF EXISTS "agents_company_built_in_agent_key_unique_idx";--> statement-breakpoint
53
+ CREATE UNIQUE INDEX "agents_company_built_in_agent_key_unique_idx"
54
+ ON "agents" ("company_id", (("metadata" -> 'wardmoteBuiltInAgent' ->> 'key')))
55
+ WHERE ("metadata" -> 'wardmoteBuiltInAgent' ->> 'key') IS NOT NULL AND "status" <> 'terminated';--> statement-breakpoint
56
+ DROP INDEX IF EXISTS "heartbeat_runs_company_ctx_issue_redaction_idx";--> statement-breakpoint
57
+ CREATE INDEX "heartbeat_runs_company_ctx_issue_redaction_idx" ON "heartbeat_runs" USING btree ("company_id",("context_snapshot" ->> 'issueId')) WHERE "heartbeat_runs"."context_snapshot" ? 'wardmoteSecretRedactions';
@@ -0,0 +1,92 @@
1
+ DO $$
2
+ BEGIN
3
+ UPDATE "folders" AS legacy
4
+ SET
5
+ "system_key" = 'bundled:wardmote-core',
6
+ "slug" = CASE WHEN legacy."slug" = 'paperclip-core' THEN 'wardmote-core' ELSE legacy."slug" END,
7
+ "name" = CASE WHEN legacy."name" = 'Paperclip Core' THEN 'Wardmote Core' ELSE legacy."name" END,
8
+ "updated_at" = now()
9
+ WHERE legacy."system_key" = 'bundled:paperclip-core'
10
+ AND NOT EXISTS (
11
+ SELECT 1 FROM "folders" AS current
12
+ WHERE current."company_id" = legacy."company_id"
13
+ AND current."kind" = legacy."kind"
14
+ AND current."system_key" = 'bundled:wardmote-core'
15
+ )
16
+ AND NOT EXISTS (
17
+ SELECT 1 FROM "folders" AS sibling
18
+ WHERE sibling."company_id" = legacy."company_id"
19
+ AND sibling."kind" = legacy."kind"
20
+ AND sibling."parent_id" IS NOT DISTINCT FROM legacy."parent_id"
21
+ AND sibling."slug" = 'wardmote-core'
22
+ );
23
+
24
+ UPDATE "company_skills" AS legacy
25
+ SET
26
+ "key" = CASE
27
+ WHEN legacy."key" ~ '^paperclipai/(bundled|optional)/'
28
+ AND NOT EXISTS (
29
+ SELECT 1 FROM "company_skills" AS current
30
+ WHERE current."company_id" = legacy."company_id"
31
+ AND current."key" = regexp_replace(
32
+ regexp_replace(legacy."key", '^paperclipai/', 'tickernelz/'),
33
+ '/paperclip-(operations|capsules)/', '/wardmote-\1/'
34
+ )
35
+ )
36
+ THEN regexp_replace(
37
+ regexp_replace(legacy."key", '^paperclipai/', 'tickernelz/'),
38
+ '/paperclip-(operations|capsules)/', '/wardmote-\1/'
39
+ )
40
+ ELSE legacy."key"
41
+ END,
42
+ "metadata" = CASE
43
+ WHEN legacy."metadata"::text ~ '"paperclipai[/:](bundled|optional)[/:]|paperclip-(operations|capsules)'
44
+ THEN regexp_replace(
45
+ regexp_replace(legacy."metadata"::text, '"paperclipai([/:])(bundled|optional)\1', '"tickernelz\1\2\1', 'g'),
46
+ '([/:"])paperclip-(operations|capsules)([/:"])', '\1wardmote-\2\3', 'g'
47
+ )::jsonb
48
+ ELSE legacy."metadata"
49
+ END,
50
+ "updated_at" = now()
51
+ WHERE (
52
+ legacy."key" ~ '^paperclipai/(bundled|optional)/'
53
+ AND NOT EXISTS (
54
+ SELECT 1 FROM "company_skills" AS current
55
+ WHERE current."company_id" = legacy."company_id"
56
+ AND current."key" = regexp_replace(
57
+ regexp_replace(legacy."key", '^paperclipai/', 'tickernelz/'),
58
+ '/paperclip-(operations|capsules)/', '/wardmote-\1/'
59
+ )
60
+ )
61
+ )
62
+ OR legacy."metadata"::text ~ '"paperclipai[/:](bundled|optional)[/:]|paperclip-(operations|capsules)';
63
+
64
+ UPDATE "agents"
65
+ SET
66
+ "adapter_config" = regexp_replace(
67
+ regexp_replace("adapter_config"::text, '"paperclipai([/:])(bundled|optional)\1', '"tickernelz\1\2\1', 'g'),
68
+ '([/:"])paperclip-(operations|capsules)([/:"])', '\1wardmote-\2\3', 'g'
69
+ )::jsonb,
70
+ "metadata" = CASE
71
+ WHEN "metadata" IS NULL THEN NULL
72
+ ELSE regexp_replace(
73
+ regexp_replace("metadata"::text, '"paperclipai([/:])(bundled|optional)\1', '"tickernelz\1\2\1', 'g'),
74
+ '([/:"])paperclip-(operations|capsules)([/:"])', '\1wardmote-\2\3', 'g'
75
+ )::jsonb
76
+ END
77
+ WHERE "adapter_config"::text ~ '"paperclipai[/:](bundled|optional)[/:]|[/:"]paperclip-(operations|capsules)[/:"]'
78
+ OR "metadata"::text ~ '"paperclipai[/:](bundled|optional)[/:]|[/:"]paperclip-(operations|capsules)[/:"]';
79
+
80
+ UPDATE "agent_config_revisions"
81
+ SET
82
+ "before_config" = regexp_replace(
83
+ regexp_replace("before_config"::text, '"paperclipai([/:])(bundled|optional)\1', '"tickernelz\1\2\1', 'g'),
84
+ '([/:"])paperclip-(operations|capsules)([/:"])', '\1wardmote-\2\3', 'g'
85
+ )::jsonb,
86
+ "after_config" = regexp_replace(
87
+ regexp_replace("after_config"::text, '"paperclipai([/:])(bundled|optional)\1', '"tickernelz\1\2\1', 'g'),
88
+ '([/:"])paperclip-(operations|capsules)([/:"])', '\1wardmote-\2\3', 'g'
89
+ )::jsonb
90
+ WHERE "before_config"::text ~ '"paperclipai[/:](bundled|optional)[/:]|[/:"]paperclip-(operations|capsules)[/:"]'
91
+ OR "after_config"::text ~ '"paperclipai[/:](bundled|optional)[/:]|[/:"]paperclip-(operations|capsules)[/:"]';
92
+ END $$;
@@ -0,0 +1,118 @@
1
+ DO $$
2
+ DECLARE
3
+ namespace_row record;
4
+ BEGIN
5
+ CREATE TEMP TABLE wardmote_plugin_key_map (old_key text PRIMARY KEY, new_key text NOT NULL) ON COMMIT DROP;
6
+ INSERT INTO wardmote_plugin_key_map (old_key, new_key) VALUES
7
+ ('paperclipai.plugin-llm-wiki', 'wardmote.plugin-llm-wiki'),
8
+ ('paperclipai.plugin-briefs', 'wardmote.plugin-briefs'),
9
+ ('paperclipai.content-machine', 'wardmote.content-machine'),
10
+ ('paperclipai.plugin-orchestration-smoke-example', 'wardmote.plugin-orchestration-smoke-example'),
11
+ ('paperclipai.plugin-authoring-smoke-example', 'wardmote.plugin-authoring-smoke-example'),
12
+ ('paperclip.createos-sandbox-provider', 'wardmote.createos-sandbox-provider'),
13
+ ('paperclip.cloudflare-sandbox-provider', 'wardmote.cloudflare-sandbox-provider'),
14
+ ('paperclip.daytona-sandbox-provider', 'wardmote.daytona-sandbox-provider'),
15
+ ('paperclip.e2b-sandbox-provider', 'wardmote.e2b-sandbox-provider'),
16
+ ('paperclip.exe-dev-sandbox-provider', 'wardmote.exe-dev-sandbox-provider'),
17
+ ('paperclip.kubernetes-sandbox-provider', 'wardmote.kubernetes-sandbox-provider'),
18
+ ('paperclip.modal-sandbox-provider', 'wardmote.modal-sandbox-provider'),
19
+ ('paperclip.novita-sandbox-provider', 'wardmote.novita-sandbox-provider'),
20
+ ('paperclip.fake-sandbox-provider', 'wardmote.fake-sandbox-provider'),
21
+ ('paperclip.workspace-diff', 'wardmote.workspace-diff'),
22
+ ('paperclip.hello-world-example', 'wardmote.hello-world-example'),
23
+ ('paperclip-file-browser-example', 'wardmote-file-browser-example'),
24
+ ('paperclip-kitchen-sink-example', 'wardmote-kitchen-sink-example');
25
+
26
+ DELETE FROM wardmote_plugin_key_map AS map
27
+ WHERE EXISTS (SELECT 1 FROM "plugins" WHERE "plugin_key" = map.new_key);
28
+
29
+ CREATE TEMP TABLE wardmote_plugin_namespace_map (old_name text PRIMARY KEY, new_name text NOT NULL) ON COMMIT DROP;
30
+ INSERT INTO wardmote_plugin_namespace_map (old_name, new_name) VALUES
31
+ ('plugin_llm_wiki_8f50da974f', 'plugin_llm_wiki_1e554e7667'),
32
+ ('plugin_orchestration_smoke_1e8c264c64', 'plugin_orchestration_smoke_bb8146106b');
33
+
34
+ CREATE TEMP TABLE wardmote_plugin_checksum_map (old_checksum text PRIMARY KEY, new_checksum text NOT NULL) ON COMMIT DROP;
35
+ INSERT INTO wardmote_plugin_checksum_map (old_checksum, new_checksum) VALUES
36
+ ('fc392bf90771b716053de451810ea196c7aa8ab44478fcd18803928384da41d3', '106b2c36f71a3f0faa31a6a53e8455a3f5b9e1fac13b72c497fea4cb432c714a'),
37
+ ('57162e4aaf5f64c428acb2c9d8b0fa47e6f27c3cc3fa1350d99e3dd1b2db77e5', '5c3acabd8ebfcc9c6a5995e2c594abd922c265b1fb6c8db1b1b4535b3d97be13'),
38
+ ('82056a08864d022742b3900ff1799df553beea90c4fdc3816f3b23776b72a366', '96e89feec7363d857aef2bb95a270a21cd0a1b292c89967c20c676c042f723e1'),
39
+ ('01d936d8a121c56371a318c0a5b84e13431c0f9de9705cf0389666b06778cb92', '5f6cf43a9c4036531812c9a68ac305e4318e29ec3c60ac16902bb32c4208f4ca'),
40
+ ('b2768a65b30e7906e00e90d8f50044e4be7185d11eb07e825ae2792c2f19e26a', '07fa8f83fe733f63fa517c631b553015b6a829836e648e9f731335a5ecec493a');
41
+
42
+ FOR namespace_row IN
43
+ SELECT ns."id", ns."namespace_name" AS old_name, nm.new_name
44
+ FROM "plugin_database_namespaces" AS ns
45
+ JOIN wardmote_plugin_key_map AS map ON map.old_key = ns."plugin_key"
46
+ JOIN wardmote_plugin_namespace_map AS nm ON nm.old_name = ns."namespace_name"
47
+ WHERE NOT EXISTS (SELECT 1 FROM "plugin_database_namespaces" WHERE "namespace_name" = nm.new_name)
48
+ LOOP
49
+ IF EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = namespace_row.old_name)
50
+ AND NOT EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = namespace_row.new_name)
51
+ THEN
52
+ EXECUTE format('ALTER SCHEMA %I RENAME TO %I', namespace_row.old_name, namespace_row.new_name);
53
+ END IF;
54
+ IF NOT EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = namespace_row.old_name) THEN
55
+ UPDATE "plugin_database_namespaces"
56
+ SET "namespace_name" = namespace_row.new_name, "updated_at" = now()
57
+ WHERE "id" = namespace_row."id";
58
+ UPDATE "plugin_migrations"
59
+ SET "namespace_name" = namespace_row.new_name
60
+ WHERE "namespace_name" = namespace_row.old_name;
61
+ END IF;
62
+ END LOOP;
63
+
64
+ UPDATE "plugin_migrations" AS migration
65
+ SET "checksum" = cm.new_checksum
66
+ FROM wardmote_plugin_key_map AS map, wardmote_plugin_checksum_map AS cm
67
+ WHERE migration."plugin_key" = map.old_key
68
+ AND migration."checksum" = cm.old_checksum
69
+ AND migration."namespace_name" IN (SELECT new_name FROM wardmote_plugin_namespace_map);
70
+
71
+ UPDATE "plugin_migrations" AS migration SET "plugin_key" = map.new_key
72
+ FROM wardmote_plugin_key_map AS map WHERE migration."plugin_key" = map.old_key;
73
+ UPDATE "plugin_database_namespaces" AS ns SET "plugin_key" = map.new_key, "updated_at" = now()
74
+ FROM wardmote_plugin_key_map AS map WHERE ns."plugin_key" = map.old_key;
75
+ UPDATE "plugin_managed_resources" AS resource SET "plugin_key" = map.new_key, "updated_at" = now()
76
+ FROM wardmote_plugin_key_map AS map WHERE resource."plugin_key" = map.old_key;
77
+ UPDATE "ai_connection_pools" AS pool SET "plugin_key" = map.new_key
78
+ FROM wardmote_plugin_key_map AS map WHERE pool."plugin_key" = map.old_key;
79
+ UPDATE "plugins" AS plugin
80
+ SET
81
+ "plugin_key" = map.new_key,
82
+ "manifest_json" = CASE
83
+ WHEN plugin."manifest_json" ->> 'id' = map.old_key THEN jsonb_set(plugin."manifest_json", '{id}', to_jsonb(map.new_key))
84
+ ELSE plugin."manifest_json"
85
+ END,
86
+ "updated_at" = now()
87
+ FROM wardmote_plugin_key_map AS map
88
+ WHERE plugin."plugin_key" = map.old_key;
89
+
90
+ UPDATE "issues" AS issue
91
+ SET "origin_kind" = 'plugin:' || map.new_key || substr(issue."origin_kind", length('plugin:' || map.old_key) + 1)
92
+ FROM wardmote_plugin_key_map AS map
93
+ WHERE issue."origin_kind" = 'plugin:' || map.old_key
94
+ OR issue."origin_kind" LIKE 'plugin:' || map.old_key || ':%';
95
+
96
+ UPDATE "agent_task_sessions" AS session
97
+ SET "task_key" = 'plugin:' || map.new_key || substr(session."task_key", length('plugin:' || map.old_key) + 1)
98
+ FROM wardmote_plugin_key_map AS map
99
+ WHERE session."task_key" LIKE 'plugin:' || map.old_key || ':%';
100
+
101
+ UPDATE "environment_leases" AS lease
102
+ SET "provider" = 'plugin:' || map.new_key || substr(lease."provider", length('plugin:' || map.old_key) + 1)
103
+ FROM wardmote_plugin_key_map AS map
104
+ WHERE lease."provider" LIKE 'plugin:' || map.old_key || ':%';
105
+ UPDATE "environment_custom_image_templates" AS template
106
+ SET "provider" = 'plugin:' || map.new_key || substr(template."provider", length('plugin:' || map.old_key) + 1)
107
+ FROM wardmote_plugin_key_map AS map
108
+ WHERE template."provider" LIKE 'plugin:' || map.old_key || ':%';
109
+ UPDATE "environment_custom_image_setup_sessions" AS setup
110
+ SET "provider" = 'plugin:' || map.new_key || substr(setup."provider", length('plugin:' || map.old_key) + 1)
111
+ FROM wardmote_plugin_key_map AS map
112
+ WHERE setup."provider" LIKE 'plugin:' || map.old_key || ':%';
113
+
114
+ UPDATE "environments" AS environment
115
+ SET "config" = jsonb_set(environment."config", '{pluginKey}', to_jsonb(map.new_key))
116
+ FROM wardmote_plugin_key_map AS map
117
+ WHERE environment."config" ->> 'pluginKey' = map.old_key;
118
+ END $$;
@@ -0,0 +1,13 @@
1
+ DROP INDEX IF EXISTS "environments_managed_sandbox_idx";--> statement-breakpoint
2
+ UPDATE "environments"
3
+ SET "metadata" = ("metadata" - 'managedByPaperclip') || jsonb_build_object('managedByWardmote', "metadata" -> 'managedByPaperclip')
4
+ WHERE "metadata" ? 'managedByPaperclip' AND NOT ("metadata" ? 'managedByWardmote');--> statement-breakpoint
5
+ UPDATE "environments"
6
+ SET "metadata" = "metadata" - 'managedByPaperclip'
7
+ WHERE "metadata" ? 'managedByPaperclip' AND "metadata" ? 'managedByWardmote';--> statement-breakpoint
8
+ UPDATE "environments"
9
+ SET "description" = 'Default execution environment for Wardmote runs on this machine.'
10
+ WHERE "description" = 'Default execution environment for Paperclip runs on this machine.';--> statement-breakpoint
11
+ CREATE UNIQUE INDEX IF NOT EXISTS "environments_managed_sandbox_idx"
12
+ ON "environments" USING btree ("driver")
13
+ WHERE "driver" = 'sandbox' AND ("metadata" ->> 'managedByWardmote')::boolean = true;
@@ -0,0 +1,31 @@
1
+ UPDATE "agent_instruction_working_copies"
2
+ SET "receipt" = jsonb_set("receipt", '{schema}', '"wardmote.agent-files.v1"')
3
+ WHERE "receipt" ->> 'schema' = 'paperclip.agent-files.v1';--> statement-breakpoint
4
+ UPDATE "heartbeat_runs"
5
+ SET "result_json" = jsonb_set("result_json", '{presentationDecision,schema}', '"wardmote.run_presentation_decision.v1"')
6
+ WHERE "result_json" -> 'presentationDecision' ->> 'schema' = 'paperclip.run_presentation_decision.v1';--> statement-breakpoint
7
+ UPDATE "heartbeat_run_events"
8
+ SET "payload" = jsonb_set("payload", '{presentationDecision,schema}', '"wardmote.run_presentation_decision.v1"')
9
+ WHERE "payload" -> 'presentationDecision' ->> 'schema' = 'paperclip.run_presentation_decision.v1'
10
+ AND "source_payload_sha256" IS NULL;--> statement-breakpoint
11
+ UPDATE "issue_thread_interactions"
12
+ SET "payload" = jsonb_set("payload", '{questionSet,schema}', '"wardmote.question_set.v1"')
13
+ WHERE "payload" -> 'questionSet' ->> 'schema' = 'paperclip.question_set.v1';--> statement-breakpoint
14
+ UPDATE "environment_leases"
15
+ SET "metadata" = jsonb_set("metadata", '{remoteExecutionTermination,schema}', to_jsonb('wardmote.' || substr("metadata" #>> '{remoteExecutionTermination,schema}', 11)))
16
+ WHERE "metadata" #>> '{remoteExecutionTermination,schema}' LIKE 'paperclip.%';--> statement-breakpoint
17
+ UPDATE "environment_leases"
18
+ SET "metadata" = jsonb_set("metadata", '{sandboxStopAndRetainReceipt,schema}', to_jsonb('wardmote.' || substr("metadata" #>> '{sandboxStopAndRetainReceipt,schema}', 11)))
19
+ WHERE "metadata" #>> '{sandboxStopAndRetainReceipt,schema}' LIKE 'paperclip.%';--> statement-breakpoint
20
+ UPDATE "environment_leases"
21
+ SET "metadata" = jsonb_set("metadata", '{sandboxStopAndRetain,schema}', to_jsonb('wardmote.' || substr("metadata" #>> '{sandboxStopAndRetain,schema}', 11)))
22
+ WHERE "metadata" #>> '{sandboxStopAndRetain,schema}' LIKE 'paperclip.%';--> statement-breakpoint
23
+ UPDATE "environment_leases"
24
+ SET "metadata" = jsonb_set("metadata", '{nativeWorkspaceExportResume,schema}', to_jsonb('wardmote.' || substr("metadata" #>> '{nativeWorkspaceExportResume,schema}', 11)))
25
+ WHERE "metadata" #>> '{nativeWorkspaceExportResume,schema}' LIKE 'paperclip.%';--> statement-breakpoint
26
+ UPDATE "chat_actions"
27
+ SET "payload" = jsonb_set("payload", '{registration,schema}', to_jsonb('wardmote.' || substr("payload" #>> '{registration,schema}', 11)))
28
+ WHERE "payload" #>> '{registration,schema}' LIKE 'paperclip.%';--> statement-breakpoint
29
+ UPDATE "chat_deliveries"
30
+ SET "normalized_event" = jsonb_set("normalized_event", '{teamsPersonalRecipient,schema}', to_jsonb('wardmote.' || substr("normalized_event" #>> '{teamsPersonalRecipient,schema}', 11)))
31
+ WHERE "normalized_event" #>> '{teamsPersonalRecipient,schema}' LIKE 'paperclip.%';
@@ -0,0 +1,27 @@
1
+ UPDATE "mcp_oauth_grants"
2
+ SET "scopes" = (
3
+ SELECT jsonb_agg(CASE WHEN value IN ('"paperclip:read"', '"paperclip:write"', '"paperclip:configure"', '"paperclip:agent"') THEN to_jsonb('wardmote:' || substr(value #>> '{}', 11)) ELSE value END ORDER BY ordinality)
4
+ FROM jsonb_array_elements("scopes") WITH ORDINALITY
5
+ )
6
+ WHERE jsonb_typeof("scopes") = 'array'
7
+ AND "scopes" ?| ARRAY['paperclip:read', 'paperclip:write', 'paperclip:configure', 'paperclip:agent'];--> statement-breakpoint
8
+ UPDATE "mcp_oauth_requests"
9
+ SET "scopes" = (
10
+ SELECT jsonb_agg(CASE WHEN value IN ('"paperclip:read"', '"paperclip:write"', '"paperclip:configure"', '"paperclip:agent"') THEN to_jsonb('wardmote:' || substr(value #>> '{}', 11)) ELSE value END ORDER BY ordinality)
11
+ FROM jsonb_array_elements("scopes") WITH ORDINALITY
12
+ )
13
+ WHERE jsonb_typeof("scopes") = 'array'
14
+ AND "scopes" ?| ARRAY['paperclip:read', 'paperclip:write', 'paperclip:configure', 'paperclip:agent'];--> statement-breakpoint
15
+ UPDATE "mcp_oauth_device_requests"
16
+ SET "scopes" = (
17
+ SELECT jsonb_agg(CASE WHEN value IN ('"paperclip:read"', '"paperclip:write"', '"paperclip:configure"', '"paperclip:agent"') THEN to_jsonb('wardmote:' || substr(value #>> '{}', 11)) ELSE value END ORDER BY ordinality)
18
+ FROM jsonb_array_elements("scopes") WITH ORDINALITY
19
+ )
20
+ WHERE jsonb_typeof("scopes") = 'array'
21
+ AND "scopes" ?| ARRAY['paperclip:read', 'paperclip:write', 'paperclip:configure', 'paperclip:agent'];--> statement-breakpoint
22
+ UPDATE "mcp_event_subscriptions"
23
+ SET "name" = 'wardmote.' || substr("name", 11)
24
+ WHERE "name" IN ('paperclip.task.status_changed', 'paperclip.task.comment_created', 'paperclip.task.document_updated', 'paperclip.dot.work_available', 'paperclip.dot.mailbox_updated');--> statement-breakpoint
25
+ UPDATE "mcp_event_deliveries"
26
+ SET "event" = jsonb_set("event", '{name}', to_jsonb('wardmote.' || substr("event" ->> 'name', 11)))
27
+ WHERE "event" ->> 'name' IN ('paperclip.task.status_changed', 'paperclip.task.comment_created', 'paperclip.task.document_updated', 'paperclip.dot.work_available', 'paperclip.dot.mailbox_updated');