@secondlayer/shared 0.10.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/db/index.d.ts +181 -2
- package/dist/src/db/queries/accounts.d.ts +158 -2
- package/dist/src/db/queries/accounts.js +17 -1
- package/dist/src/db/queries/accounts.js.map +3 -3
- package/dist/src/db/queries/integrity.d.ts +151 -1
- package/dist/src/db/queries/marketplace.d.ts +463 -0
- package/dist/src/db/queries/marketplace.js +142 -0
- package/dist/src/db/queries/marketplace.js.map +10 -0
- package/dist/src/db/queries/metrics.d.ts +151 -1
- package/dist/src/db/queries/projects.d.ts +423 -0
- package/dist/src/db/queries/projects.js +47 -0
- package/dist/src/db/queries/projects.js.map +10 -0
- package/dist/src/db/queries/subgraph-gaps.d.ts +151 -1
- package/dist/src/db/queries/subgraphs.d.ts +158 -6
- package/dist/src/db/queries/subgraphs.js +16 -13
- package/dist/src/db/queries/subgraphs.js.map +3 -3
- package/dist/src/db/queries/usage.d.ts +151 -1
- package/dist/src/db/queries/workflows.d.ts +439 -0
- package/dist/src/db/queries/workflows.js +115 -0
- package/dist/src/db/queries/workflows.js.map +11 -0
- package/dist/src/db/schema.d.ts +181 -2
- package/dist/src/index.d.ts +251 -10
- package/dist/src/index.js +91 -72
- package/dist/src/index.js.map +4 -3
- package/dist/src/node/hiro-pg-client.js +5 -3
- package/dist/src/node/hiro-pg-client.js.map +3 -3
- package/dist/src/node/local-client.d.ts +155 -1
- package/dist/src/node/local-client.js +19 -9
- package/dist/src/node/local-client.js.map +3 -3
- package/dist/src/schemas/index.d.ts +71 -9
- package/dist/src/schemas/index.js +93 -74
- package/dist/src/schemas/index.js.map +4 -3
- package/dist/src/schemas/marketplace.d.ts +63 -0
- package/dist/src/schemas/marketplace.js +39 -0
- package/dist/src/schemas/marketplace.js.map +10 -0
- package/dist/src/schemas/workflows.d.ts +66 -0
- package/dist/src/schemas/workflows.js +39 -0
- package/dist/src/schemas/workflows.js.map +10 -0
- package/dist/src/types.d.ts +3 -0
- package/migrations/0021_tx_function_args_result.ts +27 -0
- package/migrations/0022_marketplace.ts +88 -0
- package/migrations/0023_projects.ts +149 -0
- package/migrations/0024_chat_sessions.ts +51 -0
- package/migrations/0025_chat_session_summary.ts +15 -0
- package/migrations/0026_workflows.ts +204 -0
- package/migrations/0027_workflow_cursors.ts +16 -0
- package/migrations/0028_subgraph_account_scoping.ts +116 -0
- package/package.json +22 -2
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import { Kysely } from "kysely";
|
|
2
|
+
import { Generated, Selectable } from "kysely";
|
|
3
|
+
interface BlocksTable {
|
|
4
|
+
height: number;
|
|
5
|
+
hash: string;
|
|
6
|
+
parent_hash: string;
|
|
7
|
+
burn_block_height: number;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
canonical: Generated<boolean>;
|
|
10
|
+
created_at: Generated<Date>;
|
|
11
|
+
}
|
|
12
|
+
interface TransactionsTable {
|
|
13
|
+
tx_id: string;
|
|
14
|
+
block_height: number;
|
|
15
|
+
tx_index: Generated<number>;
|
|
16
|
+
type: string;
|
|
17
|
+
sender: string;
|
|
18
|
+
status: string;
|
|
19
|
+
contract_id: string | null;
|
|
20
|
+
function_name: string | null;
|
|
21
|
+
function_args: Generated<unknown | null>;
|
|
22
|
+
raw_result: Generated<string | null>;
|
|
23
|
+
raw_tx: string;
|
|
24
|
+
created_at: Generated<Date>;
|
|
25
|
+
}
|
|
26
|
+
interface EventsTable {
|
|
27
|
+
id: Generated<string>;
|
|
28
|
+
tx_id: string;
|
|
29
|
+
block_height: number;
|
|
30
|
+
event_index: number;
|
|
31
|
+
type: string;
|
|
32
|
+
data: unknown;
|
|
33
|
+
created_at: Generated<Date>;
|
|
34
|
+
}
|
|
35
|
+
interface StreamsTable {
|
|
36
|
+
id: Generated<string>;
|
|
37
|
+
name: string;
|
|
38
|
+
status: Generated<string>;
|
|
39
|
+
filters: unknown;
|
|
40
|
+
options: Generated<unknown>;
|
|
41
|
+
endpoint_url: string;
|
|
42
|
+
signing_secret: string | null;
|
|
43
|
+
api_key_id: string;
|
|
44
|
+
project_id: string | null;
|
|
45
|
+
created_at: Generated<Date>;
|
|
46
|
+
updated_at: Generated<Date>;
|
|
47
|
+
}
|
|
48
|
+
interface StreamMetricsTable {
|
|
49
|
+
stream_id: string;
|
|
50
|
+
last_triggered_at: Date | null;
|
|
51
|
+
last_triggered_block: number | null;
|
|
52
|
+
total_deliveries: Generated<number>;
|
|
53
|
+
failed_deliveries: Generated<number>;
|
|
54
|
+
error_message: string | null;
|
|
55
|
+
}
|
|
56
|
+
interface JobsTable {
|
|
57
|
+
id: Generated<string>;
|
|
58
|
+
stream_id: string;
|
|
59
|
+
block_height: number;
|
|
60
|
+
status: Generated<string>;
|
|
61
|
+
attempts: Generated<number>;
|
|
62
|
+
locked_at: Date | null;
|
|
63
|
+
locked_by: string | null;
|
|
64
|
+
error: string | null;
|
|
65
|
+
backfill: Generated<boolean>;
|
|
66
|
+
created_at: Generated<Date>;
|
|
67
|
+
completed_at: Date | null;
|
|
68
|
+
}
|
|
69
|
+
interface IndexProgressTable {
|
|
70
|
+
network: string;
|
|
71
|
+
last_indexed_block: Generated<number>;
|
|
72
|
+
last_contiguous_block: Generated<number>;
|
|
73
|
+
highest_seen_block: Generated<number>;
|
|
74
|
+
updated_at: Generated<Date>;
|
|
75
|
+
}
|
|
76
|
+
interface DeliveriesTable {
|
|
77
|
+
id: Generated<string>;
|
|
78
|
+
stream_id: string;
|
|
79
|
+
job_id: string | null;
|
|
80
|
+
block_height: number;
|
|
81
|
+
status: string;
|
|
82
|
+
status_code: number | null;
|
|
83
|
+
response_time_ms: number | null;
|
|
84
|
+
attempts: Generated<number>;
|
|
85
|
+
error: string | null;
|
|
86
|
+
payload: unknown;
|
|
87
|
+
created_at: Generated<Date>;
|
|
88
|
+
}
|
|
89
|
+
interface SubgraphsTable {
|
|
90
|
+
id: Generated<string>;
|
|
91
|
+
name: string;
|
|
92
|
+
version: Generated<string>;
|
|
93
|
+
status: Generated<string>;
|
|
94
|
+
definition: Record<string, unknown>;
|
|
95
|
+
schema_hash: string;
|
|
96
|
+
handler_path: string;
|
|
97
|
+
schema_name: string | null;
|
|
98
|
+
start_block: Generated<number>;
|
|
99
|
+
last_processed_block: Generated<number>;
|
|
100
|
+
reindex_from_block: number | null;
|
|
101
|
+
reindex_to_block: number | null;
|
|
102
|
+
last_error: string | null;
|
|
103
|
+
last_error_at: Date | null;
|
|
104
|
+
total_processed: Generated<number>;
|
|
105
|
+
total_errors: Generated<number>;
|
|
106
|
+
api_key_id: string | null;
|
|
107
|
+
account_id: string;
|
|
108
|
+
project_id: string | null;
|
|
109
|
+
is_public: Generated<boolean>;
|
|
110
|
+
tags: Generated<string[]>;
|
|
111
|
+
description: string | null;
|
|
112
|
+
forked_from_id: string | null;
|
|
113
|
+
created_at: Generated<Date>;
|
|
114
|
+
updated_at: Generated<Date>;
|
|
115
|
+
}
|
|
116
|
+
interface SubgraphGapsTable {
|
|
117
|
+
id: Generated<string>;
|
|
118
|
+
subgraph_id: string;
|
|
119
|
+
subgraph_name: string;
|
|
120
|
+
gap_start: number;
|
|
121
|
+
gap_end: number;
|
|
122
|
+
reason: string;
|
|
123
|
+
detected_at: Generated<Date>;
|
|
124
|
+
resolved_at: Date | null;
|
|
125
|
+
}
|
|
126
|
+
interface ApiKeysTable {
|
|
127
|
+
id: Generated<string>;
|
|
128
|
+
key_hash: string;
|
|
129
|
+
key_prefix: string;
|
|
130
|
+
name: string | null;
|
|
131
|
+
status: Generated<string>;
|
|
132
|
+
rate_limit: Generated<number>;
|
|
133
|
+
ip_address: string;
|
|
134
|
+
account_id: string;
|
|
135
|
+
last_used_at: Date | null;
|
|
136
|
+
revoked_at: Date | null;
|
|
137
|
+
created_at: Generated<Date>;
|
|
138
|
+
}
|
|
139
|
+
interface AccountsTable {
|
|
140
|
+
id: Generated<string>;
|
|
141
|
+
email: string;
|
|
142
|
+
plan: Generated<string>;
|
|
143
|
+
display_name: string | null;
|
|
144
|
+
bio: string | null;
|
|
145
|
+
avatar_url: string | null;
|
|
146
|
+
slug: string | null;
|
|
147
|
+
created_at: Generated<Date>;
|
|
148
|
+
}
|
|
149
|
+
interface SessionsTable {
|
|
150
|
+
id: Generated<string>;
|
|
151
|
+
token_hash: string;
|
|
152
|
+
token_prefix: string;
|
|
153
|
+
account_id: string;
|
|
154
|
+
ip_address: string;
|
|
155
|
+
expires_at: Generated<Date>;
|
|
156
|
+
revoked_at: Date | null;
|
|
157
|
+
last_used_at: Date | null;
|
|
158
|
+
created_at: Generated<Date>;
|
|
159
|
+
}
|
|
160
|
+
interface MagicLinksTable {
|
|
161
|
+
id: Generated<string>;
|
|
162
|
+
email: string;
|
|
163
|
+
token: string;
|
|
164
|
+
code: string | null;
|
|
165
|
+
expires_at: Date;
|
|
166
|
+
used_at: Date | null;
|
|
167
|
+
failed_attempts: Generated<number>;
|
|
168
|
+
created_at: Generated<Date>;
|
|
169
|
+
}
|
|
170
|
+
interface UsageDailyTable {
|
|
171
|
+
account_id: string;
|
|
172
|
+
date: string;
|
|
173
|
+
api_requests: Generated<number>;
|
|
174
|
+
deliveries: Generated<number>;
|
|
175
|
+
}
|
|
176
|
+
interface UsageSnapshotsTable {
|
|
177
|
+
id: Generated<string>;
|
|
178
|
+
account_id: string;
|
|
179
|
+
measured_at: Generated<Date>;
|
|
180
|
+
storage_bytes: Generated<number>;
|
|
181
|
+
}
|
|
182
|
+
interface WaitlistTable {
|
|
183
|
+
id: Generated<string>;
|
|
184
|
+
email: string;
|
|
185
|
+
source: Generated<string>;
|
|
186
|
+
status: Generated<string>;
|
|
187
|
+
created_at: Generated<Date>;
|
|
188
|
+
}
|
|
189
|
+
interface AccountInsightsTable {
|
|
190
|
+
id: Generated<string>;
|
|
191
|
+
account_id: string;
|
|
192
|
+
category: string;
|
|
193
|
+
insight_type: string;
|
|
194
|
+
resource_id: string | null;
|
|
195
|
+
severity: string;
|
|
196
|
+
title: string;
|
|
197
|
+
body: string;
|
|
198
|
+
data: unknown;
|
|
199
|
+
dismissed_at: Date | null;
|
|
200
|
+
expires_at: Date | null;
|
|
201
|
+
created_at: Generated<Date>;
|
|
202
|
+
}
|
|
203
|
+
interface AccountAgentRunsTable {
|
|
204
|
+
id: Generated<string>;
|
|
205
|
+
account_id: string;
|
|
206
|
+
started_at: Generated<Date>;
|
|
207
|
+
completed_at: Date | null;
|
|
208
|
+
status: Generated<string>;
|
|
209
|
+
input_tokens: Generated<number>;
|
|
210
|
+
output_tokens: Generated<number>;
|
|
211
|
+
cost_usd: Generated<number>;
|
|
212
|
+
insights_created: Generated<number>;
|
|
213
|
+
error: string | null;
|
|
214
|
+
}
|
|
215
|
+
interface SubgraphProcessingStatsTable {
|
|
216
|
+
id: Generated<string>;
|
|
217
|
+
subgraph_name: string;
|
|
218
|
+
api_key_id: string | null;
|
|
219
|
+
bucket_start: Date | null;
|
|
220
|
+
bucket_end: Date | null;
|
|
221
|
+
blocks_processed: number | null;
|
|
222
|
+
total_time_ms: number | null;
|
|
223
|
+
handler_time_ms: number | null;
|
|
224
|
+
flush_time_ms: number | null;
|
|
225
|
+
max_block_time_ms: number | null;
|
|
226
|
+
max_handler_time_ms: number | null;
|
|
227
|
+
avg_ops_per_block: number | null;
|
|
228
|
+
is_catchup: Generated<boolean>;
|
|
229
|
+
created_at: Generated<Date>;
|
|
230
|
+
}
|
|
231
|
+
interface SubgraphTableSnapshotsTable {
|
|
232
|
+
id: Generated<string>;
|
|
233
|
+
subgraph_name: string;
|
|
234
|
+
api_key_id: string | null;
|
|
235
|
+
table_name: string;
|
|
236
|
+
row_count: number | null;
|
|
237
|
+
created_at: Generated<Date>;
|
|
238
|
+
}
|
|
239
|
+
interface SubgraphHealthSnapshotsTable {
|
|
240
|
+
id: Generated<string>;
|
|
241
|
+
subgraph_id: string;
|
|
242
|
+
total_processed: number;
|
|
243
|
+
total_errors: number;
|
|
244
|
+
last_processed_block: number | null;
|
|
245
|
+
captured_at: Generated<Date>;
|
|
246
|
+
}
|
|
247
|
+
interface SubgraphUsageDailyTable {
|
|
248
|
+
subgraph_id: string;
|
|
249
|
+
date: string;
|
|
250
|
+
query_count: Generated<number>;
|
|
251
|
+
}
|
|
252
|
+
interface ProjectsTable {
|
|
253
|
+
id: Generated<string>;
|
|
254
|
+
name: string;
|
|
255
|
+
slug: string;
|
|
256
|
+
account_id: string;
|
|
257
|
+
settings: Generated<Record<string, unknown>>;
|
|
258
|
+
network: Generated<string>;
|
|
259
|
+
node_rpc: string | null;
|
|
260
|
+
created_at: Generated<Date>;
|
|
261
|
+
updated_at: Generated<Date>;
|
|
262
|
+
}
|
|
263
|
+
interface TeamMembersTable {
|
|
264
|
+
id: Generated<string>;
|
|
265
|
+
project_id: string;
|
|
266
|
+
account_id: string;
|
|
267
|
+
role: Generated<string>;
|
|
268
|
+
invited_by: string | null;
|
|
269
|
+
created_at: Generated<Date>;
|
|
270
|
+
}
|
|
271
|
+
interface TeamInvitationsTable {
|
|
272
|
+
id: Generated<string>;
|
|
273
|
+
project_id: string;
|
|
274
|
+
email: string;
|
|
275
|
+
role: Generated<string>;
|
|
276
|
+
token: string;
|
|
277
|
+
invited_by: string | null;
|
|
278
|
+
expires_at: Date;
|
|
279
|
+
accepted_at: Date | null;
|
|
280
|
+
created_at: Generated<Date>;
|
|
281
|
+
}
|
|
282
|
+
interface ChatSessionsTable {
|
|
283
|
+
id: Generated<string>;
|
|
284
|
+
account_id: string;
|
|
285
|
+
title: string | null;
|
|
286
|
+
summary: unknown | null;
|
|
287
|
+
created_at: Generated<Date>;
|
|
288
|
+
updated_at: Generated<Date>;
|
|
289
|
+
}
|
|
290
|
+
interface ChatMessagesTable {
|
|
291
|
+
id: Generated<string>;
|
|
292
|
+
chat_session_id: string;
|
|
293
|
+
role: string;
|
|
294
|
+
parts: unknown;
|
|
295
|
+
metadata: unknown | null;
|
|
296
|
+
created_at: Generated<Date>;
|
|
297
|
+
}
|
|
298
|
+
interface WorkflowDefinitionsTable {
|
|
299
|
+
id: Generated<string>;
|
|
300
|
+
name: string;
|
|
301
|
+
version: Generated<string>;
|
|
302
|
+
status: Generated<string>;
|
|
303
|
+
trigger_type: string;
|
|
304
|
+
trigger_config: unknown;
|
|
305
|
+
handler_path: string;
|
|
306
|
+
retries_config: unknown | null;
|
|
307
|
+
timeout_ms: number | null;
|
|
308
|
+
api_key_id: string;
|
|
309
|
+
project_id: string | null;
|
|
310
|
+
created_at: Generated<Date>;
|
|
311
|
+
updated_at: Generated<Date>;
|
|
312
|
+
}
|
|
313
|
+
interface WorkflowRunsTable {
|
|
314
|
+
id: Generated<string>;
|
|
315
|
+
definition_id: string;
|
|
316
|
+
status: Generated<string>;
|
|
317
|
+
trigger_type: string;
|
|
318
|
+
trigger_data: unknown | null;
|
|
319
|
+
dedup_key: string | null;
|
|
320
|
+
error: string | null;
|
|
321
|
+
started_at: Date | null;
|
|
322
|
+
completed_at: Date | null;
|
|
323
|
+
duration_ms: number | null;
|
|
324
|
+
total_ai_tokens: Generated<number>;
|
|
325
|
+
created_at: Generated<Date>;
|
|
326
|
+
}
|
|
327
|
+
interface WorkflowStepsTable {
|
|
328
|
+
id: Generated<string>;
|
|
329
|
+
run_id: string;
|
|
330
|
+
step_index: number;
|
|
331
|
+
step_id: string;
|
|
332
|
+
step_type: string;
|
|
333
|
+
status: Generated<string>;
|
|
334
|
+
input: unknown | null;
|
|
335
|
+
output: unknown | null;
|
|
336
|
+
error: string | null;
|
|
337
|
+
retry_count: Generated<number>;
|
|
338
|
+
ai_tokens_used: Generated<number>;
|
|
339
|
+
started_at: Date | null;
|
|
340
|
+
completed_at: Date | null;
|
|
341
|
+
duration_ms: number | null;
|
|
342
|
+
created_at: Generated<Date>;
|
|
343
|
+
}
|
|
344
|
+
interface WorkflowQueueTable {
|
|
345
|
+
id: Generated<string>;
|
|
346
|
+
run_id: string;
|
|
347
|
+
status: Generated<string>;
|
|
348
|
+
attempts: Generated<number>;
|
|
349
|
+
max_attempts: Generated<number>;
|
|
350
|
+
scheduled_for: Generated<Date>;
|
|
351
|
+
locked_at: Date | null;
|
|
352
|
+
locked_by: string | null;
|
|
353
|
+
error: string | null;
|
|
354
|
+
created_at: Generated<Date>;
|
|
355
|
+
completed_at: Date | null;
|
|
356
|
+
}
|
|
357
|
+
interface WorkflowSchedulesTable {
|
|
358
|
+
id: Generated<string>;
|
|
359
|
+
definition_id: string;
|
|
360
|
+
cron_expr: string;
|
|
361
|
+
timezone: Generated<string>;
|
|
362
|
+
next_run_at: Date;
|
|
363
|
+
last_run_at: Date | null;
|
|
364
|
+
enabled: Generated<boolean>;
|
|
365
|
+
created_at: Generated<Date>;
|
|
366
|
+
}
|
|
367
|
+
interface WorkflowCursorsTable {
|
|
368
|
+
name: string;
|
|
369
|
+
block_height: Generated<number>;
|
|
370
|
+
updated_at: Generated<Date>;
|
|
371
|
+
}
|
|
372
|
+
interface Database {
|
|
373
|
+
blocks: BlocksTable;
|
|
374
|
+
transactions: TransactionsTable;
|
|
375
|
+
events: EventsTable;
|
|
376
|
+
streams: StreamsTable;
|
|
377
|
+
stream_metrics: StreamMetricsTable;
|
|
378
|
+
jobs: JobsTable;
|
|
379
|
+
index_progress: IndexProgressTable;
|
|
380
|
+
deliveries: DeliveriesTable;
|
|
381
|
+
subgraphs: SubgraphsTable;
|
|
382
|
+
api_keys: ApiKeysTable;
|
|
383
|
+
accounts: AccountsTable;
|
|
384
|
+
sessions: SessionsTable;
|
|
385
|
+
magic_links: MagicLinksTable;
|
|
386
|
+
usage_daily: UsageDailyTable;
|
|
387
|
+
usage_snapshots: UsageSnapshotsTable;
|
|
388
|
+
waitlist: WaitlistTable;
|
|
389
|
+
account_insights: AccountInsightsTable;
|
|
390
|
+
account_agent_runs: AccountAgentRunsTable;
|
|
391
|
+
subgraph_health_snapshots: SubgraphHealthSnapshotsTable;
|
|
392
|
+
subgraph_processing_stats: SubgraphProcessingStatsTable;
|
|
393
|
+
subgraph_table_snapshots: SubgraphTableSnapshotsTable;
|
|
394
|
+
subgraph_gaps: SubgraphGapsTable;
|
|
395
|
+
subgraph_usage_daily: SubgraphUsageDailyTable;
|
|
396
|
+
projects: ProjectsTable;
|
|
397
|
+
team_members: TeamMembersTable;
|
|
398
|
+
team_invitations: TeamInvitationsTable;
|
|
399
|
+
chat_sessions: ChatSessionsTable;
|
|
400
|
+
chat_messages: ChatMessagesTable;
|
|
401
|
+
workflow_definitions: WorkflowDefinitionsTable;
|
|
402
|
+
workflow_runs: WorkflowRunsTable;
|
|
403
|
+
workflow_steps: WorkflowStepsTable;
|
|
404
|
+
workflow_queue: WorkflowQueueTable;
|
|
405
|
+
workflow_schedules: WorkflowSchedulesTable;
|
|
406
|
+
workflow_cursors: WorkflowCursorsTable;
|
|
407
|
+
}
|
|
408
|
+
type WorkflowDefinition = Selectable<WorkflowDefinitionsTable>;
|
|
409
|
+
type WorkflowRun = Selectable<WorkflowRunsTable>;
|
|
410
|
+
type WorkflowStep = Selectable<WorkflowStepsTable>;
|
|
411
|
+
declare function listWorkflowDefinitions(db: Kysely<Database>, apiKeyIds?: string[]): Promise<WorkflowDefinition[]>;
|
|
412
|
+
declare function getWorkflowDefinition(db: Kysely<Database>, name: string, apiKeyIds?: string[]): Promise<WorkflowDefinition | null>;
|
|
413
|
+
declare function upsertWorkflowDefinition(db: Kysely<Database>, data: {
|
|
414
|
+
name: string
|
|
415
|
+
triggerType: string
|
|
416
|
+
triggerConfig: Record<string, unknown>
|
|
417
|
+
handlerPath: string
|
|
418
|
+
apiKeyId: string
|
|
419
|
+
projectId?: string
|
|
420
|
+
retriesConfig?: Record<string, unknown>
|
|
421
|
+
timeoutMs?: number
|
|
422
|
+
version?: string
|
|
423
|
+
}): Promise<WorkflowDefinition>;
|
|
424
|
+
declare function updateWorkflowStatus(db: Kysely<Database>, name: string, apiKeyId: string, status: string): Promise<void>;
|
|
425
|
+
declare function deleteWorkflowDefinition(db: Kysely<Database>, name: string, apiKeyId: string): Promise<void>;
|
|
426
|
+
declare function createWorkflowRun(db: Kysely<Database>, data: {
|
|
427
|
+
definitionId: string
|
|
428
|
+
triggerType: string
|
|
429
|
+
triggerData?: Record<string, unknown>
|
|
430
|
+
dedupKey?: string
|
|
431
|
+
}): Promise<WorkflowRun>;
|
|
432
|
+
declare function getWorkflowRun(db: Kysely<Database>, runId: string): Promise<WorkflowRun | null>;
|
|
433
|
+
declare function listWorkflowRuns(db: Kysely<Database>, definitionId: string, params?: {
|
|
434
|
+
status?: string
|
|
435
|
+
limit?: number
|
|
436
|
+
offset?: number
|
|
437
|
+
}): Promise<WorkflowRun[]>;
|
|
438
|
+
declare function getWorkflowSteps(db: Kysely<Database>, runId: string): Promise<WorkflowStep[]>;
|
|
439
|
+
export { upsertWorkflowDefinition, updateWorkflowStatus, listWorkflowRuns, listWorkflowDefinitions, getWorkflowSteps, getWorkflowRun, getWorkflowDefinition, deleteWorkflowDefinition, createWorkflowRun };
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, {
|
|
10
|
+
get: all[name],
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/db/jsonb.ts
|
|
18
|
+
import { sql } from "kysely";
|
|
19
|
+
function jsonb(value) {
|
|
20
|
+
const escaped = JSON.stringify(value).replace(/'/g, "''");
|
|
21
|
+
return sql`${sql.raw(`'${escaped}'::jsonb`)}`;
|
|
22
|
+
}
|
|
23
|
+
function parseJsonb(value) {
|
|
24
|
+
if (typeof value === "string") {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(value);
|
|
27
|
+
} catch {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return value ?? {};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/db/queries/workflows.ts
|
|
35
|
+
async function listWorkflowDefinitions(db, apiKeyIds) {
|
|
36
|
+
let query = db.selectFrom("workflow_definitions").selectAll().where("status", "!=", "deleted").orderBy("created_at", "desc");
|
|
37
|
+
if (apiKeyIds?.length) {
|
|
38
|
+
query = query.where("api_key_id", "in", apiKeyIds);
|
|
39
|
+
}
|
|
40
|
+
return await query.execute();
|
|
41
|
+
}
|
|
42
|
+
async function getWorkflowDefinition(db, name, apiKeyIds) {
|
|
43
|
+
let query = db.selectFrom("workflow_definitions").selectAll().where("name", "=", name);
|
|
44
|
+
if (apiKeyIds?.length) {
|
|
45
|
+
query = query.where("api_key_id", "in", apiKeyIds);
|
|
46
|
+
}
|
|
47
|
+
return await query.executeTakeFirst() ?? null;
|
|
48
|
+
}
|
|
49
|
+
async function upsertWorkflowDefinition(db, data) {
|
|
50
|
+
return await db.insertInto("workflow_definitions").values({
|
|
51
|
+
name: data.name,
|
|
52
|
+
trigger_type: data.triggerType,
|
|
53
|
+
trigger_config: jsonb(data.triggerConfig),
|
|
54
|
+
handler_path: data.handlerPath,
|
|
55
|
+
api_key_id: data.apiKeyId,
|
|
56
|
+
project_id: data.projectId ?? null,
|
|
57
|
+
retries_config: data.retriesConfig ? jsonb(data.retriesConfig) : null,
|
|
58
|
+
timeout_ms: data.timeoutMs ?? null,
|
|
59
|
+
version: data.version ?? "1.0.0"
|
|
60
|
+
}).onConflict((oc) => oc.columns(["name", "api_key_id"]).doUpdateSet({
|
|
61
|
+
trigger_type: data.triggerType,
|
|
62
|
+
trigger_config: jsonb(data.triggerConfig),
|
|
63
|
+
handler_path: data.handlerPath,
|
|
64
|
+
retries_config: data.retriesConfig ? jsonb(data.retriesConfig) : null,
|
|
65
|
+
timeout_ms: data.timeoutMs ?? null,
|
|
66
|
+
version: data.version ?? "1.0.0",
|
|
67
|
+
status: "active",
|
|
68
|
+
updated_at: new Date
|
|
69
|
+
})).returningAll().executeTakeFirstOrThrow();
|
|
70
|
+
}
|
|
71
|
+
async function updateWorkflowStatus(db, name, apiKeyId, status) {
|
|
72
|
+
await db.updateTable("workflow_definitions").set({ status, updated_at: new Date }).where("name", "=", name).where("api_key_id", "=", apiKeyId).execute();
|
|
73
|
+
}
|
|
74
|
+
async function deleteWorkflowDefinition(db, name, apiKeyId) {
|
|
75
|
+
await db.updateTable("workflow_definitions").set({ status: "deleted", updated_at: new Date }).where("name", "=", name).where("api_key_id", "=", apiKeyId).execute();
|
|
76
|
+
}
|
|
77
|
+
async function createWorkflowRun(db, data) {
|
|
78
|
+
return await db.insertInto("workflow_runs").values({
|
|
79
|
+
definition_id: data.definitionId,
|
|
80
|
+
trigger_type: data.triggerType,
|
|
81
|
+
trigger_data: data.triggerData ? jsonb(data.triggerData) : null,
|
|
82
|
+
dedup_key: data.dedupKey ?? null
|
|
83
|
+
}).returningAll().executeTakeFirstOrThrow();
|
|
84
|
+
}
|
|
85
|
+
async function getWorkflowRun(db, runId) {
|
|
86
|
+
return await db.selectFrom("workflow_runs").selectAll().where("id", "=", runId).executeTakeFirst() ?? null;
|
|
87
|
+
}
|
|
88
|
+
async function listWorkflowRuns(db, definitionId, params) {
|
|
89
|
+
let query = db.selectFrom("workflow_runs").selectAll().where("definition_id", "=", definitionId).orderBy("created_at", "desc");
|
|
90
|
+
if (params?.status) {
|
|
91
|
+
query = query.where("status", "=", params.status);
|
|
92
|
+
}
|
|
93
|
+
query = query.limit(params?.limit ?? 20);
|
|
94
|
+
if (params?.offset) {
|
|
95
|
+
query = query.offset(params.offset);
|
|
96
|
+
}
|
|
97
|
+
return await query.execute();
|
|
98
|
+
}
|
|
99
|
+
async function getWorkflowSteps(db, runId) {
|
|
100
|
+
return await db.selectFrom("workflow_steps").selectAll().where("run_id", "=", runId).orderBy("step_index", "asc").execute();
|
|
101
|
+
}
|
|
102
|
+
export {
|
|
103
|
+
upsertWorkflowDefinition,
|
|
104
|
+
updateWorkflowStatus,
|
|
105
|
+
listWorkflowRuns,
|
|
106
|
+
listWorkflowDefinitions,
|
|
107
|
+
getWorkflowSteps,
|
|
108
|
+
getWorkflowRun,
|
|
109
|
+
getWorkflowDefinition,
|
|
110
|
+
deleteWorkflowDefinition,
|
|
111
|
+
createWorkflowRun
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
//# debugId=EB29175AED10824764756E2164756E21
|
|
115
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/db/jsonb.ts", "../src/db/queries/workflows.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { type RawBuilder, sql } from \"kysely\";\n\n/**\n * Safely encode a JS value as a JSONB literal for Kysely inserts/updates.\n * Kysely + postgres.js double-encodes JSON when using parameterized queries\n * with ::jsonb casts. This uses sql.raw to inline a properly escaped literal.\n */\nexport function jsonb(value: unknown): RawBuilder<unknown> {\n\tconst escaped = JSON.stringify(value).replace(/'/g, \"''\");\n\treturn sql`${sql.raw(`'${escaped}'::jsonb`)}`;\n}\n\n/**\n * Safely parse a JSONB value from the database.\n * Handles double-encoded strings where postgres.js returns a JSON string\n * instead of a parsed object.\n */\nexport function parseJsonb<T = unknown>(value: unknown): T {\n\tif (typeof value === \"string\") {\n\t\ttry {\n\t\t\treturn JSON.parse(value) as T;\n\t\t} catch {\n\t\t\treturn value as T;\n\t\t}\n\t}\n\treturn (value ?? {}) as T;\n}\n",
|
|
6
|
+
"import type { Kysely } from \"kysely\";\nimport { jsonb } from \"../jsonb.ts\";\nimport type {\n\tDatabase,\n\tWorkflowDefinition,\n\tWorkflowRun,\n\tWorkflowStep,\n} from \"../types.ts\";\n\n// ── Definitions ──────────────────────────────────────────────────────\n\nexport async function listWorkflowDefinitions(\n\tdb: Kysely<Database>,\n\tapiKeyIds?: string[],\n): Promise<WorkflowDefinition[]> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_definitions\")\n\t\t.selectAll()\n\t\t.where(\"status\", \"!=\", \"deleted\")\n\t\t.orderBy(\"created_at\", \"desc\");\n\n\tif (apiKeyIds?.length) {\n\t\tquery = query.where(\"api_key_id\", \"in\", apiKeyIds);\n\t}\n\n\treturn await query.execute();\n}\n\nexport async function getWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyIds?: string[],\n): Promise<WorkflowDefinition | null> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_definitions\")\n\t\t.selectAll()\n\t\t.where(\"name\", \"=\", name);\n\n\tif (apiKeyIds?.length) {\n\t\tquery = query.where(\"api_key_id\", \"in\", apiKeyIds);\n\t}\n\n\treturn (await query.executeTakeFirst()) ?? null;\n}\n\nexport async function upsertWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tdata: {\n\t\tname: string;\n\t\ttriggerType: string;\n\t\ttriggerConfig: Record<string, unknown>;\n\t\thandlerPath: string;\n\t\tapiKeyId: string;\n\t\tprojectId?: string;\n\t\tretriesConfig?: Record<string, unknown>;\n\t\ttimeoutMs?: number;\n\t\tversion?: string;\n\t},\n): Promise<WorkflowDefinition> {\n\treturn await db\n\t\t.insertInto(\"workflow_definitions\")\n\t\t.values({\n\t\t\tname: data.name,\n\t\t\ttrigger_type: data.triggerType,\n\t\t\ttrigger_config: jsonb(data.triggerConfig) as any,\n\t\t\thandler_path: data.handlerPath,\n\t\t\tapi_key_id: data.apiKeyId,\n\t\t\tproject_id: data.projectId ?? null,\n\t\t\tretries_config: data.retriesConfig\n\t\t\t\t? (jsonb(data.retriesConfig) as any)\n\t\t\t\t: null,\n\t\t\ttimeout_ms: data.timeoutMs ?? null,\n\t\t\tversion: data.version ?? \"1.0.0\",\n\t\t})\n\t\t.onConflict((oc) =>\n\t\t\toc.columns([\"name\", \"api_key_id\"]).doUpdateSet({\n\t\t\t\ttrigger_type: data.triggerType,\n\t\t\t\ttrigger_config: jsonb(data.triggerConfig) as any,\n\t\t\t\thandler_path: data.handlerPath,\n\t\t\t\tretries_config: data.retriesConfig\n\t\t\t\t\t? (jsonb(data.retriesConfig) as any)\n\t\t\t\t\t: null,\n\t\t\t\ttimeout_ms: data.timeoutMs ?? null,\n\t\t\t\tversion: data.version ?? \"1.0.0\",\n\t\t\t\tstatus: \"active\",\n\t\t\t\tupdated_at: new Date(),\n\t\t\t}),\n\t\t)\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n}\n\nexport async function updateWorkflowStatus(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId: string,\n\tstatus: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"workflow_definitions\")\n\t\t.set({ status, updated_at: new Date() })\n\t\t.where(\"name\", \"=\", name)\n\t\t.where(\"api_key_id\", \"=\", apiKeyId)\n\t\t.execute();\n}\n\nexport async function deleteWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"workflow_definitions\")\n\t\t.set({ status: \"deleted\", updated_at: new Date() })\n\t\t.where(\"name\", \"=\", name)\n\t\t.where(\"api_key_id\", \"=\", apiKeyId)\n\t\t.execute();\n}\n\n// ── Runs ─────────────────────────────────────────────────────────────\n\nexport async function createWorkflowRun(\n\tdb: Kysely<Database>,\n\tdata: {\n\t\tdefinitionId: string;\n\t\ttriggerType: string;\n\t\ttriggerData?: Record<string, unknown>;\n\t\tdedupKey?: string;\n\t},\n): Promise<WorkflowRun> {\n\treturn await db\n\t\t.insertInto(\"workflow_runs\")\n\t\t.values({\n\t\t\tdefinition_id: data.definitionId,\n\t\t\ttrigger_type: data.triggerType,\n\t\t\ttrigger_data: data.triggerData\n\t\t\t\t? (jsonb(data.triggerData) as any)\n\t\t\t\t: null,\n\t\t\tdedup_key: data.dedupKey ?? null,\n\t\t})\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n}\n\nexport async function getWorkflowRun(\n\tdb: Kysely<Database>,\n\trunId: string,\n): Promise<WorkflowRun | null> {\n\treturn (\n\t\t(await db\n\t\t\t.selectFrom(\"workflow_runs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", runId)\n\t\t\t.executeTakeFirst()) ?? null\n\t);\n}\n\nexport async function listWorkflowRuns(\n\tdb: Kysely<Database>,\n\tdefinitionId: string,\n\tparams?: { status?: string; limit?: number; offset?: number },\n): Promise<WorkflowRun[]> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_runs\")\n\t\t.selectAll()\n\t\t.where(\"definition_id\", \"=\", definitionId)\n\t\t.orderBy(\"created_at\", \"desc\");\n\n\tif (params?.status) {\n\t\tquery = query.where(\"status\", \"=\", params.status);\n\t}\n\n\tquery = query.limit(params?.limit ?? 20);\n\n\tif (params?.offset) {\n\t\tquery = query.offset(params.offset);\n\t}\n\n\treturn await query.execute();\n}\n\n// ── Steps ────────────────────────────────────────────────────────────\n\nexport async function getWorkflowSteps(\n\tdb: Kysely<Database>,\n\trunId: string,\n): Promise<WorkflowStep[]> {\n\treturn await db\n\t\t.selectFrom(\"workflow_steps\")\n\t\t.selectAll()\n\t\t.where(\"run_id\", \"=\", runId)\n\t\t.orderBy(\"step_index\", \"asc\")\n\t\t.execute();\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "EB29175AED10824764756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|