manychat-ai-agent 0.26.0 → 0.27.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/db/migrations/0013_meta_channels.sql +4 -0
  3. package/db/migrations/meta/0013_snapshot.json +1088 -0
  4. package/db/migrations/meta/_journal.json +7 -0
  5. package/dist/agent/prompt.js +5 -0
  6. package/dist/agent/tools/build.d.ts +23 -0
  7. package/dist/agent/tools/build.js +42 -0
  8. package/dist/agent/tools/contact-actions.d.ts +63 -0
  9. package/dist/agent/tools/contact-actions.js +64 -0
  10. package/dist/agent/tools/copy.d.ts +18 -0
  11. package/dist/agent/tools/copy.js +21 -0
  12. package/dist/agent/tools/get-contact.d.ts +5 -0
  13. package/dist/agent/tools/get-contact.js +26 -0
  14. package/dist/agent/tools/lookups.d.ts +90 -0
  15. package/dist/agent/tools/lookups.js +70 -0
  16. package/dist/agent/tools/notes.d.ts +4 -0
  17. package/dist/agent/tools/notes.js +36 -0
  18. package/dist/agent/tools/nudge.d.ts +4 -0
  19. package/dist/agent/tools/nudge.js +29 -0
  20. package/dist/agent/tools/send-flow.d.ts +4 -0
  21. package/dist/agent/tools/send-flow.js +115 -0
  22. package/dist/agent/tools/set-field.d.ts +7 -0
  23. package/dist/agent/tools/set-field.js +142 -0
  24. package/dist/agent/tools/stage.d.ts +92 -0
  25. package/dist/agent/tools/stage.js +176 -0
  26. package/dist/agent/tools/tags.d.ts +4 -0
  27. package/dist/agent/tools/tags.js +26 -0
  28. package/dist/agent/tools/turn.d.ts +93 -0
  29. package/dist/agent/tools/turn.js +93 -0
  30. package/dist/agent/tools.d.ts +11 -266
  31. package/dist/agent/tools.js +7 -738
  32. package/dist/channels/manychat/adapter.js +5 -1
  33. package/dist/channels/manychat/client.d.ts +21 -3
  34. package/dist/channels/manychat/client.js +32 -7
  35. package/dist/channels/manychat/media.js +8 -5
  36. package/dist/channels/port.d.ts +2 -0
  37. package/dist/config/loader.d.ts +2 -0
  38. package/dist/config/loader.js +15 -1
  39. package/dist/contracts/config/catalog.d.ts +55 -0
  40. package/dist/contracts/config/catalog.js +36 -0
  41. package/dist/contracts/config/channels.d.ts +22 -0
  42. package/dist/contracts/config/channels.js +58 -0
  43. package/dist/contracts/config/env.d.ts +74 -0
  44. package/dist/contracts/config/env.js +197 -0
  45. package/dist/contracts/config/funnel.d.ts +20 -0
  46. package/dist/contracts/config/funnel.js +27 -0
  47. package/dist/contracts/config/prompt-overrides.d.ts +26 -0
  48. package/dist/contracts/config/prompt-overrides.js +26 -0
  49. package/dist/contracts/config/rules.d.ts +54 -0
  50. package/dist/contracts/config/rules.js +98 -0
  51. package/dist/contracts/config/tools.d.ts +121 -0
  52. package/dist/contracts/config/tools.js +286 -0
  53. package/dist/contracts/config.d.ts +11 -329
  54. package/dist/contracts/config.js +11 -650
  55. package/dist/conversation/store.d.ts +6 -3
  56. package/dist/conversation/store.js +11 -4
  57. package/dist/db/schema.d.ts +34 -0
  58. package/dist/db/schema.js +10 -0
  59. package/dist/main.js +1 -0
  60. package/dist/nudge/checks.d.ts +46 -0
  61. package/dist/nudge/checks.js +73 -0
  62. package/dist/nudge/performer.d.ts +3 -1
  63. package/dist/nudge/performer.js +5 -2
  64. package/dist/nudge/store.d.ts +3 -1
  65. package/dist/nudge/store.js +5 -4
  66. package/dist/nudge/worker.js +50 -79
  67. package/dist/outbox/queue.d.ts +8 -0
  68. package/dist/outbox/queue.js +3 -0
  69. package/dist/outbox/worker.d.ts +20 -0
  70. package/dist/outbox/worker.js +54 -4
  71. package/dist/server.js +36 -7
  72. package/dist/turn/admission.d.ts +52 -0
  73. package/dist/turn/admission.js +94 -0
  74. package/dist/turn/completion.d.ts +23 -0
  75. package/dist/turn/completion.js +1 -0
  76. package/dist/turn/context.d.ts +23 -0
  77. package/dist/turn/context.js +33 -0
  78. package/dist/turn/deferred.d.ts +38 -0
  79. package/dist/turn/deferred.js +76 -0
  80. package/dist/turn/delivery.d.ts +102 -0
  81. package/dist/turn/delivery.js +163 -0
  82. package/dist/turn/fold.d.ts +44 -0
  83. package/dist/turn/fold.js +62 -0
  84. package/dist/{routes/turn.d.ts → turn/handler.d.ts} +14 -68
  85. package/dist/turn/handler.js +335 -0
  86. package/dist/turn/logger.d.ts +10 -0
  87. package/dist/turn/logger.js +11 -0
  88. package/dist/turn/media.d.ts +46 -0
  89. package/dist/turn/media.js +109 -0
  90. package/dist/turn/order.d.ts +49 -0
  91. package/dist/turn/order.js +115 -0
  92. package/dist/turn/prechecks.d.ts +30 -0
  93. package/dist/turn/prechecks.js +48 -0
  94. package/dist/turn/race.d.ts +7 -0
  95. package/dist/turn/race.js +18 -0
  96. package/dist/turn/recorder.d.ts +99 -0
  97. package/dist/turn/recorder.js +153 -0
  98. package/dist/turn/replies.d.ts +15 -0
  99. package/dist/turn/replies.js +25 -0
  100. package/dist/turn/result.d.ts +20 -0
  101. package/dist/turn/result.js +1 -0
  102. package/dist/turn/scope.d.ts +83 -0
  103. package/dist/turn/scope.js +72 -0
  104. package/package.json +1 -1
  105. package/dist/routes/turn.js +0 -1007
@@ -0,0 +1,1088 @@
1
+ {
2
+ "id": "b2c577a3-9455-425b-ad60-41886832e4f0",
3
+ "prevId": "5deb8a2c-6eb7-4882-8fdf-f872fdbca6c7",
4
+ "version": "7",
5
+ "dialect": "postgresql",
6
+ "tables": {
7
+ "public.budget_counters": {
8
+ "name": "budget_counters",
9
+ "schema": "",
10
+ "columns": {
11
+ "tenant_id": {
12
+ "name": "tenant_id",
13
+ "type": "text",
14
+ "primaryKey": false,
15
+ "notNull": true
16
+ },
17
+ "day": {
18
+ "name": "day",
19
+ "type": "date",
20
+ "primaryKey": false,
21
+ "notNull": true
22
+ },
23
+ "tokens": {
24
+ "name": "tokens",
25
+ "type": "integer",
26
+ "primaryKey": false,
27
+ "notNull": true,
28
+ "default": 0
29
+ },
30
+ "cost_usd": {
31
+ "name": "cost_usd",
32
+ "type": "numeric(12, 6)",
33
+ "primaryKey": false,
34
+ "notNull": true,
35
+ "default": "'0'"
36
+ }
37
+ },
38
+ "indexes": {},
39
+ "foreignKeys": {},
40
+ "compositePrimaryKeys": {
41
+ "budget_counters_tenant_id_day_pk": {
42
+ "name": "budget_counters_tenant_id_day_pk",
43
+ "columns": [
44
+ "tenant_id",
45
+ "day"
46
+ ]
47
+ }
48
+ },
49
+ "uniqueConstraints": {},
50
+ "policies": {},
51
+ "checkConstraints": {},
52
+ "isRLSEnabled": false
53
+ },
54
+ "public.conversations": {
55
+ "name": "conversations",
56
+ "schema": "",
57
+ "columns": {
58
+ "id": {
59
+ "name": "id",
60
+ "type": "uuid",
61
+ "primaryKey": true,
62
+ "notNull": true,
63
+ "default": "gen_random_uuid()"
64
+ },
65
+ "tenant_id": {
66
+ "name": "tenant_id",
67
+ "type": "text",
68
+ "primaryKey": false,
69
+ "notNull": true
70
+ },
71
+ "subscriber_id": {
72
+ "name": "subscriber_id",
73
+ "type": "text",
74
+ "primaryKey": false,
75
+ "notNull": true
76
+ },
77
+ "channel": {
78
+ "name": "channel",
79
+ "type": "text",
80
+ "primaryKey": false,
81
+ "notNull": true
82
+ },
83
+ "turn_count": {
84
+ "name": "turn_count",
85
+ "type": "integer",
86
+ "primaryKey": false,
87
+ "notNull": true,
88
+ "default": 0
89
+ },
90
+ "escalated_at": {
91
+ "name": "escalated_at",
92
+ "type": "timestamp with time zone",
93
+ "primaryKey": false,
94
+ "notNull": false
95
+ },
96
+ "last_message_at": {
97
+ "name": "last_message_at",
98
+ "type": "timestamp with time zone",
99
+ "primaryKey": false,
100
+ "notNull": true,
101
+ "default": "now()"
102
+ },
103
+ "token_hash": {
104
+ "name": "token_hash",
105
+ "type": "text",
106
+ "primaryKey": false,
107
+ "notNull": false
108
+ },
109
+ "previous_token_hash": {
110
+ "name": "previous_token_hash",
111
+ "type": "text",
112
+ "primaryKey": false,
113
+ "notNull": false
114
+ },
115
+ "token_issued_at": {
116
+ "name": "token_issued_at",
117
+ "type": "timestamp with time zone",
118
+ "primaryKey": false,
119
+ "notNull": false
120
+ },
121
+ "token_generation": {
122
+ "name": "token_generation",
123
+ "type": "integer",
124
+ "primaryKey": false,
125
+ "notNull": true,
126
+ "default": 0
127
+ },
128
+ "offering": {
129
+ "name": "offering",
130
+ "type": "text",
131
+ "primaryKey": false,
132
+ "notNull": false
133
+ },
134
+ "opening_sent_at": {
135
+ "name": "opening_sent_at",
136
+ "type": "timestamp with time zone",
137
+ "primaryKey": false,
138
+ "notNull": false
139
+ },
140
+ "created_at": {
141
+ "name": "created_at",
142
+ "type": "timestamp with time zone",
143
+ "primaryKey": false,
144
+ "notNull": true,
145
+ "default": "now()"
146
+ },
147
+ "updated_at": {
148
+ "name": "updated_at",
149
+ "type": "timestamp with time zone",
150
+ "primaryKey": false,
151
+ "notNull": true,
152
+ "default": "now()"
153
+ }
154
+ },
155
+ "indexes": {
156
+ "conversations_tenant_subscriber_uq": {
157
+ "name": "conversations_tenant_subscriber_uq",
158
+ "columns": [
159
+ {
160
+ "expression": "tenant_id",
161
+ "isExpression": false,
162
+ "asc": true,
163
+ "nulls": "last"
164
+ },
165
+ {
166
+ "expression": "subscriber_id",
167
+ "isExpression": false,
168
+ "asc": true,
169
+ "nulls": "last"
170
+ }
171
+ ],
172
+ "isUnique": true,
173
+ "concurrently": false,
174
+ "method": "btree",
175
+ "with": {}
176
+ }
177
+ },
178
+ "foreignKeys": {},
179
+ "compositePrimaryKeys": {},
180
+ "uniqueConstraints": {},
181
+ "policies": {},
182
+ "checkConstraints": {},
183
+ "isRLSEnabled": false
184
+ },
185
+ "public.eval_records": {
186
+ "name": "eval_records",
187
+ "schema": "",
188
+ "columns": {
189
+ "id": {
190
+ "name": "id",
191
+ "type": "uuid",
192
+ "primaryKey": true,
193
+ "notNull": true,
194
+ "default": "gen_random_uuid()"
195
+ },
196
+ "tenant_id": {
197
+ "name": "tenant_id",
198
+ "type": "text",
199
+ "primaryKey": false,
200
+ "notNull": true
201
+ },
202
+ "playbook_hash": {
203
+ "name": "playbook_hash",
204
+ "type": "text",
205
+ "primaryKey": false,
206
+ "notNull": true
207
+ },
208
+ "suite_hash": {
209
+ "name": "suite_hash",
210
+ "type": "text",
211
+ "primaryKey": false,
212
+ "notNull": true
213
+ },
214
+ "model": {
215
+ "name": "model",
216
+ "type": "text",
217
+ "primaryKey": false,
218
+ "notNull": true
219
+ },
220
+ "outcomes": {
221
+ "name": "outcomes",
222
+ "type": "jsonb",
223
+ "primaryKey": false,
224
+ "notNull": true
225
+ },
226
+ "created_at": {
227
+ "name": "created_at",
228
+ "type": "timestamp with time zone",
229
+ "primaryKey": false,
230
+ "notNull": true,
231
+ "default": "now()"
232
+ }
233
+ },
234
+ "indexes": {
235
+ "eval_records_lookup_idx": {
236
+ "name": "eval_records_lookup_idx",
237
+ "columns": [
238
+ {
239
+ "expression": "tenant_id",
240
+ "isExpression": false,
241
+ "asc": true,
242
+ "nulls": "last"
243
+ },
244
+ {
245
+ "expression": "playbook_hash",
246
+ "isExpression": false,
247
+ "asc": true,
248
+ "nulls": "last"
249
+ },
250
+ {
251
+ "expression": "suite_hash",
252
+ "isExpression": false,
253
+ "asc": true,
254
+ "nulls": "last"
255
+ }
256
+ ],
257
+ "isUnique": false,
258
+ "concurrently": false,
259
+ "method": "btree",
260
+ "with": {}
261
+ }
262
+ },
263
+ "foreignKeys": {},
264
+ "compositePrimaryKeys": {},
265
+ "uniqueConstraints": {},
266
+ "policies": {},
267
+ "checkConstraints": {},
268
+ "isRLSEnabled": false
269
+ },
270
+ "public.insight_proposals": {
271
+ "name": "insight_proposals",
272
+ "schema": "",
273
+ "columns": {
274
+ "id": {
275
+ "name": "id",
276
+ "type": "uuid",
277
+ "primaryKey": true,
278
+ "notNull": true,
279
+ "default": "gen_random_uuid()"
280
+ },
281
+ "tenant_id": {
282
+ "name": "tenant_id",
283
+ "type": "text",
284
+ "primaryKey": false,
285
+ "notNull": true
286
+ },
287
+ "run_id": {
288
+ "name": "run_id",
289
+ "type": "uuid",
290
+ "primaryKey": false,
291
+ "notNull": true
292
+ },
293
+ "text": {
294
+ "name": "text",
295
+ "type": "text",
296
+ "primaryKey": false,
297
+ "notNull": true
298
+ },
299
+ "rationale": {
300
+ "name": "rationale",
301
+ "type": "text",
302
+ "primaryKey": false,
303
+ "notNull": true
304
+ },
305
+ "converted_count": {
306
+ "name": "converted_count",
307
+ "type": "integer",
308
+ "primaryKey": false,
309
+ "notNull": true
310
+ },
311
+ "not_converted_count": {
312
+ "name": "not_converted_count",
313
+ "type": "integer",
314
+ "primaryKey": false,
315
+ "notNull": true
316
+ },
317
+ "turn_ids": {
318
+ "name": "turn_ids",
319
+ "type": "jsonb",
320
+ "primaryKey": false,
321
+ "notNull": true
322
+ },
323
+ "status": {
324
+ "name": "status",
325
+ "type": "text",
326
+ "primaryKey": false,
327
+ "notNull": true,
328
+ "default": "'pending'"
329
+ },
330
+ "reviewed_at": {
331
+ "name": "reviewed_at",
332
+ "type": "timestamp with time zone",
333
+ "primaryKey": false,
334
+ "notNull": false
335
+ },
336
+ "created_at": {
337
+ "name": "created_at",
338
+ "type": "timestamp with time zone",
339
+ "primaryKey": false,
340
+ "notNull": true,
341
+ "default": "now()"
342
+ }
343
+ },
344
+ "indexes": {
345
+ "insight_proposals_tenant_status_idx": {
346
+ "name": "insight_proposals_tenant_status_idx",
347
+ "columns": [
348
+ {
349
+ "expression": "tenant_id",
350
+ "isExpression": false,
351
+ "asc": true,
352
+ "nulls": "last"
353
+ },
354
+ {
355
+ "expression": "status",
356
+ "isExpression": false,
357
+ "asc": true,
358
+ "nulls": "last"
359
+ }
360
+ ],
361
+ "isUnique": false,
362
+ "concurrently": false,
363
+ "method": "btree",
364
+ "with": {}
365
+ }
366
+ },
367
+ "foreignKeys": {
368
+ "insight_proposals_run_id_learning_runs_id_fk": {
369
+ "name": "insight_proposals_run_id_learning_runs_id_fk",
370
+ "tableFrom": "insight_proposals",
371
+ "tableTo": "learning_runs",
372
+ "columnsFrom": [
373
+ "run_id"
374
+ ],
375
+ "columnsTo": [
376
+ "id"
377
+ ],
378
+ "onDelete": "cascade",
379
+ "onUpdate": "no action"
380
+ }
381
+ },
382
+ "compositePrimaryKeys": {},
383
+ "uniqueConstraints": {},
384
+ "policies": {},
385
+ "checkConstraints": {},
386
+ "isRLSEnabled": false
387
+ },
388
+ "public.learning_runs": {
389
+ "name": "learning_runs",
390
+ "schema": "",
391
+ "columns": {
392
+ "id": {
393
+ "name": "id",
394
+ "type": "uuid",
395
+ "primaryKey": true,
396
+ "notNull": true,
397
+ "default": "gen_random_uuid()"
398
+ },
399
+ "tenant_id": {
400
+ "name": "tenant_id",
401
+ "type": "text",
402
+ "primaryKey": false,
403
+ "notNull": true
404
+ },
405
+ "week": {
406
+ "name": "week",
407
+ "type": "text",
408
+ "primaryKey": false,
409
+ "notNull": true
410
+ },
411
+ "forced": {
412
+ "name": "forced",
413
+ "type": "boolean",
414
+ "primaryKey": false,
415
+ "notNull": true,
416
+ "default": false
417
+ },
418
+ "status": {
419
+ "name": "status",
420
+ "type": "text",
421
+ "primaryKey": false,
422
+ "notNull": true,
423
+ "default": "'running'"
424
+ },
425
+ "converted_count": {
426
+ "name": "converted_count",
427
+ "type": "integer",
428
+ "primaryKey": false,
429
+ "notNull": false
430
+ },
431
+ "not_converted_count": {
432
+ "name": "not_converted_count",
433
+ "type": "integer",
434
+ "primaryKey": false,
435
+ "notNull": false
436
+ },
437
+ "cost_usd": {
438
+ "name": "cost_usd",
439
+ "type": "numeric(12, 6)",
440
+ "primaryKey": false,
441
+ "notNull": false
442
+ },
443
+ "started_at": {
444
+ "name": "started_at",
445
+ "type": "timestamp with time zone",
446
+ "primaryKey": false,
447
+ "notNull": true,
448
+ "default": "now()"
449
+ },
450
+ "finished_at": {
451
+ "name": "finished_at",
452
+ "type": "timestamp with time zone",
453
+ "primaryKey": false,
454
+ "notNull": false
455
+ }
456
+ },
457
+ "indexes": {
458
+ "learning_runs_week_uq": {
459
+ "name": "learning_runs_week_uq",
460
+ "columns": [
461
+ {
462
+ "expression": "tenant_id",
463
+ "isExpression": false,
464
+ "asc": true,
465
+ "nulls": "last"
466
+ },
467
+ {
468
+ "expression": "week",
469
+ "isExpression": false,
470
+ "asc": true,
471
+ "nulls": "last"
472
+ }
473
+ ],
474
+ "isUnique": true,
475
+ "where": "\"learning_runs\".\"forced\" = false",
476
+ "concurrently": false,
477
+ "method": "btree",
478
+ "with": {}
479
+ }
480
+ },
481
+ "foreignKeys": {},
482
+ "compositePrimaryKeys": {},
483
+ "uniqueConstraints": {},
484
+ "policies": {},
485
+ "checkConstraints": {},
486
+ "isRLSEnabled": false
487
+ },
488
+ "public.nudges": {
489
+ "name": "nudges",
490
+ "schema": "",
491
+ "columns": {
492
+ "id": {
493
+ "name": "id",
494
+ "type": "uuid",
495
+ "primaryKey": true,
496
+ "notNull": true,
497
+ "default": "gen_random_uuid()"
498
+ },
499
+ "conversation_id": {
500
+ "name": "conversation_id",
501
+ "type": "uuid",
502
+ "primaryKey": false,
503
+ "notNull": true
504
+ },
505
+ "due_at": {
506
+ "name": "due_at",
507
+ "type": "timestamp with time zone",
508
+ "primaryKey": false,
509
+ "notNull": true
510
+ },
511
+ "status": {
512
+ "name": "status",
513
+ "type": "text",
514
+ "primaryKey": false,
515
+ "notNull": true,
516
+ "default": "'pending'"
517
+ },
518
+ "cancel_reason": {
519
+ "name": "cancel_reason",
520
+ "type": "text",
521
+ "primaryKey": false,
522
+ "notNull": false
523
+ },
524
+ "channel": {
525
+ "name": "channel",
526
+ "type": "text",
527
+ "primaryKey": false,
528
+ "notNull": false
529
+ },
530
+ "scheduled_at": {
531
+ "name": "scheduled_at",
532
+ "type": "timestamp with time zone",
533
+ "primaryKey": false,
534
+ "notNull": true,
535
+ "default": "now()"
536
+ },
537
+ "created_at": {
538
+ "name": "created_at",
539
+ "type": "timestamp with time zone",
540
+ "primaryKey": false,
541
+ "notNull": true,
542
+ "default": "now()"
543
+ },
544
+ "updated_at": {
545
+ "name": "updated_at",
546
+ "type": "timestamp with time zone",
547
+ "primaryKey": false,
548
+ "notNull": true,
549
+ "default": "now()"
550
+ }
551
+ },
552
+ "indexes": {
553
+ "nudges_one_pending_uq": {
554
+ "name": "nudges_one_pending_uq",
555
+ "columns": [
556
+ {
557
+ "expression": "conversation_id",
558
+ "isExpression": false,
559
+ "asc": true,
560
+ "nulls": "last"
561
+ }
562
+ ],
563
+ "isUnique": true,
564
+ "where": "\"nudges\".\"status\" = 'pending'",
565
+ "concurrently": false,
566
+ "method": "btree",
567
+ "with": {}
568
+ },
569
+ "nudges_claim_idx": {
570
+ "name": "nudges_claim_idx",
571
+ "columns": [
572
+ {
573
+ "expression": "status",
574
+ "isExpression": false,
575
+ "asc": true,
576
+ "nulls": "last"
577
+ },
578
+ {
579
+ "expression": "due_at",
580
+ "isExpression": false,
581
+ "asc": true,
582
+ "nulls": "last"
583
+ }
584
+ ],
585
+ "isUnique": false,
586
+ "concurrently": false,
587
+ "method": "btree",
588
+ "with": {}
589
+ }
590
+ },
591
+ "foreignKeys": {
592
+ "nudges_conversation_id_conversations_id_fk": {
593
+ "name": "nudges_conversation_id_conversations_id_fk",
594
+ "tableFrom": "nudges",
595
+ "tableTo": "conversations",
596
+ "columnsFrom": [
597
+ "conversation_id"
598
+ ],
599
+ "columnsTo": [
600
+ "id"
601
+ ],
602
+ "onDelete": "cascade",
603
+ "onUpdate": "no action"
604
+ }
605
+ },
606
+ "compositePrimaryKeys": {},
607
+ "uniqueConstraints": {},
608
+ "policies": {},
609
+ "checkConstraints": {},
610
+ "isRLSEnabled": false
611
+ },
612
+ "public.outbox": {
613
+ "name": "outbox",
614
+ "schema": "",
615
+ "columns": {
616
+ "id": {
617
+ "name": "id",
618
+ "type": "uuid",
619
+ "primaryKey": true,
620
+ "notNull": true,
621
+ "default": "gen_random_uuid()"
622
+ },
623
+ "tenant_id": {
624
+ "name": "tenant_id",
625
+ "type": "text",
626
+ "primaryKey": false,
627
+ "notNull": true
628
+ },
629
+ "subscriber_id": {
630
+ "name": "subscriber_id",
631
+ "type": "text",
632
+ "primaryKey": false,
633
+ "notNull": true
634
+ },
635
+ "conversation_id": {
636
+ "name": "conversation_id",
637
+ "type": "uuid",
638
+ "primaryKey": false,
639
+ "notNull": false
640
+ },
641
+ "kind": {
642
+ "name": "kind",
643
+ "type": "text",
644
+ "primaryKey": false,
645
+ "notNull": true,
646
+ "default": "'reply'"
647
+ },
648
+ "payload": {
649
+ "name": "payload",
650
+ "type": "jsonb",
651
+ "primaryKey": false,
652
+ "notNull": true
653
+ },
654
+ "status": {
655
+ "name": "status",
656
+ "type": "text",
657
+ "primaryKey": false,
658
+ "notNull": true,
659
+ "default": "'pending'"
660
+ },
661
+ "attempts": {
662
+ "name": "attempts",
663
+ "type": "integer",
664
+ "primaryKey": false,
665
+ "notNull": true,
666
+ "default": 0
667
+ },
668
+ "next_attempt_at": {
669
+ "name": "next_attempt_at",
670
+ "type": "timestamp with time zone",
671
+ "primaryKey": false,
672
+ "notNull": true,
673
+ "default": "now()"
674
+ },
675
+ "last_error": {
676
+ "name": "last_error",
677
+ "type": "text",
678
+ "primaryKey": false,
679
+ "notNull": false
680
+ },
681
+ "created_at": {
682
+ "name": "created_at",
683
+ "type": "timestamp with time zone",
684
+ "primaryKey": false,
685
+ "notNull": true,
686
+ "default": "now()"
687
+ },
688
+ "delivered_at": {
689
+ "name": "delivered_at",
690
+ "type": "timestamp with time zone",
691
+ "primaryKey": false,
692
+ "notNull": false
693
+ }
694
+ },
695
+ "indexes": {
696
+ "outbox_claim_idx": {
697
+ "name": "outbox_claim_idx",
698
+ "columns": [
699
+ {
700
+ "expression": "status",
701
+ "isExpression": false,
702
+ "asc": true,
703
+ "nulls": "last"
704
+ },
705
+ {
706
+ "expression": "next_attempt_at",
707
+ "isExpression": false,
708
+ "asc": true,
709
+ "nulls": "last"
710
+ }
711
+ ],
712
+ "isUnique": false,
713
+ "concurrently": false,
714
+ "method": "btree",
715
+ "with": {}
716
+ },
717
+ "outbox_queued_reply_idx": {
718
+ "name": "outbox_queued_reply_idx",
719
+ "columns": [
720
+ {
721
+ "expression": "tenant_id",
722
+ "isExpression": false,
723
+ "asc": true,
724
+ "nulls": "last"
725
+ },
726
+ {
727
+ "expression": "subscriber_id",
728
+ "isExpression": false,
729
+ "asc": true,
730
+ "nulls": "last"
731
+ },
732
+ {
733
+ "expression": "created_at",
734
+ "isExpression": false,
735
+ "asc": true,
736
+ "nulls": "last"
737
+ }
738
+ ],
739
+ "isUnique": false,
740
+ "where": "\"outbox\".\"kind\" = 'reply' AND \"outbox\".\"status\" IN ('pending', 'delivering')",
741
+ "concurrently": false,
742
+ "method": "btree",
743
+ "with": {}
744
+ }
745
+ },
746
+ "foreignKeys": {
747
+ "outbox_conversation_id_conversations_id_fk": {
748
+ "name": "outbox_conversation_id_conversations_id_fk",
749
+ "tableFrom": "outbox",
750
+ "tableTo": "conversations",
751
+ "columnsFrom": [
752
+ "conversation_id"
753
+ ],
754
+ "columnsTo": [
755
+ "id"
756
+ ],
757
+ "onDelete": "cascade",
758
+ "onUpdate": "no action"
759
+ }
760
+ },
761
+ "compositePrimaryKeys": {},
762
+ "uniqueConstraints": {},
763
+ "policies": {},
764
+ "checkConstraints": {},
765
+ "isRLSEnabled": false
766
+ },
767
+ "public.playbook_versions": {
768
+ "name": "playbook_versions",
769
+ "schema": "",
770
+ "columns": {
771
+ "id": {
772
+ "name": "id",
773
+ "type": "uuid",
774
+ "primaryKey": true,
775
+ "notNull": true,
776
+ "default": "gen_random_uuid()"
777
+ },
778
+ "tenant_id": {
779
+ "name": "tenant_id",
780
+ "type": "text",
781
+ "primaryKey": false,
782
+ "notNull": true
783
+ },
784
+ "content_hash": {
785
+ "name": "content_hash",
786
+ "type": "text",
787
+ "primaryKey": false,
788
+ "notNull": true
789
+ },
790
+ "insights": {
791
+ "name": "insights",
792
+ "type": "jsonb",
793
+ "primaryKey": false,
794
+ "notNull": true
795
+ },
796
+ "active": {
797
+ "name": "active",
798
+ "type": "boolean",
799
+ "primaryKey": false,
800
+ "notNull": true,
801
+ "default": false
802
+ },
803
+ "activated_at": {
804
+ "name": "activated_at",
805
+ "type": "timestamp with time zone",
806
+ "primaryKey": false,
807
+ "notNull": false
808
+ },
809
+ "created_at": {
810
+ "name": "created_at",
811
+ "type": "timestamp with time zone",
812
+ "primaryKey": false,
813
+ "notNull": true,
814
+ "default": "now()"
815
+ }
816
+ },
817
+ "indexes": {
818
+ "playbook_versions_content_uq": {
819
+ "name": "playbook_versions_content_uq",
820
+ "columns": [
821
+ {
822
+ "expression": "tenant_id",
823
+ "isExpression": false,
824
+ "asc": true,
825
+ "nulls": "last"
826
+ },
827
+ {
828
+ "expression": "content_hash",
829
+ "isExpression": false,
830
+ "asc": true,
831
+ "nulls": "last"
832
+ }
833
+ ],
834
+ "isUnique": true,
835
+ "concurrently": false,
836
+ "method": "btree",
837
+ "with": {}
838
+ },
839
+ "playbook_versions_one_active_uq": {
840
+ "name": "playbook_versions_one_active_uq",
841
+ "columns": [
842
+ {
843
+ "expression": "tenant_id",
844
+ "isExpression": false,
845
+ "asc": true,
846
+ "nulls": "last"
847
+ }
848
+ ],
849
+ "isUnique": true,
850
+ "where": "\"playbook_versions\".\"active\" = true",
851
+ "concurrently": false,
852
+ "method": "btree",
853
+ "with": {}
854
+ }
855
+ },
856
+ "foreignKeys": {},
857
+ "compositePrimaryKeys": {},
858
+ "uniqueConstraints": {},
859
+ "policies": {},
860
+ "checkConstraints": {},
861
+ "isRLSEnabled": false
862
+ },
863
+ "public.rate_counters": {
864
+ "name": "rate_counters",
865
+ "schema": "",
866
+ "columns": {
867
+ "tenant_id": {
868
+ "name": "tenant_id",
869
+ "type": "text",
870
+ "primaryKey": false,
871
+ "notNull": true
872
+ },
873
+ "subscriber_id": {
874
+ "name": "subscriber_id",
875
+ "type": "text",
876
+ "primaryKey": false,
877
+ "notNull": true
878
+ },
879
+ "window_start": {
880
+ "name": "window_start",
881
+ "type": "timestamp with time zone",
882
+ "primaryKey": false,
883
+ "notNull": true
884
+ },
885
+ "count": {
886
+ "name": "count",
887
+ "type": "integer",
888
+ "primaryKey": false,
889
+ "notNull": true,
890
+ "default": 0
891
+ }
892
+ },
893
+ "indexes": {},
894
+ "foreignKeys": {},
895
+ "compositePrimaryKeys": {
896
+ "rate_counters_tenant_id_subscriber_id_window_start_pk": {
897
+ "name": "rate_counters_tenant_id_subscriber_id_window_start_pk",
898
+ "columns": [
899
+ "tenant_id",
900
+ "subscriber_id",
901
+ "window_start"
902
+ ]
903
+ }
904
+ },
905
+ "uniqueConstraints": {},
906
+ "policies": {},
907
+ "checkConstraints": {},
908
+ "isRLSEnabled": false
909
+ },
910
+ "public.turns": {
911
+ "name": "turns",
912
+ "schema": "",
913
+ "columns": {
914
+ "id": {
915
+ "name": "id",
916
+ "type": "uuid",
917
+ "primaryKey": true,
918
+ "notNull": true,
919
+ "default": "gen_random_uuid()"
920
+ },
921
+ "seq": {
922
+ "name": "seq",
923
+ "type": "serial",
924
+ "primaryKey": false,
925
+ "notNull": true
926
+ },
927
+ "conversation_id": {
928
+ "name": "conversation_id",
929
+ "type": "uuid",
930
+ "primaryKey": false,
931
+ "notNull": true
932
+ },
933
+ "role": {
934
+ "name": "role",
935
+ "type": "text",
936
+ "primaryKey": false,
937
+ "notNull": true
938
+ },
939
+ "text": {
940
+ "name": "text",
941
+ "type": "text",
942
+ "primaryKey": false,
943
+ "notNull": true
944
+ },
945
+ "outcome": {
946
+ "name": "outcome",
947
+ "type": "text",
948
+ "primaryKey": false,
949
+ "notNull": false
950
+ },
951
+ "model": {
952
+ "name": "model",
953
+ "type": "text",
954
+ "primaryKey": false,
955
+ "notNull": false
956
+ },
957
+ "bound": {
958
+ "name": "bound",
959
+ "type": "boolean",
960
+ "primaryKey": false,
961
+ "notNull": true,
962
+ "default": true
963
+ },
964
+ "channel": {
965
+ "name": "channel",
966
+ "type": "text",
967
+ "primaryKey": false,
968
+ "notNull": false
969
+ },
970
+ "media_kind": {
971
+ "name": "media_kind",
972
+ "type": "text",
973
+ "primaryKey": false,
974
+ "notNull": false
975
+ },
976
+ "actions": {
977
+ "name": "actions",
978
+ "type": "jsonb",
979
+ "primaryKey": false,
980
+ "notNull": false
981
+ },
982
+ "reads": {
983
+ "name": "reads",
984
+ "type": "jsonb",
985
+ "primaryKey": false,
986
+ "notNull": false
987
+ },
988
+ "input_tokens": {
989
+ "name": "input_tokens",
990
+ "type": "integer",
991
+ "primaryKey": false,
992
+ "notNull": false
993
+ },
994
+ "output_tokens": {
995
+ "name": "output_tokens",
996
+ "type": "integer",
997
+ "primaryKey": false,
998
+ "notNull": false
999
+ },
1000
+ "cache_read_tokens": {
1001
+ "name": "cache_read_tokens",
1002
+ "type": "integer",
1003
+ "primaryKey": false,
1004
+ "notNull": false
1005
+ },
1006
+ "cost_usd": {
1007
+ "name": "cost_usd",
1008
+ "type": "numeric(12, 6)",
1009
+ "primaryKey": false,
1010
+ "notNull": false
1011
+ },
1012
+ "latency_ms": {
1013
+ "name": "latency_ms",
1014
+ "type": "integer",
1015
+ "primaryKey": false,
1016
+ "notNull": false
1017
+ },
1018
+ "playbook_version": {
1019
+ "name": "playbook_version",
1020
+ "type": "text",
1021
+ "primaryKey": false,
1022
+ "notNull": false
1023
+ },
1024
+ "created_at": {
1025
+ "name": "created_at",
1026
+ "type": "timestamp with time zone",
1027
+ "primaryKey": false,
1028
+ "notNull": true,
1029
+ "default": "now()"
1030
+ }
1031
+ },
1032
+ "indexes": {
1033
+ "turns_conversation_created_idx": {
1034
+ "name": "turns_conversation_created_idx",
1035
+ "columns": [
1036
+ {
1037
+ "expression": "conversation_id",
1038
+ "isExpression": false,
1039
+ "asc": true,
1040
+ "nulls": "last"
1041
+ },
1042
+ {
1043
+ "expression": "created_at",
1044
+ "isExpression": false,
1045
+ "asc": true,
1046
+ "nulls": "last"
1047
+ }
1048
+ ],
1049
+ "isUnique": false,
1050
+ "concurrently": false,
1051
+ "method": "btree",
1052
+ "with": {}
1053
+ }
1054
+ },
1055
+ "foreignKeys": {
1056
+ "turns_conversation_id_conversations_id_fk": {
1057
+ "name": "turns_conversation_id_conversations_id_fk",
1058
+ "tableFrom": "turns",
1059
+ "tableTo": "conversations",
1060
+ "columnsFrom": [
1061
+ "conversation_id"
1062
+ ],
1063
+ "columnsTo": [
1064
+ "id"
1065
+ ],
1066
+ "onDelete": "cascade",
1067
+ "onUpdate": "no action"
1068
+ }
1069
+ },
1070
+ "compositePrimaryKeys": {},
1071
+ "uniqueConstraints": {},
1072
+ "policies": {},
1073
+ "checkConstraints": {},
1074
+ "isRLSEnabled": false
1075
+ }
1076
+ },
1077
+ "enums": {},
1078
+ "schemas": {},
1079
+ "sequences": {},
1080
+ "roles": {},
1081
+ "policies": {},
1082
+ "views": {},
1083
+ "_meta": {
1084
+ "columns": {},
1085
+ "schemas": {},
1086
+ "tables": {}
1087
+ }
1088
+ }