@refrainai/cli 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/ai-model-FM6GWCID.js +37 -0
  2. package/dist/ai-model-FM6GWCID.js.map +1 -0
  3. package/dist/chunk-2BVDAJZT.js +236 -0
  4. package/dist/chunk-2BVDAJZT.js.map +1 -0
  5. package/dist/chunk-2H7UOFLK.js +11 -0
  6. package/dist/chunk-2H7UOFLK.js.map +1 -0
  7. package/dist/chunk-7UCVPKD4.js +902 -0
  8. package/dist/chunk-7UCVPKD4.js.map +1 -0
  9. package/dist/chunk-AG3CFMYU.js +36 -0
  10. package/dist/chunk-AG3CFMYU.js.map +1 -0
  11. package/dist/chunk-CLYJHKPY.js +1131 -0
  12. package/dist/chunk-CLYJHKPY.js.map +1 -0
  13. package/dist/chunk-D5SI2PHK.js +74 -0
  14. package/dist/chunk-D5SI2PHK.js.map +1 -0
  15. package/dist/chunk-DJVUITRB.js +9084 -0
  16. package/dist/chunk-DJVUITRB.js.map +1 -0
  17. package/dist/chunk-H47NWH7N.js +4427 -0
  18. package/dist/chunk-H47NWH7N.js.map +1 -0
  19. package/dist/chunk-HQDXLWAY.js +109 -0
  20. package/dist/chunk-HQDXLWAY.js.map +1 -0
  21. package/dist/chunk-IGFCYKHC.js +1974 -0
  22. package/dist/chunk-IGFCYKHC.js.map +1 -0
  23. package/dist/chunk-RT664YIO.js +245 -0
  24. package/dist/chunk-RT664YIO.js.map +1 -0
  25. package/dist/chunk-RYIJPYM3.js +164 -0
  26. package/dist/chunk-RYIJPYM3.js.map +1 -0
  27. package/dist/chunk-TDSM3UXI.js +40 -0
  28. package/dist/chunk-TDSM3UXI.js.map +1 -0
  29. package/dist/chunk-UGPXCQY3.js +778 -0
  30. package/dist/chunk-UGPXCQY3.js.map +1 -0
  31. package/dist/chunk-VPK2MQAZ.js +589 -0
  32. package/dist/chunk-VPK2MQAZ.js.map +1 -0
  33. package/dist/chunk-WEYR56ZN.js +953 -0
  34. package/dist/chunk-WEYR56ZN.js.map +1 -0
  35. package/dist/chunk-XMFCXPYU.js +275 -0
  36. package/dist/chunk-XMFCXPYU.js.map +1 -0
  37. package/dist/chunk-Z33FCOTZ.js +251 -0
  38. package/dist/chunk-Z33FCOTZ.js.map +1 -0
  39. package/dist/cli.js +59 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/compose-MTSIJY5D.js +547 -0
  42. package/dist/compose-MTSIJY5D.js.map +1 -0
  43. package/dist/config-ZSUNCFXR.js +9 -0
  44. package/dist/config-ZSUNCFXR.js.map +1 -0
  45. package/dist/fix-runbook-ZSBOTLC2.js +294 -0
  46. package/dist/fix-runbook-ZSBOTLC2.js.map +1 -0
  47. package/dist/google-sheets-DRWIVEVC.js +482 -0
  48. package/dist/google-sheets-DRWIVEVC.js.map +1 -0
  49. package/dist/registry-LZLYTNDJ.js +17 -0
  50. package/dist/registry-LZLYTNDJ.js.map +1 -0
  51. package/dist/runbook-data-helpers-KRR2SH76.js +16 -0
  52. package/dist/runbook-data-helpers-KRR2SH76.js.map +1 -0
  53. package/dist/runbook-executor-K7T6RJWJ.js +1480 -0
  54. package/dist/runbook-executor-K7T6RJWJ.js.map +1 -0
  55. package/dist/runbook-generator-MPXJBQ5N.js +800 -0
  56. package/dist/runbook-generator-MPXJBQ5N.js.map +1 -0
  57. package/dist/runbook-schema-3T6TP3JJ.js +35 -0
  58. package/dist/runbook-schema-3T6TP3JJ.js.map +1 -0
  59. package/dist/runbook-store-G5GUOWRR.js +11 -0
  60. package/dist/runbook-store-G5GUOWRR.js.map +1 -0
  61. package/dist/schema-5G6UQSPT.js +91 -0
  62. package/dist/schema-5G6UQSPT.js.map +1 -0
  63. package/dist/server-AG3LXQBI.js +8778 -0
  64. package/dist/server-AG3LXQBI.js.map +1 -0
  65. package/dist/tenant-ai-config-QPFEJUVJ.js +14 -0
  66. package/dist/tenant-ai-config-QPFEJUVJ.js.map +1 -0
  67. package/dist/yaml-patcher-VGUS2JGH.js +15 -0
  68. package/dist/yaml-patcher-VGUS2JGH.js.map +1 -0
  69. package/package.json +37 -0
@@ -0,0 +1,1131 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ __export
4
+ } from "./chunk-2H7UOFLK.js";
5
+
6
+ // src/server/db/schema.ts
7
+ var schema_exports = {};
8
+ __export(schema_exports, {
9
+ account: () => account,
10
+ apiKeys: () => apiKeys,
11
+ dataMigrationHistory: () => dataMigrationHistory,
12
+ invitations: () => invitations,
13
+ jobAiMetrics: () => jobAiMetrics,
14
+ jobApprovalRequests: () => jobApprovalRequests,
15
+ jobArtifacts: () => jobArtifacts,
16
+ jobDebugSuggestions: () => jobDebugSuggestions,
17
+ jobDebugWarnings: () => jobDebugWarnings,
18
+ jobExecutionConfigs: () => jobExecutionConfigs,
19
+ jobGenerateConfigs: () => jobGenerateConfigs,
20
+ jobRecordedSteps: () => jobRecordedSteps,
21
+ jobResultDiagnostics: () => jobResultDiagnostics,
22
+ jobResults: () => jobResults,
23
+ jobReviewResults: () => jobReviewResults,
24
+ jobReviewedSteps: () => jobReviewedSteps,
25
+ jobVariables: () => jobVariables,
26
+ jobs: () => jobs,
27
+ runbookSecrets: () => runbookSecrets,
28
+ runbookSettings: () => runbookSettings,
29
+ runbookSteps: () => runbookSteps,
30
+ runbookVariables: () => runbookVariables,
31
+ runbookVersionReviews: () => runbookVersionReviews,
32
+ runbookVersions: () => runbookVersions,
33
+ runbooks: () => runbooks,
34
+ schedules: () => schedules,
35
+ session: () => session,
36
+ telemetryFailureEvents: () => telemetryFailureEvents,
37
+ telemetryFailurePatterns: () => telemetryFailurePatterns,
38
+ telemetryJobSummaries: () => telemetryJobSummaries,
39
+ telemetryResolutionOutcomes: () => telemetryResolutionOutcomes,
40
+ telemetrySuggestionOutcomes: () => telemetrySuggestionOutcomes,
41
+ tenantDevelopmentSettings: () => tenantDevelopmentSettings,
42
+ tenantExecutionConfigs: () => tenantExecutionConfigs,
43
+ tenantExecutionSettings: () => tenantExecutionSettings,
44
+ tenantMembers: () => tenantMembers,
45
+ tenantModelOverrides: () => tenantModelOverrides,
46
+ tenantModelProviders: () => tenantModelProviders,
47
+ tenantUsage: () => tenantUsage,
48
+ tenants: () => tenants,
49
+ user: () => user,
50
+ verification: () => verification
51
+ });
52
+ import { pgTable, text, timestamp, index, unique, uuid, boolean, foreignKey, uniqueIndex, integer, real, jsonb } from "drizzle-orm/pg-core";
53
+ var dataMigrationHistory = pgTable("data_migration_history", {
54
+ name: text().primaryKey().notNull(),
55
+ executedAt: timestamp("executed_at").defaultNow().notNull()
56
+ });
57
+ var verification = pgTable("verification", {
58
+ id: text().primaryKey().notNull(),
59
+ identifier: text().notNull(),
60
+ value: text().notNull(),
61
+ expiresAt: timestamp("expires_at").notNull(),
62
+ createdAt: timestamp("created_at").defaultNow().notNull(),
63
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
64
+ }, (table) => [
65
+ index("verification_identifier_idx").using("btree", table.identifier.asc().nullsLast().op("text_ops"))
66
+ ]);
67
+ var tenants = pgTable("tenants", {
68
+ id: uuid().defaultRandom().primaryKey().notNull(),
69
+ name: text().notNull(),
70
+ slug: text().notNull(),
71
+ createdAt: timestamp("created_at").defaultNow().notNull(),
72
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
73
+ tier: text("tier", { enum: ["community", "pro", "team", "business", "enterprise"] }).default("community").notNull(),
74
+ locale: text("locale", { enum: ["en", "ja"] }).default("en").notNull(),
75
+ onboardingCompletedAt: timestamp("onboarding_completed_at")
76
+ }, (table) => [
77
+ unique("tenants_slug_unique").on(table.slug)
78
+ ]);
79
+ var user = pgTable("user", {
80
+ id: text().primaryKey().notNull(),
81
+ name: text().notNull(),
82
+ email: text().notNull(),
83
+ emailVerified: boolean("email_verified").default(false).notNull(),
84
+ image: text(),
85
+ createdAt: timestamp("created_at").defaultNow().notNull(),
86
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
87
+ onboardingCompletedAt: timestamp("onboarding_completed_at")
88
+ }, (table) => [
89
+ unique("user_email_unique").on(table.email)
90
+ ]);
91
+ var account = pgTable("account", {
92
+ id: text().primaryKey().notNull(),
93
+ accountId: text("account_id").notNull(),
94
+ providerId: text("provider_id").notNull(),
95
+ userId: text("user_id").notNull(),
96
+ accessToken: text("access_token"),
97
+ refreshToken: text("refresh_token"),
98
+ idToken: text("id_token"),
99
+ accessTokenExpiresAt: timestamp("access_token_expires_at"),
100
+ refreshTokenExpiresAt: timestamp("refresh_token_expires_at"),
101
+ scope: text(),
102
+ password: text(),
103
+ createdAt: timestamp("created_at").defaultNow().notNull(),
104
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
105
+ }, (table) => [
106
+ index("account_userId_idx").using("btree", table.userId.asc().nullsLast().op("text_ops")),
107
+ foreignKey({
108
+ columns: [table.userId],
109
+ foreignColumns: [user.id],
110
+ name: "account_user_id_user_id_fk"
111
+ }).onDelete("cascade")
112
+ ]);
113
+ var apiKeys = pgTable("api_keys", {
114
+ id: uuid().defaultRandom().primaryKey().notNull(),
115
+ tenantId: uuid("tenant_id").notNull(),
116
+ createdBy: text("created_by").notNull(),
117
+ name: text().notNull(),
118
+ keyHash: text("key_hash").notNull(),
119
+ keyPrefix: text("key_prefix").notNull(),
120
+ createdAt: timestamp("created_at").defaultNow().notNull(),
121
+ revokedAt: timestamp("revoked_at"),
122
+ lastUsedAt: timestamp("last_used_at")
123
+ }, (table) => [
124
+ uniqueIndex("api_keys_keyHash_idx").using("btree", table.keyHash.asc().nullsLast().op("text_ops")),
125
+ index("api_keys_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
126
+ foreignKey({
127
+ columns: [table.createdBy],
128
+ foreignColumns: [user.id],
129
+ name: "api_keys_created_by_user_id_fk"
130
+ }).onDelete("cascade"),
131
+ foreignKey({
132
+ columns: [table.tenantId],
133
+ foreignColumns: [tenants.id],
134
+ name: "api_keys_tenant_id_tenants_id_fk"
135
+ }).onDelete("cascade")
136
+ ]);
137
+ var invitations = pgTable("invitations", {
138
+ id: uuid().defaultRandom().primaryKey().notNull(),
139
+ tenantId: uuid("tenant_id").notNull(),
140
+ email: text().notNull(),
141
+ role: text("role", { enum: ["owner", "admin", "developer", "member"] }).default("member").notNull(),
142
+ token: text().notNull(),
143
+ invitedBy: text("invited_by").notNull(),
144
+ status: text("status", { enum: ["pending", "accepted", "declined", "cancelled"] }).default("pending").notNull(),
145
+ expiresAt: timestamp("expires_at").notNull(),
146
+ createdAt: timestamp("created_at").defaultNow().notNull(),
147
+ acceptedAt: timestamp("accepted_at")
148
+ }, (table) => [
149
+ index("invitations_email_idx").using("btree", table.email.asc().nullsLast().op("text_ops")),
150
+ index("invitations_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
151
+ foreignKey({
152
+ columns: [table.invitedBy],
153
+ foreignColumns: [user.id],
154
+ name: "invitations_invited_by_user_id_fk"
155
+ }).onDelete("cascade"),
156
+ foreignKey({
157
+ columns: [table.tenantId],
158
+ foreignColumns: [tenants.id],
159
+ name: "invitations_tenant_id_tenants_id_fk"
160
+ }).onDelete("cascade"),
161
+ unique("invitations_token_unique").on(table.token)
162
+ ]);
163
+ var runbooks = pgTable("runbooks", {
164
+ id: uuid().defaultRandom().primaryKey().notNull(),
165
+ tenantId: uuid("tenant_id").notNull(),
166
+ title: text().notNull(),
167
+ createdAt: timestamp("created_at").defaultNow().notNull(),
168
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
169
+ createdBy: text("created_by"),
170
+ activeVersionId: uuid("active_version_id"),
171
+ disabled: boolean().default(false).notNull()
172
+ }, (table) => [
173
+ index("runbooks_createdAt_idx").using("btree", table.createdAt.asc().nullsLast().op("timestamp_ops")),
174
+ index("runbooks_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
175
+ foreignKey({
176
+ columns: [table.createdBy],
177
+ foreignColumns: [user.id],
178
+ name: "runbooks_created_by_user_id_fk"
179
+ }).onDelete("set null"),
180
+ foreignKey({
181
+ columns: [table.tenantId],
182
+ foreignColumns: [tenants.id],
183
+ name: "runbooks_tenant_id_tenants_id_fk"
184
+ }).onDelete("cascade")
185
+ ]);
186
+ var runbookVersions = pgTable("runbook_versions", {
187
+ id: uuid().defaultRandom().primaryKey().notNull(),
188
+ runbookId: uuid("runbook_id").notNull(),
189
+ versionNumber: integer("version_number").notNull(),
190
+ status: text("status", { enum: ["draft", "pending_verification", "pending_approval", "active", "archived"] }).default("draft").notNull(),
191
+ goal: text().notNull(),
192
+ startUrl: text("start_url"),
193
+ context: text(),
194
+ generatedAt: text("generated_at"),
195
+ verificationJobId: uuid("verification_job_id"),
196
+ createdBy: text("created_by"),
197
+ createdAt: timestamp("created_at").defaultNow().notNull(),
198
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
199
+ publishedAt: timestamp("published_at"),
200
+ publishedBy: text("published_by"),
201
+ changeDescription: text("change_description")
202
+ }, (table) => [
203
+ index("runbook_versions_runbookId_idx").using("btree", table.runbookId.asc().nullsLast().op("uuid_ops")),
204
+ uniqueIndex("runbook_versions_runbookId_versionNumber_idx").using("btree", table.runbookId.asc().nullsLast().op("uuid_ops"), table.versionNumber.asc().nullsLast().op("int4_ops")),
205
+ index("runbook_versions_status_idx").using("btree", table.status.asc().nullsLast().op("text_ops")),
206
+ foreignKey({
207
+ columns: [table.createdBy],
208
+ foreignColumns: [user.id],
209
+ name: "runbook_versions_created_by_user_id_fk"
210
+ }).onDelete("set null"),
211
+ foreignKey({
212
+ columns: [table.publishedBy],
213
+ foreignColumns: [user.id],
214
+ name: "runbook_versions_published_by_user_id_fk"
215
+ }).onDelete("set null"),
216
+ foreignKey({
217
+ columns: [table.runbookId],
218
+ foreignColumns: [runbooks.id],
219
+ name: "runbook_versions_runbook_id_runbooks_id_fk"
220
+ }).onDelete("cascade")
221
+ ]);
222
+ var schedules = pgTable("schedules", {
223
+ id: uuid().defaultRandom().primaryKey().notNull(),
224
+ tenantId: uuid("tenant_id").notNull(),
225
+ runbookId: uuid("runbook_id").notNull(),
226
+ cron: text(),
227
+ enabled: boolean().default(true),
228
+ lastRunAt: timestamp("last_run_at"),
229
+ nextRunAt: timestamp("next_run_at"),
230
+ createdAt: timestamp("created_at").defaultNow().notNull(),
231
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
232
+ createdBy: text("created_by"),
233
+ type: text("type", { enum: ["recurring", "once"] }).default("recurring").notNull(),
234
+ timezone: text().default("UTC").notNull(),
235
+ scheduledAt: timestamp("scheduled_at"),
236
+ purpose: text("purpose", { enum: ["execute", "self_heal"] }).default("execute").notNull()
237
+ }, (table) => [
238
+ index("schedules_nextRunAt_idx").using("btree", table.nextRunAt.asc().nullsLast().op("timestamp_ops")),
239
+ index("schedules_runbookId_idx").using("btree", table.runbookId.asc().nullsLast().op("uuid_ops")),
240
+ index("schedules_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
241
+ foreignKey({
242
+ columns: [table.createdBy],
243
+ foreignColumns: [user.id],
244
+ name: "schedules_created_by_user_id_fk"
245
+ }),
246
+ foreignKey({
247
+ columns: [table.runbookId],
248
+ foreignColumns: [runbooks.id],
249
+ name: "schedules_runbook_id_runbooks_id_fk"
250
+ }).onDelete("cascade"),
251
+ foreignKey({
252
+ columns: [table.tenantId],
253
+ foreignColumns: [tenants.id],
254
+ name: "schedules_tenant_id_tenants_id_fk"
255
+ }).onDelete("cascade")
256
+ ]);
257
+ var jobs = pgTable("jobs", {
258
+ id: uuid().defaultRandom().primaryKey().notNull(),
259
+ tenantId: uuid("tenant_id").notNull(),
260
+ runbookId: uuid("runbook_id"),
261
+ status: text("status", { enum: ["scheduled", "queued", "running", "waiting_approval", "paused", "completed", "failed", "cancelled", "exploring", "reviewing"] }).default("queued").notNull(),
262
+ currentStep: integer("current_step").default(0),
263
+ totalSteps: integer("total_steps").default(0).notNull(),
264
+ errorMessage: text("error_message"),
265
+ startedAt: timestamp("started_at"),
266
+ completedAt: timestamp("completed_at"),
267
+ createdAt: timestamp("created_at").defaultNow().notNull(),
268
+ createdBy: text("created_by"),
269
+ purpose: text("purpose", { enum: ["verification", "scheduled", "manual", "api", "generation"] }).default("manual").notNull(),
270
+ mode: text("mode", { enum: ["execute", "self_heal", "generate"] }).default("execute").notNull(),
271
+ startUrl: text("start_url"),
272
+ goal: text(),
273
+ context: text(),
274
+ adoptedRunbookId: uuid("adopted_runbook_id"),
275
+ scheduledAt: timestamp("scheduled_at"),
276
+ scheduleId: uuid("schedule_id"),
277
+ runbookVersionId: uuid("runbook_version_id")
278
+ }, (table) => [
279
+ index("jobs_createdAt_idx").using("btree", table.createdAt.asc().nullsLast().op("timestamp_ops")),
280
+ index("jobs_mode_idx").using("btree", table.mode.asc().nullsLast().op("text_ops")),
281
+ index("jobs_runbookId_idx").using("btree", table.runbookId.asc().nullsLast().op("uuid_ops")),
282
+ index("jobs_scheduleId_idx").using("btree", table.scheduleId.asc().nullsLast().op("uuid_ops")),
283
+ index("jobs_status_idx").using("btree", table.status.asc().nullsLast().op("text_ops")),
284
+ index("jobs_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
285
+ foreignKey({
286
+ columns: [table.adoptedRunbookId],
287
+ foreignColumns: [runbooks.id],
288
+ name: "jobs_adopted_runbook_id_runbooks_id_fk"
289
+ }),
290
+ foreignKey({
291
+ columns: [table.createdBy],
292
+ foreignColumns: [user.id],
293
+ name: "jobs_created_by_user_id_fk"
294
+ }).onDelete("set null"),
295
+ foreignKey({
296
+ columns: [table.runbookId],
297
+ foreignColumns: [runbooks.id],
298
+ name: "jobs_runbook_id_runbooks_id_fk"
299
+ }).onDelete("cascade"),
300
+ foreignKey({
301
+ columns: [table.runbookVersionId],
302
+ foreignColumns: [runbookVersions.id],
303
+ name: "jobs_runbook_version_id_runbook_versions_id_fk"
304
+ }).onDelete("set null"),
305
+ foreignKey({
306
+ columns: [table.scheduleId],
307
+ foreignColumns: [schedules.id],
308
+ name: "jobs_schedule_id_schedules_id_fk"
309
+ }).onDelete("set null"),
310
+ foreignKey({
311
+ columns: [table.tenantId],
312
+ foreignColumns: [tenants.id],
313
+ name: "jobs_tenant_id_tenants_id_fk"
314
+ }).onDelete("cascade")
315
+ ]);
316
+ var jobAiMetrics = pgTable("job_ai_metrics", {
317
+ id: uuid().defaultRandom().primaryKey().notNull(),
318
+ jobId: uuid("job_id").notNull(),
319
+ totalCalls: integer("total_calls").default(0).notNull(),
320
+ totalInputTokens: integer("total_input_tokens").default(0).notNull(),
321
+ totalOutputTokens: integer("total_output_tokens").default(0).notNull(),
322
+ totalCachedInputTokens: integer("total_cached_input_tokens").default(0).notNull(),
323
+ totalCacheCreationTokens: integer("total_cache_creation_tokens").default(0).notNull(),
324
+ cacheHitRate: real("cache_hit_rate").default(0).notNull(),
325
+ estimatedCostUsd: real("estimated_cost_usd").default(0).notNull(),
326
+ totalDurationMs: integer("total_duration_ms").default(0).notNull()
327
+ }, (table) => [
328
+ foreignKey({
329
+ columns: [table.jobId],
330
+ foreignColumns: [jobs.id],
331
+ name: "job_ai_metrics_job_id_jobs_id_fk"
332
+ }).onDelete("cascade"),
333
+ unique("job_ai_metrics_job_id_unique").on(table.jobId)
334
+ ]);
335
+ var jobApprovalRequests = pgTable("job_approval_requests", {
336
+ id: uuid().defaultRandom().primaryKey().notNull(),
337
+ jobId: uuid("job_id").notNull(),
338
+ stepOrdinal: integer("step_ordinal").notNull(),
339
+ stepDescription: text("step_description"),
340
+ riskLevel: text("risk_level", { enum: ["low", "medium", "high"] }),
341
+ status: text("status", { enum: ["pending", "approved", "skipped", "aborted", "timeout"] }).default("pending").notNull(),
342
+ respondedBy: text("responded_by"),
343
+ respondedAt: timestamp("responded_at"),
344
+ createdAt: timestamp("created_at").defaultNow().notNull()
345
+ }, (table) => [
346
+ index("job_approval_requests_jobId_idx").using("btree", table.jobId.asc().nullsLast().op("uuid_ops")),
347
+ uniqueIndex("job_approval_requests_jobId_step_idx").using("btree", table.jobId.asc().nullsLast().op("int4_ops"), table.stepOrdinal.asc().nullsLast().op("int4_ops")),
348
+ foreignKey({
349
+ columns: [table.jobId],
350
+ foreignColumns: [jobs.id],
351
+ name: "job_approval_requests_job_id_jobs_id_fk"
352
+ }).onDelete("cascade"),
353
+ foreignKey({
354
+ columns: [table.respondedBy],
355
+ foreignColumns: [user.id],
356
+ name: "job_approval_requests_responded_by_user_id_fk"
357
+ })
358
+ ]);
359
+ var jobArtifacts = pgTable("job_artifacts", {
360
+ id: uuid().defaultRandom().primaryKey().notNull(),
361
+ jobId: uuid("job_id").notNull(),
362
+ tenantId: uuid("tenant_id").notNull(),
363
+ type: text("type", { enum: ["screenshot", "video", "download", "export"] }).notNull(),
364
+ filename: text().notNull(),
365
+ storagePath: text("storage_path").notNull(),
366
+ contentType: text("content_type").notNull(),
367
+ sizeBytes: integer("size_bytes").notNull(),
368
+ stepOrdinal: integer("step_ordinal"),
369
+ createdAt: timestamp("created_at").defaultNow().notNull()
370
+ }, (table) => [
371
+ index("job_artifacts_job_id_idx").using("btree", table.jobId.asc().nullsLast().op("uuid_ops")),
372
+ index("job_artifacts_tenant_type_idx").using("btree", table.tenantId.asc().nullsLast().op("text_ops"), table.type.asc().nullsLast().op("text_ops")),
373
+ foreignKey({
374
+ columns: [table.jobId],
375
+ foreignColumns: [jobs.id],
376
+ name: "job_artifacts_job_id_jobs_id_fk"
377
+ }).onDelete("cascade"),
378
+ foreignKey({
379
+ columns: [table.tenantId],
380
+ foreignColumns: [tenants.id],
381
+ name: "job_artifacts_tenant_id_tenants_id_fk"
382
+ }).onDelete("cascade")
383
+ ]);
384
+ var jobDebugSuggestions = pgTable("job_debug_suggestions", {
385
+ id: uuid().defaultRandom().primaryKey().notNull(),
386
+ jobId: uuid("job_id").notNull(),
387
+ stepOrdinal: integer("step_ordinal"),
388
+ stepDescription: text("step_description"),
389
+ error: text(),
390
+ runbookFix: text("runbook_fix"),
391
+ contextFix: text("context_fix"),
392
+ severity: text(),
393
+ failureCategory: text("failure_category"),
394
+ suggestedStrategy: text("suggested_strategy")
395
+ }, (table) => [
396
+ index("job_debug_suggestions_jobId_idx").using("btree", table.jobId.asc().nullsLast().op("uuid_ops")),
397
+ foreignKey({
398
+ columns: [table.jobId],
399
+ foreignColumns: [jobs.id],
400
+ name: "job_debug_suggestions_job_id_jobs_id_fk"
401
+ }).onDelete("cascade")
402
+ ]);
403
+ var jobDebugWarnings = pgTable("job_debug_warnings", {
404
+ id: uuid().defaultRandom().primaryKey().notNull(),
405
+ jobId: uuid("job_id").notNull(),
406
+ ordinal: integer().notNull(),
407
+ description: text(),
408
+ retryCount: integer("retry_count"),
409
+ threshold: integer()
410
+ }, (table) => [
411
+ index("job_debug_warnings_jobId_idx").using("btree", table.jobId.asc().nullsLast().op("uuid_ops")),
412
+ foreignKey({
413
+ columns: [table.jobId],
414
+ foreignColumns: [jobs.id],
415
+ name: "job_debug_warnings_job_id_jobs_id_fk"
416
+ }).onDelete("cascade")
417
+ ]);
418
+ var jobExecutionConfigs = pgTable("job_execution_configs", {
419
+ id: uuid().defaultRandom().primaryKey().notNull(),
420
+ jobId: uuid("job_id").notNull(),
421
+ defaultTimeout: integer("default_timeout").notNull(),
422
+ pauseBetweenSteps: integer("pause_between_steps").notNull(),
423
+ stopOnError: boolean("stop_on_error").notNull(),
424
+ stepDelay: integer("step_delay"),
425
+ enableSelectorCache: boolean("enable_selector_cache").notNull(),
426
+ enableAgentFallback: boolean("enable_agent_fallback").notNull(),
427
+ enableVisionFallback: boolean("enable_vision_fallback").notNull(),
428
+ modelId: text("model_id"),
429
+ modelProvider: text("model_provider")
430
+ }, (table) => [
431
+ foreignKey({
432
+ columns: [table.jobId],
433
+ foreignColumns: [jobs.id],
434
+ name: "job_execution_configs_job_id_jobs_id_fk"
435
+ }).onDelete("cascade"),
436
+ unique("job_execution_configs_job_id_unique").on(table.jobId)
437
+ ]);
438
+ var jobGenerateConfigs = pgTable("job_generate_configs", {
439
+ id: uuid().defaultRandom().primaryKey().notNull(),
440
+ jobId: uuid("job_id").notNull(),
441
+ maxIterations: integer("max_iterations").default(20).notNull(),
442
+ stepDelay: integer("step_delay").default(500).notNull(),
443
+ headless: boolean().default(true).notNull(),
444
+ snapshotFilter: boolean("snapshot_filter").default(true).notNull(),
445
+ stallCheckInterval: integer("stall_check_interval").default(3).notNull(),
446
+ historyWindow: integer("history_window").default(10).notNull(),
447
+ maxConsecutiveFailures: integer("max_consecutive_failures").default(3).notNull(),
448
+ screenshotDir: text("screenshot_dir"),
449
+ videoDir: text("video_dir"),
450
+ stealth: boolean().default(false).notNull(),
451
+ proxy: text(),
452
+ modelId: text("model_id"),
453
+ modelProvider: text("model_provider"),
454
+ skills: text().array()
455
+ }, (table) => [
456
+ foreignKey({
457
+ columns: [table.jobId],
458
+ foreignColumns: [jobs.id],
459
+ name: "job_generate_configs_job_id_jobs_id_fk"
460
+ }).onDelete("cascade"),
461
+ unique("job_generate_configs_job_id_unique").on(table.jobId)
462
+ ]);
463
+ var jobRecordedSteps = pgTable("job_recorded_steps", {
464
+ id: uuid().defaultRandom().primaryKey().notNull(),
465
+ jobId: uuid("job_id").notNull(),
466
+ ordinal: integer().notNull(),
467
+ actionType: text("action_type").notNull(),
468
+ selector: text(),
469
+ value: text(),
470
+ description: text(),
471
+ inputCategory: text("input_category"),
472
+ variableName: text("variable_name"),
473
+ url: text(),
474
+ success: boolean(),
475
+ error: text(),
476
+ screenshotPath: text("screenshot_path"),
477
+ failureCategory: text("failure_category"),
478
+ durationMs: integer("duration_ms"),
479
+ snapshotBefore: text("snapshot_before"),
480
+ suggestedCaptures: jsonb("suggested_captures"),
481
+ script: text(),
482
+ extractPrompt: text("extract_prompt"),
483
+ memoryCollection: text("memory_collection"),
484
+ aggregation: jsonb(),
485
+ downloadPath: text("download_path"),
486
+ exportCollection: text("export_collection"),
487
+ exportFormat: text("export_format"),
488
+ exportPath: text("export_path"),
489
+ keys: text()
490
+ }, (table) => [
491
+ index("job_recorded_steps_jobId_idx").using("btree", table.jobId.asc().nullsLast().op("uuid_ops")),
492
+ uniqueIndex("job_recorded_steps_jobId_ordinal_idx").using("btree", table.jobId.asc().nullsLast().op("int4_ops"), table.ordinal.asc().nullsLast().op("int4_ops")),
493
+ foreignKey({
494
+ columns: [table.jobId],
495
+ foreignColumns: [jobs.id],
496
+ name: "job_recorded_steps_job_id_jobs_id_fk"
497
+ }).onDelete("cascade")
498
+ ]);
499
+ var jobResults = pgTable("job_results", {
500
+ id: uuid().defaultRandom().primaryKey().notNull(),
501
+ jobId: uuid("job_id").notNull(),
502
+ ordinal: integer().notNull(),
503
+ description: text().notNull(),
504
+ status: text("status", { enum: ["success", "failed", "skipped"] }).notNull(),
505
+ durationMs: integer("duration_ms").notNull(),
506
+ error: text(),
507
+ actionType: text("action_type"),
508
+ retryCount: integer("retry_count").default(0),
509
+ failureCategory: text("failure_category"),
510
+ capturedValues: jsonb("captured_values"),
511
+ conditionSkipped: boolean("condition_skipped").default(false),
512
+ loopIterations: integer("loop_iterations"),
513
+ branchMatch: text("branch_match"),
514
+ forEachItemCount: integer("for_each_item_count"),
515
+ extractedData: text("extracted_data"),
516
+ downloadedFile: text("downloaded_file"),
517
+ exportedFile: text("exported_file"),
518
+ createdAt: timestamp("created_at").defaultNow().notNull()
519
+ }, (table) => [
520
+ index("job_results_jobId_idx").using("btree", table.jobId.asc().nullsLast().op("uuid_ops")),
521
+ uniqueIndex("job_results_jobId_ordinal_idx").using("btree", table.jobId.asc().nullsLast().op("int4_ops"), table.ordinal.asc().nullsLast().op("int4_ops")),
522
+ foreignKey({
523
+ columns: [table.jobId],
524
+ foreignColumns: [jobs.id],
525
+ name: "job_results_job_id_jobs_id_fk"
526
+ }).onDelete("cascade")
527
+ ]);
528
+ var jobResultDiagnostics = pgTable("job_result_diagnostics", {
529
+ id: uuid().defaultRandom().primaryKey().notNull(),
530
+ jobResultId: uuid("job_result_id").notNull(),
531
+ lastSnapshotPreview: text("last_snapshot_preview"),
532
+ failureHistory: jsonb("failure_history"),
533
+ lastAiResponseText: text("last_ai_response_text"),
534
+ recoveryHint: text("recovery_hint"),
535
+ deterministicResolveResult: text("deterministic_resolve_result"),
536
+ visionFallbackResult: jsonb("vision_fallback_result"),
537
+ agentFallbackResult: jsonb("agent_fallback_result"),
538
+ validationWarnings: jsonb("validation_warnings"),
539
+ validationErrors: jsonb("validation_errors"),
540
+ stepUrl: text("step_url")
541
+ }, (table) => [
542
+ foreignKey({
543
+ columns: [table.jobResultId],
544
+ foreignColumns: [jobResults.id],
545
+ name: "job_result_diagnostics_job_result_id_job_results_id_fk"
546
+ }).onDelete("cascade"),
547
+ unique("job_result_diagnostics_job_result_id_unique").on(table.jobResultId)
548
+ ]);
549
+ var jobReviewResults = pgTable("job_review_results", {
550
+ id: uuid().defaultRandom().primaryKey().notNull(),
551
+ jobId: uuid("job_id").notNull(),
552
+ summary: text(),
553
+ yamlContent: text("yaml_content"),
554
+ goalAchieved: boolean("goal_achieved")
555
+ }, (table) => [
556
+ foreignKey({
557
+ columns: [table.jobId],
558
+ foreignColumns: [jobs.id],
559
+ name: "job_review_results_job_id_jobs_id_fk"
560
+ }).onDelete("cascade"),
561
+ unique("job_review_results_job_id_unique").on(table.jobId)
562
+ ]);
563
+ var jobReviewedSteps = pgTable("job_reviewed_steps", {
564
+ id: uuid().defaultRandom().primaryKey().notNull(),
565
+ reviewResultId: uuid("review_result_id").notNull(),
566
+ originalOrdinal: integer("original_ordinal").notNull(),
567
+ keep: boolean().notNull(),
568
+ removalReason: text("removal_reason"),
569
+ riskLevel: text("risk_level"),
570
+ requiresConfirmation: boolean("requires_confirmation"),
571
+ confirmationReason: text("confirmation_reason")
572
+ }, (table) => [
573
+ index("job_reviewed_steps_reviewResultId_idx").using("btree", table.reviewResultId.asc().nullsLast().op("uuid_ops")),
574
+ foreignKey({
575
+ columns: [table.reviewResultId],
576
+ foreignColumns: [jobReviewResults.id],
577
+ name: "job_reviewed_steps_review_result_id_job_review_results_id_fk"
578
+ }).onDelete("cascade")
579
+ ]);
580
+ var jobVariables = pgTable("job_variables", {
581
+ id: uuid().defaultRandom().primaryKey().notNull(),
582
+ jobId: uuid("job_id").notNull(),
583
+ key: text().notNull(),
584
+ value: text().notNull(),
585
+ sensitive: boolean().default(false).notNull()
586
+ }, (table) => [
587
+ uniqueIndex("job_variables_jobId_key_idx").using("btree", table.jobId.asc().nullsLast().op("text_ops"), table.key.asc().nullsLast().op("text_ops")),
588
+ foreignKey({
589
+ columns: [table.jobId],
590
+ foreignColumns: [jobs.id],
591
+ name: "job_variables_job_id_jobs_id_fk"
592
+ }).onDelete("cascade")
593
+ ]);
594
+ var runbookSecrets = pgTable("runbook_secrets", {
595
+ id: uuid().defaultRandom().primaryKey().notNull(),
596
+ key: text().notNull(),
597
+ encryptedValue: text("encrypted_value").notNull(),
598
+ versionId: uuid("version_id").notNull()
599
+ }, (table) => [
600
+ uniqueIndex("runbook_secrets_versionId_key_idx").using("btree", table.versionId.asc().nullsLast().op("text_ops"), table.key.asc().nullsLast().op("text_ops")),
601
+ foreignKey({
602
+ columns: [table.versionId],
603
+ foreignColumns: [runbookVersions.id],
604
+ name: "runbook_secrets_version_id_runbook_versions_id_fk"
605
+ }).onDelete("cascade")
606
+ ]);
607
+ var runbookSettings = pgTable("runbook_settings", {
608
+ id: uuid().defaultRandom().primaryKey().notNull(),
609
+ defaultTimeout: integer("default_timeout"),
610
+ pauseBetweenSteps: integer("pause_between_steps"),
611
+ stopOnError: boolean("stop_on_error"),
612
+ stepDelay: integer("step_delay"),
613
+ enableSelectorCache: boolean("enable_selector_cache"),
614
+ enableAgentFallback: boolean("enable_agent_fallback"),
615
+ enableVisionFallback: boolean("enable_vision_fallback"),
616
+ modelId: text("model_id"),
617
+ modelProvider: text("model_provider"),
618
+ selfHealEnabled: boolean("self_heal_enabled").default(false).notNull(),
619
+ versionId: uuid("version_id").notNull()
620
+ }, (table) => [
621
+ foreignKey({
622
+ columns: [table.versionId],
623
+ foreignColumns: [runbookVersions.id],
624
+ name: "runbook_settings_version_id_runbook_versions_id_fk"
625
+ }).onDelete("cascade"),
626
+ unique("runbook_settings_version_id_unique").on(table.versionId)
627
+ ]);
628
+ var runbookSteps = pgTable("runbook_steps", {
629
+ id: uuid().defaultRandom().primaryKey().notNull(),
630
+ parentStepId: uuid("parent_step_id"),
631
+ ordinal: integer().notNull(),
632
+ description: text().notNull(),
633
+ actionType: text("action_type", { enum: ["click", "input", "select", "navigate", "scroll", "wait", "hover", "extract", "download", "export", "memory", "key"] }).notNull(),
634
+ url: text(),
635
+ riskLevel: text("risk_level", { enum: ["low", "medium", "high"] }).default("low").notNull(),
636
+ requiresConfirmation: boolean("requires_confirmation").default(false).notNull(),
637
+ value: text(),
638
+ optionText: text("option_text"),
639
+ script: text(),
640
+ keys: text(),
641
+ downloadPath: text("download_path"),
642
+ exportCollection: text("export_collection"),
643
+ exportFormat: text("export_format"),
644
+ exportPath: text("export_path"),
645
+ selector: jsonb(),
646
+ condition: text(),
647
+ captures: jsonb(),
648
+ memoryOperations: jsonb("memory_operations"),
649
+ loopCondition: text("loop_condition"),
650
+ loopForEach: text("loop_for_each"),
651
+ loopItemVariable: text("loop_item_variable"),
652
+ loopIndexVariable: text("loop_index_variable"),
653
+ loopMaxIterations: integer("loop_max_iterations"),
654
+ loopCounterVariable: text("loop_counter_variable"),
655
+ branchValue: text("branch_value"),
656
+ branchCaseMatch: text("branch_case_match"),
657
+ branchIsDefault: boolean("branch_is_default").default(false),
658
+ versionId: uuid("version_id").notNull()
659
+ }, (table) => [
660
+ index("runbook_steps_parentStepId_idx").using("btree", table.parentStepId.asc().nullsLast().op("uuid_ops")),
661
+ index("runbook_steps_versionId_idx").using("btree", table.versionId.asc().nullsLast().op("uuid_ops")),
662
+ foreignKey({
663
+ columns: [table.versionId],
664
+ foreignColumns: [runbookVersions.id],
665
+ name: "runbook_steps_version_id_runbook_versions_id_fk"
666
+ }).onDelete("cascade")
667
+ ]);
668
+ var runbookVariables = pgTable("runbook_variables", {
669
+ id: uuid().defaultRandom().primaryKey().notNull(),
670
+ name: text().notNull(),
671
+ source: text("source", { enum: ["prompt", "fixed", "context", "env", "expression", "data"] }).notNull(),
672
+ description: text(),
673
+ required: boolean().default(false).notNull(),
674
+ sensitive: boolean().default(false).notNull(),
675
+ value: text(),
676
+ versionId: uuid("version_id").notNull()
677
+ }, (table) => [
678
+ index("runbook_variables_versionId_idx").using("btree", table.versionId.asc().nullsLast().op("uuid_ops")),
679
+ uniqueIndex("runbook_variables_versionId_name_idx").using("btree", table.versionId.asc().nullsLast().op("text_ops"), table.name.asc().nullsLast().op("text_ops")),
680
+ foreignKey({
681
+ columns: [table.versionId],
682
+ foreignColumns: [runbookVersions.id],
683
+ name: "runbook_variables_version_id_runbook_versions_id_fk"
684
+ }).onDelete("cascade")
685
+ ]);
686
+ var runbookVersionReviews = pgTable("runbook_version_reviews", {
687
+ id: uuid().defaultRandom().primaryKey().notNull(),
688
+ versionId: uuid("version_id").notNull(),
689
+ requestedBy: text("requested_by").notNull(),
690
+ requestedAt: timestamp("requested_at").defaultNow().notNull(),
691
+ reviewerId: text("reviewer_id"),
692
+ reviewedAt: timestamp("reviewed_at"),
693
+ status: text("status", { enum: ["pending", "approved", "rejected"] }).default("pending").notNull(),
694
+ comment: text()
695
+ }, (table) => [
696
+ index("runbook_version_reviews_status_idx").using("btree", table.status.asc().nullsLast().op("text_ops")),
697
+ index("runbook_version_reviews_versionId_idx").using("btree", table.versionId.asc().nullsLast().op("uuid_ops")),
698
+ foreignKey({
699
+ columns: [table.requestedBy],
700
+ foreignColumns: [user.id],
701
+ name: "runbook_version_reviews_requested_by_user_id_fk"
702
+ }).onDelete("cascade"),
703
+ foreignKey({
704
+ columns: [table.reviewerId],
705
+ foreignColumns: [user.id],
706
+ name: "runbook_version_reviews_reviewer_id_user_id_fk"
707
+ }).onDelete("set null"),
708
+ foreignKey({
709
+ columns: [table.versionId],
710
+ foreignColumns: [runbookVersions.id],
711
+ name: "runbook_version_reviews_version_id_runbook_versions_id_fk"
712
+ }).onDelete("cascade")
713
+ ]);
714
+ var session = pgTable("session", {
715
+ id: text().primaryKey().notNull(),
716
+ expiresAt: timestamp("expires_at").notNull(),
717
+ token: text().notNull(),
718
+ createdAt: timestamp("created_at").defaultNow().notNull(),
719
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
720
+ ipAddress: text("ip_address"),
721
+ userAgent: text("user_agent"),
722
+ userId: text("user_id").notNull()
723
+ }, (table) => [
724
+ index("session_userId_idx").using("btree", table.userId.asc().nullsLast().op("text_ops")),
725
+ foreignKey({
726
+ columns: [table.userId],
727
+ foreignColumns: [user.id],
728
+ name: "session_user_id_user_id_fk"
729
+ }).onDelete("cascade"),
730
+ unique("session_token_unique").on(table.token)
731
+ ]);
732
+ var telemetryFailureEvents = pgTable("telemetry_failure_events", {
733
+ id: uuid().defaultRandom().primaryKey().notNull(),
734
+ tenantId: uuid("tenant_id").notNull(),
735
+ jobId: uuid("job_id").notNull(),
736
+ runbookId: uuid("runbook_id"),
737
+ stepOrdinal: integer("step_ordinal").notNull(),
738
+ urlPattern: text("url_pattern").notNull(),
739
+ selectorHint: text("selector_hint").notNull(),
740
+ failureCategory: text("failure_category").notNull(),
741
+ actionType: text("action_type"),
742
+ stepDescription: text("step_description"),
743
+ stepAction: jsonb("step_action"),
744
+ errorMessage: text("error_message"),
745
+ failureHistory: jsonb("failure_history"),
746
+ retryCount: integer("retry_count").default(0),
747
+ retryDetails: jsonb("retry_details"),
748
+ snapshotPreview: text("snapshot_preview"),
749
+ stepUrl: text("step_url"),
750
+ deterministicResult: text("deterministic_result"),
751
+ visionFallback: jsonb("vision_fallback"),
752
+ agentFallback: jsonb("agent_fallback"),
753
+ resolveMethod: text("resolve_method"),
754
+ contextChunksUsed: integer("context_chunks_used"),
755
+ failureHintsInjected: text("failure_hints_injected"),
756
+ validationWarnings: jsonb("validation_warnings"),
757
+ validationErrors: jsonb("validation_errors"),
758
+ executionStrategy: jsonb("execution_strategy"),
759
+ durationMs: integer("duration_ms"),
760
+ recoveryHint: text("recovery_hint"),
761
+ createdAt: timestamp("created_at").defaultNow().notNull()
762
+ }, (table) => [
763
+ index("telemetry_failure_events_tenant_category_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.failureCategory.asc().nullsLast().op("uuid_ops")),
764
+ index("telemetry_failure_events_tenant_created_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.createdAt.asc().nullsLast().op("uuid_ops")),
765
+ index("telemetry_failure_events_tenant_pattern_idx").using("btree", table.tenantId.asc().nullsLast().op("text_ops"), table.urlPattern.asc().nullsLast().op("uuid_ops"), table.selectorHint.asc().nullsLast().op("text_ops")),
766
+ index("telemetry_failure_events_tenant_runbook_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.runbookId.asc().nullsLast().op("uuid_ops")),
767
+ foreignKey({
768
+ columns: [table.jobId],
769
+ foreignColumns: [jobs.id],
770
+ name: "telemetry_failure_events_job_id_jobs_id_fk"
771
+ }).onDelete("cascade"),
772
+ foreignKey({
773
+ columns: [table.runbookId],
774
+ foreignColumns: [runbooks.id],
775
+ name: "telemetry_failure_events_runbook_id_runbooks_id_fk"
776
+ }).onDelete("set null"),
777
+ foreignKey({
778
+ columns: [table.tenantId],
779
+ foreignColumns: [tenants.id],
780
+ name: "telemetry_failure_events_tenant_id_tenants_id_fk"
781
+ }).onDelete("cascade")
782
+ ]);
783
+ var telemetryFailurePatterns = pgTable("telemetry_failure_patterns", {
784
+ id: uuid().defaultRandom().primaryKey().notNull(),
785
+ tenantId: uuid("tenant_id").notNull(),
786
+ runbookId: uuid("runbook_id"),
787
+ urlPattern: text("url_pattern").notNull(),
788
+ selectorHint: text("selector_hint").notNull(),
789
+ failureCategory: text("failure_category").notNull(),
790
+ occurrenceCount: integer("occurrence_count").default(1).notNull(),
791
+ lastErrorMessage: text("last_error_message"),
792
+ lastSnapshotExcerpt: text("last_snapshot_excerpt"),
793
+ successfulRecoveries: jsonb("successful_recoveries"),
794
+ lastRecoveryMethod: text("last_recovery_method"),
795
+ lastJobId: uuid("last_job_id"),
796
+ lastStepOrdinal: integer("last_step_ordinal"),
797
+ firstSeenAt: timestamp("first_seen_at").defaultNow().notNull(),
798
+ lastSeenAt: timestamp("last_seen_at").defaultNow().notNull()
799
+ }, (table) => [
800
+ index("telemetry_failure_patterns_tenant_category_idx").using("btree", table.tenantId.asc().nullsLast().op("text_ops"), table.failureCategory.asc().nullsLast().op("text_ops")),
801
+ index("telemetry_failure_patterns_tenant_runbook_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.runbookId.asc().nullsLast().op("uuid_ops")),
802
+ uniqueIndex("telemetry_failure_patterns_unique_idx").using("btree", table.tenantId.asc().nullsLast().op("text_ops"), table.urlPattern.asc().nullsLast().op("uuid_ops"), table.selectorHint.asc().nullsLast().op("text_ops"), table.failureCategory.asc().nullsLast().op("text_ops")),
803
+ foreignKey({
804
+ columns: [table.runbookId],
805
+ foreignColumns: [runbooks.id],
806
+ name: "telemetry_failure_patterns_runbook_id_runbooks_id_fk"
807
+ }).onDelete("set null"),
808
+ foreignKey({
809
+ columns: [table.tenantId],
810
+ foreignColumns: [tenants.id],
811
+ name: "telemetry_failure_patterns_tenant_id_tenants_id_fk"
812
+ }).onDelete("cascade")
813
+ ]);
814
+ var telemetryJobSummaries = pgTable("telemetry_job_summaries", {
815
+ id: uuid().defaultRandom().primaryKey().notNull(),
816
+ tenantId: uuid("tenant_id").notNull(),
817
+ jobId: uuid("job_id").notNull(),
818
+ runbookId: uuid("runbook_id"),
819
+ runbookContentHash: text("runbook_content_hash"),
820
+ mode: text(),
821
+ totalSteps: integer("total_steps"),
822
+ succeededSteps: integer("succeeded_steps"),
823
+ failedSteps: integer("failed_steps"),
824
+ skippedSteps: integer("skipped_steps"),
825
+ aborted: boolean(),
826
+ totalDurationMs: integer("total_duration_ms"),
827
+ failureCategoryCounts: jsonb("failure_category_counts"),
828
+ retryDistribution: jsonb("retry_distribution"),
829
+ resolveMethodCounts: jsonb("resolve_method_counts"),
830
+ stepsWithRetries: integer("steps_with_retries").default(0),
831
+ totalRetryCount: integer("total_retry_count").default(0),
832
+ visionFallbackAttempts: integer("vision_fallback_attempts").default(0),
833
+ visionFallbackSuccesses: integer("vision_fallback_successes").default(0),
834
+ agentFallbackAttempts: integer("agent_fallback_attempts").default(0),
835
+ agentFallbackSuccesses: integer("agent_fallback_successes").default(0),
836
+ slowStepsCount: integer("slow_steps_count").default(0),
837
+ maxStepDurationMs: integer("max_step_duration_ms").default(0),
838
+ aiTotalCalls: integer("ai_total_calls").default(0),
839
+ aiTotalInputTokens: integer("ai_total_input_tokens").default(0),
840
+ aiTotalOutputTokens: integer("ai_total_output_tokens").default(0),
841
+ aiCacheHitRate: real("ai_cache_hit_rate").default(0),
842
+ aiEstimatedCostUsd: real("ai_estimated_cost_usd").default(0),
843
+ aiTotalDurationMs: integer("ai_total_duration_ms").default(0),
844
+ modelId: text("model_id"),
845
+ modelProvider: text("model_provider"),
846
+ createdAt: timestamp("created_at").defaultNow().notNull()
847
+ }, (table) => [
848
+ index("telemetry_job_summaries_runbookId_idx").using("btree", table.runbookId.asc().nullsLast().op("uuid_ops")),
849
+ index("telemetry_job_summaries_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
850
+ index("telemetry_job_summaries_tenant_created_idx").using("btree", table.tenantId.asc().nullsLast().op("timestamp_ops"), table.createdAt.asc().nullsLast().op("uuid_ops")),
851
+ foreignKey({
852
+ columns: [table.jobId],
853
+ foreignColumns: [jobs.id],
854
+ name: "telemetry_job_summaries_job_id_jobs_id_fk"
855
+ }).onDelete("cascade"),
856
+ foreignKey({
857
+ columns: [table.runbookId],
858
+ foreignColumns: [runbooks.id],
859
+ name: "telemetry_job_summaries_runbook_id_runbooks_id_fk"
860
+ }).onDelete("set null"),
861
+ foreignKey({
862
+ columns: [table.tenantId],
863
+ foreignColumns: [tenants.id],
864
+ name: "telemetry_job_summaries_tenant_id_tenants_id_fk"
865
+ }).onDelete("cascade"),
866
+ unique("telemetry_job_summaries_job_id_unique").on(table.jobId)
867
+ ]);
868
+ var telemetryResolutionOutcomes = pgTable("telemetry_resolution_outcomes", {
869
+ id: uuid().defaultRandom().primaryKey().notNull(),
870
+ tenantId: uuid("tenant_id").notNull(),
871
+ jobId: uuid("job_id").notNull(),
872
+ runbookId: uuid("runbook_id"),
873
+ stepOrdinal: integer("step_ordinal").notNull(),
874
+ status: text().notNull(),
875
+ resolveMethod: text("resolve_method"),
876
+ retryCount: integer("retry_count").default(0),
877
+ durationMs: integer("duration_ms"),
878
+ deterministicMatchType: text("deterministic_match_type"),
879
+ deterministicConfidence: real("deterministic_confidence"),
880
+ urlPattern: text("url_pattern"),
881
+ selectorHint: text("selector_hint"),
882
+ actionType: text("action_type"),
883
+ aiReasoning: text("ai_reasoning"),
884
+ contextChunksUsed: integer("context_chunks_used").default(0),
885
+ workingMemoryTokens: integer("working_memory_tokens").default(0),
886
+ failureHintsProvided: boolean("failure_hints_provided").default(false),
887
+ snapshotElementCount: integer("snapshot_element_count").default(0),
888
+ createdAt: timestamp("created_at").defaultNow().notNull()
889
+ }, (table) => [
890
+ index("telemetry_resolution_outcomes_tenant_job_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.jobId.asc().nullsLast().op("uuid_ops")),
891
+ index("telemetry_resolution_outcomes_tenant_match_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.deterministicMatchType.asc().nullsLast().op("uuid_ops")),
892
+ index("telemetry_resolution_outcomes_tenant_method_idx").using("btree", table.tenantId.asc().nullsLast().op("text_ops"), table.resolveMethod.asc().nullsLast().op("text_ops")),
893
+ index("telemetry_resolution_outcomes_tenant_runbook_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.runbookId.asc().nullsLast().op("uuid_ops")),
894
+ foreignKey({
895
+ columns: [table.jobId],
896
+ foreignColumns: [jobs.id],
897
+ name: "telemetry_resolution_outcomes_job_id_jobs_id_fk"
898
+ }).onDelete("cascade"),
899
+ foreignKey({
900
+ columns: [table.runbookId],
901
+ foreignColumns: [runbooks.id],
902
+ name: "telemetry_resolution_outcomes_runbook_id_runbooks_id_fk"
903
+ }).onDelete("set null"),
904
+ foreignKey({
905
+ columns: [table.tenantId],
906
+ foreignColumns: [tenants.id],
907
+ name: "telemetry_resolution_outcomes_tenant_id_tenants_id_fk"
908
+ }).onDelete("cascade")
909
+ ]);
910
+ var telemetrySuggestionOutcomes = pgTable("telemetry_suggestion_outcomes", {
911
+ id: uuid().defaultRandom().primaryKey().notNull(),
912
+ tenantId: uuid("tenant_id").notNull(),
913
+ runbookId: uuid("runbook_id").notNull(),
914
+ suggestionJobId: uuid("suggestion_job_id").notNull(),
915
+ stepOrdinal: integer("step_ordinal"),
916
+ stepDescription: text("step_description"),
917
+ failureCategory: text("failure_category"),
918
+ suggestedStrategy: text("suggested_strategy"),
919
+ runbookFix: text("runbook_fix"),
920
+ contextFix: text("context_fix"),
921
+ severity: text(),
922
+ applied: boolean().default(false).notNull(),
923
+ appliedAt: timestamp("applied_at"),
924
+ verificationJobId: uuid("verification_job_id"),
925
+ verificationSuccess: boolean("verification_success"),
926
+ verificationError: text("verification_error"),
927
+ verifiedAt: timestamp("verified_at"),
928
+ createdAt: timestamp("created_at").defaultNow().notNull()
929
+ }, (table) => [
930
+ index("telemetry_suggestion_outcomes_applied_verification_idx").using("btree", table.applied.asc().nullsLast().op("bool_ops"), table.verificationJobId.asc().nullsLast().op("uuid_ops")),
931
+ index("telemetry_suggestion_outcomes_tenant_job_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.suggestionJobId.asc().nullsLast().op("uuid_ops")),
932
+ index("telemetry_suggestion_outcomes_tenant_runbook_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops"), table.runbookId.asc().nullsLast().op("uuid_ops")),
933
+ foreignKey({
934
+ columns: [table.runbookId],
935
+ foreignColumns: [runbooks.id],
936
+ name: "telemetry_suggestion_outcomes_runbook_id_runbooks_id_fk"
937
+ }).onDelete("cascade"),
938
+ foreignKey({
939
+ columns: [table.suggestionJobId],
940
+ foreignColumns: [jobs.id],
941
+ name: "telemetry_suggestion_outcomes_suggestion_job_id_jobs_id_fk"
942
+ }).onDelete("cascade"),
943
+ foreignKey({
944
+ columns: [table.tenantId],
945
+ foreignColumns: [tenants.id],
946
+ name: "telemetry_suggestion_outcomes_tenant_id_tenants_id_fk"
947
+ }).onDelete("cascade")
948
+ ]);
949
+ var tenantDevelopmentSettings = pgTable("tenant_development_settings", {
950
+ tenantId: uuid("tenant_id").primaryKey().notNull(),
951
+ requireApprovalBeforePublish: boolean("require_approval_before_publish").default(false).notNull(),
952
+ allowSelfApproval: boolean("allow_self_approval").default(false).notNull(),
953
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
954
+ updatedBy: text("updated_by")
955
+ }, (table) => [
956
+ foreignKey({
957
+ columns: [table.tenantId],
958
+ foreignColumns: [tenants.id],
959
+ name: "tenant_development_settings_tenant_id_tenants_id_fk"
960
+ }).onDelete("cascade"),
961
+ foreignKey({
962
+ columns: [table.updatedBy],
963
+ foreignColumns: [user.id],
964
+ name: "tenant_development_settings_updated_by_user_id_fk"
965
+ }).onDelete("set null")
966
+ ]);
967
+ var tenantExecutionConfigs = pgTable("tenant_execution_configs", {
968
+ id: uuid().defaultRandom().primaryKey().notNull(),
969
+ tenantId: uuid("tenant_id").notNull(),
970
+ defaultTimeout: integer("default_timeout").default(3e4).notNull(),
971
+ pauseBetweenSteps: integer("pause_between_steps").default(500).notNull(),
972
+ stopOnError: boolean("stop_on_error").default(true).notNull(),
973
+ stepDelay: integer("step_delay"),
974
+ enableSelectorCache: boolean("enable_selector_cache").default(true).notNull(),
975
+ enableAgentFallback: boolean("enable_agent_fallback").default(true).notNull(),
976
+ enableVisionFallback: boolean("enable_vision_fallback").default(false).notNull(),
977
+ modelId: text("model_id"),
978
+ modelProvider: text("model_provider")
979
+ }, (table) => [
980
+ foreignKey({
981
+ columns: [table.tenantId],
982
+ foreignColumns: [tenants.id],
983
+ name: "tenant_execution_configs_tenant_id_tenants_id_fk"
984
+ }).onDelete("cascade"),
985
+ unique("tenant_execution_configs_tenant_id_unique").on(table.tenantId)
986
+ ]);
987
+ var tenantExecutionSettings = pgTable("tenant_execution_settings", {
988
+ tenantId: uuid("tenant_id").primaryKey().notNull(),
989
+ headless: boolean().default(true).notNull(),
990
+ stealth: boolean().default(false).notNull(),
991
+ proxy: text(),
992
+ approvalMode: text("approval_mode", { enum: ["web", "slack", "teams", "discord"] }).default("web").notNull(),
993
+ notifyMode: text("notify_mode", { enum: ["slack", "teams", "discord"] }),
994
+ enableSelectorCache: boolean("enable_selector_cache").default(true).notNull(),
995
+ enableAgentFallback: boolean("enable_agent_fallback").default(true).notNull(),
996
+ enableVisionFallback: boolean("enable_vision_fallback").default(false).notNull(),
997
+ skills: text().array().default([""]).notNull(),
998
+ apiKey: text("api_key"),
999
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
1000
+ updatedBy: text("updated_by"),
1001
+ notificationCredentials: jsonb("notification_credentials"),
1002
+ enableScreenshots: boolean("enable_screenshots").default(false).notNull(),
1003
+ enableVideoRecording: boolean("enable_video_recording").default(false).notNull()
1004
+ }, (table) => [
1005
+ foreignKey({
1006
+ columns: [table.tenantId],
1007
+ foreignColumns: [tenants.id],
1008
+ name: "tenant_execution_settings_tenant_id_tenants_id_fk"
1009
+ }).onDelete("cascade"),
1010
+ foreignKey({
1011
+ columns: [table.updatedBy],
1012
+ foreignColumns: [user.id],
1013
+ name: "tenant_execution_settings_updated_by_user_id_fk"
1014
+ })
1015
+ ]);
1016
+ var tenantMembers = pgTable("tenant_members", {
1017
+ id: uuid().defaultRandom().primaryKey().notNull(),
1018
+ tenantId: uuid("tenant_id").notNull(),
1019
+ userId: text("user_id").notNull(),
1020
+ role: text("role", { enum: ["owner", "admin", "developer", "member"] }).default("member").notNull(),
1021
+ createdAt: timestamp("created_at").defaultNow().notNull()
1022
+ }, (table) => [
1023
+ index("tenant_members_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
1024
+ index("tenant_members_userId_idx").using("btree", table.userId.asc().nullsLast().op("text_ops")),
1025
+ foreignKey({
1026
+ columns: [table.tenantId],
1027
+ foreignColumns: [tenants.id],
1028
+ name: "tenant_members_tenant_id_tenants_id_fk"
1029
+ }).onDelete("cascade"),
1030
+ foreignKey({
1031
+ columns: [table.userId],
1032
+ foreignColumns: [user.id],
1033
+ name: "tenant_members_user_id_user_id_fk"
1034
+ }).onDelete("cascade")
1035
+ ]);
1036
+ var tenantModelOverrides = pgTable("tenant_model_overrides", {
1037
+ id: uuid().defaultRandom().primaryKey().notNull(),
1038
+ tenantId: uuid("tenant_id").notNull(),
1039
+ purpose: text("purpose", { enum: ["selector", "extraction", "exploration", "exploration-light", "review", "fallback", "vision"] }).notNull(),
1040
+ description: text().notNull(),
1041
+ modelId: text("model_id").notNull(),
1042
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
1043
+ }, (table) => [
1044
+ index("tenant_model_overrides_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
1045
+ uniqueIndex("tenant_model_overrides_tenant_purpose_idx").using("btree", table.tenantId.asc().nullsLast().op("text_ops"), table.purpose.asc().nullsLast().op("text_ops")),
1046
+ foreignKey({
1047
+ columns: [table.tenantId],
1048
+ foreignColumns: [tenants.id],
1049
+ name: "tenant_model_overrides_tenant_id_tenants_id_fk"
1050
+ }).onDelete("cascade")
1051
+ ]);
1052
+ var tenantModelProviders = pgTable("tenant_model_providers", {
1053
+ id: uuid().defaultRandom().primaryKey().notNull(),
1054
+ tenantId: uuid("tenant_id").notNull(),
1055
+ providerId: text("provider_id", { enum: ["anthropic", "openai", "openai-compatible", "google", "azure", "bedrock", "vertex"] }).notNull(),
1056
+ modelId: text("model_id").notNull(),
1057
+ connected: boolean().default(false).notNull(),
1058
+ config: jsonb().default({}).notNull(),
1059
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
1060
+ }, (table) => [
1061
+ index("tenant_model_providers_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
1062
+ uniqueIndex("tenant_model_providers_tenant_provider_idx").using("btree", table.tenantId.asc().nullsLast().op("text_ops"), table.providerId.asc().nullsLast().op("text_ops")),
1063
+ foreignKey({
1064
+ columns: [table.tenantId],
1065
+ foreignColumns: [tenants.id],
1066
+ name: "tenant_model_providers_tenant_id_tenants_id_fk"
1067
+ }).onDelete("cascade")
1068
+ ]);
1069
+ var tenantUsage = pgTable("tenant_usage", {
1070
+ id: uuid().defaultRandom().primaryKey().notNull(),
1071
+ tenantId: uuid("tenant_id").notNull(),
1072
+ month: text().notNull(),
1073
+ jobCount: integer("job_count").default(0).notNull(),
1074
+ stepCount: integer("step_count").default(0).notNull(),
1075
+ updatedAt: timestamp("updated_at").defaultNow().$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
1076
+ }, (table) => [
1077
+ index("tenant_usage_tenantId_idx").using("btree", table.tenantId.asc().nullsLast().op("uuid_ops")),
1078
+ uniqueIndex("tenant_usage_tenant_month_idx").using("btree", table.tenantId.asc().nullsLast().op("text_ops"), table.month.asc().nullsLast().op("text_ops")),
1079
+ foreignKey({
1080
+ columns: [table.tenantId],
1081
+ foreignColumns: [tenants.id],
1082
+ name: "tenant_usage_tenant_id_tenants_id_fk"
1083
+ }).onDelete("cascade")
1084
+ ]);
1085
+
1086
+ export {
1087
+ dataMigrationHistory,
1088
+ verification,
1089
+ tenants,
1090
+ user,
1091
+ account,
1092
+ apiKeys,
1093
+ invitations,
1094
+ runbooks,
1095
+ runbookVersions,
1096
+ schedules,
1097
+ jobs,
1098
+ jobAiMetrics,
1099
+ jobApprovalRequests,
1100
+ jobArtifacts,
1101
+ jobDebugSuggestions,
1102
+ jobDebugWarnings,
1103
+ jobExecutionConfigs,
1104
+ jobGenerateConfigs,
1105
+ jobRecordedSteps,
1106
+ jobResults,
1107
+ jobResultDiagnostics,
1108
+ jobReviewResults,
1109
+ jobReviewedSteps,
1110
+ jobVariables,
1111
+ runbookSecrets,
1112
+ runbookSettings,
1113
+ runbookSteps,
1114
+ runbookVariables,
1115
+ runbookVersionReviews,
1116
+ session,
1117
+ telemetryFailureEvents,
1118
+ telemetryFailurePatterns,
1119
+ telemetryJobSummaries,
1120
+ telemetryResolutionOutcomes,
1121
+ telemetrySuggestionOutcomes,
1122
+ tenantDevelopmentSettings,
1123
+ tenantExecutionConfigs,
1124
+ tenantExecutionSettings,
1125
+ tenantMembers,
1126
+ tenantModelOverrides,
1127
+ tenantModelProviders,
1128
+ tenantUsage,
1129
+ schema_exports
1130
+ };
1131
+ //# sourceMappingURL=chunk-CLYJHKPY.js.map