@app-vitals/agent-admin 0.0.1 → 0.1.1

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 (325) hide show
  1. package/Dockerfile +43 -0
  2. package/README.md +72 -2
  3. package/e2e/agents-page.e2e.ts +338 -0
  4. package/e2e/chat-degraded.e2e.ts +153 -0
  5. package/e2e/chat-page.e2e.ts +169 -0
  6. package/e2e/chat-progress.e2e.ts +206 -0
  7. package/e2e/chat-thread-page.e2e.ts +444 -0
  8. package/e2e/login-page.e2e.ts +148 -0
  9. package/e2e/test-server.ts +427 -0
  10. package/openapi.json +6098 -0
  11. package/openapi.platform.json +5553 -0
  12. package/package.json +62 -4
  13. package/playwright.config.ts +25 -0
  14. package/prisma/client/browser.ts +134 -0
  15. package/prisma/client/client.ts +158 -0
  16. package/prisma/client/commonInputTypes.ts +578 -0
  17. package/prisma/client/enums.ts +15 -0
  18. package/prisma/client/internal/class.ts +424 -0
  19. package/prisma/client/internal/prismaNamespace.ts +2898 -0
  20. package/prisma/client/internal/prismaNamespaceBrowser.ts +476 -0
  21. package/prisma/client/models/Account.ts +1774 -0
  22. package/prisma/client/models/AccountInvite.ts +1386 -0
  23. package/prisma/client/models/AccountMember.ts +1351 -0
  24. package/prisma/client/models/Agent.ts +4554 -0
  25. package/prisma/client/models/AgentAsk.ts +1373 -0
  26. package/prisma/client/models/AgentChatTokenUsageDailyByModel.ts +1638 -0
  27. package/prisma/client/models/AgentCronJob.ts +2416 -0
  28. package/prisma/client/models/AgentCronRun.ts +2858 -0
  29. package/prisma/client/models/AgentCronRunModelBreakdown.ts +1532 -0
  30. package/prisma/client/models/AgentCronRunSkillUsage.ts +1642 -0
  31. package/prisma/client/models/AgentEnv.ts +1421 -0
  32. package/prisma/client/models/AgentGitHubInstallationsSnapshot.ts +1289 -0
  33. package/prisma/client/models/AgentMember.ts +1316 -0
  34. package/prisma/client/models/AgentPhaseMethodology.ts +1355 -0
  35. package/prisma/client/models/AgentPlugin.ts +1421 -0
  36. package/prisma/client/models/AgentToken.ts +1380 -0
  37. package/prisma/client/models/AgentTool.ts +1351 -0
  38. package/prisma/client/models/AgentWorkQueueSnapshot.ts +1297 -0
  39. package/prisma/client/models/ChatThreadWatch.ts +1183 -0
  40. package/prisma/client/models/PushSubscription.ts +1233 -0
  41. package/prisma/client/models/SessionAlertState.ts +1187 -0
  42. package/prisma/client/models/SessionFollow.ts +1187 -0
  43. package/prisma/client/models/UserNotificationPrefs.ts +1221 -0
  44. package/prisma/client/models.ts +34 -0
  45. package/prisma/migrations/20260608000000_init/migration.sql +112 -0
  46. package/prisma/migrations/20260616000000_agent_members/migration.sql +18 -0
  47. package/prisma/migrations/20260624000000_add_agent_self_hosted/migration.sql +2 -0
  48. package/prisma/migrations/20260624120000_add_agent_repos/migration.sql +3 -0
  49. package/prisma/migrations/20260625000000_add_agent_cron_run/migration.sql +26 -0
  50. package/prisma/migrations/20260626000000_add_cron_run_token_fields/migration.sql +10 -0
  51. package/prisma/migrations/20260627000000_add_agent_chat_token_usage_daily/migration.sql +18 -0
  52. package/prisma/migrations/20260627010000_add_agent_chat_token_usage_fk/migration.sql +2 -0
  53. package/prisma/migrations/20260701000000_add_chat_threads_messages/migration.sql +37 -0
  54. package/prisma/migrations/20260701010000_drop_chat_threads_messages/migration.sql +17 -0
  55. package/prisma/migrations/20260701020000_add_cron_run_model_breakdown/migration.sql +23 -0
  56. package/prisma/migrations/20260701020000_chat_token_by_model/migration.sql +25 -0
  57. package/prisma/migrations/20260701030000_add_secret_flag_to_agent_env/migration.sql +2 -0
  58. package/prisma/migrations/20260701030000_drop_cron_run_legacy_columns/migration.sql +5 -0
  59. package/prisma/migrations/20260706000000_consolidate_cron_run_token_accounting/migration.sql +54 -0
  60. package/prisma/migrations/20260709000000_add_phase_to_agent_cron_run/migration.sql +8 -0
  61. package/prisma/migrations/20260717000000_add_item_tracking_to_agent_cron_run/migration.sql +10 -0
  62. package/prisma/migrations/20260717010000_add_agent_work_queue_snapshot/migration.sql +20 -0
  63. package/prisma/migrations/20260718000000_add_cron_phase_columns/migration.sql +25 -0
  64. package/prisma/migrations/20260718100000_drop_agent_cron_run_phase_column/migration.sql +8 -0
  65. package/prisma/migrations/20260724000000_add_agent_type_name/migration.sql +3 -0
  66. package/prisma/migrations/20260725232433_add_agent_author_allowlist/migration.sql +2 -0
  67. package/prisma/migrations/20260727120000_add_not_null_to_agent_author_allowlist/migration.sql +3 -0
  68. package/prisma/migrations/20260731000000_add_session_id_to_agent_cron_run/migration.sql +2 -0
  69. package/prisma/migrations/20260821000000_add_agent_restrict_slack_to_members/migration.sql +3 -0
  70. package/prisma/migrations/20260901000000_add_push_subscription_and_chat_thread_watch/migration.sql +40 -0
  71. package/prisma/migrations/20260903000000_add_agent_patch_author_allowlist/migration.sql +2 -0
  72. package/prisma/migrations/20260903120000_add_agent_review_author_allowlist/migration.sql +18 -0
  73. package/prisma/migrations/20260903150000_drop_agent_author_allowlist/migration.sql +14 -0
  74. package/prisma/migrations/20260905000000_add_started_at_index_to_agent_cron_run/migration.sql +11 -0
  75. package/prisma/migrations/20260906000000_add_session_follow_notification_prefs_alert_state/migration.sql +47 -0
  76. package/prisma/migrations/20260911000000_backfill_auto_follow_since/migration.sql +16 -0
  77. package/prisma/migrations/20260923115814_add_last_heartbeat_at_to_agent_cron_run/migration.sql +2 -0
  78. package/prisma/migrations/20260924120000_add_trial_expiry_fields_to_agent/migration.sql +6 -0
  79. package/prisma/migrations/20260929000000_add_agent_phase_methodology/migration.sql +21 -0
  80. package/prisma/migrations/20260929120000_add_agent_policy_fields/migration.sql +15 -0
  81. package/prisma/migrations/20261005000000_add_agent_github_installations_snapshot/migration.sql +21 -0
  82. package/prisma/migrations/20261008000000_add_cron_run_telemetry/migration.sql +50 -0
  83. package/prisma/migrations/20261008010000_add_account_models/migration.sql +48 -0
  84. package/prisma/migrations/20261008020000_add_cron_lockdown_disabled_at/migration.sql +3 -0
  85. package/prisma/migrations/20261009000000_chat_token_usage_bigint/migration.sql +7 -0
  86. package/prisma/migrations/20261010000000_add_cron_run_command_variant/migration.sql +2 -0
  87. package/prisma/migrations/20261019000000_add_agent_anthropic_identity/migration.sql +9 -0
  88. package/prisma/migrations/20261025000000_add_agent_ask/migration.sql +23 -0
  89. package/prisma/migrations/migration_lock.toml +3 -0
  90. package/prisma/schema/coding.prisma +85 -0
  91. package/prisma/schema/schema.prisma +506 -0
  92. package/prisma.config.ts +34 -0
  93. package/pwa-assets/icons/apple-touch-icon.png +0 -0
  94. package/pwa-assets/icons/favicon-32.png +0 -0
  95. package/pwa-assets/icons/icon-192.png +0 -0
  96. package/pwa-assets/icons/icon-512.png +0 -0
  97. package/pwa-assets/icons/icon-maskable-192.png +0 -0
  98. package/pwa-assets/icons/icon-maskable-512.png +0 -0
  99. package/src/account-agent-create.ts +42 -0
  100. package/src/account-agent-create.unit.test.ts +28 -0
  101. package/src/account-created-notifier.ts +71 -0
  102. package/src/account-created-notifier.unit.test.ts +70 -0
  103. package/src/account-email.ts +9 -0
  104. package/src/account-email.unit.test.ts +21 -0
  105. package/src/account-invites.ts +70 -0
  106. package/src/account-lifecycle.integration.test.ts +329 -0
  107. package/src/account-lifecycle.ts +206 -0
  108. package/src/account-lifecycle.unit.test.ts +108 -0
  109. package/src/account-members.ts +128 -0
  110. package/src/account-onboarding.integration.test.ts +101 -0
  111. package/src/account-onboarding.ts +95 -0
  112. package/src/account-trial-expiry-sweeper.ts +85 -0
  113. package/src/account-trial-warning-sweeper.integration.test.ts +228 -0
  114. package/src/account-trial-warning-sweeper.ts +216 -0
  115. package/src/accounts-api.integration.test.ts +196 -0
  116. package/src/accounts-api.smoke.test.ts +292 -0
  117. package/src/accounts-api.ts +289 -0
  118. package/src/accounts-api.unit.test.ts +93 -0
  119. package/src/accounts.integration.test.ts +178 -0
  120. package/src/accounts.ts +208 -0
  121. package/src/admin-boot-config.ts +574 -0
  122. package/src/admin-boot-config.unit.test.ts +28 -0
  123. package/src/admin-boot.boot-order.unit.test.ts +91 -0
  124. package/src/admin-boot.ts +690 -0
  125. package/src/admin-dev-login.smoke.test.ts +317 -0
  126. package/src/admin-extension.ts +432 -0
  127. package/src/admin-extension.unit.test.ts +532 -0
  128. package/src/admin-local-agent.smoke.test.ts +1643 -0
  129. package/src/admin-spec.smoke.test.ts +96 -0
  130. package/src/admin-spec.ts +186 -0
  131. package/src/admin-ui-account-nav.ts +20 -0
  132. package/src/admin-ui-account-pages.ts +131 -0
  133. package/src/admin-ui-account-pages.unit.test.ts +112 -0
  134. package/src/admin-ui-account.smoke.test.ts +286 -0
  135. package/src/admin-ui-account.ts +185 -0
  136. package/src/admin-ui-accounts-pages.ts +202 -0
  137. package/src/admin-ui-accounts-pages.unit.test.ts +138 -0
  138. package/src/admin-ui-accounts.smoke.test.ts +434 -0
  139. package/src/admin-ui-accounts.ts +266 -0
  140. package/src/admin-ui-layout.ts +60 -0
  141. package/src/admin-ui-layout.unit.test.ts +140 -0
  142. package/src/admin-ui-pages.ts +3489 -0
  143. package/src/admin-ui-pages.unit.test.ts +4355 -0
  144. package/src/admin-ui-push-test.smoke.test.ts +125 -0
  145. package/src/admin-ui-push-test.ts +102 -0
  146. package/src/admin-ui-styles.ts +656 -0
  147. package/src/admin-ui-styles.unit.test.ts +103 -0
  148. package/src/admin-ui.fixtures.ts +457 -0
  149. package/src/admin-ui.smoke.test.ts +7227 -0
  150. package/src/admin-ui.ts +3824 -0
  151. package/src/agent-account-assignment.ts +49 -0
  152. package/src/agent-account-assignment.unit.test.ts +99 -0
  153. package/src/agent-anthropic-identity.integration.test.ts +99 -0
  154. package/src/agent-anthropic-identity.ts +78 -0
  155. package/src/agent-anthropic-identity.unit.test.ts +77 -0
  156. package/src/agent-ask-config.ts +59 -0
  157. package/src/agent-ask-config.unit.test.ts +70 -0
  158. package/src/agent-ask.integration.test.ts +175 -0
  159. package/src/agent-ask.smoke.test.ts +457 -0
  160. package/src/agent-ask.ts +378 -0
  161. package/src/agent-chat-tokens.integration.test.ts +420 -0
  162. package/src/agent-chat-tokens.smoke.test.ts +551 -0
  163. package/src/agent-chat-tokens.ts +259 -0
  164. package/src/agent-cron-jobs.integration.test.ts +582 -0
  165. package/src/agent-cron-jobs.ts +615 -0
  166. package/src/agent-cron-jobs.unit.test.ts +420 -0
  167. package/src/agent-cron-run-stats.integration.test.ts +1551 -0
  168. package/src/agent-cron-run-stats.smoke.test.ts +953 -0
  169. package/src/agent-cron-run-stats.ts +752 -0
  170. package/src/agent-cron-runs.integration.test.ts +1491 -0
  171. package/src/agent-cron-runs.ts +489 -0
  172. package/src/agent-deletion-checklist.ts +128 -0
  173. package/src/agent-deletion-checklist.unit.test.ts +201 -0
  174. package/src/agent-deletion-per-agent.integration.test.ts +323 -0
  175. package/src/agent-deletion.integration.test.ts +323 -0
  176. package/src/agent-deletion.ts +329 -0
  177. package/src/agent-deletion.unit.test.ts +412 -0
  178. package/src/agent-envs.integration.test.ts +323 -0
  179. package/src/agent-envs.ts +244 -0
  180. package/src/agent-github-installations.integration.test.ts +115 -0
  181. package/src/agent-github-installations.ts +52 -0
  182. package/src/agent-manifest.ts +685 -0
  183. package/src/agent-manifest.unit.test.ts +870 -0
  184. package/src/agent-members.ts +69 -0
  185. package/src/agent-members.unit.test.ts +250 -0
  186. package/src/agent-patch-author-allowlist.integration.test.ts +218 -0
  187. package/src/agent-plugins.integration.test.ts +157 -0
  188. package/src/agent-plugins.ts +95 -0
  189. package/src/agent-plugins.unit.test.ts +43 -0
  190. package/src/agent-provisioner-per-agent.integration.test.ts +949 -0
  191. package/src/agent-provisioner.integration.test.ts +1245 -0
  192. package/src/agent-provisioner.ts +1650 -0
  193. package/src/agent-provisioner.unit.test.ts +1852 -0
  194. package/src/agent-tokens.integration.test.ts +150 -0
  195. package/src/agent-tokens.ts +112 -0
  196. package/src/agent-tools.integration.test.ts +129 -0
  197. package/src/agent-tools.ts +111 -0
  198. package/src/agents-api.integration.test.ts +705 -0
  199. package/src/agents-api.sentry.smoke.test.ts +478 -0
  200. package/src/agents-api.smoke.test.ts +5986 -0
  201. package/src/agents-api.ts +2826 -0
  202. package/src/agents.integration.test.ts +512 -0
  203. package/src/agents.ts +1097 -0
  204. package/src/agents.unit.test.ts +1736 -0
  205. package/src/anthropic-credential-guard.ts +44 -0
  206. package/src/anthropic-credential-guard.unit.test.ts +88 -0
  207. package/src/anthropic-federated-token-provider.integration.test.ts +248 -0
  208. package/src/anthropic-federated-token-provider.ts +249 -0
  209. package/src/anthropic-identity-client.fixtures.ts +237 -0
  210. package/src/anthropic-identity-client.integration.test.ts +342 -0
  211. package/src/anthropic-identity-client.ts +473 -0
  212. package/src/anthropic-identity-fixture-spec.integration.test.ts +169 -0
  213. package/src/anthropic-identity-name.integration.test.ts +83 -0
  214. package/src/anthropic-identity-name.ts +163 -0
  215. package/src/anthropic-identity-name.unit.test.ts +345 -0
  216. package/src/anthropic-openapi-contract.fixtures.ts +192 -0
  217. package/src/api-auth.ts +383 -0
  218. package/src/api-auth.unit.test.ts +837 -0
  219. package/src/api.smoke.test.ts +1225 -0
  220. package/src/api.ts +376 -0
  221. package/src/attachment-validation.ts +124 -0
  222. package/src/attachment-validation.unit.test.ts +218 -0
  223. package/src/caller-scope.ts +131 -0
  224. package/src/caller-scope.unit.test.ts +116 -0
  225. package/src/chat-credential-config.ts +22 -0
  226. package/src/chat-credentials-logging.unit.test.ts +92 -0
  227. package/src/chat-markers.ts +114 -0
  228. package/src/chat-markers.unit.test.ts +116 -0
  229. package/src/chat-service-provisioning-client.integration.test.ts +412 -0
  230. package/src/chat-service-provisioning-client.ts +221 -0
  231. package/src/chat.smoke.test.ts +1875 -0
  232. package/src/clock.ts +47 -0
  233. package/src/coding-task-store-provisioning-client.integration.test.ts +372 -0
  234. package/src/coding-task-store-provisioning-client.ts +156 -0
  235. package/src/crypto.ts +83 -0
  236. package/src/dev-auth-guard.ts +29 -0
  237. package/src/dev-auth-guard.unit.test.ts +51 -0
  238. package/src/errors.ts +77 -0
  239. package/src/errors.unit.test.ts +52 -0
  240. package/src/fixtures/anthropic-identity-recorded-fixtures.json +850 -0
  241. package/src/fixtures/anthropic-openapi/SDK_VERSION +1 -0
  242. package/src/fixtures/anthropic-openapi/mock-spec.json.gz +0 -0
  243. package/src/fixtures/chat-service-provisioning-cassette.json +156 -0
  244. package/src/fixtures/github-app-manifest-cassette.json +44 -0
  245. package/src/fixtures/google-auth-cassette.json +36 -0
  246. package/src/fixtures/http-chat-client-cassette.json +226 -0
  247. package/src/fixtures/k8s-cassette.json +470 -0
  248. package/src/fixtures/okta-auth-cassette.json +36 -0
  249. package/src/fixtures/slack-provision-cassette.json +12 -0
  250. package/src/fixtures/slack-provisioning-http-cassette.json +98 -0
  251. package/src/fixtures/task-store-provisioning-cassette.json +85 -0
  252. package/src/github-app-provisioning-client.integration.test.ts +149 -0
  253. package/src/github-app-provisioning-client.ts +161 -0
  254. package/src/github-app-provisioning-client.unit.test.ts +114 -0
  255. package/src/github-provisioning-service.ts +569 -0
  256. package/src/github-provisioning-service.unit.test.ts +123 -0
  257. package/src/google-auth-client.integration.test.ts +195 -0
  258. package/src/google-auth-client.ts +121 -0
  259. package/src/http-chat-client.integration.test.ts +554 -0
  260. package/src/http-chat-client.ts +533 -0
  261. package/src/http-chat-client.unit.test.ts +119 -0
  262. package/src/import-boundary.unit.test.ts +240 -0
  263. package/src/kubernetes-client.integration.test.ts +697 -0
  264. package/src/kubernetes-client.ts +1027 -0
  265. package/src/kubernetes-client.unit.test.ts +726 -0
  266. package/src/main.smoke.test.ts +91 -0
  267. package/src/main.ts +21 -0
  268. package/src/main.unit.test.ts +801 -0
  269. package/src/okta-auth-client.integration.test.ts +263 -0
  270. package/src/okta-auth-client.ts +152 -0
  271. package/src/openapi-schemas.ts +1310 -0
  272. package/src/openapi-schemas.unit.test.ts +348 -0
  273. package/src/per-agent-identity.fixtures.ts +305 -0
  274. package/src/platform-doc-route.ts +40 -0
  275. package/src/prisma-client.integration.test.ts +57 -0
  276. package/src/prisma-client.ts +187 -0
  277. package/src/prisma-client.unit.test.ts +178 -0
  278. package/src/prisma-tx.ts +23 -0
  279. package/src/push-content.ts +177 -0
  280. package/src/push-content.unit.test.ts +213 -0
  281. package/src/push-crypto.ts +135 -0
  282. package/src/push-crypto.unit.test.ts +66 -0
  283. package/src/push-sender.ts +169 -0
  284. package/src/push-sender.unit.test.ts +107 -0
  285. package/src/push-service.ts +332 -0
  286. package/src/push-service.unit.test.ts +679 -0
  287. package/src/push-toggle.ts +135 -0
  288. package/src/push-toggle.unit.test.ts +78 -0
  289. package/src/pwa-https-gating.smoke.test.ts +229 -0
  290. package/src/pwa-icons.unit.test.ts +41 -0
  291. package/src/pwa-routes.smoke.test.ts +276 -0
  292. package/src/pwa.ts +380 -0
  293. package/src/pwa.unit.test.ts +321 -0
  294. package/src/schema.unit.test.ts +122 -0
  295. package/src/self-serve-config.ts +52 -0
  296. package/src/self-serve-config.unit.test.ts +79 -0
  297. package/src/server.smoke.test.ts +273 -0
  298. package/src/server.ts +50 -0
  299. package/src/service-integration.ts +67 -0
  300. package/src/service-integration.unit.test.ts +129 -0
  301. package/src/slack-provisioning-client.integration.test.ts +308 -0
  302. package/src/slack-provisioning-client.ts +411 -0
  303. package/src/slack-provisioning-client.unit.test.ts +80 -0
  304. package/src/slack-provisioning-service.integration.test.ts +637 -0
  305. package/src/slack-provisioning-service.ts +451 -0
  306. package/src/slack-provisioning.integration.test.ts +395 -0
  307. package/src/specialty-manifest-loader.fixture.integration.test.ts +63 -0
  308. package/src/specialty-manifest-loader.ts +255 -0
  309. package/src/specialty-manifest-loader.unit.test.ts +301 -0
  310. package/src/specialty-registry.schema.unit.test.ts +35 -0
  311. package/src/specialty-registry.ts +236 -0
  312. package/src/specialty-registry.unit.test.ts +272 -0
  313. package/src/startup-policy-reconcile.ts +77 -0
  314. package/src/startup-policy-reconcile.unit.test.ts +251 -0
  315. package/src/theme-tokens.json +12 -0
  316. package/src/token-crypto.ts +60 -0
  317. package/src/token-crypto.unit.test.ts +182 -0
  318. package/src/trial-expiry-sweeper.integration.test.ts +318 -0
  319. package/src/trial-expiry-sweeper.ts +132 -0
  320. package/src/trial-expiry-sweeper.unit.test.ts +391 -0
  321. package/src/trial-expiry-warning-sweeper.integration.test.ts +468 -0
  322. package/src/trial-expiry-warning-sweeper.ts +447 -0
  323. package/src/trial-expiry-warning-sweeper.unit.test.ts +148 -0
  324. package/src/voice-contract.unit.test.ts +102 -0
  325. package/tsconfig.json +9 -0
@@ -0,0 +1,34 @@
1
+
2
+ /* !!! This is code generated by Prisma. Do not edit directly. !!! */
3
+ /* eslint-disable */
4
+ // biome-ignore-all lint: generated file
5
+ // @ts-nocheck
6
+ /*
7
+ * This is a barrel export file for all models and their related types.
8
+ *
9
+ * 🟢 You can import this file directly.
10
+ */
11
+ export type * from './models/AgentWorkQueueSnapshot.ts'
12
+ export type * from './models/AgentPhaseMethodology.ts'
13
+ export type * from './models/SessionFollow.ts'
14
+ export type * from './models/SessionAlertState.ts'
15
+ export type * from './models/Agent.ts'
16
+ export type * from './models/AgentEnv.ts'
17
+ export type * from './models/AgentCronJob.ts'
18
+ export type * from './models/AgentTool.ts'
19
+ export type * from './models/AgentToken.ts'
20
+ export type * from './models/AgentPlugin.ts'
21
+ export type * from './models/AgentMember.ts'
22
+ export type * from './models/Account.ts'
23
+ export type * from './models/AccountMember.ts'
24
+ export type * from './models/AccountInvite.ts'
25
+ export type * from './models/AgentCronRun.ts'
26
+ export type * from './models/AgentCronRunSkillUsage.ts'
27
+ export type * from './models/AgentCronRunModelBreakdown.ts'
28
+ export type * from './models/AgentChatTokenUsageDailyByModel.ts'
29
+ export type * from './models/AgentAsk.ts'
30
+ export type * from './models/AgentGitHubInstallationsSnapshot.ts'
31
+ export type * from './models/PushSubscription.ts'
32
+ export type * from './models/ChatThreadWatch.ts'
33
+ export type * from './models/UserNotificationPrefs.ts'
34
+ export type * from './commonInputTypes.ts'
@@ -0,0 +1,112 @@
1
+ -- CreateSchema
2
+ CREATE SCHEMA IF NOT EXISTS "public";
3
+
4
+ -- CreateTable
5
+ CREATE TABLE "Agent" (
6
+ "id" TEXT NOT NULL,
7
+ "name" TEXT NOT NULL,
8
+ "slackId" TEXT,
9
+ "slackBotToken" TEXT,
10
+ "anthropicApiKey" TEXT,
11
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+ "updatedAt" TIMESTAMP(3) NOT NULL,
13
+
14
+ CONSTRAINT "Agent_pkey" PRIMARY KEY ("id")
15
+ );
16
+
17
+ -- CreateTable
18
+ CREATE TABLE "AgentEnv" (
19
+ "id" TEXT NOT NULL,
20
+ "agentId" TEXT NOT NULL,
21
+ "key" TEXT NOT NULL,
22
+ "value" TEXT NOT NULL,
23
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
24
+ "updatedAt" TIMESTAMP(3) NOT NULL,
25
+
26
+ CONSTRAINT "AgentEnv_pkey" PRIMARY KEY ("id")
27
+ );
28
+
29
+ -- CreateTable
30
+ CREATE TABLE "AgentCronJob" (
31
+ "id" TEXT NOT NULL,
32
+ "agentId" TEXT NOT NULL,
33
+ "schedule" TEXT NOT NULL,
34
+ "prompt" TEXT NOT NULL,
35
+ "channel" TEXT,
36
+ "user" TEXT,
37
+ "silent" BOOLEAN NOT NULL DEFAULT false,
38
+ "enabled" BOOLEAN NOT NULL DEFAULT true,
39
+ "preCheck" TEXT,
40
+ "name" TEXT,
41
+ "system" BOOLEAN NOT NULL DEFAULT false,
42
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
43
+ "updatedAt" TIMESTAMP(3) NOT NULL,
44
+
45
+ CONSTRAINT "AgentCronJob_pkey" PRIMARY KEY ("id")
46
+ );
47
+
48
+ -- CreateTable
49
+ CREATE TABLE "AgentTool" (
50
+ "id" TEXT NOT NULL,
51
+ "agentId" TEXT NOT NULL,
52
+ "pattern" TEXT NOT NULL,
53
+ "enabled" BOOLEAN NOT NULL DEFAULT true,
54
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
55
+
56
+ CONSTRAINT "AgentTool_pkey" PRIMARY KEY ("id")
57
+ );
58
+
59
+ -- CreateTable
60
+ CREATE TABLE "AgentToken" (
61
+ "id" TEXT NOT NULL,
62
+ "agentId" TEXT NOT NULL,
63
+ "token" TEXT NOT NULL,
64
+ "label" TEXT,
65
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
66
+ "revokedAt" TIMESTAMP(3),
67
+
68
+ CONSTRAINT "AgentToken_pkey" PRIMARY KEY ("id")
69
+ );
70
+
71
+ -- CreateTable
72
+ CREATE TABLE "AgentPlugin" (
73
+ "id" TEXT NOT NULL,
74
+ "agentId" TEXT NOT NULL,
75
+ "name" TEXT NOT NULL,
76
+ "version" TEXT,
77
+ "enabled" BOOLEAN NOT NULL DEFAULT true,
78
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
79
+ "updatedAt" TIMESTAMP(3) NOT NULL,
80
+
81
+ CONSTRAINT "AgentPlugin_pkey" PRIMARY KEY ("id")
82
+ );
83
+
84
+ -- CreateIndex
85
+ CREATE UNIQUE INDEX "Agent_slackId_key" ON "Agent"("slackId");
86
+
87
+ -- CreateIndex
88
+ CREATE UNIQUE INDEX "AgentEnv_agentId_key_key" ON "AgentEnv"("agentId", "key");
89
+
90
+ -- CreateIndex
91
+ CREATE UNIQUE INDEX "AgentTool_agentId_pattern_key" ON "AgentTool"("agentId", "pattern");
92
+
93
+ -- CreateIndex
94
+ CREATE UNIQUE INDEX "AgentToken_token_key" ON "AgentToken"("token");
95
+
96
+ -- CreateIndex
97
+ CREATE UNIQUE INDEX "AgentPlugin_agentId_name_key" ON "AgentPlugin"("agentId", "name");
98
+
99
+ -- AddForeignKey
100
+ ALTER TABLE "AgentEnv" ADD CONSTRAINT "AgentEnv_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
101
+
102
+ -- AddForeignKey
103
+ ALTER TABLE "AgentCronJob" ADD CONSTRAINT "AgentCronJob_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
104
+
105
+ -- AddForeignKey
106
+ ALTER TABLE "AgentTool" ADD CONSTRAINT "AgentTool_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
107
+
108
+ -- AddForeignKey
109
+ ALTER TABLE "AgentToken" ADD CONSTRAINT "AgentToken_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
110
+
111
+ -- AddForeignKey
112
+ ALTER TABLE "AgentPlugin" ADD CONSTRAINT "AgentPlugin_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,18 @@
1
+ -- CreateTable
2
+ CREATE TABLE "AgentMember" (
3
+ "id" TEXT NOT NULL,
4
+ "agentId" TEXT NOT NULL,
5
+ "email" TEXT NOT NULL,
6
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
7
+
8
+ CONSTRAINT "AgentMember_pkey" PRIMARY KEY ("id")
9
+ );
10
+
11
+ -- CreateIndex
12
+ CREATE INDEX "AgentMember_email_idx" ON "AgentMember"("email");
13
+
14
+ -- CreateIndex
15
+ CREATE UNIQUE INDEX "AgentMember_agentId_email_key" ON "AgentMember"("agentId", "email");
16
+
17
+ -- AddForeignKey
18
+ ALTER TABLE "AgentMember" ADD CONSTRAINT "AgentMember_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,2 @@
1
+ -- AlterTable
2
+ ALTER TABLE "Agent" ADD COLUMN "selfHosted" BOOLEAN NOT NULL DEFAULT false;
@@ -0,0 +1,3 @@
1
+ -- AddColumn: repos TEXT[] to Agent (additive, non-breaking)
2
+ -- Existing agents default to repos: []
3
+ ALTER TABLE "Agent" ADD COLUMN "repos" TEXT[] NOT NULL DEFAULT '{}';
@@ -0,0 +1,26 @@
1
+ -- CreateTable: AgentCronRun — execution history for AgentCronJob firings.
2
+ -- agentId is denormalized for efficient agent-level history queries.
3
+
4
+ CREATE TABLE "AgentCronRun" (
5
+ "id" TEXT NOT NULL,
6
+ "cronId" TEXT NOT NULL,
7
+ "agentId" TEXT NOT NULL,
8
+ "startedAt" TIMESTAMP(3) NOT NULL,
9
+ "completedAt" TIMESTAMP(3),
10
+ "skipped" BOOLEAN NOT NULL DEFAULT false,
11
+ "skipReason" TEXT,
12
+ "outcome" TEXT,
13
+ "error" TEXT,
14
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
15
+
16
+ CONSTRAINT "AgentCronRun_pkey" PRIMARY KEY ("id")
17
+ );
18
+
19
+ -- CreateIndex
20
+ CREATE INDEX "AgentCronRun_cronId_idx" ON "AgentCronRun"("cronId");
21
+
22
+ -- CreateIndex
23
+ CREATE INDEX "AgentCronRun_agentId_startedAt_idx" ON "AgentCronRun"("agentId", "startedAt");
24
+
25
+ -- AddForeignKey
26
+ ALTER TABLE "AgentCronRun" ADD CONSTRAINT "AgentCronRun_cronId_fkey" FOREIGN KEY ("cronId") REFERENCES "AgentCronJob"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,10 @@
1
+ -- AddColumns: token tracking fields to AgentCronRun.
2
+ -- These fields allow the harness to record LLM token usage and cost per cron invocation.
3
+ -- All columns are nullable so existing rows are unaffected.
4
+
5
+ ALTER TABLE "AgentCronRun" ADD COLUMN "inputTokens" INTEGER;
6
+ ALTER TABLE "AgentCronRun" ADD COLUMN "outputTokens" INTEGER;
7
+ ALTER TABLE "AgentCronRun" ADD COLUMN "cacheReadTokens" INTEGER;
8
+ ALTER TABLE "AgentCronRun" ADD COLUMN "cacheCreationTokens" INTEGER;
9
+ ALTER TABLE "AgentCronRun" ADD COLUMN "costUsd" DOUBLE PRECISION;
10
+ ALTER TABLE "AgentCronRun" ADD COLUMN "model" TEXT;
@@ -0,0 +1,18 @@
1
+ -- CreateTable
2
+ CREATE TABLE "AgentChatTokenUsageDaily" (
3
+ "id" TEXT NOT NULL,
4
+ "agentId" TEXT NOT NULL,
5
+ "date" TEXT NOT NULL,
6
+ "inputTokens" INTEGER NOT NULL DEFAULT 0,
7
+ "outputTokens" INTEGER NOT NULL DEFAULT 0,
8
+ "cacheReadTokens" INTEGER NOT NULL DEFAULT 0,
9
+ "cacheCreationTokens" INTEGER NOT NULL DEFAULT 0,
10
+ "costUsd" DOUBLE PRECISION NOT NULL DEFAULT 0,
11
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+ "updatedAt" TIMESTAMP(3) NOT NULL,
13
+
14
+ CONSTRAINT "AgentChatTokenUsageDaily_pkey" PRIMARY KEY ("id")
15
+ );
16
+
17
+ -- CreateIndex
18
+ CREATE UNIQUE INDEX "AgentChatTokenUsageDaily_agentId_date_key" ON "AgentChatTokenUsageDaily"("agentId", "date");
@@ -0,0 +1,2 @@
1
+ -- AddForeignKey
2
+ ALTER TABLE "AgentChatTokenUsageDaily" ADD CONSTRAINT "AgentChatTokenUsageDaily_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,37 @@
1
+ -- CreateTable
2
+ CREATE TABLE "Thread" (
3
+ "id" TEXT NOT NULL,
4
+ "agentId" TEXT NOT NULL,
5
+ "memberId" TEXT NOT NULL,
6
+ "title" TEXT NOT NULL,
7
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
8
+ "updatedAt" TIMESTAMP(3) NOT NULL,
9
+
10
+ CONSTRAINT "Thread_pkey" PRIMARY KEY ("id")
11
+ );
12
+
13
+ -- CreateTable
14
+ CREATE TABLE "Message" (
15
+ "id" TEXT NOT NULL,
16
+ "threadId" TEXT NOT NULL,
17
+ "role" TEXT NOT NULL,
18
+ "body" TEXT NOT NULL,
19
+ "tokens" TEXT,
20
+ "attachmentFilename" TEXT,
21
+ "attachmentSize" INTEGER,
22
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
+
24
+ CONSTRAINT "Message_pkey" PRIMARY KEY ("id")
25
+ );
26
+
27
+ -- CreateIndex
28
+ CREATE INDEX "Thread_agentId_memberId_updatedAt_idx" ON "Thread"("agentId", "memberId", "updatedAt" DESC);
29
+
30
+ -- CreateIndex
31
+ CREATE INDEX "Message_threadId_idx" ON "Message"("threadId");
32
+
33
+ -- AddForeignKey
34
+ ALTER TABLE "Thread" ADD CONSTRAINT "Thread_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
35
+
36
+ -- AddForeignKey
37
+ ALTER TABLE "Message" ADD CONSTRAINT "Message_threadId_fkey" FOREIGN KEY ("threadId") REFERENCES "Thread"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,17 @@
1
+ -- DropForeignKey
2
+ ALTER TABLE "Message" DROP CONSTRAINT "Message_threadId_fkey";
3
+
4
+ -- DropForeignKey
5
+ ALTER TABLE "Thread" DROP CONSTRAINT "Thread_agentId_fkey";
6
+
7
+ -- DropIndex
8
+ DROP INDEX "Message_threadId_idx";
9
+
10
+ -- DropIndex
11
+ DROP INDEX "Thread_agentId_memberId_updatedAt_idx";
12
+
13
+ -- DropTable
14
+ DROP TABLE "Message";
15
+
16
+ -- DropTable
17
+ DROP TABLE "Thread";
@@ -0,0 +1,23 @@
1
+ -- AddTable: AgentCronRunModelBreakdown
2
+ -- Stores per-model token breakdown for each cron run. Populated when sub-agents
3
+ -- use different models in a single run. The unique constraint on (cronRunId, model)
4
+ -- allows upsert semantics.
5
+
6
+ CREATE TABLE "AgentCronRunModelBreakdown" (
7
+ "id" TEXT NOT NULL,
8
+ "cronRunId" TEXT NOT NULL,
9
+ "model" TEXT NOT NULL,
10
+ "inputTokens" INTEGER NOT NULL DEFAULT 0,
11
+ "outputTokens" INTEGER NOT NULL DEFAULT 0,
12
+ "cacheReadTokens" INTEGER NOT NULL DEFAULT 0,
13
+ "cacheCreationTokens" INTEGER NOT NULL DEFAULT 0,
14
+ "costUsd" DOUBLE PRECISION NOT NULL DEFAULT 0,
15
+
16
+ CONSTRAINT "AgentCronRunModelBreakdown_pkey" PRIMARY KEY ("id")
17
+ );
18
+
19
+ -- CreateIndex
20
+ CREATE UNIQUE INDEX "AgentCronRunModelBreakdown_cronRunId_model_key" ON "AgentCronRunModelBreakdown"("cronRunId", "model");
21
+
22
+ -- AddForeignKey
23
+ ALTER TABLE "AgentCronRunModelBreakdown" ADD CONSTRAINT "AgentCronRunModelBreakdown_cronRunId_fkey" FOREIGN KEY ("cronRunId") REFERENCES "AgentCronRun"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,25 @@
1
+ -- DropTable (old per-agent daily rollup — no backward compat needed)
2
+ DROP TABLE IF EXISTS "AgentChatTokenUsageDaily";
3
+
4
+ -- CreateTable (new per-model daily rollup)
5
+ CREATE TABLE "AgentChatTokenUsageDailyByModel" (
6
+ "id" TEXT NOT NULL,
7
+ "agentId" TEXT NOT NULL,
8
+ "date" TEXT NOT NULL,
9
+ "model" TEXT NOT NULL,
10
+ "inputTokens" INTEGER NOT NULL DEFAULT 0,
11
+ "outputTokens" INTEGER NOT NULL DEFAULT 0,
12
+ "cacheReadTokens" INTEGER NOT NULL DEFAULT 0,
13
+ "cacheCreationTokens" INTEGER NOT NULL DEFAULT 0,
14
+ "costUsd" DOUBLE PRECISION NOT NULL DEFAULT 0,
15
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
16
+ "updatedAt" TIMESTAMP(3) NOT NULL,
17
+
18
+ CONSTRAINT "AgentChatTokenUsageDailyByModel_pkey" PRIMARY KEY ("id")
19
+ );
20
+
21
+ -- CreateIndex
22
+ CREATE UNIQUE INDEX "AgentChatTokenUsageDailyByModel_agentId_date_model_key" ON "AgentChatTokenUsageDailyByModel"("agentId", "date", "model");
23
+
24
+ -- AddForeignKey
25
+ ALTER TABLE "AgentChatTokenUsageDailyByModel" ADD CONSTRAINT "AgentChatTokenUsageDailyByModel_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,2 @@
1
+ -- AlterTable: add secret column to AgentEnv with default false
2
+ ALTER TABLE "AgentEnv" ADD COLUMN "secret" BOOLEAN NOT NULL DEFAULT false;
@@ -0,0 +1,5 @@
1
+ -- Migration: drop legacy model and costUsd columns from AgentCronRun.
2
+ -- MA-5: all new runs use AgentCronRunModelBreakdown; the fallback path is removed.
3
+
4
+ ALTER TABLE "AgentCronRun" DROP COLUMN IF EXISTS "model";
5
+ ALTER TABLE "AgentCronRun" DROP COLUMN IF EXISTS "costUsd";
@@ -0,0 +1,54 @@
1
+ -- Migration: consolidate cron-run token accounting onto AgentCronRunModelBreakdown.
2
+ -- CTT-2.1: AgentCronRunModelBreakdown becomes the sole source of truth for all
3
+ -- cron-run token aggregation. The per-run token columns on AgentCronRun are
4
+ -- dropped in favour of a single LEFT JOIN + SUM against the breakdown table.
5
+ --
6
+ -- Step 1: backfill a synthetic breakdown row for every AgentCronRun that carries
7
+ -- token data but has no breakdown row yet (i.e. pre-2026-07-01 runs whose usage
8
+ -- was recorded before AgentCronRunModelBreakdown existed). The real per-run model
9
+ -- name and costUsd for those runs were already dropped by migration
10
+ -- 20260701030000_drop_cron_run_legacy_columns before this table existed, so they
11
+ -- surface under the placeholder model 'legacy-unattributed' with cost $0. Token
12
+ -- counts were never dropped and are preserved verbatim by this backfill.
13
+ --
14
+ -- The synthetic id is 'legacy-' || r.id so the insert needs no id-generation
15
+ -- extension (e.g. pgcrypto/gen_random_uuid) — r.id is already unique, so the
16
+ -- prefixed value is unique too and collision-free with cuid()-generated ids.
17
+ INSERT INTO "AgentCronRunModelBreakdown" (
18
+ "id",
19
+ "cronRunId",
20
+ "model",
21
+ "inputTokens",
22
+ "outputTokens",
23
+ "cacheReadTokens",
24
+ "cacheCreationTokens",
25
+ "costUsd"
26
+ )
27
+ SELECT
28
+ 'legacy-' || r."id",
29
+ r."id",
30
+ 'legacy-unattributed',
31
+ COALESCE(r."inputTokens", 0),
32
+ COALESCE(r."outputTokens", 0),
33
+ COALESCE(r."cacheReadTokens", 0),
34
+ COALESCE(r."cacheCreationTokens", 0),
35
+ 0
36
+ FROM "AgentCronRun" r
37
+ WHERE (
38
+ COALESCE(r."inputTokens", 0) <> 0
39
+ OR COALESCE(r."outputTokens", 0) <> 0
40
+ OR COALESCE(r."cacheReadTokens", 0) <> 0
41
+ OR COALESCE(r."cacheCreationTokens", 0) <> 0
42
+ )
43
+ AND NOT EXISTS (
44
+ SELECT 1
45
+ FROM "AgentCronRunModelBreakdown" b
46
+ WHERE b."cronRunId" = r."id"
47
+ );
48
+
49
+ -- Step 2: drop the now-redundant per-run token columns. All token aggregation
50
+ -- reads from AgentCronRunModelBreakdown from here on.
51
+ ALTER TABLE "AgentCronRun" DROP COLUMN IF EXISTS "inputTokens";
52
+ ALTER TABLE "AgentCronRun" DROP COLUMN IF EXISTS "outputTokens";
53
+ ALTER TABLE "AgentCronRun" DROP COLUMN IF EXISTS "cacheReadTokens";
54
+ ALTER TABLE "AgentCronRun" DROP COLUMN IF EXISTS "cacheCreationTokens";
@@ -0,0 +1,8 @@
1
+ -- AlterTable: add nullable phase column to AgentCronRun
2
+ -- WL-3.4: the unified loop (shipwright-loop) runs many distinct one-shot
3
+ -- invocations per outer tick, each serving a different pipeline phase
4
+ -- (dev-task/review/patch/deploy), all reported under the single
5
+ -- shipwright-loop cronId. phase records which pipeline phase an individual
6
+ -- run served. Legacy five-job crons leave this column null (cronId itself
7
+ -- was the phase signal under that model).
8
+ ALTER TABLE "AgentCronRun" ADD COLUMN "phase" TEXT;
@@ -0,0 +1,10 @@
1
+ -- AlterTable: add nullable itemType/itemId columns to AgentCronRun
2
+ -- WLS-2.2: the unified loop (shipwright-loop) dispatches a one-shot command
3
+ -- against a specific work item (a task id like "WLS-2.2" or a PR id like
4
+ -- "acme/x#123"). itemType ("task" | "pr") and itemId record which item a
5
+ -- given run was dispatched against, so the admin UI and metrics can spot an
6
+ -- agent spinning on the same item run after run. Both columns are nullable:
7
+ -- a tick with no dispatch (skipped tick, empty queue) leaves them null, and
8
+ -- pre-existing rows are left untouched (no backfill).
9
+ ALTER TABLE "AgentCronRun" ADD COLUMN "itemType" TEXT;
10
+ ALTER TABLE "AgentCronRun" ADD COLUMN "itemId" TEXT;
@@ -0,0 +1,20 @@
1
+ -- CreateTable: AgentWorkQueueSnapshot — one row per agent, holding the
2
+ -- agent's most recently pushed work-queue snapshot. agentId is unique so
3
+ -- POST /agents/:id/work-queue can upsert a single row per agent.
4
+
5
+ -- CreateTable
6
+ CREATE TABLE "AgentWorkQueueSnapshot" (
7
+ "id" TEXT NOT NULL,
8
+ "agentId" TEXT NOT NULL,
9
+ "computedAt" TIMESTAMP(3) NOT NULL,
10
+ "items" JSONB NOT NULL,
11
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+
13
+ CONSTRAINT "AgentWorkQueueSnapshot_pkey" PRIMARY KEY ("id")
14
+ );
15
+
16
+ -- CreateIndex
17
+ CREATE UNIQUE INDEX "AgentWorkQueueSnapshot_agentId_key" ON "AgentWorkQueueSnapshot"("agentId");
18
+
19
+ -- AddForeignKey
20
+ ALTER TABLE "AgentWorkQueueSnapshot" ADD CONSTRAINT "AgentWorkQueueSnapshot_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,25 @@
1
+ -- AlterTable: add nullable parentCronId self-relation on AgentCronJob and
2
+ -- nullable phaseId FK on AgentCronRun.
3
+ -- LPC-1.1: a parent cron can have child "phase" crons (e.g. dev-task/review/
4
+ -- patch/deploy phases of a single logical loop); AgentCronRun.phaseId points
5
+ -- at the specific phase cron a run was dispatched by. Both columns are
6
+ -- purely additive and unused until later tasks (LPC-1.2, LPC-1.3, LPC-2.1,
7
+ -- LPC-3.1) wire them up.
8
+ ALTER TABLE "AgentCronJob" ADD COLUMN "parentCronId" TEXT;
9
+ ALTER TABLE "AgentCronRun" ADD COLUMN "phaseId" TEXT;
10
+
11
+ -- CreateIndex
12
+ CREATE INDEX "AgentCronJob_parentCronId_idx" ON "AgentCronJob"("parentCronId");
13
+
14
+ -- CreateIndex
15
+ CREATE INDEX "AgentCronRun_phaseId_idx" ON "AgentCronRun"("phaseId");
16
+
17
+ -- AddForeignKey
18
+ -- Deleting a parent cron cascades to its phase children.
19
+ ALTER TABLE "AgentCronJob" ADD CONSTRAINT "AgentCronJob_parentCronId_fkey" FOREIGN KEY ("parentCronId") REFERENCES "AgentCronJob"("id") ON DELETE CASCADE ON UPDATE CASCADE;
20
+
21
+ -- AddForeignKey
22
+ -- SetNull (not Cascade): phaseId is a secondary/denormalized pointer to the
23
+ -- phase cron; deleting a phase cron should not delete run history for the
24
+ -- parent cron (cronId's own Cascade already owns that).
25
+ ALTER TABLE "AgentCronRun" ADD CONSTRAINT "AgentCronRun_phaseId_fkey" FOREIGN KEY ("phaseId") REFERENCES "AgentCronJob"("id") ON DELETE SET NULL ON UPDATE CASCADE;
@@ -0,0 +1,8 @@
1
+ -- Migration: drop the legacy AgentCronRun.phase string column.
2
+ -- LPC-3.1: phaseId (FK to AgentCronJob.id, added in LPC-1.1) is now the sole
3
+ -- phase-attribution field. The writer (loop-orchestrator) and reader
4
+ -- (cron-logs admin UI) have both been switched over to phaseId in the same
5
+ -- PR — atomic removal, no dual-write/dual-read period, per the plugin
6
+ -- constitution's breaking-change guidance for in-repo-only consumers.
7
+
8
+ ALTER TABLE "AgentCronRun" DROP COLUMN "phase";
@@ -0,0 +1,3 @@
1
+ -- AddColumn: typeName TEXT to Agent (additive, non-breaking)
2
+ -- Existing agents default to typeName: "coding"
3
+ ALTER TABLE "Agent" ADD COLUMN "typeName" TEXT NOT NULL DEFAULT 'coding';
@@ -0,0 +1,2 @@
1
+ -- AlterTable
2
+ ALTER TABLE "Agent" ADD COLUMN "authorAllowlist" TEXT[] DEFAULT ARRAY[]::TEXT[];
@@ -0,0 +1,3 @@
1
+ -- Backfill NULL authorAllowlist rows, then enforce NOT NULL (mirrors the repos column)
2
+ UPDATE "Agent" SET "authorAllowlist" = '{}' WHERE "authorAllowlist" IS NULL;
3
+ ALTER TABLE "Agent" ALTER COLUMN "authorAllowlist" SET NOT NULL;
@@ -0,0 +1,2 @@
1
+ -- Add nullable sessionId column to AgentCronRun
2
+ ALTER TABLE "AgentCronRun" ADD COLUMN "sessionId" TEXT;
@@ -0,0 +1,3 @@
1
+ -- AddColumn: restrictSlackToMembers BOOLEAN to Agent (additive, non-breaking)
2
+ -- Existing agents default to restrictSlackToMembers: false (unrestricted).
3
+ ALTER TABLE "Agent" ADD COLUMN "restrictSlackToMembers" BOOLEAN NOT NULL DEFAULT false;
@@ -0,0 +1,40 @@
1
+ -- Web Push notifications for agent replies (CFB-4.2).
2
+ -- Two additive tables; no changes to existing tables.
3
+
4
+ -- CreateTable
5
+ CREATE TABLE "PushSubscription" (
6
+ "id" TEXT NOT NULL,
7
+ "userEmail" TEXT NOT NULL,
8
+ "endpoint" TEXT NOT NULL,
9
+ "p256dh" TEXT NOT NULL,
10
+ "auth" TEXT NOT NULL,
11
+ "detailOptIn" TEXT NOT NULL DEFAULT 'generic',
12
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
13
+ "updatedAt" TIMESTAMP(3) NOT NULL,
14
+
15
+ CONSTRAINT "PushSubscription_pkey" PRIMARY KEY ("id")
16
+ );
17
+
18
+ -- CreateTable
19
+ CREATE TABLE "ChatThreadWatch" (
20
+ "id" TEXT NOT NULL,
21
+ "userEmail" TEXT NOT NULL,
22
+ "threadId" TEXT NOT NULL,
23
+ "agentId" TEXT NOT NULL,
24
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
25
+ "updatedAt" TIMESTAMP(3) NOT NULL,
26
+
27
+ CONSTRAINT "ChatThreadWatch_pkey" PRIMARY KEY ("id")
28
+ );
29
+
30
+ -- CreateIndex
31
+ CREATE UNIQUE INDEX "PushSubscription_endpoint_key" ON "PushSubscription"("endpoint");
32
+
33
+ -- CreateIndex
34
+ CREATE INDEX "PushSubscription_userEmail_idx" ON "PushSubscription"("userEmail");
35
+
36
+ -- CreateIndex
37
+ CREATE INDEX "ChatThreadWatch_threadId_idx" ON "ChatThreadWatch"("threadId");
38
+
39
+ -- CreateIndex
40
+ CREATE UNIQUE INDEX "ChatThreadWatch_userEmail_threadId_key" ON "ChatThreadWatch"("userEmail", "threadId");
@@ -0,0 +1,2 @@
1
+ -- AlterTable
2
+ ALTER TABLE "Agent" ADD COLUMN "patchAuthorAllowlist" TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[];
@@ -0,0 +1,18 @@
1
+ -- AddColumn: reviewAuthorAllowlist TEXT[] to Agent, then backfill from the
2
+ -- existing authorAllowlist column for every pre-existing row.
3
+ --
4
+ -- Unlike patchAuthorAllowlist (a brand-new, independent column added by the
5
+ -- sibling DBR-1.1 task with nothing to backfill), reviewAuthorAllowlist is a
6
+ -- rename-in-progress of the EXISTING authorAllowlist column: every row that
7
+ -- already has authorAllowlist values must carry them forward here too, not
8
+ -- just default to an empty array. The backfill runs inside this migration's
9
+ -- transaction, before the NOT NULL constraint is applied, so it's safe to
10
+ -- set NOT NULL directly (mirrors patchAuthorAllowlist's single-migration
11
+ -- approach rather than authorAllowlist's original two-migration
12
+ -- add-then-enforce-NOT-NULL pattern).
13
+ ALTER TABLE "Agent" ADD COLUMN "reviewAuthorAllowlist" TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[];
14
+
15
+ -- Backfill: copy every existing row's authorAllowlist value across so the
16
+ -- two columns start in sync. New rows created after this migration get both
17
+ -- columns written explicitly at the application layer (dual-write).
18
+ UPDATE "Agent" SET "reviewAuthorAllowlist" = "authorAllowlist";
@@ -0,0 +1,14 @@
1
+ -- Migration: drop the legacy Agent.authorAllowlist column.
2
+ --
3
+ -- DBR-2.4 — the final "remove" step of the add-migrate-remove sequence that
4
+ -- renamed this column to reviewAuthorAllowlist:
5
+ -- DBR-2.1 added reviewAuthorAllowlist alongside authorAllowlist, backfilled
6
+ -- it from the existing column, and dual-wrote/dual-read both columns.
7
+ -- DBR-2.2 migrated the admin UI to write only reviewAuthorAllowlist.
8
+ -- DBR-2.3 migrated the agent's runtime config-sync read path onto
9
+ -- reviewAuthorAllowlist, falling back to authorAllowlist only if absent.
10
+ -- Both DBR-2.2 (PR #3094) and DBR-2.3 (PR #3115) are confirmed deployed and
11
+ -- live on main, so every reader/writer now uses reviewAuthorAllowlist
12
+ -- exclusively — the old column is dead weight. Data was already preserved in
13
+ -- reviewAuthorAllowlist by DBR-2.1's backfill; nothing further to migrate.
14
+ ALTER TABLE "Agent" DROP COLUMN "authorAllowlist";
@@ -0,0 +1,11 @@
1
+ -- AAV-1.1: add a standalone index on AgentCronRun.startedAt.
2
+ --
3
+ -- The existing composite index on (agentId, startedAt) is optimized for
4
+ -- single-agent lookups (listForAgent/list), not a global "startedAt desc"
5
+ -- sort across a large `agentId IN (...)` set (listAcrossAgents). As the
6
+ -- agent fleet grows from <10 today toward ~250 within 3-6 months, a
7
+ -- fleet-wide cross-agent listing needs its own index to avoid a full table
8
+ -- scan/sort. Purely additive — no column changes.
9
+
10
+ -- CreateIndex
11
+ CREATE INDEX "AgentCronRun_startedAt_idx" ON "AgentCronRun"("startedAt");