diff --git a/apps/api/src/handlers/github/__tests__/notifyPullRequestTerminalStatus.test.ts b/apps/api/src/handlers/github/__tests__/notifyPullRequestTerminalStatus.test.ts
index 84d6f5337..d62639d10 100644
--- a/apps/api/src/handlers/github/__tests__/notifyPullRequestTerminalStatus.test.ts
+++ b/apps/api/src/handlers/github/__tests__/notifyPullRequestTerminalStatus.test.ts
@@ -26,6 +26,7 @@ const {
mockResolveSlackReactionNames: vi.fn().mockResolvedValue({
ackEmoji: 'eyes',
completionEmoji: 'white_check_mark',
+ prClosedEmoji: 'x',
summonEmoji: null,
}),
mockStickyFooterPost: vi.fn().mockResolvedValue('msg-ts-123'),
@@ -96,10 +97,7 @@ vi.mock('@roomote/db/server', () => ({
}));
import { db } from '@roomote/db/server';
-import {
- notifyPullRequestTerminalStatus,
- SLACK_PR_CLOSED_REACTION_EMOJI,
-} from '../notifyPullRequestTerminalStatus';
+import { notifyPullRequestTerminalStatus } from '../notifyPullRequestTerminalStatus';
const mockedGithubFind = vi.mocked(db.query.githubInstallations.findFirst);
const mockedTaskPullRequestsFind = vi.mocked(
@@ -147,6 +145,7 @@ describe('notifyPullRequestTerminalStatus', () => {
mockResolveSlackReactionNames.mockResolvedValue({
ackEmoji: 'eyes',
completionEmoji: 'white_check_mark',
+ prClosedEmoji: 'x',
summonEmoji: null,
});
mockStickyFooterPost.mockResolvedValue('msg-ts-123');
@@ -237,7 +236,41 @@ describe('notifyPullRequestTerminalStatus', () => {
expect(mockAddReaction).toHaveBeenCalledWith({
channel: 'C123',
timestamp: 'thread-ts-1',
- name: SLACK_PR_CLOSED_REACTION_EMOJI,
+ name: 'x',
+ });
+ });
+
+ it('uses the configured closed-PR emoji reaction', async () => {
+ mockResolveSlackReactionNames.mockResolvedValue({
+ ackEmoji: 'eyes',
+ completionEmoji: 'white_check_mark',
+ prClosedEmoji: 'no_entry_sign',
+ summonEmoji: null,
+ });
+ mockedGithubFind.mockResolvedValue({ id: 1 } as any);
+ mockedTaskPullRequestsFind.mockResolvedValue([{ taskId: 'task-1' }] as any);
+ mockedTasksFind.mockResolvedValue([
+ {
+ id: 'task-1',
+ slackThreadTs: 'thread-ts-1',
+ slackChannelId: 'C123',
+ linearSessionId: null,
+ },
+ ] as any);
+ mockedSlackFind.mockResolvedValue({
+ botAccessToken: 'xoxb-token',
+ } as any);
+
+ await notifyPullRequestTerminalStatus({
+ ...baseParams,
+ status: 'closed',
+ actorLogin: 'closer',
+ });
+
+ expect(mockAddReaction).toHaveBeenCalledWith({
+ channel: 'C123',
+ timestamp: 'thread-ts-1',
+ name: 'no_entry_sign',
});
});
diff --git a/apps/api/src/handlers/github/notifyPullRequestTerminalStatus.ts b/apps/api/src/handlers/github/notifyPullRequestTerminalStatus.ts
index 7e73666eb..050aaf387 100644
--- a/apps/api/src/handlers/github/notifyPullRequestTerminalStatus.ts
+++ b/apps/api/src/handlers/github/notifyPullRequestTerminalStatus.ts
@@ -36,9 +36,6 @@ import {
getCommunicationThreadIdFromTaskPayload,
} from '@roomote/types';
-/** Fixed Slack reaction for closed (not merged) PRs on the originating message. */
-export const SLACK_PR_CLOSED_REACTION_EMOJI = 'heavy_multiplication_x';
-
const LINEAR_MCP_URL = 'https://mcp.linear.app/mcp';
interface NotifyPullRequestTerminalStatusParams {
@@ -206,7 +203,8 @@ async function deliverSlackTerminalStatus({
const notifiedThreads = new Set();
const notifier = new SlackNotifier(slackInstallation.botAccessToken);
- const { ackEmoji, completionEmoji } = await resolveSlackReactionNames();
+ const { ackEmoji, completionEmoji, prClosedEmoji } =
+ await resolveSlackReactionNames();
const statusNotification = buildPullRequestStatusNotificationText({
prTitle,
prUrl,
@@ -216,7 +214,7 @@ async function deliverSlackTerminalStatus({
formatStatus: (value) => `*${value}*`,
});
const terminalReaction =
- status === 'closed' ? SLACK_PR_CLOSED_REACTION_EMOJI : completionEmoji;
+ status === 'closed' ? prClosedEmoji : completionEmoji;
for (const target of slackTargets) {
if (notifiedThreads.has(target.slackThreadTs)) {
diff --git a/apps/docs/vibes.mdx b/apps/docs/vibes.mdx
index 0671de968..a3c3d7273 100644
--- a/apps/docs/vibes.mdx
+++ b/apps/docs/vibes.mdx
@@ -17,6 +17,7 @@ in team-facing messages.
| ------------------------- | --------------------------------------------------------------------------- | ------------------------ |
| **Acknowledgement emoji** | The reaction Roomote uses to show it saw a Slack message | `eyes` |
| **Completion emoji** | The reaction Roomote can use when supported work finishes | `white_check_mark` |
+| **Closed PR emoji** | The reaction Roomote adds when a linked pull request is closed without merge | `x` |
| **Summon emoji** | The reaction teammates can add to an existing Slack message to start a task | `shipit` |
| **Style guidance** | Optional guidance for how Roomote should sound in messages | "Direct, concise, calm." |
@@ -44,7 +45,8 @@ channels.
The acknowledgement reaction is the quick "I saw this" signal. The completion
reaction is for supported completion moments where a Slack reaction is the
-right confirmation.
+right confirmation. The closed PR reaction is applied to the originating Slack
+message when a linked pull request is closed without merging.
If teammates are missing Roomote's status updates, choose reactions that stand
out in your workspace. If channels feel too busy, keep the defaults or use
diff --git a/apps/web/src/components/settings/VibesSettings.client.test.tsx b/apps/web/src/components/settings/VibesSettings.client.test.tsx
index 48fd5ce31..1dd673b8d 100644
--- a/apps/web/src/components/settings/VibesSettings.client.test.tsx
+++ b/apps/web/src/components/settings/VibesSettings.client.test.tsx
@@ -37,10 +37,12 @@ const {
slackSummonEmoji: null as string | null,
slackAckEmoji: 'eyes',
slackCompletionEmoji: 'white_check_mark',
+ slackPrClosedEmoji: 'x',
styleGuidance: null as string | null,
defaults: {
slackAckEmoji: 'eyes',
slackCompletionEmoji: 'white_check_mark',
+ slackPrClosedEmoji: 'x',
},
},
},
@@ -49,6 +51,7 @@ const {
slackSummonEmoji?: string | null;
slackAckEmoji?: string;
slackCompletionEmoji?: string;
+ slackPrClosedEmoji?: string;
styleGuidance?: string | null;
}): Promise<
| {
@@ -59,7 +62,10 @@ const {
success: false;
fieldErrors: Partial<
Record<
- 'slackAckEmoji' | 'slackCompletionEmoji' | 'styleGuidance',
+ | 'slackAckEmoji'
+ | 'slackCompletionEmoji'
+ | 'slackPrClosedEmoji'
+ | 'styleGuidance',
string
>
>;
@@ -97,6 +103,18 @@ const {
};
}
+ if (
+ Object.prototype.hasOwnProperty.call(input, 'slackPrClosedEmoji') &&
+ !normalize(input.slackPrClosedEmoji)
+ ) {
+ return {
+ success: false as const,
+ fieldErrors: {
+ slackPrClosedEmoji: 'Closed PR emoji is required.',
+ },
+ };
+ }
+
mockSettingsState.current = {
...mockSettingsState.current,
...(Object.prototype.hasOwnProperty.call(input, 'slackSummonEmoji')
@@ -111,6 +129,11 @@ const {
normalize(input.slackCompletionEmoji) ?? 'white_check_mark',
}
: {}),
+ ...(Object.prototype.hasOwnProperty.call(input, 'slackPrClosedEmoji')
+ ? {
+ slackPrClosedEmoji: normalize(input.slackPrClosedEmoji) ?? 'x',
+ }
+ : {}),
...(Object.prototype.hasOwnProperty.call(input, 'styleGuidance')
? { styleGuidance: input.styleGuidance?.trim() || null }
: {}),
@@ -245,6 +268,9 @@ async function renderLoadedVibesSettings() {
expect(screen.getByLabelText('Completion')).toHaveValue(
mockSettingsState.current.slackCompletionEmoji,
);
+ expect(screen.getByLabelText('Closed PR')).toHaveValue(
+ mockSettingsState.current.slackPrClosedEmoji,
+ );
});
await waitFor(() => {
@@ -332,10 +358,12 @@ describe('VibesSettings', () => {
slackSummonEmoji: null,
slackAckEmoji: 'eyes',
slackCompletionEmoji: 'white_check_mark',
+ slackPrClosedEmoji: 'x',
styleGuidance: null,
defaults: {
slackAckEmoji: 'eyes',
slackCompletionEmoji: 'white_check_mark',
+ slackPrClosedEmoji: 'x',
},
};
});
@@ -503,6 +531,32 @@ describe('VibesSettings', () => {
});
});
+ it('resets the closed PR emoji back to its default value', async () => {
+ await renderLoadedVibesSettings();
+
+ const input = screen.getByLabelText('Closed PR');
+ await changeControlledInput(input, 'no_entry_sign');
+ await blurControlledInput(input);
+
+ await waitFor(() => {
+ expect(mockUpdateVibesSettings.mock.calls.at(-1)?.[0]).toEqual({
+ slackPrClosedEmoji: 'no_entry_sign',
+ });
+ });
+
+ fireEvent.click(screen.getByLabelText('Reset closed PR emoji'));
+
+ await waitFor(() => {
+ expect(mockUpdateVibesSettings.mock.calls.at(-1)?.[0]).toEqual({
+ slackPrClosedEmoji: 'x',
+ });
+ });
+
+ await waitFor(() => {
+ expect(screen.getByLabelText('Closed PR')).toHaveValue('x');
+ });
+ });
+
it('clears the summon emoji when clicking the clear button', async () => {
mockSettingsState.current.slackSummonEmoji = 'shipit';
await renderLoadedVibesSettings();
diff --git a/apps/web/src/components/settings/VibesSettings.tsx b/apps/web/src/components/settings/VibesSettings.tsx
index deebccf3d..250bbc952 100644
--- a/apps/web/src/components/settings/VibesSettings.tsx
+++ b/apps/web/src/components/settings/VibesSettings.tsx
@@ -58,7 +58,8 @@ const VIBES_IDEA_DOWNLOADS = [
type VibesFieldName =
| 'slackSummonEmoji'
| 'slackAckEmoji'
- | 'slackCompletionEmoji';
+ | 'slackCompletionEmoji'
+ | 'slackPrClosedEmoji';
type VibesDraft = Record;
@@ -77,11 +78,13 @@ function toDraft(settings: {
slackSummonEmoji: string | null;
slackAckEmoji: string;
slackCompletionEmoji: string;
+ slackPrClosedEmoji: string;
}): VibesDraft {
return {
slackSummonEmoji: settings.slackSummonEmoji ?? '',
slackAckEmoji: settings.slackAckEmoji,
slackCompletionEmoji: settings.slackCompletionEmoji,
+ slackPrClosedEmoji: settings.slackPrClosedEmoji,
};
}
@@ -93,13 +96,15 @@ const FIELD_TO_TOAST_TYPE: Record = {
slackSummonEmoji: 'summon',
slackAckEmoji: 'acknowledgement',
slackCompletionEmoji: 'completion',
+ slackPrClosedEmoji: 'closed PR',
};
function hasDirtyField(draft: VibesDraft, saved: VibesDraft) {
return (
draft.slackSummonEmoji !== saved.slackSummonEmoji ||
draft.slackAckEmoji !== saved.slackAckEmoji ||
- draft.slackCompletionEmoji !== saved.slackCompletionEmoji
+ draft.slackCompletionEmoji !== saved.slackCompletionEmoji ||
+ draft.slackPrClosedEmoji !== saved.slackPrClosedEmoji
);
}
@@ -140,11 +145,13 @@ export function VibesSettings() {
slackSummonEmoji: '',
slackAckEmoji: '',
slackCompletionEmoji: '',
+ slackPrClosedEmoji: '',
});
const [savedDraft, setSavedDraft] = useState({
slackSummonEmoji: '',
slackAckEmoji: '',
slackCompletionEmoji: '',
+ slackPrClosedEmoji: '',
});
const [fieldErrors, setFieldErrors] = useState({});
const [hasLoadedInitialState, setHasLoadedInitialState] = useState(false);
@@ -386,6 +393,8 @@ export function VibesSettings() {
const ackDefault = settingsQuery.data?.defaults.slackAckEmoji ?? 'eyes';
const completionDefault =
settingsQuery.data?.defaults.slackCompletionEmoji ?? 'white_check_mark';
+ const prClosedDefault =
+ settingsQuery.data?.defaults.slackPrClosedEmoji ?? 'x';
const isStyleGuidanceDirty = styleGuidance !== savedStyleGuidance;
const showStyleGuidanceCounter =
styleGuidance.length >= ROOMOTE_STYLE_GUIDANCE_MAX_LENGTH * 0.9;
@@ -532,6 +541,49 @@ export function VibesSettings() {
) : null}
+
+
+
+
+
+
+ Used when a linked pull request is closed without merging.
+ Default ❌
+
+
+
+
+
+ updateField({
+ field: 'slackPrClosedEmoji',
+ value: event.target.value,
+ })
+ }
+ onBlur={() => handleBlur('slackPrClosedEmoji')}
+ />
+ {fieldErrors.slackPrClosedEmoji ? (
+
+ {fieldErrors.slackPrClosedEmoji}
+
+ ) : null}
+
diff --git a/apps/web/src/trpc/commands/vibes/index.ts b/apps/web/src/trpc/commands/vibes/index.ts
index a58cd8135..7a8ba3c8b 100644
--- a/apps/web/src/trpc/commands/vibes/index.ts
+++ b/apps/web/src/trpc/commands/vibes/index.ts
@@ -2,6 +2,7 @@ import {
db,
DEFAULT_SLACK_ACK_EMOJI,
DEFAULT_SLACK_COMPLETION_EMOJI,
+ DEFAULT_SLACK_PR_CLOSED_EMOJI,
deploymentSettings,
getBackgroundAgentSettingsForDeployment,
normalizeOptionalSlackEmojiName,
@@ -24,10 +25,12 @@ export async function getVibesSettingsCommand(auth: UserAuthSuccess): Promise<{
slackSummonEmoji: string | null;
slackAckEmoji: string;
slackCompletionEmoji: string;
+ slackPrClosedEmoji: string;
styleGuidance: string | null;
defaults: {
slackAckEmoji: string;
slackCompletionEmoji: string;
+ slackPrClosedEmoji: string;
};
}> {
assertAdmin(auth);
@@ -38,10 +41,12 @@ export async function getVibesSettingsCommand(auth: UserAuthSuccess): Promise<{
slackSummonEmoji: settings.slackSummonEmoji,
slackAckEmoji: settings.slackAckEmoji,
slackCompletionEmoji: settings.slackCompletionEmoji,
+ slackPrClosedEmoji: settings.slackPrClosedEmoji,
styleGuidance: settings.styleGuidance,
defaults: {
slackAckEmoji: DEFAULT_SLACK_ACK_EMOJI,
slackCompletionEmoji: DEFAULT_SLACK_COMPLETION_EMOJI,
+ slackPrClosedEmoji: DEFAULT_SLACK_PR_CLOSED_EMOJI,
},
};
}
@@ -50,6 +55,7 @@ interface UpdateVibesSettingsInput {
slackSummonEmoji?: string | null;
slackAckEmoji?: string;
slackCompletionEmoji?: string;
+ slackPrClosedEmoji?: string;
styleGuidance?: string | null;
}
@@ -67,6 +73,7 @@ export async function updateVibesSettingsCommand(
slackSummonEmoji?: string;
slackAckEmoji?: string;
slackCompletionEmoji?: string;
+ slackPrClosedEmoji?: string;
styleGuidance?: string;
};
}
@@ -77,6 +84,7 @@ export async function updateVibesSettingsCommand(
slackSummonEmoji?: string;
slackAckEmoji?: string;
slackCompletionEmoji?: string;
+ slackPrClosedEmoji?: string;
styleGuidance?: string;
} = {};
const now = new Date();
@@ -112,6 +120,18 @@ export async function updateVibesSettingsCommand(
}
}
+ if (Object.prototype.hasOwnProperty.call(input, 'slackPrClosedEmoji')) {
+ const normalizedPrClosedEmoji = normalizeOptionalSlackEmojiName(
+ input.slackPrClosedEmoji,
+ );
+
+ if (!normalizedPrClosedEmoji) {
+ fieldErrors.slackPrClosedEmoji = 'Closed PR emoji is required.';
+ } else {
+ updates.slackPrClosedEmoji = normalizedPrClosedEmoji;
+ }
+ }
+
if (Object.prototype.hasOwnProperty.call(input, 'styleGuidance')) {
if (
(input.styleGuidance?.length ?? 0) > ROOMOTE_STYLE_GUIDANCE_MAX_LENGTH
diff --git a/apps/web/src/trpc/routers/_app.ts b/apps/web/src/trpc/routers/_app.ts
index a178e27bc..4b92b85b6 100644
--- a/apps/web/src/trpc/routers/_app.ts
+++ b/apps/web/src/trpc/routers/_app.ts
@@ -1989,6 +1989,7 @@ export const appRouter = createRouter({
slackSummonEmoji: z.string().max(255).nullable(),
slackAckEmoji: z.string().max(255),
slackCompletionEmoji: z.string().max(255),
+ slackPrClosedEmoji: z.string().max(255),
styleGuidance: z.string().max(400).nullable(),
})
.partial(),
diff --git a/packages/db/drizzle/0012_broad_pretty_boy.sql b/packages/db/drizzle/0012_broad_pretty_boy.sql
new file mode 100644
index 000000000..abdd4a0bb
--- /dev/null
+++ b/packages/db/drizzle/0012_broad_pretty_boy.sql
@@ -0,0 +1 @@
+ALTER TABLE "deployment_settings" ADD COLUMN "slack_pr_closed_emoji" text DEFAULT 'x' NOT NULL;
\ No newline at end of file
diff --git a/packages/db/drizzle/meta/0012_snapshot.json b/packages/db/drizzle/meta/0012_snapshot.json
new file mode 100644
index 000000000..576d5a670
--- /dev/null
+++ b/packages/db/drizzle/meta/0012_snapshot.json
@@ -0,0 +1,9141 @@
+{
+ "id": "59a8e59b-657d-47c0-8d26-bf2f5c0efb62",
+ "prevId": "e291b2c2-88ae-4e81-b6fc-4fbfec078554",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.auth_accounts": {
+ "name": "auth_accounts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "account_id": {
+ "name": "account_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider_id": {
+ "name": "provider_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access_token_expires_at": {
+ "name": "access_token_expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token_expires_at": {
+ "name": "refresh_token_expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scope": {
+ "name": "scope",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "id_token": {
+ "name": "id_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "auth_accounts_user_id_idx": {
+ "name": "auth_accounts_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "auth_accounts_provider_account_unique": {
+ "name": "auth_accounts_provider_account_unique",
+ "columns": [
+ {
+ "expression": "provider_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "account_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "auth_accounts_user_id_auth_users_id_fk": {
+ "name": "auth_accounts_user_id_auth_users_id_fk",
+ "tableFrom": "auth_accounts",
+ "tableTo": "auth_users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.auth_sessions": {
+ "name": "auth_sessions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ip_address": {
+ "name": "ip_address",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_agent": {
+ "name": "user_agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "auth_sessions_token_unique": {
+ "name": "auth_sessions_token_unique",
+ "columns": [
+ {
+ "expression": "token",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "auth_sessions_user_id_idx": {
+ "name": "auth_sessions_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "auth_sessions_user_id_auth_users_id_fk": {
+ "name": "auth_sessions_user_id_auth_users_id_fk",
+ "tableFrom": "auth_sessions",
+ "tableTo": "auth_users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.auth_users": {
+ "name": "auth_users",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email_verified": {
+ "name": "email_verified",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "auth_users_email_unique": {
+ "name": "auth_users_email_unique",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "auth_users_created_at_idx": {
+ "name": "auth_users_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.auth_verifications": {
+ "name": "auth_verifications",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "identifier": {
+ "name": "identifier",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "auth_verifications_identifier_idx": {
+ "name": "auth_verifications_identifier_idx",
+ "columns": [
+ {
+ "expression": "identifier",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.automations": {
+ "name": "automations",
+ "schema": "",
+ "columns": {
+ "key": {
+ "name": "key",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "internal": {
+ "name": "internal",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "schedule": {
+ "name": "schedule",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "instructions": {
+ "name": "instructions",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "settings": {
+ "name": "settings",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "targets": {
+ "name": "targets",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "last_run_at": {
+ "name": "last_run_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_succeeded_at": {
+ "name": "last_succeeded_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_failed_at": {
+ "name": "last_failed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_error": {
+ "name": "last_error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scan_cursor": {
+ "name": "scan_cursor",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.compute_provider_usage": {
+ "name": "compute_provider_usage",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider_usage_id": {
+ "name": "provider_usage_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "auth_kind": {
+ "name": "auth_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "instance_id": {
+ "name": "instance_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "launch_mode": {
+ "name": "launch_mode",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lifecycle_action": {
+ "name": "lifecycle_action",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "measurement_source": {
+ "name": "measurement_source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "configured_vcpus": {
+ "name": "configured_vcpus",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "configured_cpu_cores": {
+ "name": "configured_cpu_cores",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "configured_memory_mib": {
+ "name": "configured_memory_mib",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "wall_clock_duration_ms": {
+ "name": "wall_clock_duration_ms",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "active_cpu_duration_ms": {
+ "name": "active_cpu_duration_ms",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "observed_memory_mib_milliseconds": {
+ "name": "observed_memory_mib_milliseconds",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "network_ingress_bytes": {
+ "name": "network_ingress_bytes",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "network_egress_bytes": {
+ "name": "network_egress_bytes",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "details": {
+ "name": "details",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "started_at": {
+ "name": "started_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "completed_at": {
+ "name": "completed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "compute_provider_usage_provider_usage_id_unique": {
+ "name": "compute_provider_usage_provider_usage_id_unique",
+ "columns": [
+ {
+ "expression": "provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "provider_usage_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "compute_provider_usage_run_id_idx": {
+ "name": "compute_provider_usage_run_id_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "compute_provider_usage_task_id_idx": {
+ "name": "compute_provider_usage_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "compute_provider_usage_created_at_idx": {
+ "name": "compute_provider_usage_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "compute_provider_usage_run_id_task_runs_id_fk": {
+ "name": "compute_provider_usage_run_id_task_runs_id_fk",
+ "tableFrom": "compute_provider_usage",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "compute_provider_usage_task_id_tasks_id_fk": {
+ "name": "compute_provider_usage_task_id_tasks_id_fk",
+ "tableFrom": "compute_provider_usage",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.compute_provider_usage_samples": {
+ "name": "compute_provider_usage_samples",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider_usage_id": {
+ "name": "provider_usage_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "instance_id": {
+ "name": "instance_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sampled_at": {
+ "name": "sampled_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cpu_usage_ns_total": {
+ "name": "cpu_usage_ns_total",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memory_usage_bytes": {
+ "name": "memory_usage_bytes",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "memory_peak_usage_bytes": {
+ "name": "memory_peak_usage_bytes",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "details": {
+ "name": "details",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "compute_provider_usage_samples_provider_usage_sampled_at_unique": {
+ "name": "compute_provider_usage_samples_provider_usage_sampled_at_unique",
+ "columns": [
+ {
+ "expression": "provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "provider_usage_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sampled_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "compute_provider_usage_samples_run_id_idx": {
+ "name": "compute_provider_usage_samples_run_id_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "compute_provider_usage_samples_task_id_idx": {
+ "name": "compute_provider_usage_samples_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "compute_provider_usage_samples_created_at_idx": {
+ "name": "compute_provider_usage_samples_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "compute_provider_usage_samples_run_id_task_runs_id_fk": {
+ "name": "compute_provider_usage_samples_run_id_task_runs_id_fk",
+ "tableFrom": "compute_provider_usage_samples",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "compute_provider_usage_samples_task_id_tasks_id_fk": {
+ "name": "compute_provider_usage_samples_task_id_tasks_id_fk",
+ "tableFrom": "compute_provider_usage_samples",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.deployment_mcp_enablements": {
+ "name": "deployment_mcp_enablements",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "mcp_id": {
+ "name": "mcp_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "enabled_by_user_id": {
+ "name": "enabled_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "disabled_tools": {
+ "name": "disabled_tools",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "deployment_mcp_enablements_enabled_by_user_id_users_id_fk": {
+ "name": "deployment_mcp_enablements_enabled_by_user_id_users_id_fk",
+ "tableFrom": "deployment_mcp_enablements",
+ "tableTo": "users",
+ "columnsFrom": ["enabled_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "deployment_mcp_enablements_mcp_unique": {
+ "name": "deployment_mcp_enablements_mcp_unique",
+ "nullsNotDistinct": false,
+ "columns": ["mcp_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.deployment_secrets": {
+ "name": "deployment_secrets",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "deployment_secrets_name_unique": {
+ "name": "deployment_secrets_name_unique",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.deployment_settings": {
+ "name": "deployment_settings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "'default'"
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "task_model_settings": {
+ "name": "task_model_settings",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "router_debug_slack_channel_id": {
+ "name": "router_debug_slack_channel_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "runtime_model_config": {
+ "name": "runtime_model_config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "runtime_compute_config": {
+ "name": "runtime_compute_config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access_policy": {
+ "name": "access_policy",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "license_key": {
+ "name": "license_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "instance_analytics_id": {
+ "name": "instance_analytics_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "latest_known_version": {
+ "name": "latest_known_version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "latest_version_checked_at": {
+ "name": "latest_version_checked_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "setup_completed_at": {
+ "name": "setup_completed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "setup_new_state": {
+ "name": "setup_new_state",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "slack_onboarding_stage": {
+ "name": "slack_onboarding_stage",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "manager_slack_channel_id": {
+ "name": "manager_slack_channel_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "global_agent_instructions": {
+ "name": "global_agent_instructions",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "authorship_instructions": {
+ "name": "authorship_instructions",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "compiled_authorship_rules": {
+ "name": "compiled_authorship_rules",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "compiled_authorship_issues": {
+ "name": "compiled_authorship_issues",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "compiled_authorship_at": {
+ "name": "compiled_authorship_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "style_guidance": {
+ "name": "style_guidance",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "slack_summon_emoji": {
+ "name": "slack_summon_emoji",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "slack_ack_emoji": {
+ "name": "slack_ack_emoji",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'eyes'"
+ },
+ "slack_completion_emoji": {
+ "name": "slack_completion_emoji",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'white_check_mark'"
+ },
+ "slack_pr_closed_emoji": {
+ "name": "slack_pr_closed_emoji",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'x'"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.environment_config_versions": {
+ "name": "environment_config_versions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "environment_id": {
+ "name": "environment_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "version": {
+ "name": "version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "config": {
+ "name": "config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_by_user_id": {
+ "name": "created_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "environment_config_versions_environment_id_idx": {
+ "name": "environment_config_versions_environment_id_idx",
+ "columns": [
+ {
+ "expression": "environment_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "environment_config_versions_environment_version_unique": {
+ "name": "environment_config_versions_environment_version_unique",
+ "columns": [
+ {
+ "expression": "environment_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "version",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "environment_config_versions_environment_id_environments_id_fk": {
+ "name": "environment_config_versions_environment_id_environments_id_fk",
+ "tableFrom": "environment_config_versions",
+ "tableTo": "environments",
+ "columnsFrom": ["environment_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "environment_config_versions_created_by_user_id_users_id_fk": {
+ "name": "environment_config_versions_created_by_user_id_users_id_fk",
+ "tableFrom": "environment_config_versions",
+ "tableTo": "users",
+ "columnsFrom": ["created_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.environment_repository_mappings": {
+ "name": "environment_repository_mappings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "environment_id": {
+ "name": "environment_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "repository_id": {
+ "name": "repository_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "env_repo_mappings_env_id_idx": {
+ "name": "env_repo_mappings_env_id_idx",
+ "columns": [
+ {
+ "expression": "environment_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "env_repo_mappings_repo_id_idx": {
+ "name": "env_repo_mappings_repo_id_idx",
+ "columns": [
+ {
+ "expression": "repository_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "environment_repository_mappings_environment_id_environments_id_fk": {
+ "name": "environment_repository_mappings_environment_id_environments_id_fk",
+ "tableFrom": "environment_repository_mappings",
+ "tableTo": "environments",
+ "columnsFrom": ["environment_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "environment_repository_mappings_repository_id_repositories_id_fk": {
+ "name": "environment_repository_mappings_repository_id_repositories_id_fk",
+ "tableFrom": "environment_repository_mappings",
+ "tableTo": "repositories",
+ "columnsFrom": ["repository_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "env_repo_mappings_unique": {
+ "name": "env_repo_mappings_unique",
+ "nullsNotDistinct": false,
+ "columns": ["environment_id", "repository_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.environment_snapshots": {
+ "name": "environment_snapshots",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "environment_id": {
+ "name": "environment_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "snapshot_id": {
+ "name": "snapshot_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_created_at": {
+ "name": "snapshot_created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_expires_at": {
+ "name": "snapshot_expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_status": {
+ "name": "snapshot_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "deleted_at": {
+ "name": "deleted_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "environment_snapshots_environment_id_idx": {
+ "name": "environment_snapshots_environment_id_idx",
+ "columns": [
+ {
+ "expression": "environment_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "environment_snapshots_env_provider_unique": {
+ "name": "environment_snapshots_env_provider_unique",
+ "columns": [
+ {
+ "expression": "environment_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "where": "\"environment_snapshots\".\"deleted_at\" IS NULL",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "environment_snapshots_environment_id_environments_id_fk": {
+ "name": "environment_snapshots_environment_id_environments_id_fk",
+ "tableFrom": "environment_snapshots",
+ "tableTo": "environments",
+ "columnsFrom": ["environment_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.environment_variables": {
+ "name": "environment_variables",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_by_user_id": {
+ "name": "created_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_updated_by_user_id": {
+ "name": "last_updated_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "environment_variables_user_id_idx": {
+ "name": "environment_variables_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "environment_variables_name_unique": {
+ "name": "environment_variables_name_unique",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "environment_variables_user_id_users_id_fk": {
+ "name": "environment_variables_user_id_users_id_fk",
+ "tableFrom": "environment_variables",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "environment_variables_created_by_user_id_users_id_fk": {
+ "name": "environment_variables_created_by_user_id_users_id_fk",
+ "tableFrom": "environment_variables",
+ "tableTo": "users",
+ "columnsFrom": ["created_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "environment_variables_last_updated_by_user_id_users_id_fk": {
+ "name": "environment_variables_last_updated_by_user_id_users_id_fk",
+ "tableFrom": "environment_variables",
+ "tableTo": "users",
+ "columnsFrom": ["last_updated_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.environments": {
+ "name": "environments",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by_user_id": {
+ "name": "created_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "config": {
+ "name": "config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_eval": {
+ "name": "is_eval",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "declarative_source": {
+ "name": "declarative_source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_id": {
+ "name": "snapshot_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_created_at": {
+ "name": "snapshot_created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_expires_at": {
+ "name": "snapshot_expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_status": {
+ "name": "snapshot_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "environments_user_id_idx": {
+ "name": "environments_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "environments_created_by_user_id_idx": {
+ "name": "environments_created_by_user_id_idx",
+ "columns": [
+ {
+ "expression": "created_by_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "environments_snapshot_expires_at_idx": {
+ "name": "environments_snapshot_expires_at_idx",
+ "columns": [
+ {
+ "expression": "snapshot_expires_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "environments_name_unique": {
+ "name": "environments_name_unique",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "environments_user_id_users_id_fk": {
+ "name": "environments_user_id_users_id_fk",
+ "tableFrom": "environments",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "environments_created_by_user_id_users_id_fk": {
+ "name": "environments_created_by_user_id_users_id_fk",
+ "tableFrom": "environments",
+ "tableTo": "users",
+ "columnsFrom": ["created_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.github_installations": {
+ "name": "github_installations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "installation_id": {
+ "name": "installation_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "app_id": {
+ "name": "app_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "account_login": {
+ "name": "account_login",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "account_type": {
+ "name": "account_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permissions": {
+ "name": "permissions",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "installed_by_user_id": {
+ "name": "installed_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "members_count": {
+ "name": "members_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "suspended_at": {
+ "name": "suspended_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "github_installations_account_login_idx": {
+ "name": "github_installations_account_login_idx",
+ "columns": [
+ {
+ "expression": "account_login",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "github_installations_deployment_installation_unique": {
+ "name": "github_installations_deployment_installation_unique",
+ "columns": [
+ {
+ "expression": "installation_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "github_installations_user_id_users_id_fk": {
+ "name": "github_installations_user_id_users_id_fk",
+ "tableFrom": "github_installations",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "github_installations_installed_by_user_id_users_id_fk": {
+ "name": "github_installations_installed_by_user_id_users_id_fk",
+ "tableFrom": "github_installations",
+ "tableTo": "users",
+ "columnsFrom": ["installed_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.github_pending_installations": {
+ "name": "github_pending_installations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "requested_by_user_id": {
+ "name": "requested_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "app_id": {
+ "name": "app_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "payload": {
+ "name": "payload",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "github_pending_installations_requested_by_user_id_idx": {
+ "name": "github_pending_installations_requested_by_user_id_idx",
+ "columns": [
+ {
+ "expression": "requested_by_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "github_pending_installations_user_id_users_id_fk": {
+ "name": "github_pending_installations_user_id_users_id_fk",
+ "tableFrom": "github_pending_installations",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "github_pending_installations_requested_by_user_id_users_id_fk": {
+ "name": "github_pending_installations_requested_by_user_id_users_id_fk",
+ "tableFrom": "github_pending_installations",
+ "tableTo": "users",
+ "columnsFrom": ["requested_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.github_user_mappings": {
+ "name": "github_user_mappings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "github_login": {
+ "name": "github_login",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "github_user_id": {
+ "name": "github_user_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token_expires_at": {
+ "name": "token_expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "github_user_mappings_github_login_idx": {
+ "name": "github_user_mappings_github_login_idx",
+ "columns": [
+ {
+ "expression": "github_login",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "github_user_mappings_user_id_idx": {
+ "name": "github_user_mappings_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "github_user_mappings_user_id_users_id_fk": {
+ "name": "github_user_mappings_user_id_users_id_fk",
+ "tableFrom": "github_user_mappings",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "github_user_mappings_unique": {
+ "name": "github_user_mappings_unique",
+ "nullsNotDistinct": false,
+ "columns": ["github_user_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.invites": {
+ "name": "invites",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "token_hash": {
+ "name": "token_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "label": {
+ "name": "label",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "invited_by_user_id": {
+ "name": "invited_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'member'"
+ },
+ "max_uses": {
+ "name": "max_uses",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "used_count": {
+ "name": "used_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "revoked_at": {
+ "name": "revoked_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "invites_token_hash_unique": {
+ "name": "invites_token_hash_unique",
+ "columns": [
+ {
+ "expression": "token_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "invites_created_at_idx": {
+ "name": "invites_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "invites_invited_by_user_id_users_id_fk": {
+ "name": "invites_invited_by_user_id_users_id_fk",
+ "tableFrom": "invites",
+ "tableTo": "users",
+ "columnsFrom": ["invited_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.linear_pending_selections": {
+ "name": "linear_pending_selections",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "linear_organization_id": {
+ "name": "linear_organization_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "step": {
+ "name": "step",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'awaiting_workspace'"
+ },
+ "payload": {
+ "name": "payload",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "selected_repo": {
+ "name": "selected_repo",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "workspace_options": {
+ "name": "workspace_options",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "linear_pending_selections_expires_at_idx": {
+ "name": "linear_pending_selections_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expires_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "linear_pending_selections_step_idx": {
+ "name": "linear_pending_selections_step_idx",
+ "columns": [
+ {
+ "expression": "step",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "linear_pending_selections_user_id_users_id_fk": {
+ "name": "linear_pending_selections_user_id_users_id_fk",
+ "tableFrom": "linear_pending_selections",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "linear_pending_selections_session_id_unique": {
+ "name": "linear_pending_selections_session_id_unique",
+ "nullsNotDistinct": false,
+ "columns": ["session_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.llm_usage_events": {
+ "name": "llm_usage_events",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'opencode'"
+ },
+ "usage_type": {
+ "name": "usage_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'inference'"
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "environment_id": {
+ "name": "environment_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "event_key": {
+ "name": "event_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "harness_session_id": {
+ "name": "harness_session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "message_id": {
+ "name": "message_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "provider_id": {
+ "name": "provider_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "model_id": {
+ "name": "model_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "agent": {
+ "name": "agent",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "input_tokens": {
+ "name": "input_tokens",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "output_tokens": {
+ "name": "output_tokens",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "reasoning_tokens": {
+ "name": "reasoning_tokens",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "cache_read_tokens": {
+ "name": "cache_read_tokens",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "cache_write_tokens": {
+ "name": "cache_write_tokens",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "total_tokens": {
+ "name": "total_tokens",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "context_tokens": {
+ "name": "context_tokens",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "cost_micro_usd": {
+ "name": "cost_micro_usd",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "cost_source": {
+ "name": "cost_source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pricing_metadata": {
+ "name": "pricing_metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "message_created_at": {
+ "name": "message_created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "message_completed_at": {
+ "name": "message_completed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "details": {
+ "name": "details",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "llm_usage_events_session_message_unique": {
+ "name": "llm_usage_events_session_message_unique",
+ "columns": [
+ {
+ "expression": "harness_session_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "message_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "llm_usage_events_event_key_unique": {
+ "name": "llm_usage_events_event_key_unique",
+ "columns": [
+ {
+ "expression": "event_key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "llm_usage_events_task_id_idx": {
+ "name": "llm_usage_events_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "llm_usage_events_run_id_idx": {
+ "name": "llm_usage_events_run_id_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "llm_usage_events_user_id_idx": {
+ "name": "llm_usage_events_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "llm_usage_events_environment_id_idx": {
+ "name": "llm_usage_events_environment_id_idx",
+ "columns": [
+ {
+ "expression": "environment_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "llm_usage_events_provider_model_idx": {
+ "name": "llm_usage_events_provider_model_idx",
+ "columns": [
+ {
+ "expression": "provider_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "model_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "llm_usage_events_created_at_idx": {
+ "name": "llm_usage_events_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "llm_usage_events_task_id_tasks_id_fk": {
+ "name": "llm_usage_events_task_id_tasks_id_fk",
+ "tableFrom": "llm_usage_events",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "llm_usage_events_run_id_task_runs_id_fk": {
+ "name": "llm_usage_events_run_id_task_runs_id_fk",
+ "tableFrom": "llm_usage_events",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "llm_usage_events_user_id_users_id_fk": {
+ "name": "llm_usage_events_user_id_users_id_fk",
+ "tableFrom": "llm_usage_events",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "llm_usage_events_environment_id_environments_id_fk": {
+ "name": "llm_usage_events_environment_id_environments_id_fk",
+ "tableFrom": "llm_usage_events",
+ "tableTo": "environments",
+ "columnsFrom": ["environment_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mcp_connections": {
+ "name": "mcp_connections",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mcp_id": {
+ "name": "mcp_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "connection_role": {
+ "name": "connection_role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'default'"
+ },
+ "auth_config": {
+ "name": "auth_config",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "auth_status": {
+ "name": "auth_status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token_expires_at": {
+ "name": "token_expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scopes": {
+ "name": "scopes",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "mcp_connections_user_id_idx": {
+ "name": "mcp_connections_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "mcp_connections_role_idx": {
+ "name": "mcp_connections_role_idx",
+ "columns": [
+ {
+ "expression": "mcp_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "connection_role",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "mcp_connections_user_id_users_id_fk": {
+ "name": "mcp_connections_user_id_users_id_fk",
+ "tableFrom": "mcp_connections",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mcp_connections_user_mcp_id_unique": {
+ "name": "mcp_connections_user_mcp_id_unique",
+ "nullsNotDistinct": true,
+ "columns": ["user_id", "mcp_id", "connection_role"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mcp_oauth_replays": {
+ "name": "mcp_oauth_replays",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "connection_id": {
+ "name": "connection_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mcp_id": {
+ "name": "mcp_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "connection_role": {
+ "name": "connection_role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'default'"
+ },
+ "session_id": {
+ "name": "session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payload": {
+ "name": "payload",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "redirect_to": {
+ "name": "redirect_to",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "mcp_oauth_replays_connection_id_idx": {
+ "name": "mcp_oauth_replays_connection_id_idx",
+ "columns": [
+ {
+ "expression": "connection_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "mcp_oauth_replays_user_id_idx": {
+ "name": "mcp_oauth_replays_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "mcp_oauth_replays_expires_at_idx": {
+ "name": "mcp_oauth_replays_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expires_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "mcp_oauth_replays_connection_id_mcp_connections_id_fk": {
+ "name": "mcp_oauth_replays_connection_id_mcp_connections_id_fk",
+ "tableFrom": "mcp_oauth_replays",
+ "tableTo": "mcp_connections",
+ "columnsFrom": ["connection_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "mcp_oauth_replays_user_id_users_id_fk": {
+ "name": "mcp_oauth_replays_user_id_users_id_fk",
+ "tableFrom": "mcp_oauth_replays",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "mcp_oauth_replays_token_unique": {
+ "name": "mcp_oauth_replays_token_unique",
+ "nullsNotDistinct": false,
+ "columns": ["token"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.microsoft_auth_user_mappings": {
+ "name": "microsoft_auth_user_mappings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "auth_account_id": {
+ "name": "auth_account_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "account_id": {
+ "name": "account_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "microsoft_tenant_id": {
+ "name": "microsoft_tenant_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "microsoft_aad_object_id": {
+ "name": "microsoft_aad_object_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "microsoft_auth_user_mappings_user_id_idx": {
+ "name": "microsoft_auth_user_mappings_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "microsoft_auth_user_mappings_account_id_idx": {
+ "name": "microsoft_auth_user_mappings_account_id_idx",
+ "columns": [
+ {
+ "expression": "account_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "microsoft_auth_user_mappings_auth_account_idx": {
+ "name": "microsoft_auth_user_mappings_auth_account_idx",
+ "columns": [
+ {
+ "expression": "auth_account_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "microsoft_auth_user_mappings_aad_object_unique": {
+ "name": "microsoft_auth_user_mappings_aad_object_unique",
+ "columns": [
+ {
+ "expression": "microsoft_tenant_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "microsoft_aad_object_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "microsoft_auth_user_mappings_auth_account_id_auth_accounts_id_fk": {
+ "name": "microsoft_auth_user_mappings_auth_account_id_auth_accounts_id_fk",
+ "tableFrom": "microsoft_auth_user_mappings",
+ "tableTo": "auth_accounts",
+ "columnsFrom": ["auth_account_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "microsoft_auth_user_mappings_user_id_auth_users_id_fk": {
+ "name": "microsoft_auth_user_mappings_user_id_auth_users_id_fk",
+ "tableFrom": "microsoft_auth_user_mappings",
+ "tableTo": "auth_users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.oauth_state": {
+ "name": "oauth_state",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "connection_id": {
+ "name": "connection_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "code_verifier": {
+ "name": "code_verifier",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "replay_token": {
+ "name": "replay_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "oauth_state_connection_id_idx": {
+ "name": "oauth_state_connection_id_idx",
+ "columns": [
+ {
+ "expression": "connection_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "oauth_state_replay_token_idx": {
+ "name": "oauth_state_replay_token_idx",
+ "columns": [
+ {
+ "expression": "replay_token",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "oauth_state_expires_at_idx": {
+ "name": "oauth_state_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expires_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "oauth_state_connection_id_mcp_connections_id_fk": {
+ "name": "oauth_state_connection_id_mcp_connections_id_fk",
+ "tableFrom": "oauth_state",
+ "tableTo": "mcp_connections",
+ "columnsFrom": ["connection_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.pull_request_facts": {
+ "name": "pull_request_facts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "repository_id": {
+ "name": "repository_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "repository_full_name": {
+ "name": "repository_full_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source_control_provider": {
+ "name": "source_control_provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "external_pull_request_id": {
+ "name": "external_pull_request_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pr_number": {
+ "name": "pr_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "html_url": {
+ "name": "html_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "author_login": {
+ "name": "author_login",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "state": {
+ "name": "state",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at_remote": {
+ "name": "created_at_remote",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at_remote": {
+ "name": "updated_at_remote",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "closed_at_remote": {
+ "name": "closed_at_remote",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "merged_at_remote": {
+ "name": "merged_at_remote",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_seen_at": {
+ "name": "first_seen_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "synced_at": {
+ "name": "synced_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "pull_request_facts_deployment_repo_pr_unique": {
+ "name": "pull_request_facts_deployment_repo_pr_unique",
+ "columns": [
+ {
+ "expression": "repository_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "pr_number",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pull_request_facts_deployment_created_idx": {
+ "name": "pull_request_facts_deployment_created_idx",
+ "columns": [
+ {
+ "expression": "created_at_remote",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pull_request_facts_deployment_repo_created_idx": {
+ "name": "pull_request_facts_deployment_repo_created_idx",
+ "columns": [
+ {
+ "expression": "repository_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at_remote",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pull_request_facts_deployment_state_created_idx": {
+ "name": "pull_request_facts_deployment_state_created_idx",
+ "columns": [
+ {
+ "expression": "state",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at_remote",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pull_request_facts_deployment_author_created_idx": {
+ "name": "pull_request_facts_deployment_author_created_idx",
+ "columns": [
+ {
+ "expression": "author_login",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at_remote",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pull_request_facts_deployment_updated_idx": {
+ "name": "pull_request_facts_deployment_updated_idx",
+ "columns": [
+ {
+ "expression": "updated_at_remote",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "pull_request_facts_repository_id_repositories_id_fk": {
+ "name": "pull_request_facts_repository_id_repositories_id_fk",
+ "tableFrom": "pull_request_facts",
+ "tableTo": "repositories",
+ "columnsFrom": ["repository_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {
+ "pull_request_facts_source_control_provider_check": {
+ "name": "pull_request_facts_source_control_provider_check",
+ "value": "\"pull_request_facts\".\"source_control_provider\" in ('github', 'gitlab', 'gitea', 'ado', 'bitbucket')"
+ }
+ },
+ "isRLSEnabled": false
+ },
+ "public.pull_request_sync_states": {
+ "name": "pull_request_sync_states",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "repository_id": {
+ "name": "repository_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "last_incremental_updated_at": {
+ "name": "last_incremental_updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "backfill_completed_at": {
+ "name": "backfill_completed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cooldown_until": {
+ "name": "cooldown_until",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_successful_sync_at": {
+ "name": "last_successful_sync_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_attempted_sync_at": {
+ "name": "last_attempted_sync_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_error_at": {
+ "name": "last_error_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_error_message": {
+ "name": "last_error_message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "pull_request_sync_states_repo_unique": {
+ "name": "pull_request_sync_states_repo_unique",
+ "columns": [
+ {
+ "expression": "repository_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pull_request_sync_states_deployment_updated_idx": {
+ "name": "pull_request_sync_states_deployment_updated_idx",
+ "columns": [
+ {
+ "expression": "last_successful_sync_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "pull_request_sync_states_cooldown_idx": {
+ "name": "pull_request_sync_states_cooldown_idx",
+ "columns": [
+ {
+ "expression": "cooldown_until",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "pull_request_sync_states_repository_id_repositories_id_fk": {
+ "name": "pull_request_sync_states_repository_id_repositories_id_fk",
+ "tableFrom": "pull_request_sync_states",
+ "tableTo": "repositories",
+ "columnsFrom": ["repository_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.repositories": {
+ "name": "repositories",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "source_control_provider": {
+ "name": "source_control_provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "installation_id": {
+ "name": "installation_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github_repo_id": {
+ "name": "github_repo_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "external_repo_id": {
+ "name": "external_repo_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "full_name": {
+ "name": "full_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "private": {
+ "name": "private",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "default_branch": {
+ "name": "default_branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'main'"
+ },
+ "clone_url": {
+ "name": "clone_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "html_url": {
+ "name": "html_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permissions": {
+ "name": "permissions",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "linked_by_user_id": {
+ "name": "linked_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "repositories_source_control_provider_idx": {
+ "name": "repositories_source_control_provider_idx",
+ "columns": [
+ {
+ "expression": "source_control_provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "repositories_installation_id_idx": {
+ "name": "repositories_installation_id_idx",
+ "columns": [
+ {
+ "expression": "installation_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "repositories_full_name_idx": {
+ "name": "repositories_full_name_idx",
+ "columns": [
+ {
+ "expression": "full_name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "repositories_provider_host_full_name_idx": {
+ "name": "repositories_provider_host_full_name_idx",
+ "columns": [
+ {
+ "expression": "source_control_provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "host",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "full_name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "repositories_deployment_active_installation_idx": {
+ "name": "repositories_deployment_active_installation_idx",
+ "columns": [
+ {
+ "expression": "is_active",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "installation_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "repositories_deployment_github_repo_unique": {
+ "name": "repositories_deployment_github_repo_unique",
+ "columns": [
+ {
+ "expression": "github_repo_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "repositories_provider_host_external_repo_unique": {
+ "name": "repositories_provider_host_external_repo_unique",
+ "columns": [
+ {
+ "expression": "source_control_provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "coalesce(\"host\", '')",
+ "asc": true,
+ "isExpression": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "external_repo_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "repositories_provider_host_full_name_unique": {
+ "name": "repositories_provider_host_full_name_unique",
+ "columns": [
+ {
+ "expression": "source_control_provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "coalesce(\"host\", '')",
+ "asc": true,
+ "isExpression": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "full_name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "repositories_installation_id_github_installations_id_fk": {
+ "name": "repositories_installation_id_github_installations_id_fk",
+ "tableFrom": "repositories",
+ "tableTo": "github_installations",
+ "columnsFrom": ["installation_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "repositories_user_id_users_id_fk": {
+ "name": "repositories_user_id_users_id_fk",
+ "tableFrom": "repositories",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "repositories_linked_by_user_id_users_id_fk": {
+ "name": "repositories_linked_by_user_id_users_id_fk",
+ "tableFrom": "repositories",
+ "tableTo": "users",
+ "columnsFrom": ["linked_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {
+ "repositories_source_control_provider_check": {
+ "name": "repositories_source_control_provider_check",
+ "value": "\"repositories\".\"source_control_provider\" in ('github', 'gitlab', 'gitea', 'ado', 'bitbucket')"
+ },
+ "repositories_github_shape_check": {
+ "name": "repositories_github_shape_check",
+ "value": "\"repositories\".\"source_control_provider\" != 'github' OR (\"repositories\".\"installation_id\" IS NOT NULL AND \"repositories\".\"github_repo_id\" IS NOT NULL)"
+ },
+ "repositories_gitlab_shape_check": {
+ "name": "repositories_gitlab_shape_check",
+ "value": "\"repositories\".\"source_control_provider\" != 'gitlab' OR \"repositories\".\"external_repo_id\" IS NOT NULL"
+ },
+ "repositories_gitea_shape_check": {
+ "name": "repositories_gitea_shape_check",
+ "value": "\"repositories\".\"source_control_provider\" != 'gitea' OR \"repositories\".\"external_repo_id\" IS NOT NULL"
+ },
+ "repositories_ado_shape_check": {
+ "name": "repositories_ado_shape_check",
+ "value": "\"repositories\".\"source_control_provider\" != 'ado' OR \"repositories\".\"external_repo_id\" IS NOT NULL"
+ },
+ "repositories_bitbucket_shape_check": {
+ "name": "repositories_bitbucket_shape_check",
+ "value": "\"repositories\".\"source_control_provider\" != 'bitbucket' OR \"repositories\".\"external_repo_id\" IS NOT NULL"
+ }
+ },
+ "isRLSEnabled": false
+ },
+ "public.sandbox_oidc_targets": {
+ "name": "sandbox_oidc_targets",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "environment_id": {
+ "name": "environment_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "compute_provider": {
+ "name": "compute_provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "compute_provider_id": {
+ "name": "compute_provider_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "target_kind": {
+ "name": "target_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "audience": {
+ "name": "audience",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token_file": {
+ "name": "token_file",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "aws_role_arn": {
+ "name": "aws_role_arn",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "aws_region": {
+ "name": "aws_region",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "refresh_at": {
+ "name": "refresh_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "sandbox_oidc_targets_environment_id_idx": {
+ "name": "sandbox_oidc_targets_environment_id_idx",
+ "columns": [
+ {
+ "expression": "environment_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "sandbox_oidc_targets_run_id_idx": {
+ "name": "sandbox_oidc_targets_run_id_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "sandbox_oidc_targets_refresh_at_idx": {
+ "name": "sandbox_oidc_targets_refresh_at_idx",
+ "columns": [
+ {
+ "expression": "refresh_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "sandbox_oidc_targets_provider_target_file_unique": {
+ "name": "sandbox_oidc_targets_provider_target_file_unique",
+ "columns": [
+ {
+ "expression": "compute_provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "compute_provider_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "token_file",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "sandbox_oidc_targets_environment_id_environments_id_fk": {
+ "name": "sandbox_oidc_targets_environment_id_environments_id_fk",
+ "tableFrom": "sandbox_oidc_targets",
+ "tableTo": "environments",
+ "columnsFrom": ["environment_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "sandbox_oidc_targets_run_id_task_runs_id_fk": {
+ "name": "sandbox_oidc_targets_run_id_task_runs_id_fk",
+ "tableFrom": "sandbox_oidc_targets",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {
+ "sandbox_oidc_targets_owner_required": {
+ "name": "sandbox_oidc_targets_owner_required",
+ "value": "run_id IS NOT NULL"
+ }
+ },
+ "isRLSEnabled": false
+ },
+ "public.setup_qualification_blocks": {
+ "name": "setup_qualification_blocks",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "reason": {
+ "name": "reason",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'blocked'"
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "email_domain": {
+ "name": "email_domain",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github_account_login": {
+ "name": "github_account_login",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github_account_type": {
+ "name": "github_account_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_blocked_at": {
+ "name": "first_blocked_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "last_blocked_at": {
+ "name": "last_blocked_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "resolved_at": {
+ "name": "resolved_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lifted_by_admin_user_id": {
+ "name": "lifted_by_admin_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lifted_by_admin_email": {
+ "name": "lifted_by_admin_email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "setup_qualification_blocks_deployment_user_reason_unique": {
+ "name": "setup_qualification_blocks_deployment_user_reason_unique",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "reason",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "setup_qualification_blocks_deployment_status_idx": {
+ "name": "setup_qualification_blocks_deployment_status_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "setup_qualification_blocks_user_status_idx": {
+ "name": "setup_qualification_blocks_user_status_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "setup_qualification_blocks_user_id_users_id_fk": {
+ "name": "setup_qualification_blocks_user_id_users_id_fk",
+ "tableFrom": "setup_qualification_blocks",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.slack_auth_tokens": {
+ "name": "slack_auth_tokens",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "token": {
+ "name": "token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slack_user_id": {
+ "name": "slack_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slack_team_id": {
+ "name": "slack_team_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "channel": {
+ "name": "channel",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "thread_ts": {
+ "name": "thread_ts",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "original_text": {
+ "name": "original_text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "slack_auth_tokens_expires_at_idx": {
+ "name": "slack_auth_tokens_expires_at_idx",
+ "columns": [
+ {
+ "expression": "expires_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "slack_auth_tokens_token_unique": {
+ "name": "slack_auth_tokens_token_unique",
+ "nullsNotDistinct": false,
+ "columns": ["token"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.slack_conversation_messages": {
+ "name": "slack_conversation_messages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "subject_user_id": {
+ "name": "subject_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "slack_team_id": {
+ "name": "slack_team_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "subject_slack_user_id": {
+ "name": "subject_slack_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "sender_user_id": {
+ "name": "sender_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sender_slack_user_id": {
+ "name": "sender_slack_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "slack_channel_id": {
+ "name": "slack_channel_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "conversation_kind": {
+ "name": "conversation_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "thread_ts": {
+ "name": "thread_ts",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "message_ts": {
+ "name": "message_ts",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message_at": {
+ "name": "message_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "direction": {
+ "name": "direction",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "author_kind": {
+ "name": "author_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "text": {
+ "name": "text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "slack_quick_answer_id": {
+ "name": "slack_quick_answer_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "slack_conversation_messages_deployment_user_message_at_idx": {
+ "name": "slack_conversation_messages_deployment_user_message_at_idx",
+ "columns": [
+ {
+ "expression": "subject_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "message_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "slack_conversation_messages_deployment_user_thread_idx": {
+ "name": "slack_conversation_messages_deployment_user_thread_idx",
+ "columns": [
+ {
+ "expression": "subject_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "slack_channel_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "thread_ts",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "message_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "slack_conversation_messages_task_id_idx": {
+ "name": "slack_conversation_messages_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "slack_conversation_messages_run_id_idx": {
+ "name": "slack_conversation_messages_run_id_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "slack_conversation_messages_team_channel_message_unique": {
+ "name": "slack_conversation_messages_team_channel_message_unique",
+ "columns": [
+ {
+ "expression": "slack_team_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "slack_channel_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "message_ts",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "slack_conversation_messages_subject_user_id_users_id_fk": {
+ "name": "slack_conversation_messages_subject_user_id_users_id_fk",
+ "tableFrom": "slack_conversation_messages",
+ "tableTo": "users",
+ "columnsFrom": ["subject_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "slack_conversation_messages_sender_user_id_users_id_fk": {
+ "name": "slack_conversation_messages_sender_user_id_users_id_fk",
+ "tableFrom": "slack_conversation_messages",
+ "tableTo": "users",
+ "columnsFrom": ["sender_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "slack_conversation_messages_task_id_tasks_id_fk": {
+ "name": "slack_conversation_messages_task_id_tasks_id_fk",
+ "tableFrom": "slack_conversation_messages",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "slack_conversation_messages_run_id_task_runs_id_fk": {
+ "name": "slack_conversation_messages_run_id_task_runs_id_fk",
+ "tableFrom": "slack_conversation_messages",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "slack_conversation_messages_slack_quick_answer_id_slack_quick_answers_id_fk": {
+ "name": "slack_conversation_messages_slack_quick_answer_id_slack_quick_answers_id_fk",
+ "tableFrom": "slack_conversation_messages",
+ "tableTo": "slack_quick_answers",
+ "columnsFrom": ["slack_quick_answer_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.slack_installation_channels": {
+ "name": "slack_installation_channels",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "slack_installation_id": {
+ "name": "slack_installation_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "channel_id": {
+ "name": "channel_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "slack_installation_channels_installation_id_idx": {
+ "name": "slack_installation_channels_installation_id_idx",
+ "columns": [
+ {
+ "expression": "slack_installation_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "slack_installation_channels_slack_installation_id_slack_installations_id_fk": {
+ "name": "slack_installation_channels_slack_installation_id_slack_installations_id_fk",
+ "tableFrom": "slack_installation_channels",
+ "tableTo": "slack_installations",
+ "columnsFrom": ["slack_installation_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "slack_installation_channels_unique": {
+ "name": "slack_installation_channels_unique",
+ "nullsNotDistinct": false,
+ "columns": ["slack_installation_id", "channel_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.slack_installations": {
+ "name": "slack_installations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "team_id": {
+ "name": "team_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "team_name": {
+ "name": "team_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "team_domain": {
+ "name": "team_domain",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enterprise_id": {
+ "name": "enterprise_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "enterprise_name": {
+ "name": "enterprise_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "app_id": {
+ "name": "app_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "bot_user_id": {
+ "name": "bot_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "bot_name": {
+ "name": "bot_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "app_name": {
+ "name": "app_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bot_access_token": {
+ "name": "bot_access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_access_token": {
+ "name": "user_access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scopes": {
+ "name": "scopes",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token_type": {
+ "name": "token_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'bot'"
+ },
+ "installed_by_user_id": {
+ "name": "installed_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "member_count_snapshot": {
+ "name": "member_count_snapshot",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "member_count_snapshot_at": {
+ "name": "member_count_snapshot_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "last_used_at": {
+ "name": "last_used_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "slack_installations_bot_user_id_idx": {
+ "name": "slack_installations_bot_user_id_idx",
+ "columns": [
+ {
+ "expression": "bot_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "slack_installations_active_idx": {
+ "name": "slack_installations_active_idx",
+ "columns": [
+ {
+ "expression": "is_active",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "slack_installations_installed_by_user_id_users_id_fk": {
+ "name": "slack_installations_installed_by_user_id_users_id_fk",
+ "tableFrom": "slack_installations",
+ "tableTo": "users",
+ "columnsFrom": ["installed_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "slack_installations_team_id_unique": {
+ "name": "slack_installations_team_id_unique",
+ "nullsNotDistinct": false,
+ "columns": ["team_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.slack_quick_answers": {
+ "name": "slack_quick_answers",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slack_channel": {
+ "name": "slack_channel",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slack_thread_ts": {
+ "name": "slack_thread_ts",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "messages": {
+ "name": "messages",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "slack_quick_answers_deployment_channel_thread_unique": {
+ "name": "slack_quick_answers_deployment_channel_thread_unique",
+ "columns": [
+ {
+ "expression": "slack_channel",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "slack_thread_ts",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "slack_quick_answers_deployment_user_idx": {
+ "name": "slack_quick_answers_deployment_user_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "slack_quick_answers_user_id_users_id_fk": {
+ "name": "slack_quick_answers_user_id_users_id_fk",
+ "tableFrom": "slack_quick_answers",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.slack_user_mappings": {
+ "name": "slack_user_mappings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "slack_user_id": {
+ "name": "slack_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slack_team_id": {
+ "name": "slack_team_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "slack_user_mappings_user_id_idx": {
+ "name": "slack_user_mappings_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "slack_user_mappings_user_id_users_id_fk": {
+ "name": "slack_user_mappings_user_id_users_id_fk",
+ "tableFrom": "slack_user_mappings",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "slack_user_mappings_unique": {
+ "name": "slack_user_mappings_unique",
+ "nullsNotDistinct": false,
+ "columns": ["slack_user_id", "slack_team_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.task_artifacts": {
+ "name": "task_artifacts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "artifact_type": {
+ "name": "artifact_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'general'"
+ },
+ "content_type": {
+ "name": "content_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "path": {
+ "name": "path",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "version": {
+ "name": "version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "size": {
+ "name": "size",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "uploaded": {
+ "name": "uploaded",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_artifacts_task_id_idx": {
+ "name": "task_artifacts_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_artifacts_run_id_idx": {
+ "name": "task_artifacts_run_id_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_artifacts_uploaded_idx": {
+ "name": "task_artifacts_uploaded_idx",
+ "columns": [
+ {
+ "expression": "uploaded",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_artifacts_created_at_idx": {
+ "name": "task_artifacts_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_artifacts_path_idx": {
+ "name": "task_artifacts_path_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "path",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_artifacts_task_id_tasks_id_fk": {
+ "name": "task_artifacts_task_id_tasks_id_fk",
+ "tableFrom": "task_artifacts",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_artifacts_run_id_task_runs_id_fk": {
+ "name": "task_artifacts_run_id_task_runs_id_fk",
+ "tableFrom": "task_artifacts",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "task_artifacts_task_id_path_version_unique": {
+ "name": "task_artifacts_task_id_path_version_unique",
+ "nullsNotDistinct": false,
+ "columns": ["task_id", "path", "version"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.task_messages": {
+ "name": "task_messages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ts": {
+ "name": "ts",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event_type": {
+ "name": "event_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "protocol": {
+ "name": "protocol",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content_blocks": {
+ "name": "content_blocks",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payload": {
+ "name": "payload",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_messages_task_id_ts_idx": {
+ "name": "task_messages_task_id_ts_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "ts",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_messages_run_id_idx": {
+ "name": "task_messages_run_id_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_messages_created_at_idx": {
+ "name": "task_messages_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_messages_run_id_task_runs_id_fk": {
+ "name": "task_messages_run_id_task_runs_id_fk",
+ "tableFrom": "task_messages",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_messages_task_id_tasks_id_fk": {
+ "name": "task_messages_task_id_tasks_id_fk",
+ "tableFrom": "task_messages",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_messages_user_id_users_id_fk": {
+ "name": "task_messages_user_id_users_id_fk",
+ "tableFrom": "task_messages",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "task_messages_task_protocol_ts_event_type_unique": {
+ "name": "task_messages_task_protocol_ts_event_type_unique",
+ "nullsNotDistinct": false,
+ "columns": ["task_id", "protocol", "ts", "event_type"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.task_pins": {
+ "name": "task_pins",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_pins_deployment_user_task_unique": {
+ "name": "task_pins_deployment_user_task_unique",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_pins_deployment_user_updated_at_idx": {
+ "name": "task_pins_deployment_user_updated_at_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "updated_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_pins_task_id_idx": {
+ "name": "task_pins_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_pins_task_id_tasks_id_fk": {
+ "name": "task_pins_task_id_tasks_id_fk",
+ "tableFrom": "task_pins",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_pins_user_id_users_id_fk": {
+ "name": "task_pins_user_id_users_id_fk",
+ "tableFrom": "task_pins",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.task_platform_issue_reports": {
+ "name": "task_platform_issue_reports",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "task_message_id": {
+ "name": "task_message_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "report": {
+ "name": "report",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "slack_posted_at": {
+ "name": "slack_posted_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_platform_issue_reports_created_at_idx": {
+ "name": "task_platform_issue_reports_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_platform_issue_reports_task_id_created_at_idx": {
+ "name": "task_platform_issue_reports_task_id_created_at_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_platform_issue_reports_run_id_created_at_idx": {
+ "name": "task_platform_issue_reports_run_id_created_at_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_platform_issue_reports_task_message_id_unique": {
+ "name": "task_platform_issue_reports_task_message_id_unique",
+ "columns": [
+ {
+ "expression": "task_message_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_platform_issue_reports_task_id_tasks_id_fk": {
+ "name": "task_platform_issue_reports_task_id_tasks_id_fk",
+ "tableFrom": "task_platform_issue_reports",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_platform_issue_reports_run_id_task_runs_id_fk": {
+ "name": "task_platform_issue_reports_run_id_task_runs_id_fk",
+ "tableFrom": "task_platform_issue_reports",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_platform_issue_reports_task_message_id_task_messages_id_fk": {
+ "name": "task_platform_issue_reports_task_message_id_task_messages_id_fk",
+ "tableFrom": "task_platform_issue_reports",
+ "tableTo": "task_messages",
+ "columnsFrom": ["task_message_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.task_pull_requests": {
+ "name": "task_pull_requests",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source_control_provider": {
+ "name": "source_control_provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'github'"
+ },
+ "host": {
+ "name": "host",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "repository_id": {
+ "name": "repository_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pr_url": {
+ "name": "pr_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "pr_number": {
+ "name": "pr_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pr_title": {
+ "name": "pr_title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "repository": {
+ "name": "repository",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pr_sha": {
+ "name": "pr_sha",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pr_base_ref": {
+ "name": "pr_base_ref",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pr_base_sha": {
+ "name": "pr_base_sha",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github_reaction_id": {
+ "name": "github_reaction_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github_check_run_id": {
+ "name": "github_check_run_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github_review_comment_id": {
+ "name": "github_review_comment_id",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "detected_at": {
+ "name": "detected_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_pull_requests_task_id_idx": {
+ "name": "task_pull_requests_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_pull_requests_repository_id_idx": {
+ "name": "task_pull_requests_repository_id_idx",
+ "columns": [
+ {
+ "expression": "repository_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_pull_requests_provider_repository_pr_number_idx": {
+ "name": "task_pull_requests_provider_repository_pr_number_idx",
+ "columns": [
+ {
+ "expression": "source_control_provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "repository",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "pr_number",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_pull_requests_task_id_tasks_id_fk": {
+ "name": "task_pull_requests_task_id_tasks_id_fk",
+ "tableFrom": "task_pull_requests",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_pull_requests_repository_id_repositories_id_fk": {
+ "name": "task_pull_requests_repository_id_repositories_id_fk",
+ "tableFrom": "task_pull_requests",
+ "tableTo": "repositories",
+ "columnsFrom": ["repository_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "task_pull_requests_task_pr_unique": {
+ "name": "task_pull_requests_task_pr_unique",
+ "nullsNotDistinct": false,
+ "columns": ["task_id", "pr_url"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {
+ "task_pull_requests_source_control_provider_check": {
+ "name": "task_pull_requests_source_control_provider_check",
+ "value": "\"task_pull_requests\".\"source_control_provider\" in ('github', 'gitlab', 'gitea', 'ado', 'bitbucket')"
+ }
+ },
+ "isRLSEnabled": false
+ },
+ "public.task_run_events": {
+ "name": "task_run_events",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source": {
+ "name": "source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event_type": {
+ "name": "event_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message": {
+ "name": "message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "details": {
+ "name": "details",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_run_events_run_id_created_at_idx": {
+ "name": "task_run_events_run_id_created_at_idx",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_run_events_task_id_created_at_idx": {
+ "name": "task_run_events_task_id_created_at_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_run_events_created_at_idx": {
+ "name": "task_run_events_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_run_events_source_created_at_idx": {
+ "name": "task_run_events_source_created_at_idx",
+ "columns": [
+ {
+ "expression": "source",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_run_events_run_id_task_runs_id_fk": {
+ "name": "task_run_events_run_id_task_runs_id_fk",
+ "tableFrom": "task_run_events",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_run_events_task_id_tasks_id_fk": {
+ "name": "task_run_events_task_id_tasks_id_fk",
+ "tableFrom": "task_run_events",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.task_runs": {
+ "name": "task_runs",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "integer",
+ "primaryKey": true,
+ "notNull": true,
+ "identity": {
+ "type": "always",
+ "name": "task_runs_id_seq",
+ "schema": "public",
+ "increment": "1",
+ "startWith": "1",
+ "minValue": "1",
+ "maxValue": "2147483647",
+ "cache": "1",
+ "cycle": false
+ }
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "kind": {
+ "name": "kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'fresh'"
+ },
+ "source_run_id": {
+ "name": "source_run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "acting_user_id": {
+ "name": "acting_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payload_kind": {
+ "name": "payload_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "harness": {
+ "name": "harness",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'opencode-server'"
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "queue_scope": {
+ "name": "queue_scope",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "task_phase": {
+ "name": "task_phase",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "payload": {
+ "name": "payload",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "prompt": {
+ "name": "prompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "log": {
+ "name": "log",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "artifacts": {
+ "name": "artifacts",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "result": {
+ "name": "result",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "machine_id": {
+ "name": "machine_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sandbox_cmd_id": {
+ "name": "sandbox_cmd_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "machine_domain": {
+ "name": "machine_domain",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "machine_domains": {
+ "name": "machine_domains",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "initial_paths": {
+ "name": "initial_paths",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "primary_port_name": {
+ "name": "primary_port_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sandbox_server_url": {
+ "name": "sandbox_server_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "proxy_ports": {
+ "name": "proxy_ports",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "worker_release_tag": {
+ "name": "worker_release_tag",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "worker_version": {
+ "name": "worker_version",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "worker_commit": {
+ "name": "worker_commit",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "vendor": {
+ "name": "vendor",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "port": {
+ "name": "port",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "configured_vcpus": {
+ "name": "configured_vcpus",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "configured_cpu_cores": {
+ "name": "configured_cpu_cores",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "configured_memory_mib": {
+ "name": "configured_memory_mib",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_id": {
+ "name": "snapshot_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_requested_at": {
+ "name": "snapshot_requested_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_created_at": {
+ "name": "snapshot_created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "snapshot_failed_at": {
+ "name": "snapshot_failed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "keepalive_ms": {
+ "name": "keepalive_ms",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sleep_at": {
+ "name": "sleep_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sleep_requested_at": {
+ "name": "sleep_requested_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "worker_heartbeat_at": {
+ "name": "worker_heartbeat_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source_snapshot_id": {
+ "name": "source_snapshot_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "auth_bypass_value": {
+ "name": "auth_bypass_value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "auth_bypass_header_name": {
+ "name": "auth_bypass_header_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "dequeued_at": {
+ "name": "dequeued_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "provision_started_at": {
+ "name": "provision_started_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "provision_ready_at": {
+ "name": "provision_ready_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "started_at": {
+ "name": "started_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "setup_completed_at": {
+ "name": "setup_completed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "environment_setup_state": {
+ "name": "environment_setup_state",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "environment_setup_completed_at": {
+ "name": "environment_setup_completed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "harness_started_at": {
+ "name": "harness_started_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "runtime_task_started_at": {
+ "name": "runtime_task_started_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_assistant_output_at": {
+ "name": "first_assistant_output_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "completed_at": {
+ "name": "completed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cancel_requested_at": {
+ "name": "cancel_requested_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "canceled_at": {
+ "name": "canceled_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "launch_mode": {
+ "name": "launch_mode",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "task_runs_task_id_idx": {
+ "name": "task_runs_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_queue_scope_idx": {
+ "name": "task_runs_queue_scope_idx",
+ "columns": [
+ {
+ "expression": "queue_scope",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_acting_user_id_idx": {
+ "name": "task_runs_acting_user_id_idx",
+ "columns": [
+ {
+ "expression": "acting_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_snapshot_id_idx": {
+ "name": "task_runs_snapshot_id_idx",
+ "columns": [
+ {
+ "expression": "snapshot_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_sleep_at_idx": {
+ "name": "task_runs_sleep_at_idx",
+ "columns": [
+ {
+ "expression": "sleep_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_worker_heartbeat_at_idx": {
+ "name": "task_runs_worker_heartbeat_at_idx",
+ "columns": [
+ {
+ "expression": "worker_heartbeat_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_sleep_check_due_idx": {
+ "name": "task_runs_sleep_check_due_idx",
+ "columns": [
+ {
+ "expression": "sleep_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "vendor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"task_runs\".\"status\" IN ('running', 'idle') AND \"task_runs\".\"machine_id\" IS NOT NULL AND \"task_runs\".\"sleep_at\" IS NOT NULL AND \"task_runs\".\"sleep_requested_at\" IS NULL AND \"task_runs\".\"snapshot_id\" IS NULL AND \"task_runs\".\"snapshot_requested_at\" IS NULL AND \"task_runs\".\"vendor\" IN ('modal', 'daytona', 'e2b', 'docker', 'blaxel')",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_sleep_check_stale_worker_idx": {
+ "name": "task_runs_sleep_check_stale_worker_idx",
+ "columns": [
+ {
+ "expression": "worker_heartbeat_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "vendor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"task_runs\".\"status\" IN ('running', 'idle') AND \"task_runs\".\"machine_id\" IS NOT NULL AND \"task_runs\".\"worker_heartbeat_at\" IS NOT NULL AND \"task_runs\".\"sleep_requested_at\" IS NULL AND \"task_runs\".\"snapshot_id\" IS NULL AND \"task_runs\".\"snapshot_requested_at\" IS NULL AND \"task_runs\".\"vendor\" IN ('modal', 'daytona', 'e2b', 'docker', 'blaxel')",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_sleep_check_active_idx": {
+ "name": "task_runs_sleep_check_active_idx",
+ "columns": [
+ {
+ "expression": "vendor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "where": "\"task_runs\".\"status\" IN ('running', 'idle') AND \"task_runs\".\"machine_id\" IS NOT NULL AND \"task_runs\".\"sleep_requested_at\" IS NULL AND \"task_runs\".\"snapshot_id\" IS NULL AND \"task_runs\".\"snapshot_requested_at\" IS NULL AND \"task_runs\".\"vendor\" IN ('modal', 'daytona', 'e2b', 'docker', 'blaxel')",
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_source_snapshot_id_idx": {
+ "name": "task_runs_source_snapshot_id_idx",
+ "columns": [
+ {
+ "expression": "source_snapshot_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_source_run_id_idx": {
+ "name": "task_runs_source_run_id_idx",
+ "columns": [
+ {
+ "expression": "source_run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_runs_first_assistant_output_at_idx": {
+ "name": "task_runs_first_assistant_output_at_idx",
+ "columns": [
+ {
+ "expression": "first_assistant_output_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_runs_task_id_tasks_id_fk": {
+ "name": "task_runs_task_id_tasks_id_fk",
+ "tableFrom": "task_runs",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_runs_source_run_id_task_runs_id_fk": {
+ "name": "task_runs_source_run_id_task_runs_id_fk",
+ "tableFrom": "task_runs",
+ "tableTo": "task_runs",
+ "columnsFrom": ["source_run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "task_runs_acting_user_id_users_id_fk": {
+ "name": "task_runs_acting_user_id_users_id_fk",
+ "tableFrom": "task_runs",
+ "tableTo": "users",
+ "columnsFrom": ["acting_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {
+ "task_runs_kind_check": {
+ "name": "task_runs_kind_check",
+ "value": "\"task_runs\".\"kind\" in ('fresh', 'resume')"
+ },
+ "task_runs_harness_check": {
+ "name": "task_runs_harness_check",
+ "value": "\"task_runs\".\"harness\" in ('opencode-server')"
+ }
+ },
+ "isRLSEnabled": false
+ },
+ "public.task_slack_reply_details": {
+ "name": "task_slack_reply_details",
+ "schema": "",
+ "columns": {
+ "detail_id": {
+ "name": "detail_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "summary": {
+ "name": "summary",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "findings": {
+ "name": "findings",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_slack_reply_details_task_id_idx": {
+ "name": "task_slack_reply_details_task_id_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_slack_reply_details_deployment_task_detail_unique": {
+ "name": "task_slack_reply_details_deployment_task_detail_unique",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "detail_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_slack_reply_details_task_id_tasks_id_fk": {
+ "name": "task_slack_reply_details_task_id_tasks_id_fk",
+ "tableFrom": "task_slack_reply_details",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.task_start_parallel_counts": {
+ "name": "task_start_parallel_counts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "task_id": {
+ "name": "task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "run_id": {
+ "name": "run_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "payload_kind": {
+ "name": "payload_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "parallel_count": {
+ "name": "parallel_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "activity_window_seconds": {
+ "name": "activity_window_seconds",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "started_at": {
+ "name": "started_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "ended_at": {
+ "name": "ended_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "task_start_parallel_counts_run_id_unique": {
+ "name": "task_start_parallel_counts_run_id_unique",
+ "columns": [
+ {
+ "expression": "run_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_start_parallel_counts_task_id_started_at_idx": {
+ "name": "task_start_parallel_counts_task_id_started_at_idx",
+ "columns": [
+ {
+ "expression": "task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "started_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "task_start_parallel_counts_started_at_idx": {
+ "name": "task_start_parallel_counts_started_at_idx",
+ "columns": [
+ {
+ "expression": "started_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "task_start_parallel_counts_task_id_tasks_id_fk": {
+ "name": "task_start_parallel_counts_task_id_tasks_id_fk",
+ "tableFrom": "task_start_parallel_counts",
+ "tableTo": "tasks",
+ "columnsFrom": ["task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "task_start_parallel_counts_run_id_task_runs_id_fk": {
+ "name": "task_start_parallel_counts_run_id_task_runs_id_fk",
+ "tableFrom": "task_start_parallel_counts",
+ "tableTo": "task_runs",
+ "columnsFrom": ["run_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.tasks": {
+ "name": "tasks",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "workflow": {
+ "name": "workflow",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "surface": {
+ "name": "surface",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "trigger": {
+ "name": "trigger",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "visibility": {
+ "name": "visibility",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'visible'"
+ },
+ "state": {
+ "name": "state",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'active'"
+ },
+ "initiator_kind": {
+ "name": "initiator_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "initiator_user_id": {
+ "name": "initiator_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "initiator_automation": {
+ "name": "initiator_automation",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "actor_external_id": {
+ "name": "actor_external_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "actor_display_name": {
+ "name": "actor_display_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "commit_author_kind": {
+ "name": "commit_author_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "commit_author_user_id": {
+ "name": "commit_author_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "commit_author_login": {
+ "name": "commit_author_login",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "commit_author_external_id": {
+ "name": "commit_author_external_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "pr_assignee_login": {
+ "name": "pr_assignee_login",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "slack_channel_id": {
+ "name": "slack_channel_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "slack_thread_ts": {
+ "name": "slack_thread_ts",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linear_session_id": {
+ "name": "linear_session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linear_issue_id": {
+ "name": "linear_issue_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linear_organization_id": {
+ "name": "linear_organization_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "harness": {
+ "name": "harness",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'opencode-server'"
+ },
+ "harness_session_id": {
+ "name": "harness_session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "model_provider": {
+ "name": "model_provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title_edited_by_user_at": {
+ "name": "title_edited_by_user_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "llm_title_checkpoint": {
+ "name": "llm_title_checkpoint",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "mode": {
+ "name": "mode",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "model": {
+ "name": "model",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "prompt": {
+ "name": "prompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "draft_prompt": {
+ "name": "draft_prompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "requested_work_kind": {
+ "name": "requested_work_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'unknown'"
+ },
+ "requested_work_kind_source": {
+ "name": "requested_work_kind_source",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'system_default'"
+ },
+ "requested_work_kind_confidence": {
+ "name": "requested_work_kind_confidence",
+ "type": "real",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "harness_instructions": {
+ "name": "harness_instructions",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "compute_duration_ms": {
+ "name": "compute_duration_ms",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "timestamp": {
+ "name": "timestamp",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "activity_at": {
+ "name": "activity_at",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "repository_url": {
+ "name": "repository_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "repository_name": {
+ "name": "repository_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "default_branch": {
+ "name": "default_branch",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "deleted_at": {
+ "name": "deleted_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "tasks_initiator_user_id_idx": {
+ "name": "tasks_initiator_user_id_idx",
+ "columns": [
+ {
+ "expression": "initiator_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tasks_initiator_automation_idx": {
+ "name": "tasks_initiator_automation_idx",
+ "columns": [
+ {
+ "expression": "initiator_automation",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tasks_workflow_idx": {
+ "name": "tasks_workflow_idx",
+ "columns": [
+ {
+ "expression": "workflow",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tasks_visibility_activity_at_idx": {
+ "name": "tasks_visibility_activity_at_idx",
+ "columns": [
+ {
+ "expression": "visibility",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "activity_at",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tasks_harness_session_id_idx": {
+ "name": "tasks_harness_session_id_idx",
+ "columns": [
+ {
+ "expression": "harness_session_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tasks_timestamp_idx": {
+ "name": "tasks_timestamp_idx",
+ "columns": [
+ {
+ "expression": "timestamp",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tasks_deployment_activity_at_idx": {
+ "name": "tasks_deployment_activity_at_idx",
+ "columns": [
+ {
+ "expression": "activity_at",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "last"
+ },
+ {
+ "expression": "id",
+ "isExpression": false,
+ "asc": false,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tasks_created_at_idx": {
+ "name": "tasks_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "tasks_initiator_user_id_users_id_fk": {
+ "name": "tasks_initiator_user_id_users_id_fk",
+ "tableFrom": "tasks",
+ "tableTo": "users",
+ "columnsFrom": ["initiator_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "tasks_initiator_automation_automations_key_fk": {
+ "name": "tasks_initiator_automation_automations_key_fk",
+ "tableFrom": "tasks",
+ "tableTo": "automations",
+ "columnsFrom": ["initiator_automation"],
+ "columnsTo": ["key"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "tasks_commit_author_user_id_users_id_fk": {
+ "name": "tasks_commit_author_user_id_users_id_fk",
+ "tableFrom": "tasks",
+ "tableTo": "users",
+ "columnsFrom": ["commit_author_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {
+ "tasks_initiator_shape_check": {
+ "name": "tasks_initiator_shape_check",
+ "value": "(\"tasks\".\"initiator_kind\" = 'user' AND \"tasks\".\"initiator_automation\" IS NULL AND (\"tasks\".\"initiator_user_id\" IS NOT NULL OR \"tasks\".\"actor_external_id\" IS NOT NULL)) OR (\"tasks\".\"initiator_kind\" = 'automation' AND \"tasks\".\"initiator_automation\" IS NOT NULL AND \"tasks\".\"initiator_user_id\" IS NULL)"
+ },
+ "tasks_workflow_check": {
+ "name": "tasks_workflow_check",
+ "value": "\"tasks\".\"workflow\" in ('standard', 'pr_review', 'pr_conflict_resolve', 'scan', 'mcp_recommendations', 'setup_onboarding', 'env_snapshot', 'eval')"
+ },
+ "tasks_surface_check": {
+ "name": "tasks_surface_check",
+ "value": "\"tasks\".\"surface\" in ('web', 'api', 'slack', 'teams', 'telegram', 'linear', 'github', 'gitlab', 'gitea', 'ado', 'bitbucket', 'system')"
+ },
+ "tasks_trigger_check": {
+ "name": "tasks_trigger_check",
+ "value": "\"tasks\".\"trigger\" in ('message', 'webhook', 'schedule', 'manual')"
+ },
+ "tasks_visibility_check": {
+ "name": "tasks_visibility_check",
+ "value": "\"tasks\".\"visibility\" in ('visible', 'hidden')"
+ },
+ "tasks_state_check": {
+ "name": "tasks_state_check",
+ "value": "\"tasks\".\"state\" in ('active', 'completed', 'failed', 'canceled')"
+ },
+ "tasks_harness_check": {
+ "name": "tasks_harness_check",
+ "value": "\"tasks\".\"harness\" in ('opencode-server')"
+ },
+ "tasks_requested_work_kind_check": {
+ "name": "tasks_requested_work_kind_check",
+ "value": "\"tasks\".\"requested_work_kind\" in ('question', 'plan', 'implement', 'unknown')"
+ },
+ "tasks_requested_work_kind_source_check": {
+ "name": "tasks_requested_work_kind_source_check",
+ "value": "\"tasks\".\"requested_work_kind_source\" in ('explicit_bootstrap', 'task_tool', 'llm_classifier', 'inherited', 'system_default')"
+ },
+ "tasks_commit_author_kind_check": {
+ "name": "tasks_commit_author_kind_check",
+ "value": "\"tasks\".\"commit_author_kind\" IS NULL OR \"tasks\".\"commit_author_kind\" in ('roomote', 'user', 'external')"
+ }
+ },
+ "isRLSEnabled": false
+ },
+ "public.teams_installations": {
+ "name": "teams_installations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "installation_key": {
+ "name": "installation_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "tenant_id": {
+ "name": "tenant_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "team_id": {
+ "name": "team_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "team_name": {
+ "name": "team_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "channel_id": {
+ "name": "channel_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "channel_name": {
+ "name": "channel_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "conversation_id": {
+ "name": "conversation_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "conversation_type": {
+ "name": "conversation_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bot_app_id": {
+ "name": "bot_app_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "bot_user_id": {
+ "name": "bot_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "bot_name": {
+ "name": "bot_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "service_url": {
+ "name": "service_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "last_activity_at": {
+ "name": "last_activity_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "teams_installations_tenant_id_idx": {
+ "name": "teams_installations_tenant_id_idx",
+ "columns": [
+ {
+ "expression": "tenant_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "teams_installations_team_id_idx": {
+ "name": "teams_installations_team_id_idx",
+ "columns": [
+ {
+ "expression": "team_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "teams_installations_conversation_id_idx": {
+ "name": "teams_installations_conversation_id_idx",
+ "columns": [
+ {
+ "expression": "conversation_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "teams_installations_active_idx": {
+ "name": "teams_installations_active_idx",
+ "columns": [
+ {
+ "expression": "is_active",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "teams_installations_installation_key_unique": {
+ "name": "teams_installations_installation_key_unique",
+ "nullsNotDistinct": false,
+ "columns": ["installation_key"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.teams_user_mappings": {
+ "name": "teams_user_mappings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "teams_user_id": {
+ "name": "teams_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "teams_tenant_id": {
+ "name": "teams_tenant_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "teams_aad_object_id": {
+ "name": "teams_aad_object_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "teams_user_mappings_aad_object_idx": {
+ "name": "teams_user_mappings_aad_object_idx",
+ "columns": [
+ {
+ "expression": "teams_aad_object_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "teams_tenant_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "teams_user_mappings_user_id_idx": {
+ "name": "teams_user_mappings_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "teams_user_mappings_user_id_users_id_fk": {
+ "name": "teams_user_mappings_user_id_users_id_fk",
+ "tableFrom": "teams_user_mappings",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "teams_user_mappings_unique": {
+ "name": "teams_user_mappings_unique",
+ "nullsNotDistinct": false,
+ "columns": ["teams_user_id", "teams_tenant_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.telegram_user_mappings": {
+ "name": "telegram_user_mappings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "telegram_user_id": {
+ "name": "telegram_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "telegram_chat_id": {
+ "name": "telegram_chat_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "telegram_username": {
+ "name": "telegram_username",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "telegram_user_mappings_user_id_idx": {
+ "name": "telegram_user_mappings_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "telegram_user_mappings_user_id_users_id_fk": {
+ "name": "telegram_user_mappings_user_id_users_id_fk",
+ "tableFrom": "telegram_user_mappings",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "telegram_user_mappings_unique": {
+ "name": "telegram_user_mappings_unique",
+ "nullsNotDistinct": false,
+ "columns": ["telegram_user_id"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.tracked_messages": {
+ "name": "tracked_messages",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "surface": {
+ "name": "surface",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "kind": {
+ "name": "kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "dedupe_key": {
+ "name": "dedupe_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "channel_id": {
+ "name": "channel_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "message_ts": {
+ "name": "message_ts",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "thread_ts": {
+ "name": "thread_ts",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "work_item_id": {
+ "name": "work_item_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "automation_key": {
+ "name": "automation_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_by_user_id": {
+ "name": "created_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "summary_text": {
+ "name": "summary_text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "posted_at": {
+ "name": "posted_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "dismissed_at": {
+ "name": "dismissed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "tracked_messages_kind_dedupe_key_unique": {
+ "name": "tracked_messages_kind_dedupe_key_unique",
+ "columns": [
+ {
+ "expression": "kind",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "dedupe_key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tracked_messages_work_item_id_idx": {
+ "name": "tracked_messages_work_item_id_idx",
+ "columns": [
+ {
+ "expression": "work_item_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tracked_messages_channel_message_idx": {
+ "name": "tracked_messages_channel_message_idx",
+ "columns": [
+ {
+ "expression": "channel_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "message_ts",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "tracked_messages_automation_channel_posted_idx": {
+ "name": "tracked_messages_automation_channel_posted_idx",
+ "columns": [
+ {
+ "expression": "automation_key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "channel_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "posted_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "tracked_messages_work_item_id_work_items_id_fk": {
+ "name": "tracked_messages_work_item_id_work_items_id_fk",
+ "tableFrom": "tracked_messages",
+ "tableTo": "work_items",
+ "columnsFrom": ["work_item_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "tracked_messages_automation_key_automations_key_fk": {
+ "name": "tracked_messages_automation_key_automations_key_fk",
+ "tableFrom": "tracked_messages",
+ "tableTo": "automations",
+ "columnsFrom": ["automation_key"],
+ "columnsTo": ["key"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "tracked_messages_created_by_user_id_users_id_fk": {
+ "name": "tracked_messages_created_by_user_id_users_id_fk",
+ "tableFrom": "tracked_messages",
+ "tableTo": "users",
+ "columnsFrom": ["created_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user_api_keys": {
+ "name": "user_api_keys",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "api_key": {
+ "name": "api_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "user_api_keys_user_id_idx": {
+ "name": "user_api_keys_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "user_api_keys_user_deployment_provider_unique": {
+ "name": "user_api_keys_user_deployment_provider_unique",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "user_api_keys_user_id_users_id_fk": {
+ "name": "user_api_keys_user_id_users_id_fk",
+ "tableFrom": "user_api_keys",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "text",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image_url": {
+ "name": "image_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "entity": {
+ "name": "entity",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "metadata": {
+ "name": "metadata",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{}'::jsonb"
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'member'"
+ },
+ "analytics_id": {
+ "name": "analytics_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "onboarding_completed_at": {
+ "name": "onboarding_completed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "invited_by_invite_id": {
+ "name": "invited_by_invite_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_sync_at": {
+ "name": "last_sync_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted_at": {
+ "name": "deleted_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "users_email_idx": {
+ "name": "users_email_idx",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "users_created_at_idx": {
+ "name": "users_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "users_analytics_id_unique_idx": {
+ "name": "users_analytics_id_unique_idx",
+ "columns": [
+ {
+ "expression": "analytics_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.webhooks": {
+ "name": "webhooks",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "delivery_id": {
+ "name": "delivery_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider": {
+ "name": "provider",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "event": {
+ "name": "event",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "payload": {
+ "name": "payload",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "succeeded_at": {
+ "name": "succeeded_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "failed_at": {
+ "name": "failed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "webhooks_provider_delivery_id_unique": {
+ "name": "webhooks_provider_delivery_id_unique",
+ "columns": [
+ {
+ "expression": "provider",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "delivery_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "webhooks_event_idx": {
+ "name": "webhooks_event_idx",
+ "columns": [
+ {
+ "expression": "event",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "webhooks_created_at_idx": {
+ "name": "webhooks_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {
+ "webhooks_status_exclusive": {
+ "name": "webhooks_status_exclusive",
+ "value": "(\n (succeeded_at IS NOT NULL)::int +\n (failed_at IS NOT NULL)::int\n ) <= 1"
+ }
+ },
+ "isRLSEnabled": false
+ },
+ "public.work_items": {
+ "name": "work_items",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "kind": {
+ "name": "kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "automation_key": {
+ "name": "automation_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source_task_id": {
+ "name": "source_task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "selected_by_user_id": {
+ "name": "selected_by_user_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "source_work_item_id": {
+ "name": "source_work_item_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "brief": {
+ "name": "brief",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "execution_prompt": {
+ "name": "execution_prompt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "investigation_context": {
+ "name": "investigation_context",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "category": {
+ "name": "category",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "priority": {
+ "name": "priority",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "action_kind": {
+ "name": "action_kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "disposition": {
+ "name": "disposition",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "sort_order": {
+ "name": "sort_order",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "repository_ids": {
+ "name": "repository_ids",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "target_repository_full_name": {
+ "name": "target_repository_full_name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "target_environment_id": {
+ "name": "target_environment_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "workspace_readiness": {
+ "name": "workspace_readiness",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "readiness_message": {
+ "name": "readiness_message",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "fingerprint": {
+ "name": "fingerprint",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'open'"
+ },
+ "launch_claimed_at": {
+ "name": "launch_claimed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "launched_task_id": {
+ "name": "launched_task_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "launched_at": {
+ "name": "launched_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "failed_at": {
+ "name": "failed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "launch_error": {
+ "name": "launch_error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "dismissed_at": {
+ "name": "dismissed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "work_items_source_task_idx": {
+ "name": "work_items_source_task_idx",
+ "columns": [
+ {
+ "expression": "source_task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "work_items_kind_status_idx": {
+ "name": "work_items_kind_status_idx",
+ "columns": [
+ {
+ "expression": "kind",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "work_items_automation_key_fingerprint_idx": {
+ "name": "work_items_automation_key_fingerprint_idx",
+ "columns": [
+ {
+ "expression": "automation_key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "fingerprint",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "work_items_fingerprint_idx": {
+ "name": "work_items_fingerprint_idx",
+ "columns": [
+ {
+ "expression": "fingerprint",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "work_items_launched_task_id_idx": {
+ "name": "work_items_launched_task_id_idx",
+ "columns": [
+ {
+ "expression": "launched_task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "work_items_source_task_kind_sort_order_unique": {
+ "name": "work_items_source_task_kind_sort_order_unique",
+ "columns": [
+ {
+ "expression": "source_task_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "kind",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "sort_order",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "work_items_automation_key_automations_key_fk": {
+ "name": "work_items_automation_key_automations_key_fk",
+ "tableFrom": "work_items",
+ "tableTo": "automations",
+ "columnsFrom": ["automation_key"],
+ "columnsTo": ["key"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "work_items_source_task_id_tasks_id_fk": {
+ "name": "work_items_source_task_id_tasks_id_fk",
+ "tableFrom": "work_items",
+ "tableTo": "tasks",
+ "columnsFrom": ["source_task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "work_items_selected_by_user_id_users_id_fk": {
+ "name": "work_items_selected_by_user_id_users_id_fk",
+ "tableFrom": "work_items",
+ "tableTo": "users",
+ "columnsFrom": ["selected_by_user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "work_items_source_work_item_id_work_items_id_fk": {
+ "name": "work_items_source_work_item_id_work_items_id_fk",
+ "tableFrom": "work_items",
+ "tableTo": "work_items",
+ "columnsFrom": ["source_work_item_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "work_items_target_environment_id_environments_id_fk": {
+ "name": "work_items_target_environment_id_environments_id_fk",
+ "tableFrom": "work_items",
+ "tableTo": "environments",
+ "columnsFrom": ["target_environment_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "work_items_launched_task_id_tasks_id_fk": {
+ "name": "work_items_launched_task_id_tasks_id_fk",
+ "tableFrom": "work_items",
+ "tableTo": "tasks",
+ "columnsFrom": ["launched_task_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
diff --git a/packages/db/drizzle/meta/_journal.json b/packages/db/drizzle/meta/_journal.json
index de5ea1fce..61c162a16 100644
--- a/packages/db/drizzle/meta/_journal.json
+++ b/packages/db/drizzle/meta/_journal.json
@@ -85,6 +85,13 @@
"when": 1784108492065,
"tag": "0011_generalized_llm_usage",
"breakpoints": true
+ },
+ {
+ "idx": 12,
+ "version": "7",
+ "when": 1784137074725,
+ "tag": "0012_broad_pretty_boy",
+ "breakpoints": true
}
]
}
diff --git a/packages/db/src/lib/automations.ts b/packages/db/src/lib/automations.ts
index 29aaa32e5..b4b62ae16 100644
--- a/packages/db/src/lib/automations.ts
+++ b/packages/db/src/lib/automations.ts
@@ -24,6 +24,7 @@ import {
DEFAULT_PR_REVIEW_SETTINGS,
DEFAULT_SLACK_ACK_EMOJI,
DEFAULT_SLACK_COMPLETION_EMOJI,
+ DEFAULT_SLACK_PR_CLOSED_EMOJI,
DEFAULT_SUGGESTER_ROUTING_MODE,
getTriggerableBackgroundAutomationDescriptorByKey,
isChannelAutoStartLaunchMode,
@@ -85,6 +86,7 @@ export const DEFAULT_CONFLICT_RESOLVER_LABEL = AUTO_RESOLVE_CONFLICTS_LABEL;
export {
DEFAULT_SLACK_ACK_EMOJI,
DEFAULT_SLACK_COMPLETION_EMOJI,
+ DEFAULT_SLACK_PR_CLOSED_EMOJI,
} from '@roomote/types';
export const MANAGER_CHANNEL_STARTER_AUTOMATION_SETTINGS = {
@@ -98,7 +100,10 @@ export const MANAGER_CHANNEL_STARTER_AUTOMATION_SETTINGS = {
export type SlackEmojiPreferences = Pick<
BackgroundAgentSettings,
- 'slackSummonEmoji' | 'slackAckEmoji' | 'slackCompletionEmoji'
+ | 'slackSummonEmoji'
+ | 'slackAckEmoji'
+ | 'slackCompletionEmoji'
+ | 'slackPrClosedEmoji'
>;
function isConflictResolverFrequency(
@@ -738,6 +743,9 @@ export function normalizeBackgroundAgentSettings(
slackCompletionEmoji:
normalizeOptionalSlackEmojiName(row?.slackCompletionEmoji) ??
DEFAULT_SLACK_COMPLETION_EMOJI,
+ slackPrClosedEmoji:
+ normalizeOptionalSlackEmojiName(row?.slackPrClosedEmoji) ??
+ DEFAULT_SLACK_PR_CLOSED_EMOJI,
createdAt: row?.createdAt ?? now,
updatedAt: row?.updatedAt ?? now,
@@ -889,5 +897,8 @@ export async function getSlackEmojiPreferencesForDeployment(): Promise;
diff --git a/packages/slack/src/__tests__/show-task-configuration.test.ts b/packages/slack/src/__tests__/show-task-configuration.test.ts
index f817f913c..5038fbf3e 100644
--- a/packages/slack/src/__tests__/show-task-configuration.test.ts
+++ b/packages/slack/src/__tests__/show-task-configuration.test.ts
@@ -266,6 +266,7 @@ describe('Slack deleted-mention suppression', () => {
getSlackEmojiPreferencesForDeploymentMock.mockResolvedValue({
slackAckEmoji: 'eyes',
slackCompletionEmoji: 'white_check_mark',
+ slackPrClosedEmoji: 'x',
slackSummonEmoji: null,
});
getTaskUrlMock.mockReturnValue('https://app.example.com/task/task_123');
diff --git a/packages/slack/src/emoji-preferences.ts b/packages/slack/src/emoji-preferences.ts
index 453a44ba2..8a74d7ad4 100644
--- a/packages/slack/src/emoji-preferences.ts
+++ b/packages/slack/src/emoji-preferences.ts
@@ -1,6 +1,7 @@
import {
DEFAULT_SLACK_ACK_EMOJI,
DEFAULT_SLACK_COMPLETION_EMOJI,
+ DEFAULT_SLACK_PR_CLOSED_EMOJI,
getSlackEmojiPreferencesForDeployment as getSlackEmojiPreferencesForDeploymentFromDb,
type SlackEmojiPreferences,
} from '@roomote/db/server';
@@ -8,6 +9,7 @@ import {
export {
DEFAULT_SLACK_ACK_EMOJI,
DEFAULT_SLACK_COMPLETION_EMOJI,
+ DEFAULT_SLACK_PR_CLOSED_EMOJI,
type SlackEmojiPreferences,
};
@@ -18,6 +20,7 @@ export async function getSlackEmojiPreferencesForDeployment() {
export async function resolveSlackReactionNames(): Promise<{
ackEmoji: string;
completionEmoji: string;
+ prClosedEmoji: string;
summonEmoji: string | null;
}> {
const preferences = await getSlackEmojiPreferencesForDeployment();
@@ -26,6 +29,8 @@ export async function resolveSlackReactionNames(): Promise<{
ackEmoji: preferences.slackAckEmoji || DEFAULT_SLACK_ACK_EMOJI,
completionEmoji:
preferences.slackCompletionEmoji || DEFAULT_SLACK_COMPLETION_EMOJI,
+ prClosedEmoji:
+ preferences.slackPrClosedEmoji || DEFAULT_SLACK_PR_CLOSED_EMOJI,
summonEmoji: preferences.slackSummonEmoji,
};
}
diff --git a/packages/types/src/slack.ts b/packages/types/src/slack.ts
index 644ebae90..aaa460b8a 100644
--- a/packages/types/src/slack.ts
+++ b/packages/types/src/slack.ts
@@ -22,6 +22,7 @@ export type SlackBlock =
export const DEFAULT_SLACK_ACK_EMOJI = 'eyes';
export const DEFAULT_SLACK_COMPLETION_EMOJI = 'white_check_mark';
+export const DEFAULT_SLACK_PR_CLOSED_EMOJI = 'x';
/** Origin-message reaction when a Slack task is cancelled via the Cancel button. */
export const DEFAULT_SLACK_CANCEL_EMOJI = 'x';