manychat-ai-agent 0.20.0 → 0.22.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 (61) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/db/migrations/0012_offerings_and_conversions.sql +5 -0
  3. package/db/migrations/meta/0012_snapshot.json +1076 -0
  4. package/db/migrations/meta/_journal.json +7 -0
  5. package/dist/agent/guardrails.d.ts +2 -2
  6. package/dist/agent/guardrails.js +6 -6
  7. package/dist/agent/mock-provider.js +86 -28
  8. package/dist/agent/prompt.d.ts +4 -4
  9. package/dist/agent/prompt.js +65 -62
  10. package/dist/agent/runner.js +8 -8
  11. package/dist/agent/tools.d.ts +19 -18
  12. package/dist/agent/tools.js +41 -39
  13. package/dist/channels/manychat/adapter.js +4 -3
  14. package/dist/channels/port.d.ts +2 -2
  15. package/dist/cli/run.js +51 -5
  16. package/dist/config/index.d.ts +2 -2
  17. package/dist/config/index.js +1 -1
  18. package/dist/config/loader.js +62 -18
  19. package/dist/contracts/agent.d.ts +3 -3
  20. package/dist/contracts/agent.js +6 -6
  21. package/dist/contracts/config.d.ts +16 -16
  22. package/dist/contracts/config.js +25 -23
  23. package/dist/contracts/learning.d.ts +6 -6
  24. package/dist/contracts/learning.js +10 -2
  25. package/dist/contracts/manychat.d.ts +1 -0
  26. package/dist/contracts/manychat.js +9 -3
  27. package/dist/conversation/actions.d.ts +3 -3
  28. package/dist/conversation/actions.js +7 -7
  29. package/dist/conversation/store.d.ts +7 -7
  30. package/dist/conversation/store.js +7 -7
  31. package/dist/db/schema.d.ts +10 -10
  32. package/dist/db/schema.js +9 -8
  33. package/dist/evals/cases.d.ts +3 -3
  34. package/dist/evals/cases.js +7 -5
  35. package/dist/evals/runner.js +2 -2
  36. package/dist/learning/analyst.d.ts +2 -2
  37. package/dist/learning/analyst.js +14 -14
  38. package/dist/learning/cli.d.ts +2 -2
  39. package/dist/learning/cli.js +10 -10
  40. package/dist/learning/cohort.d.ts +3 -3
  41. package/dist/learning/cohort.js +4 -4
  42. package/dist/learning/commands.js +3 -3
  43. package/dist/learning/job.d.ts +2 -2
  44. package/dist/learning/job.js +12 -12
  45. package/dist/learning/store.d.ts +6 -6
  46. package/dist/learning/store.js +6 -6
  47. package/dist/migrations/index.d.ts +18 -2
  48. package/dist/migrations/index.js +31 -15
  49. package/dist/migrations/offerings.d.ts +7 -0
  50. package/dist/migrations/offerings.js +103 -0
  51. package/dist/nudge/worker.js +4 -4
  52. package/dist/outbox/worker.js +5 -5
  53. package/dist/plugins/loader.d.ts +20 -0
  54. package/dist/plugins/loader.js +13 -6
  55. package/dist/plugins/scaffold.d.ts +52 -0
  56. package/dist/plugins/scaffold.js +302 -0
  57. package/dist/routes/turn.js +27 -24
  58. package/dist/server.js +2 -2
  59. package/package.json +4 -3
  60. package/src/plugins/templates/read.js.tmpl +57 -0
  61. package/src/plugins/templates/write.js.tmpl +44 -0
@@ -0,0 +1,1076 @@
1
+ {
2
+ "id": "5deb8a2c-6eb7-4882-8fdf-f872fdbca6c7",
3
+ "prevId": "5a391636-6bac-4b41-97f4-8079488f2a3e",
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
+ "scheduled_at": {
525
+ "name": "scheduled_at",
526
+ "type": "timestamp with time zone",
527
+ "primaryKey": false,
528
+ "notNull": true,
529
+ "default": "now()"
530
+ },
531
+ "created_at": {
532
+ "name": "created_at",
533
+ "type": "timestamp with time zone",
534
+ "primaryKey": false,
535
+ "notNull": true,
536
+ "default": "now()"
537
+ },
538
+ "updated_at": {
539
+ "name": "updated_at",
540
+ "type": "timestamp with time zone",
541
+ "primaryKey": false,
542
+ "notNull": true,
543
+ "default": "now()"
544
+ }
545
+ },
546
+ "indexes": {
547
+ "nudges_one_pending_uq": {
548
+ "name": "nudges_one_pending_uq",
549
+ "columns": [
550
+ {
551
+ "expression": "conversation_id",
552
+ "isExpression": false,
553
+ "asc": true,
554
+ "nulls": "last"
555
+ }
556
+ ],
557
+ "isUnique": true,
558
+ "where": "\"nudges\".\"status\" = 'pending'",
559
+ "concurrently": false,
560
+ "method": "btree",
561
+ "with": {}
562
+ },
563
+ "nudges_claim_idx": {
564
+ "name": "nudges_claim_idx",
565
+ "columns": [
566
+ {
567
+ "expression": "status",
568
+ "isExpression": false,
569
+ "asc": true,
570
+ "nulls": "last"
571
+ },
572
+ {
573
+ "expression": "due_at",
574
+ "isExpression": false,
575
+ "asc": true,
576
+ "nulls": "last"
577
+ }
578
+ ],
579
+ "isUnique": false,
580
+ "concurrently": false,
581
+ "method": "btree",
582
+ "with": {}
583
+ }
584
+ },
585
+ "foreignKeys": {
586
+ "nudges_conversation_id_conversations_id_fk": {
587
+ "name": "nudges_conversation_id_conversations_id_fk",
588
+ "tableFrom": "nudges",
589
+ "tableTo": "conversations",
590
+ "columnsFrom": [
591
+ "conversation_id"
592
+ ],
593
+ "columnsTo": [
594
+ "id"
595
+ ],
596
+ "onDelete": "cascade",
597
+ "onUpdate": "no action"
598
+ }
599
+ },
600
+ "compositePrimaryKeys": {},
601
+ "uniqueConstraints": {},
602
+ "policies": {},
603
+ "checkConstraints": {},
604
+ "isRLSEnabled": false
605
+ },
606
+ "public.outbox": {
607
+ "name": "outbox",
608
+ "schema": "",
609
+ "columns": {
610
+ "id": {
611
+ "name": "id",
612
+ "type": "uuid",
613
+ "primaryKey": true,
614
+ "notNull": true,
615
+ "default": "gen_random_uuid()"
616
+ },
617
+ "tenant_id": {
618
+ "name": "tenant_id",
619
+ "type": "text",
620
+ "primaryKey": false,
621
+ "notNull": true
622
+ },
623
+ "subscriber_id": {
624
+ "name": "subscriber_id",
625
+ "type": "text",
626
+ "primaryKey": false,
627
+ "notNull": true
628
+ },
629
+ "conversation_id": {
630
+ "name": "conversation_id",
631
+ "type": "uuid",
632
+ "primaryKey": false,
633
+ "notNull": false
634
+ },
635
+ "kind": {
636
+ "name": "kind",
637
+ "type": "text",
638
+ "primaryKey": false,
639
+ "notNull": true,
640
+ "default": "'reply'"
641
+ },
642
+ "payload": {
643
+ "name": "payload",
644
+ "type": "jsonb",
645
+ "primaryKey": false,
646
+ "notNull": true
647
+ },
648
+ "status": {
649
+ "name": "status",
650
+ "type": "text",
651
+ "primaryKey": false,
652
+ "notNull": true,
653
+ "default": "'pending'"
654
+ },
655
+ "attempts": {
656
+ "name": "attempts",
657
+ "type": "integer",
658
+ "primaryKey": false,
659
+ "notNull": true,
660
+ "default": 0
661
+ },
662
+ "next_attempt_at": {
663
+ "name": "next_attempt_at",
664
+ "type": "timestamp with time zone",
665
+ "primaryKey": false,
666
+ "notNull": true,
667
+ "default": "now()"
668
+ },
669
+ "last_error": {
670
+ "name": "last_error",
671
+ "type": "text",
672
+ "primaryKey": false,
673
+ "notNull": false
674
+ },
675
+ "created_at": {
676
+ "name": "created_at",
677
+ "type": "timestamp with time zone",
678
+ "primaryKey": false,
679
+ "notNull": true,
680
+ "default": "now()"
681
+ },
682
+ "delivered_at": {
683
+ "name": "delivered_at",
684
+ "type": "timestamp with time zone",
685
+ "primaryKey": false,
686
+ "notNull": false
687
+ }
688
+ },
689
+ "indexes": {
690
+ "outbox_claim_idx": {
691
+ "name": "outbox_claim_idx",
692
+ "columns": [
693
+ {
694
+ "expression": "status",
695
+ "isExpression": false,
696
+ "asc": true,
697
+ "nulls": "last"
698
+ },
699
+ {
700
+ "expression": "next_attempt_at",
701
+ "isExpression": false,
702
+ "asc": true,
703
+ "nulls": "last"
704
+ }
705
+ ],
706
+ "isUnique": false,
707
+ "concurrently": false,
708
+ "method": "btree",
709
+ "with": {}
710
+ },
711
+ "outbox_queued_reply_idx": {
712
+ "name": "outbox_queued_reply_idx",
713
+ "columns": [
714
+ {
715
+ "expression": "tenant_id",
716
+ "isExpression": false,
717
+ "asc": true,
718
+ "nulls": "last"
719
+ },
720
+ {
721
+ "expression": "subscriber_id",
722
+ "isExpression": false,
723
+ "asc": true,
724
+ "nulls": "last"
725
+ },
726
+ {
727
+ "expression": "created_at",
728
+ "isExpression": false,
729
+ "asc": true,
730
+ "nulls": "last"
731
+ }
732
+ ],
733
+ "isUnique": false,
734
+ "where": "\"outbox\".\"kind\" = 'reply' AND \"outbox\".\"status\" IN ('pending', 'delivering')",
735
+ "concurrently": false,
736
+ "method": "btree",
737
+ "with": {}
738
+ }
739
+ },
740
+ "foreignKeys": {
741
+ "outbox_conversation_id_conversations_id_fk": {
742
+ "name": "outbox_conversation_id_conversations_id_fk",
743
+ "tableFrom": "outbox",
744
+ "tableTo": "conversations",
745
+ "columnsFrom": [
746
+ "conversation_id"
747
+ ],
748
+ "columnsTo": [
749
+ "id"
750
+ ],
751
+ "onDelete": "cascade",
752
+ "onUpdate": "no action"
753
+ }
754
+ },
755
+ "compositePrimaryKeys": {},
756
+ "uniqueConstraints": {},
757
+ "policies": {},
758
+ "checkConstraints": {},
759
+ "isRLSEnabled": false
760
+ },
761
+ "public.playbook_versions": {
762
+ "name": "playbook_versions",
763
+ "schema": "",
764
+ "columns": {
765
+ "id": {
766
+ "name": "id",
767
+ "type": "uuid",
768
+ "primaryKey": true,
769
+ "notNull": true,
770
+ "default": "gen_random_uuid()"
771
+ },
772
+ "tenant_id": {
773
+ "name": "tenant_id",
774
+ "type": "text",
775
+ "primaryKey": false,
776
+ "notNull": true
777
+ },
778
+ "content_hash": {
779
+ "name": "content_hash",
780
+ "type": "text",
781
+ "primaryKey": false,
782
+ "notNull": true
783
+ },
784
+ "insights": {
785
+ "name": "insights",
786
+ "type": "jsonb",
787
+ "primaryKey": false,
788
+ "notNull": true
789
+ },
790
+ "active": {
791
+ "name": "active",
792
+ "type": "boolean",
793
+ "primaryKey": false,
794
+ "notNull": true,
795
+ "default": false
796
+ },
797
+ "activated_at": {
798
+ "name": "activated_at",
799
+ "type": "timestamp with time zone",
800
+ "primaryKey": false,
801
+ "notNull": false
802
+ },
803
+ "created_at": {
804
+ "name": "created_at",
805
+ "type": "timestamp with time zone",
806
+ "primaryKey": false,
807
+ "notNull": true,
808
+ "default": "now()"
809
+ }
810
+ },
811
+ "indexes": {
812
+ "playbook_versions_content_uq": {
813
+ "name": "playbook_versions_content_uq",
814
+ "columns": [
815
+ {
816
+ "expression": "tenant_id",
817
+ "isExpression": false,
818
+ "asc": true,
819
+ "nulls": "last"
820
+ },
821
+ {
822
+ "expression": "content_hash",
823
+ "isExpression": false,
824
+ "asc": true,
825
+ "nulls": "last"
826
+ }
827
+ ],
828
+ "isUnique": true,
829
+ "concurrently": false,
830
+ "method": "btree",
831
+ "with": {}
832
+ },
833
+ "playbook_versions_one_active_uq": {
834
+ "name": "playbook_versions_one_active_uq",
835
+ "columns": [
836
+ {
837
+ "expression": "tenant_id",
838
+ "isExpression": false,
839
+ "asc": true,
840
+ "nulls": "last"
841
+ }
842
+ ],
843
+ "isUnique": true,
844
+ "where": "\"playbook_versions\".\"active\" = true",
845
+ "concurrently": false,
846
+ "method": "btree",
847
+ "with": {}
848
+ }
849
+ },
850
+ "foreignKeys": {},
851
+ "compositePrimaryKeys": {},
852
+ "uniqueConstraints": {},
853
+ "policies": {},
854
+ "checkConstraints": {},
855
+ "isRLSEnabled": false
856
+ },
857
+ "public.rate_counters": {
858
+ "name": "rate_counters",
859
+ "schema": "",
860
+ "columns": {
861
+ "tenant_id": {
862
+ "name": "tenant_id",
863
+ "type": "text",
864
+ "primaryKey": false,
865
+ "notNull": true
866
+ },
867
+ "subscriber_id": {
868
+ "name": "subscriber_id",
869
+ "type": "text",
870
+ "primaryKey": false,
871
+ "notNull": true
872
+ },
873
+ "window_start": {
874
+ "name": "window_start",
875
+ "type": "timestamp with time zone",
876
+ "primaryKey": false,
877
+ "notNull": true
878
+ },
879
+ "count": {
880
+ "name": "count",
881
+ "type": "integer",
882
+ "primaryKey": false,
883
+ "notNull": true,
884
+ "default": 0
885
+ }
886
+ },
887
+ "indexes": {},
888
+ "foreignKeys": {},
889
+ "compositePrimaryKeys": {
890
+ "rate_counters_tenant_id_subscriber_id_window_start_pk": {
891
+ "name": "rate_counters_tenant_id_subscriber_id_window_start_pk",
892
+ "columns": [
893
+ "tenant_id",
894
+ "subscriber_id",
895
+ "window_start"
896
+ ]
897
+ }
898
+ },
899
+ "uniqueConstraints": {},
900
+ "policies": {},
901
+ "checkConstraints": {},
902
+ "isRLSEnabled": false
903
+ },
904
+ "public.turns": {
905
+ "name": "turns",
906
+ "schema": "",
907
+ "columns": {
908
+ "id": {
909
+ "name": "id",
910
+ "type": "uuid",
911
+ "primaryKey": true,
912
+ "notNull": true,
913
+ "default": "gen_random_uuid()"
914
+ },
915
+ "seq": {
916
+ "name": "seq",
917
+ "type": "serial",
918
+ "primaryKey": false,
919
+ "notNull": true
920
+ },
921
+ "conversation_id": {
922
+ "name": "conversation_id",
923
+ "type": "uuid",
924
+ "primaryKey": false,
925
+ "notNull": true
926
+ },
927
+ "role": {
928
+ "name": "role",
929
+ "type": "text",
930
+ "primaryKey": false,
931
+ "notNull": true
932
+ },
933
+ "text": {
934
+ "name": "text",
935
+ "type": "text",
936
+ "primaryKey": false,
937
+ "notNull": true
938
+ },
939
+ "outcome": {
940
+ "name": "outcome",
941
+ "type": "text",
942
+ "primaryKey": false,
943
+ "notNull": false
944
+ },
945
+ "model": {
946
+ "name": "model",
947
+ "type": "text",
948
+ "primaryKey": false,
949
+ "notNull": false
950
+ },
951
+ "bound": {
952
+ "name": "bound",
953
+ "type": "boolean",
954
+ "primaryKey": false,
955
+ "notNull": true,
956
+ "default": true
957
+ },
958
+ "media_kind": {
959
+ "name": "media_kind",
960
+ "type": "text",
961
+ "primaryKey": false,
962
+ "notNull": false
963
+ },
964
+ "actions": {
965
+ "name": "actions",
966
+ "type": "jsonb",
967
+ "primaryKey": false,
968
+ "notNull": false
969
+ },
970
+ "reads": {
971
+ "name": "reads",
972
+ "type": "jsonb",
973
+ "primaryKey": false,
974
+ "notNull": false
975
+ },
976
+ "input_tokens": {
977
+ "name": "input_tokens",
978
+ "type": "integer",
979
+ "primaryKey": false,
980
+ "notNull": false
981
+ },
982
+ "output_tokens": {
983
+ "name": "output_tokens",
984
+ "type": "integer",
985
+ "primaryKey": false,
986
+ "notNull": false
987
+ },
988
+ "cache_read_tokens": {
989
+ "name": "cache_read_tokens",
990
+ "type": "integer",
991
+ "primaryKey": false,
992
+ "notNull": false
993
+ },
994
+ "cost_usd": {
995
+ "name": "cost_usd",
996
+ "type": "numeric(12, 6)",
997
+ "primaryKey": false,
998
+ "notNull": false
999
+ },
1000
+ "latency_ms": {
1001
+ "name": "latency_ms",
1002
+ "type": "integer",
1003
+ "primaryKey": false,
1004
+ "notNull": false
1005
+ },
1006
+ "playbook_version": {
1007
+ "name": "playbook_version",
1008
+ "type": "text",
1009
+ "primaryKey": false,
1010
+ "notNull": false
1011
+ },
1012
+ "created_at": {
1013
+ "name": "created_at",
1014
+ "type": "timestamp with time zone",
1015
+ "primaryKey": false,
1016
+ "notNull": true,
1017
+ "default": "now()"
1018
+ }
1019
+ },
1020
+ "indexes": {
1021
+ "turns_conversation_created_idx": {
1022
+ "name": "turns_conversation_created_idx",
1023
+ "columns": [
1024
+ {
1025
+ "expression": "conversation_id",
1026
+ "isExpression": false,
1027
+ "asc": true,
1028
+ "nulls": "last"
1029
+ },
1030
+ {
1031
+ "expression": "created_at",
1032
+ "isExpression": false,
1033
+ "asc": true,
1034
+ "nulls": "last"
1035
+ }
1036
+ ],
1037
+ "isUnique": false,
1038
+ "concurrently": false,
1039
+ "method": "btree",
1040
+ "with": {}
1041
+ }
1042
+ },
1043
+ "foreignKeys": {
1044
+ "turns_conversation_id_conversations_id_fk": {
1045
+ "name": "turns_conversation_id_conversations_id_fk",
1046
+ "tableFrom": "turns",
1047
+ "tableTo": "conversations",
1048
+ "columnsFrom": [
1049
+ "conversation_id"
1050
+ ],
1051
+ "columnsTo": [
1052
+ "id"
1053
+ ],
1054
+ "onDelete": "cascade",
1055
+ "onUpdate": "no action"
1056
+ }
1057
+ },
1058
+ "compositePrimaryKeys": {},
1059
+ "uniqueConstraints": {},
1060
+ "policies": {},
1061
+ "checkConstraints": {},
1062
+ "isRLSEnabled": false
1063
+ }
1064
+ },
1065
+ "enums": {},
1066
+ "schemas": {},
1067
+ "sequences": {},
1068
+ "roles": {},
1069
+ "policies": {},
1070
+ "views": {},
1071
+ "_meta": {
1072
+ "columns": {},
1073
+ "schemas": {},
1074
+ "tables": {}
1075
+ }
1076
+ }