@ash-cloud/ash-ai 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +204 -106
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +167 -20
- package/dist/index.d.ts +167 -20
- package/dist/index.js +204 -106
- package/dist/index.js.map +1 -1
- package/dist/playground.js +1275 -1126
- package/dist/{schema-B7RbjHWi.d.cts → schema-DSLyNeoS.d.cts} +3 -3
- package/dist/{schema-B7RbjHWi.d.ts → schema-DSLyNeoS.d.ts} +3 -3
- package/dist/schema.cjs +3 -1
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +3 -1
- package/dist/schema.js.map +1 -1
- package/package.json +1 -1
|
@@ -21,7 +21,7 @@ declare const agentBackendEnum: drizzle_orm_pg_core.PgEnum<["claude", "gemini"]>
|
|
|
21
21
|
declare const queueItemStatusEnum: drizzle_orm_pg_core.PgEnum<["pending", "processing", "completed", "failed", "cancelled"]>;
|
|
22
22
|
declare const configDeploymentStatusEnum: drizzle_orm_pg_core.PgEnum<["pending", "success", "failed"]>;
|
|
23
23
|
declare const configDeploymentTriggerEnum: drizzle_orm_pg_core.PgEnum<["webhook", "manual", "initial", "rollback"]>;
|
|
24
|
-
declare const eventCategoryEnum: drizzle_orm_pg_core.PgEnum<["lifecycle", "content", "tool", "system", "error", "file", "input"]>;
|
|
24
|
+
declare const eventCategoryEnum: drizzle_orm_pg_core.PgEnum<["lifecycle", "content", "tool", "system", "error", "file", "input", "webhook"]>;
|
|
25
25
|
declare const sessions: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
26
26
|
name: "sessions";
|
|
27
27
|
schema: undefined;
|
|
@@ -1578,14 +1578,14 @@ declare const sessionEvents: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
|
1578
1578
|
tableName: "session_events";
|
|
1579
1579
|
dataType: "string";
|
|
1580
1580
|
columnType: "PgEnumColumn";
|
|
1581
|
-
data: "file" | "content" | "error" | "tool" | "system" | "input" | "lifecycle";
|
|
1581
|
+
data: "file" | "content" | "error" | "tool" | "system" | "input" | "lifecycle" | "webhook";
|
|
1582
1582
|
driverParam: string;
|
|
1583
1583
|
notNull: true;
|
|
1584
1584
|
hasDefault: false;
|
|
1585
1585
|
isPrimaryKey: false;
|
|
1586
1586
|
isAutoincrement: false;
|
|
1587
1587
|
hasRuntimeDefault: false;
|
|
1588
|
-
enumValues: ["lifecycle", "content", "tool", "system", "error", "file", "input"];
|
|
1588
|
+
enumValues: ["lifecycle", "content", "tool", "system", "error", "file", "input", "webhook"];
|
|
1589
1589
|
baseColumn: never;
|
|
1590
1590
|
identity: undefined;
|
|
1591
1591
|
generated: undefined;
|
|
@@ -21,7 +21,7 @@ declare const agentBackendEnum: drizzle_orm_pg_core.PgEnum<["claude", "gemini"]>
|
|
|
21
21
|
declare const queueItemStatusEnum: drizzle_orm_pg_core.PgEnum<["pending", "processing", "completed", "failed", "cancelled"]>;
|
|
22
22
|
declare const configDeploymentStatusEnum: drizzle_orm_pg_core.PgEnum<["pending", "success", "failed"]>;
|
|
23
23
|
declare const configDeploymentTriggerEnum: drizzle_orm_pg_core.PgEnum<["webhook", "manual", "initial", "rollback"]>;
|
|
24
|
-
declare const eventCategoryEnum: drizzle_orm_pg_core.PgEnum<["lifecycle", "content", "tool", "system", "error", "file", "input"]>;
|
|
24
|
+
declare const eventCategoryEnum: drizzle_orm_pg_core.PgEnum<["lifecycle", "content", "tool", "system", "error", "file", "input", "webhook"]>;
|
|
25
25
|
declare const sessions: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
26
26
|
name: "sessions";
|
|
27
27
|
schema: undefined;
|
|
@@ -1578,14 +1578,14 @@ declare const sessionEvents: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
|
1578
1578
|
tableName: "session_events";
|
|
1579
1579
|
dataType: "string";
|
|
1580
1580
|
columnType: "PgEnumColumn";
|
|
1581
|
-
data: "file" | "content" | "error" | "tool" | "system" | "input" | "lifecycle";
|
|
1581
|
+
data: "file" | "content" | "error" | "tool" | "system" | "input" | "lifecycle" | "webhook";
|
|
1582
1582
|
driverParam: string;
|
|
1583
1583
|
notNull: true;
|
|
1584
1584
|
hasDefault: false;
|
|
1585
1585
|
isPrimaryKey: false;
|
|
1586
1586
|
isAutoincrement: false;
|
|
1587
1587
|
hasRuntimeDefault: false;
|
|
1588
|
-
enumValues: ["lifecycle", "content", "tool", "system", "error", "file", "input"];
|
|
1588
|
+
enumValues: ["lifecycle", "content", "tool", "system", "error", "file", "input", "webhook"];
|
|
1589
1589
|
baseColumn: never;
|
|
1590
1590
|
identity: undefined;
|
|
1591
1591
|
generated: undefined;
|
package/dist/schema.cjs
CHANGED
|
@@ -56,8 +56,10 @@ var eventCategoryEnum = pgCore.pgEnum("event_category", [
|
|
|
56
56
|
// error events
|
|
57
57
|
"file",
|
|
58
58
|
// file_push, file_pull, file_sync (file sync operations)
|
|
59
|
-
"input"
|
|
59
|
+
"input",
|
|
60
60
|
// user_input (user prompts/messages)
|
|
61
|
+
"webhook"
|
|
62
|
+
// webhook_delivery, webhook_failure (outbound webhook events)
|
|
61
63
|
]);
|
|
62
64
|
var sessions = pgCore.pgTable(
|
|
63
65
|
"sessions",
|
package/dist/schema.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage-postgres/schema.ts"],"names":["pgEnum","pgTable","uuid","text","integer","jsonb","timestamp","index","boolean","relations"],"mappings":"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","file":"schema.cjs","sourcesContent":["/**\n * PostgreSQL Schema for Agent SDK Harness\n *\n * This schema is designed to be:\n * 1. Compatible with @conviction-labs/harness-core types\n * 2. Tenant-agnostic - no multi-tenancy concepts in core\n * 3. Usable standalone for self-hosted deployments\n *\n * Multi-tenancy (organizations, API keys, billing) should be implemented\n * in the cloud layer by:\n * - Creating separate tables that reference these via foreign keys\n * - Or extending these tables in cloud-specific migrations\n */\n\nimport {\n pgTable,\n text,\n timestamp,\n uuid,\n jsonb,\n integer,\n index,\n pgEnum,\n boolean,\n} from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// ============================================================================\n// Enums\n// ============================================================================\n\nexport const sessionStatusEnum = pgEnum('session_status', [\n 'active',\n 'completed',\n 'error',\n 'suspended',\n]);\n\nexport const messageRoleEnum = pgEnum('message_role', [\n 'user',\n 'assistant',\n 'tool',\n 'system',\n]);\n\nexport const agentStatusEnum = pgEnum('agent_status', [\n 'active',\n 'paused',\n 'deleted',\n]);\n\nexport const agentBackendEnum = pgEnum('agent_backend', [\n 'claude',\n 'gemini',\n]);\n\nexport const queueItemStatusEnum = pgEnum('queue_item_status', [\n 'pending',\n 'processing',\n 'completed',\n 'failed',\n 'cancelled',\n]);\n\n// Claude config deployment enums (for .claude directory sync from GitHub)\nexport const configDeploymentStatusEnum = pgEnum('config_deployment_status', [\n 'pending',\n 'success',\n 'failed',\n]);\n\nexport const configDeploymentTriggerEnum = pgEnum('config_deployment_trigger', [\n 'webhook',\n 'manual',\n 'initial',\n 'rollback',\n]);\n\n// Event category enum for session events timeline\nexport const eventCategoryEnum = pgEnum('event_category', [\n 'lifecycle', // session_start, session_end, turn_complete\n 'content', // text_stream (aggregated), thinking_stream\n 'tool', // tool_use, tool_result\n 'system', // mcp_status, sandbox_log\n 'error', // error events\n 'file', // file_push, file_pull, file_sync (file sync operations)\n 'input', // user_input (user prompts/messages)\n]);\n\n// ============================================================================\n// Sessions\n// ============================================================================\n\nexport const sessions = pgTable(\n 'sessions',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n agentName: text('agent_name').notNull(),\n status: sessionStatusEnum('status').default('active').notNull(),\n sdkSessionId: text('sdk_session_id'), // Claude Agent SDK session ID for resume\n parentSessionId: uuid('parent_session_id'),\n totalTokens: integer('total_tokens'),\n totalCost: integer('total_cost'), // In cents\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_sessions_tenant').on(table.tenantId),\n index('idx_sessions_agent').on(table.agentName),\n index('idx_sessions_sdk').on(table.sdkSessionId),\n index('idx_sessions_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Messages\n// ============================================================================\n\nexport const messages = pgTable(\n 'messages',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n role: messageRoleEnum('role').notNull(),\n content: jsonb('content').notNull().$type<unknown[]>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_messages_session').on(table.sessionId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Attachments\n// ============================================================================\n\nexport const attachments = pgTable(\n 'attachments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n messageId: uuid('message_id')\n .notNull()\n .references(() => messages.id, { onDelete: 'cascade' }),\n filename: text('filename').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n storagePath: text('storage_path').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [index('idx_attachments_message').on(table.messageId)]\n);\n\n// ============================================================================\n// Agents\n// ============================================================================\n\nexport const agents = pgTable(\n 'agents',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n name: text('name').notNull(),\n slug: text('slug').notNull(),\n description: text('description'),\n model: text('model').notNull().default('claude-sonnet-4-5'),\n backend: agentBackendEnum('backend').default('claude').notNull(),\n systemPrompt: text('system_prompt'),\n allowedTools: jsonb('allowed_tools').default([]).$type<string[]>(),\n disallowedTools: jsonb('disallowed_tools').default([]).$type<string[]>(),\n maxTurns: integer('max_turns'),\n permissionMode: text('permission_mode'),\n mcpServers: jsonb('mcp_servers').default({}).$type<Record<string, { command: string; args?: string[] }>>(),\n envVars: jsonb('env_vars').default({}).$type<Record<string, string>>(),\n startupScript: text('startup_script'),\n configFileUrl: text('config_file_url'), // .claude directory zip (skills, commands, agents, hooks, mcp)\n configFileUpdatedAt: timestamp('config_file_updated_at', { withTimezone: true }), // When config was last updated (for cache busting)\n config: jsonb('config').default({}).$type<Record<string, unknown>>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: agentStatusEnum('status').default('active').notNull(),\n // Webhook configuration for execution completion notifications (outbound)\n executionWebhookUrl: text('execution_webhook_url'),\n executionWebhookSecret: text('execution_webhook_secret'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n deletedAt: timestamp('deleted_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_agents_tenant').on(table.tenantId),\n index('idx_agents_slug').on(table.slug),\n index('idx_agents_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Queue Items\n// ============================================================================\n\nexport const queueItems = pgTable(\n 'queue_items',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n sessionId: uuid('session_id').references(() => sessions.id, {\n onDelete: 'cascade',\n }),\n agentName: text('agent_name').notNull(),\n prompt: text('prompt').notNull(),\n files: jsonb('files').$type<Array<{\n filename: string;\n content: string;\n mimeType: string;\n }>>(),\n sessionContext: text('session_context'),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: queueItemStatusEnum('status').default('pending').notNull(),\n priority: integer('priority').default(0).notNull(),\n retryCount: integer('retry_count').default(0).notNull(),\n maxRetries: integer('max_retries').default(3).notNull(),\n error: text('error'),\n resultMessageId: uuid('result_message_id'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }),\n completedAt: timestamp('completed_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_queue_items_tenant').on(table.tenantId),\n index('idx_queue_items_agent').on(table.agentName),\n index('idx_queue_items_session').on(table.sessionId),\n index('idx_queue_items_status').on(table.status),\n index('idx_queue_items_pending').on(table.agentName, table.sessionId, table.status, table.priority, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Config Deployments (history for GitHub-synced .claude directory)\n// ============================================================================\n\nexport const configDeployments = pgTable(\n 'config_deployments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n agentId: uuid('agent_id')\n .notNull()\n .references(() => agents.id, { onDelete: 'cascade' }),\n\n // Git commit info\n commitSha: text('commit_sha').notNull(),\n commitMessage: text('commit_message'),\n commitAuthor: text('commit_author'),\n commitTimestamp: timestamp('commit_timestamp', { withTimezone: true }),\n\n // Deployment status\n status: configDeploymentStatusEnum('status').default('pending').notNull(),\n errorMessage: text('error_message'),\n\n // Config file info (zipped .claude directory)\n configFileUrl: text('config_file_url'),\n configFileSize: integer('config_file_size'),\n\n // Content manifest - what's included in this deployment\n manifest: jsonb('manifest').default({}).$type<{\n hasSkills?: boolean;\n skillsCount?: number;\n hasCommands?: boolean;\n commandsCount?: number;\n hasAgents?: boolean;\n agentsCount?: number;\n hasHooks?: boolean;\n hasMcpConfig?: boolean;\n mcpServersCount?: number;\n }>(),\n\n // Trigger info\n triggeredBy: configDeploymentTriggerEnum('triggered_by').notNull(),\n rollbackFromId: uuid('rollback_from_id'), // If this was a rollback, which deployment it came from\n\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_config_deployments_agent').on(table.agentId),\n index('idx_config_deployments_status').on(table.status),\n index('idx_config_deployments_created').on(table.agentId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Session Events (Timeline)\n// ============================================================================\n\nexport const sessionEvents = pgTable(\n 'session_events',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n eventType: text('event_type').notNull(),\n category: eventCategoryEnum('category').notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }).notNull(),\n endedAt: timestamp('ended_at', { withTimezone: true }),\n durationMs: integer('duration_ms'),\n eventData: jsonb('event_data').default({}).$type<Record<string, unknown>>(),\n // Tool-specific fields\n toolUseId: text('tool_use_id'),\n toolName: text('tool_name'),\n // Aggregation fields (for text_stream events)\n isAggregated: boolean('is_aggregated').default(false),\n aggregatedCount: integer('aggregated_count'),\n // Ordering\n sequenceNumber: integer('sequence_number').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_session_events_session').on(table.sessionId, table.sequenceNumber),\n index('idx_session_events_category').on(table.sessionId, table.category),\n ]\n);\n\n// ============================================================================\n// Relations\n// ============================================================================\n\nexport const sessionsRelations = relations(sessions, ({ one, many }) => ({\n parentSession: one(sessions, {\n fields: [sessions.parentSessionId],\n references: [sessions.id],\n relationName: 'parentSession',\n }),\n childSessions: many(sessions, {\n relationName: 'parentSession',\n }),\n messages: many(messages),\n events: many(sessionEvents),\n}));\n\nexport const sessionEventsRelations = relations(sessionEvents, ({ one }) => ({\n session: one(sessions, {\n fields: [sessionEvents.sessionId],\n references: [sessions.id],\n }),\n}));\n\nexport const messagesRelations = relations(messages, ({ one, many }) => ({\n session: one(sessions, {\n fields: [messages.sessionId],\n references: [sessions.id],\n }),\n attachments: many(attachments),\n}));\n\nexport const attachmentsRelations = relations(attachments, ({ one }) => ({\n message: one(messages, {\n fields: [attachments.messageId],\n references: [messages.id],\n }),\n}));\n\nexport const configDeploymentsRelations = relations(configDeployments, ({ one }) => ({\n agent: one(agents, {\n fields: [configDeployments.agentId],\n references: [agents.id],\n }),\n}));\n\nexport const agentsRelations = relations(agents, ({ many }) => ({\n configDeployments: many(configDeployments),\n}));\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type SessionRow = typeof sessions.$inferSelect;\nexport type NewSessionRow = typeof sessions.$inferInsert;\n\nexport type MessageRow = typeof messages.$inferSelect;\nexport type NewMessageRow = typeof messages.$inferInsert;\n\nexport type AttachmentRow = typeof attachments.$inferSelect;\nexport type NewAttachmentRow = typeof attachments.$inferInsert;\n\nexport type AgentRow = typeof agents.$inferSelect;\nexport type NewAgentRow = typeof agents.$inferInsert;\n\nexport type QueueItemRow = typeof queueItems.$inferSelect;\nexport type NewQueueItemRow = typeof queueItems.$inferInsert;\n\nexport type ConfigDeploymentRow = typeof configDeployments.$inferSelect;\nexport type NewConfigDeploymentRow = typeof configDeployments.$inferInsert;\n\nexport type SessionEventRow = typeof sessionEvents.$inferSelect;\nexport type NewSessionEventRow = typeof sessionEvents.$inferInsert;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage-postgres/schema.ts"],"names":["pgEnum","pgTable","uuid","text","integer","jsonb","timestamp","index","boolean","relations"],"mappings":"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","file":"schema.cjs","sourcesContent":["/**\n * PostgreSQL Schema for Agent SDK Harness\n *\n * This schema is designed to be:\n * 1. Compatible with @conviction-labs/harness-core types\n * 2. Tenant-agnostic - no multi-tenancy concepts in core\n * 3. Usable standalone for self-hosted deployments\n *\n * Multi-tenancy (organizations, API keys, billing) should be implemented\n * in the cloud layer by:\n * - Creating separate tables that reference these via foreign keys\n * - Or extending these tables in cloud-specific migrations\n */\n\nimport {\n pgTable,\n text,\n timestamp,\n uuid,\n jsonb,\n integer,\n index,\n pgEnum,\n boolean,\n} from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// ============================================================================\n// Enums\n// ============================================================================\n\nexport const sessionStatusEnum = pgEnum('session_status', [\n 'active',\n 'completed',\n 'error',\n 'suspended',\n]);\n\nexport const messageRoleEnum = pgEnum('message_role', [\n 'user',\n 'assistant',\n 'tool',\n 'system',\n]);\n\nexport const agentStatusEnum = pgEnum('agent_status', [\n 'active',\n 'paused',\n 'deleted',\n]);\n\nexport const agentBackendEnum = pgEnum('agent_backend', [\n 'claude',\n 'gemini',\n]);\n\nexport const queueItemStatusEnum = pgEnum('queue_item_status', [\n 'pending',\n 'processing',\n 'completed',\n 'failed',\n 'cancelled',\n]);\n\n// Claude config deployment enums (for .claude directory sync from GitHub)\nexport const configDeploymentStatusEnum = pgEnum('config_deployment_status', [\n 'pending',\n 'success',\n 'failed',\n]);\n\nexport const configDeploymentTriggerEnum = pgEnum('config_deployment_trigger', [\n 'webhook',\n 'manual',\n 'initial',\n 'rollback',\n]);\n\n// Event category enum for session events timeline\nexport const eventCategoryEnum = pgEnum('event_category', [\n 'lifecycle', // session_start, session_end, turn_complete\n 'content', // text_stream (aggregated), thinking_stream\n 'tool', // tool_use, tool_result\n 'system', // mcp_status, sandbox_log\n 'error', // error events\n 'file', // file_push, file_pull, file_sync (file sync operations)\n 'input', // user_input (user prompts/messages)\n 'webhook', // webhook_delivery, webhook_failure (outbound webhook events)\n]);\n\n// ============================================================================\n// Sessions\n// ============================================================================\n\nexport const sessions = pgTable(\n 'sessions',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n agentName: text('agent_name').notNull(),\n status: sessionStatusEnum('status').default('active').notNull(),\n sdkSessionId: text('sdk_session_id'), // Claude Agent SDK session ID for resume\n parentSessionId: uuid('parent_session_id'),\n totalTokens: integer('total_tokens'),\n totalCost: integer('total_cost'), // In cents\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_sessions_tenant').on(table.tenantId),\n index('idx_sessions_agent').on(table.agentName),\n index('idx_sessions_sdk').on(table.sdkSessionId),\n index('idx_sessions_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Messages\n// ============================================================================\n\nexport const messages = pgTable(\n 'messages',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n role: messageRoleEnum('role').notNull(),\n content: jsonb('content').notNull().$type<unknown[]>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_messages_session').on(table.sessionId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Attachments\n// ============================================================================\n\nexport const attachments = pgTable(\n 'attachments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n messageId: uuid('message_id')\n .notNull()\n .references(() => messages.id, { onDelete: 'cascade' }),\n filename: text('filename').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n storagePath: text('storage_path').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [index('idx_attachments_message').on(table.messageId)]\n);\n\n// ============================================================================\n// Agents\n// ============================================================================\n\nexport const agents = pgTable(\n 'agents',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n name: text('name').notNull(),\n slug: text('slug').notNull(),\n description: text('description'),\n model: text('model').notNull().default('claude-sonnet-4-5'),\n backend: agentBackendEnum('backend').default('claude').notNull(),\n systemPrompt: text('system_prompt'),\n allowedTools: jsonb('allowed_tools').default([]).$type<string[]>(),\n disallowedTools: jsonb('disallowed_tools').default([]).$type<string[]>(),\n maxTurns: integer('max_turns'),\n permissionMode: text('permission_mode'),\n mcpServers: jsonb('mcp_servers').default({}).$type<Record<string, { command: string; args?: string[] }>>(),\n envVars: jsonb('env_vars').default({}).$type<Record<string, string>>(),\n startupScript: text('startup_script'),\n configFileUrl: text('config_file_url'), // .claude directory zip (skills, commands, agents, hooks, mcp)\n configFileUpdatedAt: timestamp('config_file_updated_at', { withTimezone: true }), // When config was last updated (for cache busting)\n config: jsonb('config').default({}).$type<Record<string, unknown>>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: agentStatusEnum('status').default('active').notNull(),\n // Webhook configuration for execution completion notifications (outbound)\n executionWebhookUrl: text('execution_webhook_url'),\n executionWebhookSecret: text('execution_webhook_secret'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n deletedAt: timestamp('deleted_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_agents_tenant').on(table.tenantId),\n index('idx_agents_slug').on(table.slug),\n index('idx_agents_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Queue Items\n// ============================================================================\n\nexport const queueItems = pgTable(\n 'queue_items',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n sessionId: uuid('session_id').references(() => sessions.id, {\n onDelete: 'cascade',\n }),\n agentName: text('agent_name').notNull(),\n prompt: text('prompt').notNull(),\n files: jsonb('files').$type<Array<{\n filename: string;\n content: string;\n mimeType: string;\n }>>(),\n sessionContext: text('session_context'),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: queueItemStatusEnum('status').default('pending').notNull(),\n priority: integer('priority').default(0).notNull(),\n retryCount: integer('retry_count').default(0).notNull(),\n maxRetries: integer('max_retries').default(3).notNull(),\n error: text('error'),\n resultMessageId: uuid('result_message_id'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }),\n completedAt: timestamp('completed_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_queue_items_tenant').on(table.tenantId),\n index('idx_queue_items_agent').on(table.agentName),\n index('idx_queue_items_session').on(table.sessionId),\n index('idx_queue_items_status').on(table.status),\n index('idx_queue_items_pending').on(table.agentName, table.sessionId, table.status, table.priority, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Config Deployments (history for GitHub-synced .claude directory)\n// ============================================================================\n\nexport const configDeployments = pgTable(\n 'config_deployments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n agentId: uuid('agent_id')\n .notNull()\n .references(() => agents.id, { onDelete: 'cascade' }),\n\n // Git commit info\n commitSha: text('commit_sha').notNull(),\n commitMessage: text('commit_message'),\n commitAuthor: text('commit_author'),\n commitTimestamp: timestamp('commit_timestamp', { withTimezone: true }),\n\n // Deployment status\n status: configDeploymentStatusEnum('status').default('pending').notNull(),\n errorMessage: text('error_message'),\n\n // Config file info (zipped .claude directory)\n configFileUrl: text('config_file_url'),\n configFileSize: integer('config_file_size'),\n\n // Content manifest - what's included in this deployment\n manifest: jsonb('manifest').default({}).$type<{\n hasSkills?: boolean;\n skillsCount?: number;\n hasCommands?: boolean;\n commandsCount?: number;\n hasAgents?: boolean;\n agentsCount?: number;\n hasHooks?: boolean;\n hasMcpConfig?: boolean;\n mcpServersCount?: number;\n }>(),\n\n // Trigger info\n triggeredBy: configDeploymentTriggerEnum('triggered_by').notNull(),\n rollbackFromId: uuid('rollback_from_id'), // If this was a rollback, which deployment it came from\n\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_config_deployments_agent').on(table.agentId),\n index('idx_config_deployments_status').on(table.status),\n index('idx_config_deployments_created').on(table.agentId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Session Events (Timeline)\n// ============================================================================\n\nexport const sessionEvents = pgTable(\n 'session_events',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n eventType: text('event_type').notNull(),\n category: eventCategoryEnum('category').notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }).notNull(),\n endedAt: timestamp('ended_at', { withTimezone: true }),\n durationMs: integer('duration_ms'),\n eventData: jsonb('event_data').default({}).$type<Record<string, unknown>>(),\n // Tool-specific fields\n toolUseId: text('tool_use_id'),\n toolName: text('tool_name'),\n // Aggregation fields (for text_stream events)\n isAggregated: boolean('is_aggregated').default(false),\n aggregatedCount: integer('aggregated_count'),\n // Ordering\n sequenceNumber: integer('sequence_number').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_session_events_session').on(table.sessionId, table.sequenceNumber),\n index('idx_session_events_category').on(table.sessionId, table.category),\n ]\n);\n\n// ============================================================================\n// Relations\n// ============================================================================\n\nexport const sessionsRelations = relations(sessions, ({ one, many }) => ({\n parentSession: one(sessions, {\n fields: [sessions.parentSessionId],\n references: [sessions.id],\n relationName: 'parentSession',\n }),\n childSessions: many(sessions, {\n relationName: 'parentSession',\n }),\n messages: many(messages),\n events: many(sessionEvents),\n}));\n\nexport const sessionEventsRelations = relations(sessionEvents, ({ one }) => ({\n session: one(sessions, {\n fields: [sessionEvents.sessionId],\n references: [sessions.id],\n }),\n}));\n\nexport const messagesRelations = relations(messages, ({ one, many }) => ({\n session: one(sessions, {\n fields: [messages.sessionId],\n references: [sessions.id],\n }),\n attachments: many(attachments),\n}));\n\nexport const attachmentsRelations = relations(attachments, ({ one }) => ({\n message: one(messages, {\n fields: [attachments.messageId],\n references: [messages.id],\n }),\n}));\n\nexport const configDeploymentsRelations = relations(configDeployments, ({ one }) => ({\n agent: one(agents, {\n fields: [configDeployments.agentId],\n references: [agents.id],\n }),\n}));\n\nexport const agentsRelations = relations(agents, ({ many }) => ({\n configDeployments: many(configDeployments),\n}));\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type SessionRow = typeof sessions.$inferSelect;\nexport type NewSessionRow = typeof sessions.$inferInsert;\n\nexport type MessageRow = typeof messages.$inferSelect;\nexport type NewMessageRow = typeof messages.$inferInsert;\n\nexport type AttachmentRow = typeof attachments.$inferSelect;\nexport type NewAttachmentRow = typeof attachments.$inferInsert;\n\nexport type AgentRow = typeof agents.$inferSelect;\nexport type NewAgentRow = typeof agents.$inferInsert;\n\nexport type QueueItemRow = typeof queueItems.$inferSelect;\nexport type NewQueueItemRow = typeof queueItems.$inferInsert;\n\nexport type ConfigDeploymentRow = typeof configDeployments.$inferSelect;\nexport type NewConfigDeploymentRow = typeof configDeployments.$inferInsert;\n\nexport type SessionEventRow = typeof sessionEvents.$inferSelect;\nexport type NewSessionEventRow = typeof sessionEvents.$inferInsert;\n"]}
|
package/dist/schema.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { C as AgentRow, A as AttachmentRow, E as ConfigDeploymentRow, M as MessageRow, D as NewAgentRow, b as NewAttachmentRow, F as NewConfigDeploymentRow, a as NewMessageRow, c as NewQueueItemRow, e as NewSessionEventRow, N as NewSessionRow, Q as QueueItemRow, d as SessionEventRow, S as SessionRow, h as agentBackendEnum, g as agentStatusEnum, p as agents, B as agentsRelations, o as attachments, y as attachmentsRelations, i as configDeploymentStatusEnum, j as configDeploymentTriggerEnum, t as configDeployments, z as configDeploymentsRelations, k as eventCategoryEnum, m as messageRoleEnum, n as messages, x as messagesRelations, q as queueItemStatusEnum, r as queueItems, u as sessionEvents, w as sessionEventsRelations, f as sessionStatusEnum, l as sessions, v as sessionsRelations } from './schema-
|
|
1
|
+
export { C as AgentRow, A as AttachmentRow, E as ConfigDeploymentRow, M as MessageRow, D as NewAgentRow, b as NewAttachmentRow, F as NewConfigDeploymentRow, a as NewMessageRow, c as NewQueueItemRow, e as NewSessionEventRow, N as NewSessionRow, Q as QueueItemRow, d as SessionEventRow, S as SessionRow, h as agentBackendEnum, g as agentStatusEnum, p as agents, B as agentsRelations, o as attachments, y as attachmentsRelations, i as configDeploymentStatusEnum, j as configDeploymentTriggerEnum, t as configDeployments, z as configDeploymentsRelations, k as eventCategoryEnum, m as messageRoleEnum, n as messages, x as messagesRelations, q as queueItemStatusEnum, r as queueItems, u as sessionEvents, w as sessionEventsRelations, f as sessionStatusEnum, l as sessions, v as sessionsRelations } from './schema-DSLyNeoS.cjs';
|
|
2
2
|
import 'drizzle-orm';
|
|
3
3
|
import 'drizzle-orm/pg-core';
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { C as AgentRow, A as AttachmentRow, E as ConfigDeploymentRow, M as MessageRow, D as NewAgentRow, b as NewAttachmentRow, F as NewConfigDeploymentRow, a as NewMessageRow, c as NewQueueItemRow, e as NewSessionEventRow, N as NewSessionRow, Q as QueueItemRow, d as SessionEventRow, S as SessionRow, h as agentBackendEnum, g as agentStatusEnum, p as agents, B as agentsRelations, o as attachments, y as attachmentsRelations, i as configDeploymentStatusEnum, j as configDeploymentTriggerEnum, t as configDeployments, z as configDeploymentsRelations, k as eventCategoryEnum, m as messageRoleEnum, n as messages, x as messagesRelations, q as queueItemStatusEnum, r as queueItems, u as sessionEvents, w as sessionEventsRelations, f as sessionStatusEnum, l as sessions, v as sessionsRelations } from './schema-
|
|
1
|
+
export { C as AgentRow, A as AttachmentRow, E as ConfigDeploymentRow, M as MessageRow, D as NewAgentRow, b as NewAttachmentRow, F as NewConfigDeploymentRow, a as NewMessageRow, c as NewQueueItemRow, e as NewSessionEventRow, N as NewSessionRow, Q as QueueItemRow, d as SessionEventRow, S as SessionRow, h as agentBackendEnum, g as agentStatusEnum, p as agents, B as agentsRelations, o as attachments, y as attachmentsRelations, i as configDeploymentStatusEnum, j as configDeploymentTriggerEnum, t as configDeployments, z as configDeploymentsRelations, k as eventCategoryEnum, m as messageRoleEnum, n as messages, x as messagesRelations, q as queueItemStatusEnum, r as queueItems, u as sessionEvents, w as sessionEventsRelations, f as sessionStatusEnum, l as sessions, v as sessionsRelations } from './schema-DSLyNeoS.js';
|
|
2
2
|
import 'drizzle-orm';
|
|
3
3
|
import 'drizzle-orm/pg-core';
|
package/dist/schema.js
CHANGED
|
@@ -54,8 +54,10 @@ var eventCategoryEnum = pgEnum("event_category", [
|
|
|
54
54
|
// error events
|
|
55
55
|
"file",
|
|
56
56
|
// file_push, file_pull, file_sync (file sync operations)
|
|
57
|
-
"input"
|
|
57
|
+
"input",
|
|
58
58
|
// user_input (user prompts/messages)
|
|
59
|
+
"webhook"
|
|
60
|
+
// webhook_delivery, webhook_failure (outbound webhook events)
|
|
59
61
|
]);
|
|
60
62
|
var sessions = pgTable(
|
|
61
63
|
"sessions",
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage-postgres/schema.ts"],"names":[],"mappings":";;;;AA+BO,IAAM,iBAAA,GAAoB,OAAO,gBAAA,EAAkB;AAAA,EACxD,QAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,eAAA,GAAkB,OAAO,cAAA,EAAgB;AAAA,EACpD,MAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,eAAA,GAAkB,OAAO,cAAA,EAAgB;AAAA,EACpD,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,gBAAA,GAAmB,OAAO,eAAA,EAAiB;AAAA,EACtD,QAAA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,mBAAA,GAAsB,OAAO,mBAAA,EAAqB;AAAA,EAC7D,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,0BAAA,GAA6B,OAAO,0BAAA,EAA4B;AAAA,EAC3E,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,2BAAA,GAA8B,OAAO,2BAAA,EAA6B;AAAA,EAC7E,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,iBAAA,GAAoB,OAAO,gBAAA,EAAkB;AAAA,EACxD,WAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,MAAA;AAAA;AAAA,EACA,QAAA;AAAA;AAAA,EACA,OAAA;AAAA;AAAA,EACA,MAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAMM,IAAM,QAAA,GAAW,OAAA;AAAA,EACtB,UAAA;AAAA,EACA;AAAA,IACE,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,aAAA,GAAgB,UAAA,EAAW;AAAA;AAAA,IAE1C,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA,IAC1B,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,QAAQ,iBAAA,CAAkB,QAAQ,EAAE,OAAA,CAAQ,QAAQ,EAAE,OAAA,EAAQ;AAAA,IAC9D,YAAA,EAAc,KAAK,gBAAgB,CAAA;AAAA;AAAA,IACnC,eAAA,EAAiB,KAAK,mBAAmB,CAAA;AAAA,IACzC,WAAA,EAAa,QAAQ,cAAc,CAAA;AAAA,IACnC,SAAA,EAAW,QAAQ,YAAY,CAAA;AAAA;AAAA,IAC/B,QAAA,EAAU,MAAM,UAAU,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA+B;AAAA,IACvE,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA,EAAQ;AAAA,IACX,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA;AAAQ,GACb;AAAA,EACA,CAAC,KAAA,KAAU;AAAA,IACT,KAAA,CAAM,qBAAqB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,IAC9C,KAAA,CAAM,oBAAoB,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IAC9C,KAAA,CAAM,kBAAkB,CAAA,CAAE,EAAA,CAAG,MAAM,YAAY,CAAA;AAAA,IAC/C,KAAA,CAAM,qBAAqB,CAAA,CAAE,EAAA,CAAG,MAAM,MAAM;AAAA;AAEhD;AAMO,IAAM,QAAA,GAAW,OAAA;AAAA,EACtB,UAAA;AAAA,EACA;AAAA,IACE,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,aAAA,GAAgB,UAAA,EAAW;AAAA,IAC1C,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CACzB,OAAA,EAAQ,CACR,UAAA,CAAW,MAAM,QAAA,CAAS,EAAA,EAAI,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,IACxD,IAAA,EAAM,eAAA,CAAgB,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,SAAS,KAAA,CAAM,SAAS,CAAA,CAAE,OAAA,GAAU,KAAA,EAAiB;AAAA,IACrD,QAAA,EAAU,MAAM,UAAU,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA+B;AAAA,IACvE,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA;AAAQ,GACb;AAAA,EACA,CAAC,KAAA,KAAU;AAAA,IACT,MAAM,sBAAsB,CAAA,CAAE,GAAG,KAAA,CAAM,SAAA,EAAW,MAAM,SAAS;AAAA;AAErE;AAMO,IAAM,WAAA,GAAc,OAAA;AAAA,EACzB,aAAA;AAAA,EACA;AAAA,IACE,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,aAAA,GAAgB,UAAA,EAAW;AAAA,IAC1C,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CACzB,OAAA,EAAQ,CACR,UAAA,CAAW,MAAM,QAAA,CAAS,EAAA,EAAI,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,IACxD,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA,IACnC,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA,CAAE,OAAA,EAAQ;AAAA,IACpC,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC9B,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC1C,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA;AAAQ,GACb;AAAA,EACA,CAAC,UAAU,CAAC,KAAA,CAAM,yBAAyB,CAAA,CAAE,EAAA,CAAG,KAAA,CAAM,SAAS,CAAC;AAClE;AAMO,IAAM,MAAA,GAAS,OAAA;AAAA,EACpB,QAAA;AAAA,EACA;AAAA,IACE,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,aAAA,GAAgB,UAAA,EAAW;AAAA;AAAA,IAE1C,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA,IAC1B,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC3B,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC3B,WAAA,EAAa,KAAK,aAAa,CAAA;AAAA,IAC/B,OAAO,IAAA,CAAK,OAAO,EAAE,OAAA,EAAQ,CAAE,QAAQ,mBAAmB,CAAA;AAAA,IAC1D,SAAS,gBAAA,CAAiB,SAAS,EAAE,OAAA,CAAQ,QAAQ,EAAE,OAAA,EAAQ;AAAA,IAC/D,YAAA,EAAc,KAAK,eAAe,CAAA;AAAA,IAClC,YAAA,EAAc,MAAM,eAAe,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAAgB;AAAA,IACjE,eAAA,EAAiB,MAAM,kBAAkB,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAAgB;AAAA,IACvE,QAAA,EAAU,QAAQ,WAAW,CAAA;AAAA,IAC7B,cAAA,EAAgB,KAAK,iBAAiB,CAAA;AAAA,IACtC,UAAA,EAAY,MAAM,aAAa,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA4D;AAAA,IACzG,OAAA,EAAS,MAAM,UAAU,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA8B;AAAA,IACrE,aAAA,EAAe,KAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAe,KAAK,iBAAiB,CAAA;AAAA;AAAA,IACrC,qBAAqB,SAAA,CAAU,wBAAA,EAA0B,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA;AAAA,IAC/E,MAAA,EAAQ,MAAM,QAAQ,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA+B;AAAA,IACnE,QAAA,EAAU,MAAM,UAAU,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA+B;AAAA,IACvE,QAAQ,eAAA,CAAgB,QAAQ,EAAE,OAAA,CAAQ,QAAQ,EAAE,OAAA,EAAQ;AAAA;AAAA,IAE5D,mBAAA,EAAqB,KAAK,uBAAuB,CAAA;AAAA,IACjD,sBAAA,EAAwB,KAAK,0BAA0B,CAAA;AAAA,IACvD,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA,EAAQ;AAAA,IACX,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA,EAAQ;AAAA,IACX,WAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM;AAAA,GAC3D;AAAA,EACA,CAAC,KAAA,KAAU;AAAA,IACT,KAAA,CAAM,mBAAmB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,IAC5C,KAAA,CAAM,iBAAiB,CAAA,CAAE,EAAA,CAAG,MAAM,IAAI,CAAA;AAAA,IACtC,KAAA,CAAM,mBAAmB,CAAA,CAAE,EAAA,CAAG,MAAM,MAAM;AAAA;AAE9C;AAMO,IAAM,UAAA,GAAa,OAAA;AAAA,EACxB,aAAA;AAAA,EACA;AAAA,IACE,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,aAAA,GAAgB,UAAA,EAAW;AAAA;AAAA,IAE1C,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA,IAC1B,WAAW,IAAA,CAAK,YAAY,EAAE,UAAA,CAAW,MAAM,SAAS,EAAA,EAAI;AAAA,MAC1D,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACD,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC/B,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA,CAAE,KAAA,EAIlB;AAAA,IACJ,cAAA,EAAgB,KAAK,iBAAiB,CAAA;AAAA,IACtC,QAAA,EAAU,MAAM,UAAU,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA+B;AAAA,IACvE,QAAQ,mBAAA,CAAoB,QAAQ,EAAE,OAAA,CAAQ,SAAS,EAAE,OAAA,EAAQ;AAAA,IACjE,UAAU,OAAA,CAAQ,UAAU,EAAE,OAAA,CAAQ,CAAC,EAAE,OAAA,EAAQ;AAAA,IACjD,YAAY,OAAA,CAAQ,aAAa,EAAE,OAAA,CAAQ,CAAC,EAAE,OAAA,EAAQ;AAAA,IACtD,YAAY,OAAA,CAAQ,aAAa,EAAE,OAAA,CAAQ,CAAC,EAAE,OAAA,EAAQ;AAAA,IACtD,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,IACnB,eAAA,EAAiB,KAAK,mBAAmB,CAAA;AAAA,IACzC,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA,EAAQ;AAAA,IACX,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA,EAAQ;AAAA,IACX,WAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,IACzD,aAAa,SAAA,CAAU,cAAA,EAAgB,EAAE,YAAA,EAAc,MAAM;AAAA,GAC/D;AAAA,EACA,CAAC,KAAA,KAAU;AAAA,IACT,KAAA,CAAM,wBAAwB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,IACjD,KAAA,CAAM,uBAAuB,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IACjD,KAAA,CAAM,yBAAyB,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IACnD,KAAA,CAAM,wBAAwB,CAAA,CAAE,EAAA,CAAG,MAAM,MAAM,CAAA;AAAA,IAC/C,KAAA,CAAM,yBAAyB,CAAA,CAAE,EAAA,CAAG,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,QAAA,EAAU,MAAM,SAAS;AAAA;AAEvH;AAMO,IAAM,iBAAA,GAAoB,OAAA;AAAA,EAC/B,oBAAA;AAAA,EACA;AAAA,IACE,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,aAAA,GAAgB,UAAA,EAAW;AAAA,IAC1C,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA,CACrB,OAAA,EAAQ,CACR,UAAA,CAAW,MAAM,MAAA,CAAO,EAAA,EAAI,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA;AAAA,IAGtD,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,aAAA,EAAe,KAAK,gBAAgB,CAAA;AAAA,IACpC,YAAA,EAAc,KAAK,eAAe,CAAA;AAAA,IAClC,iBAAiB,SAAA,CAAU,kBAAA,EAAoB,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA;AAAA,IAGrE,QAAQ,0BAAA,CAA2B,QAAQ,EAAE,OAAA,CAAQ,SAAS,EAAE,OAAA,EAAQ;AAAA,IACxE,YAAA,EAAc,KAAK,eAAe,CAAA;AAAA;AAAA,IAGlC,aAAA,EAAe,KAAK,iBAAiB,CAAA;AAAA,IACrC,cAAA,EAAgB,QAAQ,kBAAkB,CAAA;AAAA;AAAA,IAG1C,QAAA,EAAU,MAAM,UAAU,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAUrC;AAAA;AAAA,IAGH,WAAA,EAAa,2BAAA,CAA4B,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,IACjE,cAAA,EAAgB,KAAK,kBAAkB,CAAA;AAAA;AAAA,IAEvC,QAAA,EAAU,MAAM,UAAU,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA+B;AAAA,IACvE,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA;AAAQ,GACb;AAAA,EACA,CAAC,KAAA,KAAU;AAAA,IACT,KAAA,CAAM,8BAA8B,CAAA,CAAE,EAAA,CAAG,MAAM,OAAO,CAAA;AAAA,IACtD,KAAA,CAAM,+BAA+B,CAAA,CAAE,EAAA,CAAG,MAAM,MAAM,CAAA;AAAA,IACtD,MAAM,gCAAgC,CAAA,CAAE,GAAG,KAAA,CAAM,OAAA,EAAS,MAAM,SAAS;AAAA;AAE7E;AAMO,IAAM,aAAA,GAAgB,OAAA;AAAA,EAC3B,gBAAA;AAAA,EACA;AAAA,IACE,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,aAAA,GAAgB,UAAA,EAAW;AAAA,IAC1C,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CACzB,OAAA,EAAQ,CACR,UAAA,CAAW,MAAM,QAAA,CAAS,EAAA,EAAI,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,IACxD,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,QAAA,EAAU,iBAAA,CAAkB,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChD,SAAA,EAAW,UAAU,YAAA,EAAc,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,IACnE,SAAS,SAAA,CAAU,UAAA,EAAY,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,IACrD,UAAA,EAAY,QAAQ,aAAa,CAAA;AAAA,IACjC,SAAA,EAAW,MAAM,YAAY,CAAA,CAAE,QAAQ,EAAE,EAAE,KAAA,EAA+B;AAAA;AAAA,IAE1E,SAAA,EAAW,KAAK,aAAa,CAAA;AAAA,IAC7B,QAAA,EAAU,KAAK,WAAW,CAAA;AAAA;AAAA,IAE1B,YAAA,EAAc,OAAA,CAAQ,eAAe,CAAA,CAAE,QAAQ,KAAK,CAAA;AAAA,IACpD,eAAA,EAAiB,QAAQ,kBAAkB,CAAA;AAAA;AAAA,IAE3C,cAAA,EAAgB,OAAA,CAAQ,iBAAiB,CAAA,CAAE,OAAA,EAAQ;AAAA,IACnD,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CACtD,UAAA,EAAW,CACX,OAAA;AAAQ,GACb;AAAA,EACA,CAAC,KAAA,KAAU;AAAA,IACT,MAAM,4BAA4B,CAAA,CAAE,GAAG,KAAA,CAAM,SAAA,EAAW,MAAM,cAAc,CAAA;AAAA,IAC5E,MAAM,6BAA6B,CAAA,CAAE,GAAG,KAAA,CAAM,SAAA,EAAW,MAAM,QAAQ;AAAA;AAE3E;AAMO,IAAM,oBAAoB,SAAA,CAAU,QAAA,EAAU,CAAC,EAAE,GAAA,EAAK,MAAK,MAAO;AAAA,EACvE,aAAA,EAAe,IAAI,QAAA,EAAU;AAAA,IAC3B,MAAA,EAAQ,CAAC,QAAA,CAAS,eAAe,CAAA;AAAA,IACjC,UAAA,EAAY,CAAC,QAAA,CAAS,EAAE,CAAA;AAAA,IACxB,YAAA,EAAc;AAAA,GACf,CAAA;AAAA,EACD,aAAA,EAAe,KAAK,QAAA,EAAU;AAAA,IAC5B,YAAA,EAAc;AAAA,GACf,CAAA;AAAA,EACD,QAAA,EAAU,KAAK,QAAQ,CAAA;AAAA,EACvB,MAAA,EAAQ,KAAK,aAAa;AAC5B,CAAA,CAAE;AAEK,IAAM,yBAAyB,SAAA,CAAU,aAAA,EAAe,CAAC,EAAE,KAAI,MAAO;AAAA,EAC3E,OAAA,EAAS,IAAI,QAAA,EAAU;AAAA,IACrB,MAAA,EAAQ,CAAC,aAAA,CAAc,SAAS,CAAA;AAAA,IAChC,UAAA,EAAY,CAAC,QAAA,CAAS,EAAE;AAAA,GACzB;AACH,CAAA,CAAE;AAEK,IAAM,oBAAoB,SAAA,CAAU,QAAA,EAAU,CAAC,EAAE,GAAA,EAAK,MAAK,MAAO;AAAA,EACvE,OAAA,EAAS,IAAI,QAAA,EAAU;AAAA,IACrB,MAAA,EAAQ,CAAC,QAAA,CAAS,SAAS,CAAA;AAAA,IAC3B,UAAA,EAAY,CAAC,QAAA,CAAS,EAAE;AAAA,GACzB,CAAA;AAAA,EACD,WAAA,EAAa,KAAK,WAAW;AAC/B,CAAA,CAAE;AAEK,IAAM,uBAAuB,SAAA,CAAU,WAAA,EAAa,CAAC,EAAE,KAAI,MAAO;AAAA,EACvE,OAAA,EAAS,IAAI,QAAA,EAAU;AAAA,IACrB,MAAA,EAAQ,CAAC,WAAA,CAAY,SAAS,CAAA;AAAA,IAC9B,UAAA,EAAY,CAAC,QAAA,CAAS,EAAE;AAAA,GACzB;AACH,CAAA,CAAE;AAEK,IAAM,6BAA6B,SAAA,CAAU,iBAAA,EAAmB,CAAC,EAAE,KAAI,MAAO;AAAA,EACnF,KAAA,EAAO,IAAI,MAAA,EAAQ;AAAA,IACjB,MAAA,EAAQ,CAAC,iBAAA,CAAkB,OAAO,CAAA;AAAA,IAClC,UAAA,EAAY,CAAC,MAAA,CAAO,EAAE;AAAA,GACvB;AACH,CAAA,CAAE;AAEK,IAAM,kBAAkB,SAAA,CAAU,MAAA,EAAQ,CAAC,EAAE,MAAK,MAAO;AAAA,EAC9D,iBAAA,EAAmB,KAAK,iBAAiB;AAC3C,CAAA,CAAE","file":"schema.js","sourcesContent":["/**\n * PostgreSQL Schema for Agent SDK Harness\n *\n * This schema is designed to be:\n * 1. Compatible with @conviction-labs/harness-core types\n * 2. Tenant-agnostic - no multi-tenancy concepts in core\n * 3. Usable standalone for self-hosted deployments\n *\n * Multi-tenancy (organizations, API keys, billing) should be implemented\n * in the cloud layer by:\n * - Creating separate tables that reference these via foreign keys\n * - Or extending these tables in cloud-specific migrations\n */\n\nimport {\n pgTable,\n text,\n timestamp,\n uuid,\n jsonb,\n integer,\n index,\n pgEnum,\n boolean,\n} from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// ============================================================================\n// Enums\n// ============================================================================\n\nexport const sessionStatusEnum = pgEnum('session_status', [\n 'active',\n 'completed',\n 'error',\n 'suspended',\n]);\n\nexport const messageRoleEnum = pgEnum('message_role', [\n 'user',\n 'assistant',\n 'tool',\n 'system',\n]);\n\nexport const agentStatusEnum = pgEnum('agent_status', [\n 'active',\n 'paused',\n 'deleted',\n]);\n\nexport const agentBackendEnum = pgEnum('agent_backend', [\n 'claude',\n 'gemini',\n]);\n\nexport const queueItemStatusEnum = pgEnum('queue_item_status', [\n 'pending',\n 'processing',\n 'completed',\n 'failed',\n 'cancelled',\n]);\n\n// Claude config deployment enums (for .claude directory sync from GitHub)\nexport const configDeploymentStatusEnum = pgEnum('config_deployment_status', [\n 'pending',\n 'success',\n 'failed',\n]);\n\nexport const configDeploymentTriggerEnum = pgEnum('config_deployment_trigger', [\n 'webhook',\n 'manual',\n 'initial',\n 'rollback',\n]);\n\n// Event category enum for session events timeline\nexport const eventCategoryEnum = pgEnum('event_category', [\n 'lifecycle', // session_start, session_end, turn_complete\n 'content', // text_stream (aggregated), thinking_stream\n 'tool', // tool_use, tool_result\n 'system', // mcp_status, sandbox_log\n 'error', // error events\n 'file', // file_push, file_pull, file_sync (file sync operations)\n 'input', // user_input (user prompts/messages)\n]);\n\n// ============================================================================\n// Sessions\n// ============================================================================\n\nexport const sessions = pgTable(\n 'sessions',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n agentName: text('agent_name').notNull(),\n status: sessionStatusEnum('status').default('active').notNull(),\n sdkSessionId: text('sdk_session_id'), // Claude Agent SDK session ID for resume\n parentSessionId: uuid('parent_session_id'),\n totalTokens: integer('total_tokens'),\n totalCost: integer('total_cost'), // In cents\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_sessions_tenant').on(table.tenantId),\n index('idx_sessions_agent').on(table.agentName),\n index('idx_sessions_sdk').on(table.sdkSessionId),\n index('idx_sessions_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Messages\n// ============================================================================\n\nexport const messages = pgTable(\n 'messages',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n role: messageRoleEnum('role').notNull(),\n content: jsonb('content').notNull().$type<unknown[]>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_messages_session').on(table.sessionId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Attachments\n// ============================================================================\n\nexport const attachments = pgTable(\n 'attachments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n messageId: uuid('message_id')\n .notNull()\n .references(() => messages.id, { onDelete: 'cascade' }),\n filename: text('filename').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n storagePath: text('storage_path').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [index('idx_attachments_message').on(table.messageId)]\n);\n\n// ============================================================================\n// Agents\n// ============================================================================\n\nexport const agents = pgTable(\n 'agents',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n name: text('name').notNull(),\n slug: text('slug').notNull(),\n description: text('description'),\n model: text('model').notNull().default('claude-sonnet-4-5'),\n backend: agentBackendEnum('backend').default('claude').notNull(),\n systemPrompt: text('system_prompt'),\n allowedTools: jsonb('allowed_tools').default([]).$type<string[]>(),\n disallowedTools: jsonb('disallowed_tools').default([]).$type<string[]>(),\n maxTurns: integer('max_turns'),\n permissionMode: text('permission_mode'),\n mcpServers: jsonb('mcp_servers').default({}).$type<Record<string, { command: string; args?: string[] }>>(),\n envVars: jsonb('env_vars').default({}).$type<Record<string, string>>(),\n startupScript: text('startup_script'),\n configFileUrl: text('config_file_url'), // .claude directory zip (skills, commands, agents, hooks, mcp)\n configFileUpdatedAt: timestamp('config_file_updated_at', { withTimezone: true }), // When config was last updated (for cache busting)\n config: jsonb('config').default({}).$type<Record<string, unknown>>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: agentStatusEnum('status').default('active').notNull(),\n // Webhook configuration for execution completion notifications (outbound)\n executionWebhookUrl: text('execution_webhook_url'),\n executionWebhookSecret: text('execution_webhook_secret'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n deletedAt: timestamp('deleted_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_agents_tenant').on(table.tenantId),\n index('idx_agents_slug').on(table.slug),\n index('idx_agents_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Queue Items\n// ============================================================================\n\nexport const queueItems = pgTable(\n 'queue_items',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n sessionId: uuid('session_id').references(() => sessions.id, {\n onDelete: 'cascade',\n }),\n agentName: text('agent_name').notNull(),\n prompt: text('prompt').notNull(),\n files: jsonb('files').$type<Array<{\n filename: string;\n content: string;\n mimeType: string;\n }>>(),\n sessionContext: text('session_context'),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: queueItemStatusEnum('status').default('pending').notNull(),\n priority: integer('priority').default(0).notNull(),\n retryCount: integer('retry_count').default(0).notNull(),\n maxRetries: integer('max_retries').default(3).notNull(),\n error: text('error'),\n resultMessageId: uuid('result_message_id'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }),\n completedAt: timestamp('completed_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_queue_items_tenant').on(table.tenantId),\n index('idx_queue_items_agent').on(table.agentName),\n index('idx_queue_items_session').on(table.sessionId),\n index('idx_queue_items_status').on(table.status),\n index('idx_queue_items_pending').on(table.agentName, table.sessionId, table.status, table.priority, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Config Deployments (history for GitHub-synced .claude directory)\n// ============================================================================\n\nexport const configDeployments = pgTable(\n 'config_deployments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n agentId: uuid('agent_id')\n .notNull()\n .references(() => agents.id, { onDelete: 'cascade' }),\n\n // Git commit info\n commitSha: text('commit_sha').notNull(),\n commitMessage: text('commit_message'),\n commitAuthor: text('commit_author'),\n commitTimestamp: timestamp('commit_timestamp', { withTimezone: true }),\n\n // Deployment status\n status: configDeploymentStatusEnum('status').default('pending').notNull(),\n errorMessage: text('error_message'),\n\n // Config file info (zipped .claude directory)\n configFileUrl: text('config_file_url'),\n configFileSize: integer('config_file_size'),\n\n // Content manifest - what's included in this deployment\n manifest: jsonb('manifest').default({}).$type<{\n hasSkills?: boolean;\n skillsCount?: number;\n hasCommands?: boolean;\n commandsCount?: number;\n hasAgents?: boolean;\n agentsCount?: number;\n hasHooks?: boolean;\n hasMcpConfig?: boolean;\n mcpServersCount?: number;\n }>(),\n\n // Trigger info\n triggeredBy: configDeploymentTriggerEnum('triggered_by').notNull(),\n rollbackFromId: uuid('rollback_from_id'), // If this was a rollback, which deployment it came from\n\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_config_deployments_agent').on(table.agentId),\n index('idx_config_deployments_status').on(table.status),\n index('idx_config_deployments_created').on(table.agentId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Session Events (Timeline)\n// ============================================================================\n\nexport const sessionEvents = pgTable(\n 'session_events',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n eventType: text('event_type').notNull(),\n category: eventCategoryEnum('category').notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }).notNull(),\n endedAt: timestamp('ended_at', { withTimezone: true }),\n durationMs: integer('duration_ms'),\n eventData: jsonb('event_data').default({}).$type<Record<string, unknown>>(),\n // Tool-specific fields\n toolUseId: text('tool_use_id'),\n toolName: text('tool_name'),\n // Aggregation fields (for text_stream events)\n isAggregated: boolean('is_aggregated').default(false),\n aggregatedCount: integer('aggregated_count'),\n // Ordering\n sequenceNumber: integer('sequence_number').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_session_events_session').on(table.sessionId, table.sequenceNumber),\n index('idx_session_events_category').on(table.sessionId, table.category),\n ]\n);\n\n// ============================================================================\n// Relations\n// ============================================================================\n\nexport const sessionsRelations = relations(sessions, ({ one, many }) => ({\n parentSession: one(sessions, {\n fields: [sessions.parentSessionId],\n references: [sessions.id],\n relationName: 'parentSession',\n }),\n childSessions: many(sessions, {\n relationName: 'parentSession',\n }),\n messages: many(messages),\n events: many(sessionEvents),\n}));\n\nexport const sessionEventsRelations = relations(sessionEvents, ({ one }) => ({\n session: one(sessions, {\n fields: [sessionEvents.sessionId],\n references: [sessions.id],\n }),\n}));\n\nexport const messagesRelations = relations(messages, ({ one, many }) => ({\n session: one(sessions, {\n fields: [messages.sessionId],\n references: [sessions.id],\n }),\n attachments: many(attachments),\n}));\n\nexport const attachmentsRelations = relations(attachments, ({ one }) => ({\n message: one(messages, {\n fields: [attachments.messageId],\n references: [messages.id],\n }),\n}));\n\nexport const configDeploymentsRelations = relations(configDeployments, ({ one }) => ({\n agent: one(agents, {\n fields: [configDeployments.agentId],\n references: [agents.id],\n }),\n}));\n\nexport const agentsRelations = relations(agents, ({ many }) => ({\n configDeployments: many(configDeployments),\n}));\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type SessionRow = typeof sessions.$inferSelect;\nexport type NewSessionRow = typeof sessions.$inferInsert;\n\nexport type MessageRow = typeof messages.$inferSelect;\nexport type NewMessageRow = typeof messages.$inferInsert;\n\nexport type AttachmentRow = typeof attachments.$inferSelect;\nexport type NewAttachmentRow = typeof attachments.$inferInsert;\n\nexport type AgentRow = typeof agents.$inferSelect;\nexport type NewAgentRow = typeof agents.$inferInsert;\n\nexport type QueueItemRow = typeof queueItems.$inferSelect;\nexport type NewQueueItemRow = typeof queueItems.$inferInsert;\n\nexport type ConfigDeploymentRow = typeof configDeployments.$inferSelect;\nexport type NewConfigDeploymentRow = typeof configDeployments.$inferInsert;\n\nexport type SessionEventRow = typeof sessionEvents.$inferSelect;\nexport type NewSessionEventRow = typeof sessionEvents.$inferInsert;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage-postgres/schema.ts"],"names":[],"mappings":"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","file":"schema.js","sourcesContent":["/**\n * PostgreSQL Schema for Agent SDK Harness\n *\n * This schema is designed to be:\n * 1. Compatible with @conviction-labs/harness-core types\n * 2. Tenant-agnostic - no multi-tenancy concepts in core\n * 3. Usable standalone for self-hosted deployments\n *\n * Multi-tenancy (organizations, API keys, billing) should be implemented\n * in the cloud layer by:\n * - Creating separate tables that reference these via foreign keys\n * - Or extending these tables in cloud-specific migrations\n */\n\nimport {\n pgTable,\n text,\n timestamp,\n uuid,\n jsonb,\n integer,\n index,\n pgEnum,\n boolean,\n} from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// ============================================================================\n// Enums\n// ============================================================================\n\nexport const sessionStatusEnum = pgEnum('session_status', [\n 'active',\n 'completed',\n 'error',\n 'suspended',\n]);\n\nexport const messageRoleEnum = pgEnum('message_role', [\n 'user',\n 'assistant',\n 'tool',\n 'system',\n]);\n\nexport const agentStatusEnum = pgEnum('agent_status', [\n 'active',\n 'paused',\n 'deleted',\n]);\n\nexport const agentBackendEnum = pgEnum('agent_backend', [\n 'claude',\n 'gemini',\n]);\n\nexport const queueItemStatusEnum = pgEnum('queue_item_status', [\n 'pending',\n 'processing',\n 'completed',\n 'failed',\n 'cancelled',\n]);\n\n// Claude config deployment enums (for .claude directory sync from GitHub)\nexport const configDeploymentStatusEnum = pgEnum('config_deployment_status', [\n 'pending',\n 'success',\n 'failed',\n]);\n\nexport const configDeploymentTriggerEnum = pgEnum('config_deployment_trigger', [\n 'webhook',\n 'manual',\n 'initial',\n 'rollback',\n]);\n\n// Event category enum for session events timeline\nexport const eventCategoryEnum = pgEnum('event_category', [\n 'lifecycle', // session_start, session_end, turn_complete\n 'content', // text_stream (aggregated), thinking_stream\n 'tool', // tool_use, tool_result\n 'system', // mcp_status, sandbox_log\n 'error', // error events\n 'file', // file_push, file_pull, file_sync (file sync operations)\n 'input', // user_input (user prompts/messages)\n 'webhook', // webhook_delivery, webhook_failure (outbound webhook events)\n]);\n\n// ============================================================================\n// Sessions\n// ============================================================================\n\nexport const sessions = pgTable(\n 'sessions',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n agentName: text('agent_name').notNull(),\n status: sessionStatusEnum('status').default('active').notNull(),\n sdkSessionId: text('sdk_session_id'), // Claude Agent SDK session ID for resume\n parentSessionId: uuid('parent_session_id'),\n totalTokens: integer('total_tokens'),\n totalCost: integer('total_cost'), // In cents\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_sessions_tenant').on(table.tenantId),\n index('idx_sessions_agent').on(table.agentName),\n index('idx_sessions_sdk').on(table.sdkSessionId),\n index('idx_sessions_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Messages\n// ============================================================================\n\nexport const messages = pgTable(\n 'messages',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n role: messageRoleEnum('role').notNull(),\n content: jsonb('content').notNull().$type<unknown[]>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_messages_session').on(table.sessionId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Attachments\n// ============================================================================\n\nexport const attachments = pgTable(\n 'attachments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n messageId: uuid('message_id')\n .notNull()\n .references(() => messages.id, { onDelete: 'cascade' }),\n filename: text('filename').notNull(),\n mimeType: text('mime_type').notNull(),\n size: integer('size').notNull(),\n storagePath: text('storage_path').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [index('idx_attachments_message').on(table.messageId)]\n);\n\n// ============================================================================\n// Agents\n// ============================================================================\n\nexport const agents = pgTable(\n 'agents',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n name: text('name').notNull(),\n slug: text('slug').notNull(),\n description: text('description'),\n model: text('model').notNull().default('claude-sonnet-4-5'),\n backend: agentBackendEnum('backend').default('claude').notNull(),\n systemPrompt: text('system_prompt'),\n allowedTools: jsonb('allowed_tools').default([]).$type<string[]>(),\n disallowedTools: jsonb('disallowed_tools').default([]).$type<string[]>(),\n maxTurns: integer('max_turns'),\n permissionMode: text('permission_mode'),\n mcpServers: jsonb('mcp_servers').default({}).$type<Record<string, { command: string; args?: string[] }>>(),\n envVars: jsonb('env_vars').default({}).$type<Record<string, string>>(),\n startupScript: text('startup_script'),\n configFileUrl: text('config_file_url'), // .claude directory zip (skills, commands, agents, hooks, mcp)\n configFileUpdatedAt: timestamp('config_file_updated_at', { withTimezone: true }), // When config was last updated (for cache busting)\n config: jsonb('config').default({}).$type<Record<string, unknown>>(),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: agentStatusEnum('status').default('active').notNull(),\n // Webhook configuration for execution completion notifications (outbound)\n executionWebhookUrl: text('execution_webhook_url'),\n executionWebhookSecret: text('execution_webhook_secret'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n deletedAt: timestamp('deleted_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_agents_tenant').on(table.tenantId),\n index('idx_agents_slug').on(table.slug),\n index('idx_agents_status').on(table.status),\n ]\n);\n\n// ============================================================================\n// Queue Items\n// ============================================================================\n\nexport const queueItems = pgTable(\n 'queue_items',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n // Optional tenant isolation - null for single-tenant, set for multi-tenant\n tenantId: text('tenant_id'),\n sessionId: uuid('session_id').references(() => sessions.id, {\n onDelete: 'cascade',\n }),\n agentName: text('agent_name').notNull(),\n prompt: text('prompt').notNull(),\n files: jsonb('files').$type<Array<{\n filename: string;\n content: string;\n mimeType: string;\n }>>(),\n sessionContext: text('session_context'),\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n status: queueItemStatusEnum('status').default('pending').notNull(),\n priority: integer('priority').default(0).notNull(),\n retryCount: integer('retry_count').default(0).notNull(),\n maxRetries: integer('max_retries').default(3).notNull(),\n error: text('error'),\n resultMessageId: uuid('result_message_id'),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }),\n completedAt: timestamp('completed_at', { withTimezone: true }),\n },\n (table) => [\n index('idx_queue_items_tenant').on(table.tenantId),\n index('idx_queue_items_agent').on(table.agentName),\n index('idx_queue_items_session').on(table.sessionId),\n index('idx_queue_items_status').on(table.status),\n index('idx_queue_items_pending').on(table.agentName, table.sessionId, table.status, table.priority, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Config Deployments (history for GitHub-synced .claude directory)\n// ============================================================================\n\nexport const configDeployments = pgTable(\n 'config_deployments',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n agentId: uuid('agent_id')\n .notNull()\n .references(() => agents.id, { onDelete: 'cascade' }),\n\n // Git commit info\n commitSha: text('commit_sha').notNull(),\n commitMessage: text('commit_message'),\n commitAuthor: text('commit_author'),\n commitTimestamp: timestamp('commit_timestamp', { withTimezone: true }),\n\n // Deployment status\n status: configDeploymentStatusEnum('status').default('pending').notNull(),\n errorMessage: text('error_message'),\n\n // Config file info (zipped .claude directory)\n configFileUrl: text('config_file_url'),\n configFileSize: integer('config_file_size'),\n\n // Content manifest - what's included in this deployment\n manifest: jsonb('manifest').default({}).$type<{\n hasSkills?: boolean;\n skillsCount?: number;\n hasCommands?: boolean;\n commandsCount?: number;\n hasAgents?: boolean;\n agentsCount?: number;\n hasHooks?: boolean;\n hasMcpConfig?: boolean;\n mcpServersCount?: number;\n }>(),\n\n // Trigger info\n triggeredBy: configDeploymentTriggerEnum('triggered_by').notNull(),\n rollbackFromId: uuid('rollback_from_id'), // If this was a rollback, which deployment it came from\n\n metadata: jsonb('metadata').default({}).$type<Record<string, unknown>>(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_config_deployments_agent').on(table.agentId),\n index('idx_config_deployments_status').on(table.status),\n index('idx_config_deployments_created').on(table.agentId, table.createdAt),\n ]\n);\n\n// ============================================================================\n// Session Events (Timeline)\n// ============================================================================\n\nexport const sessionEvents = pgTable(\n 'session_events',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n sessionId: uuid('session_id')\n .notNull()\n .references(() => sessions.id, { onDelete: 'cascade' }),\n eventType: text('event_type').notNull(),\n category: eventCategoryEnum('category').notNull(),\n startedAt: timestamp('started_at', { withTimezone: true }).notNull(),\n endedAt: timestamp('ended_at', { withTimezone: true }),\n durationMs: integer('duration_ms'),\n eventData: jsonb('event_data').default({}).$type<Record<string, unknown>>(),\n // Tool-specific fields\n toolUseId: text('tool_use_id'),\n toolName: text('tool_name'),\n // Aggregation fields (for text_stream events)\n isAggregated: boolean('is_aggregated').default(false),\n aggregatedCount: integer('aggregated_count'),\n // Ordering\n sequenceNumber: integer('sequence_number').notNull(),\n createdAt: timestamp('created_at', { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index('idx_session_events_session').on(table.sessionId, table.sequenceNumber),\n index('idx_session_events_category').on(table.sessionId, table.category),\n ]\n);\n\n// ============================================================================\n// Relations\n// ============================================================================\n\nexport const sessionsRelations = relations(sessions, ({ one, many }) => ({\n parentSession: one(sessions, {\n fields: [sessions.parentSessionId],\n references: [sessions.id],\n relationName: 'parentSession',\n }),\n childSessions: many(sessions, {\n relationName: 'parentSession',\n }),\n messages: many(messages),\n events: many(sessionEvents),\n}));\n\nexport const sessionEventsRelations = relations(sessionEvents, ({ one }) => ({\n session: one(sessions, {\n fields: [sessionEvents.sessionId],\n references: [sessions.id],\n }),\n}));\n\nexport const messagesRelations = relations(messages, ({ one, many }) => ({\n session: one(sessions, {\n fields: [messages.sessionId],\n references: [sessions.id],\n }),\n attachments: many(attachments),\n}));\n\nexport const attachmentsRelations = relations(attachments, ({ one }) => ({\n message: one(messages, {\n fields: [attachments.messageId],\n references: [messages.id],\n }),\n}));\n\nexport const configDeploymentsRelations = relations(configDeployments, ({ one }) => ({\n agent: one(agents, {\n fields: [configDeployments.agentId],\n references: [agents.id],\n }),\n}));\n\nexport const agentsRelations = relations(agents, ({ many }) => ({\n configDeployments: many(configDeployments),\n}));\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type SessionRow = typeof sessions.$inferSelect;\nexport type NewSessionRow = typeof sessions.$inferInsert;\n\nexport type MessageRow = typeof messages.$inferSelect;\nexport type NewMessageRow = typeof messages.$inferInsert;\n\nexport type AttachmentRow = typeof attachments.$inferSelect;\nexport type NewAttachmentRow = typeof attachments.$inferInsert;\n\nexport type AgentRow = typeof agents.$inferSelect;\nexport type NewAgentRow = typeof agents.$inferInsert;\n\nexport type QueueItemRow = typeof queueItems.$inferSelect;\nexport type NewQueueItemRow = typeof queueItems.$inferInsert;\n\nexport type ConfigDeploymentRow = typeof configDeployments.$inferSelect;\nexport type NewConfigDeploymentRow = typeof configDeployments.$inferInsert;\n\nexport type SessionEventRow = typeof sessionEvents.$inferSelect;\nexport type NewSessionEventRow = typeof sessionEvents.$inferInsert;\n"]}
|