@prajwalshete/telegram-plugin 0.0.0-stage → 0.1.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 (295) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/LICENSE +21 -0
  3. package/README.md +109 -2
  4. package/dist/adapters/clock.d.ts +3 -0
  5. package/dist/adapters/clock.js +4 -0
  6. package/dist/adapters/console-log.d.ts +13 -0
  7. package/dist/adapters/console-log.js +41 -0
  8. package/dist/adapters/d1-db.d.ts +5 -0
  9. package/dist/adapters/d1-db.js +37 -0
  10. package/dist/adapters/ids.d.ts +5 -0
  11. package/dist/adapters/ids.js +25 -0
  12. package/dist/adapters/index.d.ts +7 -0
  13. package/dist/adapters/keyring.d.ts +50 -0
  14. package/dist/adapters/keyring.js +174 -0
  15. package/dist/adapters/metrics.d.ts +28 -0
  16. package/dist/adapters/metrics.js +48 -0
  17. package/dist/adapters/r2-files.d.ts +20 -0
  18. package/dist/adapters/r2-files.js +53 -0
  19. package/dist/bin/cli.d.ts +1 -0
  20. package/dist/bin/cli.js +45 -0
  21. package/dist/client/broadcasts.d.ts +35 -0
  22. package/dist/client/commands.d.ts +23 -0
  23. package/dist/client/endpoint.d.ts +34 -0
  24. package/dist/client/events.d.ts +33 -0
  25. package/dist/client/index.d.ts +11 -0
  26. package/dist/client/index.js +3 -0
  27. package/dist/client/schedules.d.ts +42 -0
  28. package/dist/client/schema.d.ts +181 -0
  29. package/dist/client/send.d.ts +15 -0
  30. package/dist/client/templates.d.ts +47 -0
  31. package/dist/contracts/bots.d.ts +129 -0
  32. package/dist/contracts/bots.js +70 -0
  33. package/dist/contracts/broadcasts.d.ts +116 -0
  34. package/dist/contracts/broadcasts.js +63 -0
  35. package/dist/contracts/chats.d.ts +97 -0
  36. package/dist/contracts/chats.js +66 -0
  37. package/dist/contracts/commands.d.ts +52 -0
  38. package/dist/contracts/commands.js +53 -0
  39. package/dist/contracts/common.d.ts +38 -0
  40. package/dist/contracts/common.js +41 -0
  41. package/dist/contracts/deliveries.d.ts +103 -0
  42. package/dist/contracts/deliveries.js +74 -0
  43. package/dist/contracts/destinations.d.ts +24 -0
  44. package/dist/contracts/destinations.js +28 -0
  45. package/dist/contracts/events.d.ts +165 -0
  46. package/dist/contracts/events.js +98 -0
  47. package/dist/contracts/features.d.ts +20 -0
  48. package/dist/contracts/features.js +21 -0
  49. package/dist/contracts/health.d.ts +55 -0
  50. package/dist/contracts/health.js +58 -0
  51. package/dist/contracts/index.d.ts +22 -0
  52. package/dist/contracts/index.js +22 -0
  53. package/dist/contracts/labels.d.ts +38 -0
  54. package/dist/contracts/labels.js +52 -0
  55. package/dist/contracts/links.d.ts +51 -0
  56. package/dist/contracts/links.js +50 -0
  57. package/dist/contracts/meta.d.ts +132 -0
  58. package/dist/contracts/meta.js +85 -0
  59. package/dist/contracts/permissions.d.ts +24 -0
  60. package/dist/contracts/permissions.js +27 -0
  61. package/dist/contracts/problems.d.ts +106 -0
  62. package/dist/contracts/problems.js +101 -0
  63. package/dist/contracts/recipients.d.ts +36 -0
  64. package/dist/contracts/recipients.js +22 -0
  65. package/dist/contracts/schedules.d.ts +276 -0
  66. package/dist/contracts/schedules.js +143 -0
  67. package/dist/contracts/send.d.ts +126 -0
  68. package/dist/contracts/send.js +69 -0
  69. package/dist/contracts/subscriptions.d.ts +38 -0
  70. package/dist/contracts/subscriptions.js +31 -0
  71. package/dist/contracts/templates.d.ts +358 -0
  72. package/dist/contracts/templates.js +174 -0
  73. package/dist/contracts/users.d.ts +15 -0
  74. package/dist/contracts/users.js +19 -0
  75. package/dist/core/guards.d.ts +22 -0
  76. package/dist/core/guards.js +47 -0
  77. package/dist/core/html/escape.d.ts +2 -0
  78. package/dist/core/html/escape.js +36 -0
  79. package/dist/core/html/tokenize.js +65 -0
  80. package/dist/core/index.d.ts +18 -0
  81. package/dist/core/pacing.d.ts +1 -0
  82. package/dist/core/pacing.js +86 -0
  83. package/dist/core/random.d.ts +2 -0
  84. package/dist/core/random.js +38 -0
  85. package/dist/core/recipients.d.ts +1 -0
  86. package/dist/core/recipients.js +86 -0
  87. package/dist/core/schedule/describe.d.ts +3 -0
  88. package/dist/core/schedule/describe.js +74 -0
  89. package/dist/core/schedule/index.d.ts +4 -0
  90. package/dist/core/schedule/policy.d.ts +1 -0
  91. package/dist/core/schedule/policy.js +37 -0
  92. package/dist/core/schedule/rule.d.ts +25 -0
  93. package/dist/core/schedule/rule.js +142 -0
  94. package/dist/core/schedule/tz.d.ts +2 -0
  95. package/dist/core/schedule/tz.js +59 -0
  96. package/dist/core/split/plain.d.ts +2 -0
  97. package/dist/core/split/plain.js +23 -0
  98. package/dist/core/split/split.d.ts +15 -0
  99. package/dist/core/split/split.js +158 -0
  100. package/dist/core/template/ast.d.ts +58 -0
  101. package/dist/core/template/ast.js +5 -0
  102. package/dist/core/template/expr.js +108 -0
  103. package/dist/core/template/filters.d.ts +20 -0
  104. package/dist/core/template/filters.js +127 -0
  105. package/dist/core/template/format.d.ts +17 -0
  106. package/dist/core/template/format.js +88 -0
  107. package/dist/core/template/index.d.ts +20 -0
  108. package/dist/core/template/index.js +29 -0
  109. package/dist/core/template/parse.d.ts +8 -0
  110. package/dist/core/template/parse.js +369 -0
  111. package/dist/core/template/render.d.ts +17 -0
  112. package/dist/core/template/render.js +118 -0
  113. package/dist/core/template/shape.d.ts +28 -0
  114. package/dist/core/template/shape.js +151 -0
  115. package/dist/core/template/tags.js +105 -0
  116. package/dist/core/template/validate.d.ts +10 -0
  117. package/dist/core/template/validate.js +144 -0
  118. package/dist/core/template/variables.d.ts +15 -0
  119. package/dist/core/template/variables.js +41 -0
  120. package/dist/do/index.d.ts +3 -0
  121. package/dist/do/index.js +3 -0
  122. package/dist/do/telegram-bot-do.d.ts +45 -0
  123. package/dist/do/telegram-bot-do.js +219 -0
  124. package/dist/engine/actions/callback.js +256 -0
  125. package/dist/engine/actions/tokens.d.ts +2 -0
  126. package/dist/engine/actions/tokens.js +51 -0
  127. package/dist/engine/bot-api.js +20 -0
  128. package/dist/engine/bot-features.js +39 -0
  129. package/dist/engine/chat-state.js +66 -0
  130. package/dist/engine/content/audience.js +54 -0
  131. package/dist/engine/content/buttons.d.ts +1 -0
  132. package/dist/engine/content/buttons.js +113 -0
  133. package/dist/engine/content/fanout.js +284 -0
  134. package/dist/engine/content/intersect.d.ts +6 -0
  135. package/dist/engine/content/intersect.js +26 -0
  136. package/dist/engine/content/providers.d.ts +6 -0
  137. package/dist/engine/content/providers.js +142 -0
  138. package/dist/engine/content/recipients.js +128 -0
  139. package/dist/engine/content/render.js +138 -0
  140. package/dist/engine/content/reply.js +156 -0
  141. package/dist/engine/content/report-files.js +78 -0
  142. package/dist/engine/content/template-rows.js +74 -0
  143. package/dist/engine/dialogs/dialog.d.ts +2 -0
  144. package/dist/engine/dialogs/dialog.js +375 -0
  145. package/dist/engine/dispatch/builtins.js +198 -0
  146. package/dist/engine/dispatch/commands.js +194 -0
  147. package/dist/engine/dispatch/context.d.ts +2 -0
  148. package/dist/engine/dispatch/context.js +194 -0
  149. package/dist/engine/dispatch/dispatcher.js +66 -0
  150. package/dist/engine/dispatch/handlers.d.ts +1 -0
  151. package/dist/engine/dispatch/handlers.js +103 -0
  152. package/dist/engine/dispatch/lifecycle.js +85 -0
  153. package/dist/engine/dispatch/link-chat.js +31 -0
  154. package/dist/engine/dispatch/linking.js +273 -0
  155. package/dist/engine/errors.d.ts +60 -0
  156. package/dist/engine/errors.js +72 -0
  157. package/dist/engine/events/filters.d.ts +5 -0
  158. package/dist/engine/events/filters.js +82 -0
  159. package/dist/engine/events/kick.js +30 -0
  160. package/dist/engine/events/payload.d.ts +3 -0
  161. package/dist/engine/events/payload.js +16 -0
  162. package/dist/engine/events/tick.js +208 -0
  163. package/dist/engine/i18n.d.ts +12 -0
  164. package/dist/engine/i18n.js +55 -0
  165. package/dist/engine/inbound/files.js +121 -0
  166. package/dist/engine/inbound/handler.js +46 -0
  167. package/dist/engine/jobs.d.ts +32 -0
  168. package/dist/engine/jobs.js +85 -0
  169. package/dist/engine/link-codes.js +46 -0
  170. package/dist/engine/metrics.js +12 -0
  171. package/dist/engine/options.d.ts +369 -0
  172. package/dist/engine/options.js +81 -0
  173. package/dist/engine/outbox/dead-letter.js +78 -0
  174. package/dist/engine/outbox/do-registry.d.ts +10 -0
  175. package/dist/engine/outbox/do-registry.js +10 -0
  176. package/dist/engine/outbox/do-transport.d.ts +33 -0
  177. package/dist/engine/outbox/do-transport.js +73 -0
  178. package/dist/engine/outbox/drain.d.ts +13 -0
  179. package/dist/engine/outbox/drain.js +381 -0
  180. package/dist/engine/outbox/enqueue.d.ts +1 -0
  181. package/dist/engine/outbox/enqueue.js +63 -0
  182. package/dist/engine/outbox/select.js +24 -0
  183. package/dist/engine/outbox/send.js +362 -0
  184. package/dist/engine/outbox/transport.d.ts +35 -0
  185. package/dist/engine/outbox/transport.js +175 -0
  186. package/dist/engine/outbox/wake.js +28 -0
  187. package/dist/engine/registry.d.ts +502 -0
  188. package/dist/engine/registry.js +258 -0
  189. package/dist/engine/rows.d.ts +25 -0
  190. package/dist/engine/rows.js +131 -0
  191. package/dist/engine/runtime.d.ts +95 -0
  192. package/dist/engine/runtime.js +149 -0
  193. package/dist/engine/schedules/fire.js +208 -0
  194. package/dist/engine/schedules/resume.js +75 -0
  195. package/dist/engine/schedules/rows.js +69 -0
  196. package/dist/engine/schedules/tick.js +30 -0
  197. package/dist/engine/schedules/wake.js +50 -0
  198. package/dist/engine/state.d.ts +11 -0
  199. package/dist/engine/state.js +78 -0
  200. package/dist/locales/en.js +339 -0
  201. package/dist/locales/en.json +341 -0
  202. package/dist/locales/mr.js +339 -0
  203. package/dist/locales/mr.json +341 -0
  204. package/dist/ports/db.d.ts +22 -0
  205. package/dist/ports/index.d.ts +4 -0
  206. package/dist/ports/ports.d.ts +257 -0
  207. package/dist/ports/sql.d.ts +39 -0
  208. package/dist/ports/sql.js +76 -0
  209. package/dist/renderers/csv.d.ts +14 -0
  210. package/dist/renderers/csv.js +51 -0
  211. package/dist/renderers/html.d.ts +44 -0
  212. package/dist/renderers/html.js +81 -0
  213. package/dist/renderers/index.d.ts +5 -0
  214. package/dist/renderers/index.js +4 -0
  215. package/dist/renderers/table.d.ts +30 -0
  216. package/dist/renderers/table.js +114 -0
  217. package/dist/routes/admin.js +146 -0
  218. package/dist/routes/app.d.ts +3111 -0
  219. package/dist/routes/app.js +9 -0
  220. package/dist/routes/broadcasts.js +37 -0
  221. package/dist/routes/commands.js +35 -0
  222. package/dist/routes/content.js +12 -0
  223. package/dist/routes/events.js +36 -0
  224. package/dist/routes/http.d.ts +30 -0
  225. package/dist/routes/http.js +223 -0
  226. package/dist/routes/me.js +59 -0
  227. package/dist/routes/schedules.js +62 -0
  228. package/dist/routes/send.js +24 -0
  229. package/dist/routes/templates.js +70 -0
  230. package/dist/routes/webhook.js +147 -0
  231. package/dist/schema/columns.js +307 -0
  232. package/dist/schema/ddl.d.ts +7 -0
  233. package/dist/schema/ddl.js +45 -0
  234. package/dist/schema/index.d.ts +4255 -0
  235. package/dist/schema/index.js +44 -0
  236. package/dist/schema/reference.sql +359 -0
  237. package/dist/schema/tables.d.ts +4243 -0
  238. package/dist/schema/tables.js +327 -0
  239. package/dist/schema/version.d.ts +5 -0
  240. package/dist/schema/version.js +7 -0
  241. package/dist/server/index.d.ts +55 -0
  242. package/dist/server/index.js +46 -0
  243. package/dist/server/plugin.d.ts +81 -0
  244. package/dist/server/plugin.js +247 -0
  245. package/dist/server/version.d.ts +2 -0
  246. package/dist/server/version.js +4 -0
  247. package/dist/services/ai-tool.d.ts +26 -0
  248. package/dist/services/ai-tool.js +148 -0
  249. package/dist/services/bots.js +300 -0
  250. package/dist/services/broadcasts.js +390 -0
  251. package/dist/services/chats.js +83 -0
  252. package/dist/services/cleanup.js +83 -0
  253. package/dist/services/commands.js +140 -0
  254. package/dist/services/deliveries.js +53 -0
  255. package/dist/services/destinations.js +91 -0
  256. package/dist/services/event-rules.js +229 -0
  257. package/dist/services/events.js +20 -0
  258. package/dist/services/idempotency.js +64 -0
  259. package/dist/services/links.js +200 -0
  260. package/dist/services/menu.js +95 -0
  261. package/dist/services/ops.js +90 -0
  262. package/dist/services/rekey.js +63 -0
  263. package/dist/services/reports.js +87 -0
  264. package/dist/services/schedules.js +214 -0
  265. package/dist/services/send.d.ts +14 -0
  266. package/dist/services/send.js +421 -0
  267. package/dist/services/subscriptions.js +28 -0
  268. package/dist/services/templates.js +259 -0
  269. package/dist/telegram/classify.d.ts +30 -0
  270. package/dist/telegram/classify.js +164 -0
  271. package/dist/telegram/client.d.ts +73 -0
  272. package/dist/telegram/client.js +135 -0
  273. package/dist/telegram/errors.d.ts +37 -0
  274. package/dist/telegram/errors.js +62 -0
  275. package/dist/telegram/inbound.d.ts +40 -0
  276. package/dist/telegram/inbound.js +72 -0
  277. package/dist/telegram/index.d.ts +8 -0
  278. package/dist/telegram/multipart.d.ts +5 -0
  279. package/dist/telegram/multipart.js +47 -0
  280. package/dist/telegram/types.d.ts +271 -0
  281. package/dist/telegram/update.d.ts +833 -0
  282. package/dist/telegram/update.js +129 -0
  283. package/dist/testing/fake-html.d.ts +9 -0
  284. package/dist/testing/fake-html.js +83 -0
  285. package/dist/testing/fake-telegram.d.ts +206 -0
  286. package/dist/testing/fake-telegram.js +856 -0
  287. package/dist/testing/index.d.ts +7 -0
  288. package/dist/testing/index.js +7 -0
  289. package/dist/testing/reference-sql.d.ts +4 -0
  290. package/dist/testing/reference-sql.js +8 -0
  291. package/dist/testing/test-plugin.d.ts +126 -0
  292. package/dist/testing/test-plugin.js +182 -0
  293. package/dist/testing/updates.d.ts +100 -0
  294. package/dist/testing/updates.js +212 -0
  295. package/package.json +113 -3
@@ -0,0 +1,44 @@
1
+ import { SCHEMA_VERSION } from "./version.js";
2
+ import { telegramTables } from "./tables.js";
3
+ import { referenceSql, referenceSqlStatements } from "./ddl.js";
4
+ // src/schema/index.ts
5
+ const defaults = telegramTables();
6
+ /** Bots (`tg_bot`): encrypted token and webhook secret, mode, status, pacing and drain lease. */
7
+ const tgBot = defaults.tgBot;
8
+ /** Chats (`tg_chat`): Telegram chats per bot, linked user or group audience, locale, status. */
9
+ const tgChat = defaults.tgChat;
10
+ /** One-time link codes (`tg_link_code`), stored hashed with an expiry. */
11
+ const tgLinkCode = defaults.tgLinkCode;
12
+ /** Named destinations (`tg_destination`): a slug for a chat, optionally `ai_allowed`. */
13
+ const tgDestination = defaults.tgDestination;
14
+ /** Per-bot command configuration (`tg_command`): enabled, roles, aliases, menu. */
15
+ const tgCommand = defaults.tgCommand;
16
+ /** Templates (`tg_template`): message / report bodies per locale, provider, buttons. */
17
+ const tgTemplate = defaults.tgTemplate;
18
+ /** Append-only template history (`tg_template_version`). */
19
+ const tgTemplateVersion = defaults.tgTemplateVersion;
20
+ /** Per-chat subscriptions (`tg_subscription`): mute and quiet hours per topic. */
21
+ const tgSubscription = defaults.tgSubscription;
22
+ /** Recurring schedules (`tg_schedule`): rule, IANA zone, template, recipients, `next_run_at`. */
23
+ const tgSchedule = defaults.tgSchedule;
24
+ /** Schedule run history (`tg_schedule_run`). */
25
+ const tgScheduleRun = defaults.tgScheduleRun;
26
+ /** Event rules (`tg_event_rule`): event key, filters, template, recipients, throttle. */
27
+ const tgEventRule = defaults.tgEventRule;
28
+ /** Emitted host events (`tg_event`), processed by the tick. */
29
+ const tgEvent = defaults.tgEvent;
30
+ /** One-off broadcasts (`tg_broadcast`) and their progress. */
31
+ const tgBroadcast = defaults.tgBroadcast;
32
+ /** The outbox (`tg_delivery`): one row per message part, with status, attempts and dedupe key. */
33
+ const tgDelivery = defaults.tgDelivery;
34
+ /** Received Telegram updates (`tg_update`): dedupe and processing state. */
35
+ const tgUpdate = defaults.tgUpdate;
36
+ /** Callback-button tokens (`tg_action_token`): action, params, expiry, single use. */
37
+ const tgActionToken = defaults.tgActionToken;
38
+ /** Active dialogs (`tg_dialog`): step, state and expiry per chat. */
39
+ const tgDialog = defaults.tgDialog;
40
+ /** Plugin key/value state (`tg_state`): schema version, last tick, throttles. */
41
+ const tgState = defaults.tgState;
42
+ /** Audit rows (`tg_audit`) written with admin changes. */
43
+ const tgAudit = defaults.tgAudit;
44
+ export { SCHEMA_VERSION, referenceSql, referenceSqlStatements, telegramTables, tgActionToken, tgAudit, tgBot, tgBroadcast, tgChat, tgCommand, tgDelivery, tgDestination, tgDialog, tgEvent, tgEventRule, tgLinkCode, tgSchedule, tgScheduleRun, tgState, tgSubscription, tgTemplate, tgTemplateVersion, tgUpdate };
@@ -0,0 +1,359 @@
1
+ -- cf-telegram-plugin reference schema. Generated from telegramTables(); do not edit by hand.
2
+
3
+ CREATE TABLE IF NOT EXISTS tg_bot (
4
+ id TEXT PRIMARY KEY NOT NULL,
5
+ tenant TEXT NOT NULL DEFAULT '',
6
+ name TEXT NOT NULL,
7
+ tg_bot_id TEXT NOT NULL,
8
+ username TEXT NOT NULL,
9
+ token_enc TEXT NOT NULL,
10
+ webhook_secret_enc TEXT,
11
+ mode TEXT NOT NULL DEFAULT 'webhook',
12
+ status TEXT NOT NULL DEFAULT 'active',
13
+ status_detail TEXT,
14
+ checked_at INTEGER,
15
+ default_locale TEXT NOT NULL DEFAULT 'en',
16
+ features_json TEXT,
17
+ rate_per_sec INTEGER NOT NULL DEFAULT 25,
18
+ paused_until INTEGER,
19
+ drain_lease_until INTEGER,
20
+ drain_token TEXT,
21
+ commands_synced_hash TEXT,
22
+ created_by TEXT,
23
+ created_at INTEGER NOT NULL,
24
+ updated_at INTEGER NOT NULL,
25
+ deleted_at INTEGER
26
+ );
27
+
28
+ CREATE INDEX IF NOT EXISTS tg_bot_tenant_status_idx ON tg_bot (tenant, status);
29
+
30
+ CREATE UNIQUE INDEX IF NOT EXISTS tg_bot_tg_bot_uq ON tg_bot (tenant, tg_bot_id) WHERE deleted_at IS NULL;
31
+
32
+ CREATE TABLE IF NOT EXISTS tg_chat (
33
+ id TEXT PRIMARY KEY NOT NULL,
34
+ tenant TEXT NOT NULL DEFAULT '',
35
+ bot_id TEXT NOT NULL,
36
+ chat_id TEXT NOT NULL,
37
+ kind TEXT NOT NULL,
38
+ title TEXT,
39
+ username TEXT,
40
+ user_id TEXT,
41
+ audience_json TEXT,
42
+ status TEXT NOT NULL DEFAULT 'pending',
43
+ locale TEXT,
44
+ timezone TEXT,
45
+ topics_json TEXT,
46
+ next_allowed_at INTEGER,
47
+ minute_window_start INTEGER,
48
+ minute_count INTEGER NOT NULL DEFAULT 0,
49
+ linked_by TEXT,
50
+ linked_at INTEGER,
51
+ created_at INTEGER NOT NULL,
52
+ updated_at INTEGER NOT NULL
53
+ );
54
+
55
+ CREATE UNIQUE INDEX IF NOT EXISTS tg_chat_bot_chat_uq ON tg_chat (tenant, bot_id, chat_id);
56
+
57
+ CREATE INDEX IF NOT EXISTS tg_chat_user_idx ON tg_chat (user_id);
58
+
59
+ CREATE INDEX IF NOT EXISTS tg_chat_bot_status_idx ON tg_chat (bot_id, status);
60
+
61
+ CREATE TABLE IF NOT EXISTS tg_link_code (
62
+ code_hash TEXT PRIMARY KEY NOT NULL,
63
+ tenant TEXT NOT NULL DEFAULT '',
64
+ bot_id TEXT NOT NULL,
65
+ purpose TEXT NOT NULL,
66
+ user_id TEXT,
67
+ audience_json TEXT,
68
+ expires_at INTEGER NOT NULL,
69
+ used_at INTEGER,
70
+ used_by_chat TEXT,
71
+ created_by TEXT,
72
+ created_at INTEGER NOT NULL
73
+ );
74
+
75
+ CREATE INDEX IF NOT EXISTS tg_link_code_expires_idx ON tg_link_code (expires_at);
76
+
77
+ CREATE TABLE IF NOT EXISTS tg_destination (
78
+ id TEXT PRIMARY KEY NOT NULL,
79
+ tenant TEXT NOT NULL DEFAULT '',
80
+ name TEXT NOT NULL,
81
+ slug TEXT NOT NULL,
82
+ bot_id TEXT NOT NULL,
83
+ chat_ref TEXT NOT NULL,
84
+ message_thread_id INTEGER,
85
+ ai_allowed INTEGER NOT NULL DEFAULT 0,
86
+ created_by TEXT,
87
+ created_at INTEGER NOT NULL,
88
+ updated_at INTEGER NOT NULL,
89
+ deleted_at INTEGER
90
+ );
91
+
92
+ CREATE UNIQUE INDEX IF NOT EXISTS tg_destination_slug_uq ON tg_destination (tenant, slug);
93
+
94
+ CREATE TABLE IF NOT EXISTS tg_command (
95
+ tenant TEXT NOT NULL DEFAULT '',
96
+ bot_id TEXT NOT NULL,
97
+ command TEXT NOT NULL,
98
+ enabled INTEGER NOT NULL DEFAULT 1,
99
+ roles_json TEXT,
100
+ aliases_json TEXT,
101
+ description_json TEXT,
102
+ show_in_menu INTEGER NOT NULL DEFAULT 1,
103
+ sort INTEGER NOT NULL DEFAULT 0,
104
+ updated_by TEXT,
105
+ updated_at INTEGER NOT NULL,
106
+ PRIMARY KEY (tenant, bot_id, command)
107
+ );
108
+
109
+ CREATE TABLE IF NOT EXISTS tg_template (
110
+ id TEXT PRIMARY KEY NOT NULL,
111
+ tenant TEXT NOT NULL DEFAULT '',
112
+ key TEXT NOT NULL,
113
+ name TEXT NOT NULL,
114
+ kind TEXT NOT NULL DEFAULT 'message',
115
+ provider TEXT,
116
+ provider_params_json TEXT,
117
+ body_json TEXT NOT NULL,
118
+ format TEXT NOT NULL DEFAULT 'html',
119
+ report_json TEXT,
120
+ buttons_json TEXT,
121
+ options_json TEXT,
122
+ version INTEGER NOT NULL DEFAULT 1,
123
+ created_by TEXT,
124
+ created_at INTEGER NOT NULL,
125
+ updated_by TEXT,
126
+ updated_at INTEGER NOT NULL,
127
+ deleted_at INTEGER
128
+ );
129
+
130
+ CREATE UNIQUE INDEX IF NOT EXISTS tg_template_key_uq ON tg_template (tenant, key);
131
+
132
+ CREATE TABLE IF NOT EXISTS tg_template_version (
133
+ tenant TEXT NOT NULL DEFAULT '',
134
+ template_id TEXT NOT NULL,
135
+ version INTEGER NOT NULL,
136
+ body_json TEXT NOT NULL,
137
+ report_json TEXT,
138
+ buttons_json TEXT,
139
+ saved_by TEXT,
140
+ saved_at INTEGER NOT NULL,
141
+ PRIMARY KEY (template_id, version)
142
+ );
143
+
144
+ CREATE TABLE IF NOT EXISTS tg_subscription (
145
+ tenant TEXT NOT NULL DEFAULT '',
146
+ chat_ref TEXT NOT NULL,
147
+ topic TEXT NOT NULL,
148
+ muted INTEGER NOT NULL DEFAULT 0,
149
+ quiet_json TEXT,
150
+ updated_at INTEGER NOT NULL,
151
+ PRIMARY KEY (tenant, chat_ref, topic)
152
+ );
153
+
154
+ CREATE TABLE IF NOT EXISTS tg_schedule (
155
+ id TEXT PRIMARY KEY NOT NULL,
156
+ tenant TEXT NOT NULL DEFAULT '',
157
+ name TEXT NOT NULL,
158
+ rule_json TEXT NOT NULL,
159
+ timezone TEXT NOT NULL,
160
+ template_id TEXT NOT NULL,
161
+ params_json TEXT,
162
+ recipients_json TEXT NOT NULL,
163
+ personalize INTEGER NOT NULL DEFAULT 1,
164
+ missed_policy TEXT NOT NULL DEFAULT 'run_once',
165
+ missed_grace_min INTEGER NOT NULL DEFAULT 30,
166
+ enabled INTEGER NOT NULL DEFAULT 1,
167
+ paused_until INTEGER,
168
+ next_run_at INTEGER,
169
+ claim_until INTEGER,
170
+ claim_token TEXT,
171
+ last_run_at INTEGER,
172
+ last_status TEXT,
173
+ created_by TEXT,
174
+ created_at INTEGER NOT NULL,
175
+ updated_at INTEGER NOT NULL,
176
+ deleted_at INTEGER
177
+ );
178
+
179
+ CREATE INDEX IF NOT EXISTS tg_schedule_due_idx ON tg_schedule (enabled, next_run_at);
180
+
181
+ CREATE TABLE IF NOT EXISTS tg_schedule_run (
182
+ id TEXT PRIMARY KEY NOT NULL,
183
+ tenant TEXT NOT NULL DEFAULT '',
184
+ schedule_id TEXT NOT NULL,
185
+ slot_at INTEGER NOT NULL,
186
+ trigger TEXT NOT NULL DEFAULT 'schedule',
187
+ started_at INTEGER NOT NULL,
188
+ finished_at INTEGER,
189
+ status TEXT NOT NULL DEFAULT 'running',
190
+ deliveries INTEGER NOT NULL DEFAULT 0,
191
+ error TEXT,
192
+ template_version INTEGER
193
+ );
194
+
195
+ CREATE UNIQUE INDEX IF NOT EXISTS tg_schedule_run_slot_uq ON tg_schedule_run (schedule_id, slot_at);
196
+
197
+ CREATE TABLE IF NOT EXISTS tg_event_rule (
198
+ id TEXT PRIMARY KEY NOT NULL,
199
+ tenant TEXT NOT NULL DEFAULT '',
200
+ event TEXT NOT NULL,
201
+ name TEXT NOT NULL,
202
+ filter_json TEXT,
203
+ template_id TEXT NOT NULL,
204
+ recipients_json TEXT NOT NULL,
205
+ throttle_json TEXT,
206
+ enabled INTEGER NOT NULL DEFAULT 1,
207
+ created_by TEXT,
208
+ created_at INTEGER NOT NULL,
209
+ updated_at INTEGER NOT NULL,
210
+ deleted_at INTEGER
211
+ );
212
+
213
+ CREATE INDEX IF NOT EXISTS tg_event_rule_event_idx ON tg_event_rule (tenant, event, enabled);
214
+
215
+ CREATE TABLE IF NOT EXISTS tg_event (
216
+ id TEXT PRIMARY KEY NOT NULL,
217
+ tenant TEXT NOT NULL DEFAULT '',
218
+ event TEXT NOT NULL,
219
+ payload_json TEXT NOT NULL,
220
+ dedupe_key TEXT NOT NULL,
221
+ occurred_at INTEGER NOT NULL,
222
+ status TEXT NOT NULL DEFAULT 'pending',
223
+ attempts INTEGER NOT NULL DEFAULT 0,
224
+ claim_until INTEGER,
225
+ claim_token TEXT,
226
+ processed_at INTEGER,
227
+ error TEXT
228
+ );
229
+
230
+ CREATE UNIQUE INDEX IF NOT EXISTS tg_event_dedupe_uq ON tg_event (tenant, dedupe_key);
231
+
232
+ CREATE INDEX IF NOT EXISTS tg_event_status_idx ON tg_event (status, occurred_at);
233
+
234
+ CREATE TABLE IF NOT EXISTS tg_broadcast (
235
+ id TEXT PRIMARY KEY NOT NULL,
236
+ tenant TEXT NOT NULL DEFAULT '',
237
+ title TEXT NOT NULL,
238
+ template_id TEXT,
239
+ body_json TEXT,
240
+ params_json TEXT,
241
+ file_ref TEXT,
242
+ recipients_json TEXT NOT NULL,
243
+ status TEXT NOT NULL DEFAULT 'draft',
244
+ stats_json TEXT,
245
+ created_by TEXT,
246
+ created_at INTEGER NOT NULL,
247
+ updated_at INTEGER NOT NULL,
248
+ sent_at INTEGER,
249
+ deleted_at INTEGER
250
+ );
251
+
252
+ CREATE TABLE IF NOT EXISTS tg_delivery (
253
+ id TEXT PRIMARY KEY NOT NULL,
254
+ tenant TEXT NOT NULL DEFAULT '',
255
+ bot_id TEXT NOT NULL,
256
+ chat_ref TEXT NOT NULL,
257
+ message_thread_id INTEGER,
258
+ source TEXT NOT NULL,
259
+ source_id TEXT,
260
+ kind TEXT NOT NULL DEFAULT 'text',
261
+ body_html TEXT,
262
+ part INTEGER NOT NULL DEFAULT 0,
263
+ parts INTEGER NOT NULL DEFAULT 1,
264
+ file_ref TEXT,
265
+ file_name TEXT,
266
+ file_mime TEXT,
267
+ reply_markup_json TEXT,
268
+ options_json TEXT,
269
+ render_json TEXT,
270
+ target_message_id INTEGER,
271
+ dedupe_key TEXT NOT NULL,
272
+ status TEXT NOT NULL DEFAULT 'queued',
273
+ attempts INTEGER NOT NULL DEFAULT 0,
274
+ next_attempt_at INTEGER NOT NULL,
275
+ lease_until INTEGER,
276
+ lease_token TEXT,
277
+ tg_message_id INTEGER,
278
+ error_code TEXT,
279
+ error_detail TEXT,
280
+ created_at INTEGER NOT NULL,
281
+ updated_at INTEGER NOT NULL,
282
+ sent_at INTEGER
283
+ );
284
+
285
+ CREATE UNIQUE INDEX IF NOT EXISTS tg_delivery_dedupe_uq ON tg_delivery (tenant, dedupe_key);
286
+
287
+ CREATE INDEX IF NOT EXISTS tg_delivery_due_idx ON tg_delivery (bot_id, status, next_attempt_at);
288
+
289
+ CREATE INDEX IF NOT EXISTS tg_delivery_source_idx ON tg_delivery (source, source_id);
290
+
291
+ CREATE TABLE IF NOT EXISTS tg_update (
292
+ tenant TEXT NOT NULL DEFAULT '',
293
+ bot_id TEXT NOT NULL,
294
+ update_id INTEGER NOT NULL,
295
+ kind TEXT,
296
+ chat_id TEXT,
297
+ status TEXT NOT NULL DEFAULT 'received',
298
+ attempts INTEGER NOT NULL DEFAULT 0,
299
+ received_at INTEGER NOT NULL,
300
+ processed_at INTEGER,
301
+ error TEXT,
302
+ PRIMARY KEY (bot_id, update_id)
303
+ );
304
+
305
+ CREATE INDEX IF NOT EXISTS tg_update_status_idx ON tg_update (status, received_at);
306
+
307
+ CREATE TABLE IF NOT EXISTS tg_action_token (
308
+ id TEXT PRIMARY KEY NOT NULL,
309
+ tenant TEXT NOT NULL DEFAULT '',
310
+ bot_id TEXT NOT NULL,
311
+ action TEXT NOT NULL,
312
+ params_json TEXT,
313
+ chat_ref TEXT,
314
+ user_id TEXT,
315
+ single_use INTEGER NOT NULL DEFAULT 1,
316
+ confirmed_at INTEGER,
317
+ expires_at INTEGER NOT NULL,
318
+ used_at INTEGER,
319
+ result TEXT,
320
+ created_at INTEGER NOT NULL
321
+ );
322
+
323
+ CREATE INDEX IF NOT EXISTS tg_action_token_expires_idx ON tg_action_token (expires_at);
324
+
325
+ CREATE TABLE IF NOT EXISTS tg_dialog (
326
+ tenant TEXT NOT NULL DEFAULT '',
327
+ chat_ref TEXT NOT NULL,
328
+ dialog TEXT NOT NULL,
329
+ user_id TEXT,
330
+ step TEXT NOT NULL,
331
+ state_json TEXT NOT NULL DEFAULT '{}',
332
+ expires_at INTEGER NOT NULL,
333
+ started_at INTEGER NOT NULL,
334
+ updated_at INTEGER NOT NULL,
335
+ PRIMARY KEY (tenant, chat_ref)
336
+ );
337
+
338
+ CREATE INDEX IF NOT EXISTS tg_dialog_expires_idx ON tg_dialog (expires_at);
339
+
340
+ CREATE TABLE IF NOT EXISTS tg_state (
341
+ tenant TEXT NOT NULL DEFAULT '',
342
+ key TEXT NOT NULL,
343
+ value TEXT NOT NULL,
344
+ updated_at INTEGER NOT NULL,
345
+ PRIMARY KEY (tenant, key)
346
+ );
347
+
348
+ CREATE TABLE IF NOT EXISTS tg_audit (
349
+ id TEXT PRIMARY KEY NOT NULL,
350
+ tenant TEXT NOT NULL DEFAULT '',
351
+ actor TEXT,
352
+ entity TEXT NOT NULL,
353
+ entity_id TEXT,
354
+ action TEXT NOT NULL,
355
+ diff_json TEXT,
356
+ at INTEGER NOT NULL
357
+ );
358
+
359
+ CREATE INDEX IF NOT EXISTS tg_audit_entity_idx ON tg_audit (entity, entity_id);