@prajwalshete/telegram-plugin 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/CHANGELOG.md +91 -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,341 @@
1
+ {
2
+ "labels": {
3
+ "botMode": {
4
+ "webhook": "वेबहुक",
5
+ "polling": "पोलिंग (डेव्हलपमेंट)"
6
+ },
7
+ "botStatus": {
8
+ "active": "सक्रिय",
9
+ "disabled": "बंद",
10
+ "invalid_token": "अवैध टोकन",
11
+ "webhook_error": "वेबहुक त्रुटी"
12
+ },
13
+ "chatKind": {
14
+ "private": "खाजगी चॅट",
15
+ "group": "गट",
16
+ "supergroup": "सुपरग्रुप",
17
+ "channel": "चॅनेल"
18
+ },
19
+ "chatStatus": {
20
+ "pending": "प्रलंबित",
21
+ "active": "सक्रिय",
22
+ "blocked": "बॉट ब्लॉक केला",
23
+ "left": "बाहेर पडले",
24
+ "migrated": "सुपरग्रुपमध्ये हलवले"
25
+ },
26
+ "linkPurpose": {
27
+ "user": "व्यक्ती",
28
+ "group": "गट"
29
+ },
30
+ "builtinCommand": {
31
+ "start": "सुरू करा",
32
+ "help": "मदत",
33
+ "stop": "संदेश थांबवा",
34
+ "settings": "सेटिंग्ज",
35
+ "whoami": "मी कोण आहे",
36
+ "language": "भाषा"
37
+ },
38
+ "templateKind": {
39
+ "message": "संदेश",
40
+ "report": "अहवाल फाइल"
41
+ },
42
+ "templateFormat": {
43
+ "html": "फॉरमॅट केलेले (HTML)",
44
+ "text": "साधा मजकूर"
45
+ },
46
+ "reportFormat": {
47
+ "pdf": "PDF",
48
+ "csv": "CSV"
49
+ },
50
+ "buttonStyle": {
51
+ "primary": "मुख्य",
52
+ "success": "यश (हिरवा)",
53
+ "danger": "धोका (लाल)"
54
+ },
55
+ "weekday": {
56
+ "mon": "सोमवार",
57
+ "tue": "मंगळवार",
58
+ "wed": "बुधवार",
59
+ "thu": "गुरुवार",
60
+ "fri": "शुक्रवार",
61
+ "sat": "शनिवार",
62
+ "sun": "रविवार"
63
+ },
64
+ "scheduleRuleKind": {
65
+ "daily": "दररोज",
66
+ "weekly": "साप्ताहिक",
67
+ "monthly": "मासिक",
68
+ "cron": "सानुकूल (cron)",
69
+ "once": "एकदाच"
70
+ },
71
+ "missedPolicy": {
72
+ "skip": "चुकलेले रन वगळा",
73
+ "run_once": "चुकल्यास एकदा चालवा"
74
+ },
75
+ "scheduleRunStatus": {
76
+ "running": "चालू आहे",
77
+ "done": "पूर्ण",
78
+ "partial": "अंशतः पाठवले",
79
+ "failed": "अयशस्वी",
80
+ "skipped": "वगळले"
81
+ },
82
+ "scheduleRunTrigger": {
83
+ "schedule": "वेळापत्रकानुसार",
84
+ "manual": "आता चालवले"
85
+ },
86
+ "filterOp": {
87
+ "eq": "बरोबर",
88
+ "ne": "नाही",
89
+ "gt": "पेक्षा जास्त",
90
+ "gte": "किमान",
91
+ "lt": "पेक्षा कमी",
92
+ "lte": "कमाल",
93
+ "in": "यापैकी एक",
94
+ "contains": "समाविष्ट आहे"
95
+ },
96
+ "eventStatus": {
97
+ "pending": "प्रलंबित",
98
+ "processing": "प्रक्रिया सुरू",
99
+ "done": "पूर्ण",
100
+ "failed": "अयशस्वी",
101
+ "ignored": "दुर्लक्षित"
102
+ },
103
+ "broadcastStatus": {
104
+ "draft": "मसुदा",
105
+ "queued": "रांगेत",
106
+ "sending": "पाठवत आहे",
107
+ "done": "पूर्ण"
108
+ },
109
+ "deliverySource": {
110
+ "schedule": "वेळापत्रक",
111
+ "event": "घटना सूचना",
112
+ "broadcast": "प्रसारण",
113
+ "command": "कमांड उत्तर",
114
+ "ai": "AI सहाय्यक",
115
+ "api": "ॲप",
116
+ "system": "सिस्टम"
117
+ },
118
+ "deliveryKind": {
119
+ "text": "मजकूर",
120
+ "document": "दस्तऐवज",
121
+ "photo": "फोटो",
122
+ "edit": "संपादन",
123
+ "delete": "हटवणे"
124
+ },
125
+ "deliveryStatus": {
126
+ "queued": "रांगेत",
127
+ "sending": "पाठवत आहे",
128
+ "sent": "पाठवले",
129
+ "failed": "अयशस्वी",
130
+ "dropped": "रद्द झाले",
131
+ "cancelled": "रद्द केले"
132
+ },
133
+ "feature": {
134
+ "core": "बॉट आणि चॅट",
135
+ "commands": "कमांड",
136
+ "templates": "साचे",
137
+ "schedules": "वेळापत्रके",
138
+ "reports": "अहवाल फाइल्स",
139
+ "events": "घटना सूचना",
140
+ "broadcasts": "प्रसारणे",
141
+ "actions": "बटणे आणि मंजुरी",
142
+ "dialogs": "संवाद",
143
+ "inbound": "मिळालेल्या फाइल्स",
144
+ "subscriptions": "प्राधान्ये",
145
+ "ai": "AI सहाय्यक",
146
+ "ops": "कामकाज"
147
+ },
148
+ "permission": {
149
+ "telegram_view": "टेलिग्राम सेटिंग्ज पहा",
150
+ "telegram_bots_manage": "बॉट व्यवस्थापित करा",
151
+ "telegram_chats_manage": "जोडलेले चॅट व्यवस्थापित करा",
152
+ "telegram_self_link": "माझे टेलिग्राम जोडा",
153
+ "telegram_destinations_manage": "गंतव्ये व्यवस्थापित करा",
154
+ "telegram_commands_manage": "कमांड व्यवस्थापित करा",
155
+ "telegram_templates_manage": "साचे व्यवस्थापित करा",
156
+ "telegram_schedules_manage": "वेळापत्रके व्यवस्थापित करा",
157
+ "telegram_events_manage": "घटना सूचना व्यवस्थापित करा",
158
+ "telegram_broadcasts_send": "प्रसारणे पाठवा",
159
+ "telegram_reports_run": "अहवाल चालवा",
160
+ "telegram_send": "टेलिग्रामवर पाठवा",
161
+ "telegram_ops_view": "वितरण स्थिती पहा",
162
+ "telegram_ops_manage": "वितरण पुन्हा करा किंवा रद्द करा",
163
+ "telegram_ops_content": "संदेशाचा मजकूर पहा"
164
+ },
165
+ "problem": {
166
+ "feature_disabled": "हे वैशिष्ट्य बंद आहे.",
167
+ "bot_token_invalid": "बॉट टोकन वैध नाही.",
168
+ "bot_token_mismatch": "हे टोकन दुसऱ्या बॉटचे आहे.",
169
+ "bot_unreachable": "टेलिग्रामशी संपर्क झाला नाही. पुन्हा प्रयत्न करा.",
170
+ "webhook_url_missing": "ॲपचा सार्वजनिक पत्ता सेट केलेला नाही.",
171
+ "webhook_failed": "टेलिग्रामने वेबहुक स्वीकारला नाही.",
172
+ "chat_not_found": "चॅट सापडले नाही.",
173
+ "chat_blocked": "या व्यक्तीने बॉट ब्लॉक केला आहे.",
174
+ "link_expired": "ही लिंक कालबाह्य झाली आहे.",
175
+ "link_used": "ही लिंक आधीच वापरली आहे.",
176
+ "destination_not_allowed": "तिथे पाठवण्याची परवानगी नाही.",
177
+ "template_invalid": "साच्यात त्रुटी आहेत.",
178
+ "template_variable_unknown": "साच्यात अज्ञात फील्ड वापरले आहे.",
179
+ "provider_unknown": "अज्ञात डेटा स्रोत.",
180
+ "provider_forbidden": "या प्रेक्षकांना हा डेटा पाहण्याची परवानगी नाही.",
181
+ "schedule_rule_invalid": "वेळापत्रकाची वेळ वैध नाही.",
182
+ "timezone_invalid": "अज्ञात वेळ क्षेत्र.",
183
+ "recipient_empty": "किमान एक प्राप्तकर्ता निवडा.",
184
+ "send_text_rejected": "हा मजकूर जसा आहे तसा पाठवता येत नाही.",
185
+ "file_too_large": "टेलिग्रामसाठी फाइल खूप मोठी आहे.",
186
+ "renderer_unavailable": "हा फाइल प्रकार उपलब्ध नाही.",
187
+ "delivery_not_retryable": "हा संदेश पुन्हा पाठवता येत नाही.",
188
+ "schema_outdated": "डेटाबेस अपडेट करणे आवश्यक आहे.",
189
+ "unauthenticated": "पुढे जाण्यासाठी साइन इन करा.",
190
+ "forbidden": "तुम्हाला परवानगी नाही.",
191
+ "not_found": "सापडले नाही.",
192
+ "validation_failed": "काही फील्ड वैध नाहीत.",
193
+ "rate_limited": "खूप विनंत्या. थोडा वेळ थांबा.",
194
+ "internal_error": "काहीतरी चुकले. नंतर पुन्हा प्रयत्न करा."
195
+ },
196
+ "reportColumnFormat": {
197
+ "text": "मजकूर",
198
+ "number": "संख्या",
199
+ "money": "रक्कम",
200
+ "date": "तारीख",
201
+ "datetime": "तारीख आणि वेळ",
202
+ "yesno": "हो / नाही"
203
+ }
204
+ },
205
+ "bot": {
206
+ "cmd": {
207
+ "start": "सुरू करा आणि खाते जोडा",
208
+ "help": "मी काय करू शकतो",
209
+ "stop": "सर्व संदेश थांबवा",
210
+ "settings": "तुमची संदेश सेटिंग्ज",
211
+ "whoami": "तुमचे जोडलेले खाते दाखवा",
212
+ "language": "भाषा बदला",
213
+ "report": "अहवाल मिळवा"
214
+ },
215
+ "start": {
216
+ "unlinked": "हा बॉट खाजगी आहे. तुमच्या ॲडमिनकडे लिंक मागा, किंवा ॲप उघडून \"टेलिग्राम जोडा\" निवडा.",
217
+ "linked": "{{name}} ({{role}}) म्हणून जोडले.",
218
+ "group_linked": "हा गट जोडला आहे. याला यांच्यासाठी संदेश मिळतील: {{audience}}.",
219
+ "already_linked": "तुम्ही आधीच {{name}} म्हणून जोडलेले आहात.",
220
+ "unmuted": "संदेश पुन्हा सुरू झाले.",
221
+ "audience_users": "{{count}} लोक"
222
+ },
223
+ "link": {
224
+ "expired": "ही लिंक कालबाह्य झाली आहे. ॲपमध्ये नवीन लिंक मागा.",
225
+ "used": "ही लिंक आधीच वापरली आहे.",
226
+ "other_account": "हे टेलिग्राम खाते आधीच दुसऱ्या कोणाशी जोडलेले आहे.",
227
+ "not_creator": "ज्याने ही लिंक बनवली तेच ती गटात वापरू शकतात.",
228
+ "pending_confirm": "हे आमंत्रण {{name}} यांच्यासाठी आहे. {{name}} यांनी ॲपमध्ये पुष्टी करण्याची वाट पाहत आहोत; पुष्टी झाल्यावर तुम्हाला इथे संदेश येईल.",
229
+ "confirmed_hint": "तुम्ही काय करू शकता ते पाहण्यासाठी /help पाठवा.",
230
+ "pending_notice": "{{admin}} यांच्याकडून तुमच्यासाठी टेलिग्राम लिंक प्रलंबित आहे. खाते तुमचे असल्यास ॲपमध्ये पुष्टी करा.",
231
+ "an_admin": "एक ॲडमिन"
232
+ },
233
+ "help": {
234
+ "header": "तुम्ही वापरू शकता अशा कमांड:",
235
+ "none": "तुमच्यासाठी अजून कोणत्याही कमांड नाहीत."
236
+ },
237
+ "stop": {
238
+ "done": "संदेश थांबवले आहेत. पुन्हा सुरू करण्यासाठी /start पाठवा."
239
+ },
240
+ "settings": {
241
+ "header": "तुमची संदेश सेटिंग्ज:",
242
+ "muted": "म्यूट",
243
+ "unmuted": "चालू",
244
+ "all": "सर्व संदेश: {{state}}",
245
+ "language": "भाषा: {{language}}"
246
+ },
247
+ "whoami": {
248
+ "linked": "तुम्ही {{name}} ({{role}}) आहात.",
249
+ "unlinked": "हे चॅट कोणत्याही खात्याशी जोडलेले नाही."
250
+ },
251
+ "language": {
252
+ "choose": "भाषा निवडा:",
253
+ "set": "भाषा मराठी केली.",
254
+ "unknown": "अज्ञात भाषा. यापैकी एक निवडा: {{list}}",
255
+ "names": {
256
+ "en": "English (इंग्रजी)",
257
+ "mr": "मराठी"
258
+ }
259
+ },
260
+ "error": {
261
+ "forbidden": "तुम्हाला यासाठी परवानगी नाही.",
262
+ "generic": "काहीतरी चुकले. नंतर पुन्हा प्रयत्न करा.",
263
+ "unknown_command": "अज्ञात कमांड. मी काय करू शकतो हे पाहण्यासाठी /help पाठवा.",
264
+ "feature_disabled": "हे बंद आहे.",
265
+ "rate_limited": "तुम्ही खूप वेगाने संदेश पाठवत आहात. एक मिनिट थांबा.",
266
+ "not_linked": "आधी हे चॅट जोडा: ॲप उघडून \"टेलिग्राम जोडा\" निवडा.",
267
+ "sender_not_linked": "आधी तुमचे स्वतःचे टेलिग्राम खाते जोडा: ॲप उघडून \"टेलिग्राम जोडा\" निवडा, मग इथे पुन्हा प्रयत्न करा."
268
+ },
269
+ "action": {
270
+ "expired": "हे बटण कालबाह्य झाले आहे.",
271
+ "used": "हे आधीच केले आहे.",
272
+ "confirm": "खात्री करण्यासाठी पुन्हा टॅप करा.",
273
+ "done": "झाले.",
274
+ "not_yours": "हे बटण तुमच्यासाठी नाही.",
275
+ "link_first": "आधी ॲपमध्ये तुमचे टेलिग्राम खाते जोडा.",
276
+ "failed": "हे झाले नाही. नंतर पुन्हा प्रयत्न करा.",
277
+ "cancelled": "रद्द केले.",
278
+ "confirm_button": "खात्री करा",
279
+ "cancel_button": "रद्द करा"
280
+ },
281
+ "dialog": {
282
+ "cancelled": "रद्द केले.",
283
+ "timeout": "हा संवाद कालबाह्य झाला.",
284
+ "invalid": "हे बरोबर वाटत नाही. पुन्हा प्रयत्न करा.",
285
+ "cancel_hint": "थांबवण्यासाठी /cancel पाठवा.",
286
+ "skip_hint": "हे वगळण्यासाठी /skip पाठवा.",
287
+ "send_photo": "एक फोटो पाठवा.",
288
+ "send_document": "एक फाइल पाठवा.",
289
+ "pick_choice": "कृपया एक बटण निवडा.",
290
+ "required": "ही पायरी आवश्यक आहे, ती वगळता येणार नाही.",
291
+ "nothing": "रद्द करण्यासारखे काही नाही.",
292
+ "done": "जतन केले. धन्यवाद.",
293
+ "failed": "हे जतन करता आले नाही. नंतर पुन्हा प्रयत्न करा."
294
+ },
295
+ "here": {
296
+ "saved": "हा विषय \"{{name}}\" म्हणून जतन केला.",
297
+ "not_topic": "जोडलेल्या गटाच्या फोरम विषयात /here आणि नाव पाठवा."
298
+ },
299
+ "command": {
300
+ "usage": "वापर: {{usage}}",
301
+ "wrong_chat": "ही आज्ञा या चॅटमध्ये चालत नाही."
302
+ },
303
+ "report": {
304
+ "list_header": "तुम्ही मिळवू शकता असे अहवाल:",
305
+ "none": "तुमच्यासाठी कोणतेही अहवाल नाहीत.",
306
+ "unknown": "अज्ञात अहवाल. यादी पाहण्यासाठी /report पाठवा.",
307
+ "failed": "अहवाल तयार होऊ शकला नाही. नंतर पुन्हा प्रयत्न करा.",
308
+ "too_large": "ही फाइल Telegram साठी खूप मोठी आहे.",
309
+ "download": "येथे डाउनलोड करा:",
310
+ "yes": "हो",
311
+ "no": "नाही",
312
+ "more": "आणखी अहवाल उपलब्ध आहेत. एखादा अहवाल मिळवण्यासाठी /report नंतर त्याचे नाव पाठवा."
313
+ },
314
+ "data": {
315
+ "failed": "माहिती आणता आली नाही. नंतर पुन्हा प्रयत्न करा."
316
+ },
317
+ "inbound": {
318
+ "not_handled": "धन्यवाद, पण मी इथे फाइल्स वापरू शकत नाही.",
319
+ "too_large": "ही फाइल खूप मोठी आहे.",
320
+ "type_not_allowed": "अशा प्रकारची फाइल स्वीकारली जात नाही.",
321
+ "unavailable": "सध्या फाइल्स स्वीकारता येत नाहीत.",
322
+ "download_failed": "फाइल डाउनलोड करता आली नाही. पुन्हा पाठवून पहा."
323
+ },
324
+ "ai": {
325
+ "consequence": "हे टेलिग्रामवर (@{{bot}}) {{name}} यांना {{what}} पाठवेल. {{audience}}",
326
+ "what": {
327
+ "text": "एक संदेश",
328
+ "file": "फाइल {{name}}",
329
+ "record": "{{type}} {{key}}",
330
+ "template": "संदेश \"{{name}}\"",
331
+ "report": "अहवाल {{name}}"
332
+ },
333
+ "audience": {
334
+ "user": "फक्त {{name}} हे पाहतील.",
335
+ "role": "या गटातील सर्वजण हे पाहतील ({{role}} म्हणून).",
336
+ "group": "या गटातील सर्वजण हे पाहतील."
337
+ },
338
+ "chats": "हे {{count}} चॅटवर जाईल."
339
+ }
340
+ }
341
+ }
@@ -0,0 +1,22 @@
1
+ import { SqlFragment } from "./sql.js";
2
+ /** Result of `DbPort.run`. */
3
+ export interface RunResult {
4
+ /** Rows written by the statement. */
5
+ changes: number;
6
+ /** Rowid of the last inserted row, or null. */
7
+ lastRowId: number | null;
8
+ }
9
+ /** The database port. `d1Db(env.DB)` is the default; hosts may pass their own (for example a D1 session). */
10
+ export interface DbPort {
11
+ /** All result rows. */
12
+ all<T = Record<string, unknown>>(q: SqlFragment): Promise<T[]>;
13
+ /** The first row, or null. */
14
+ first<T = Record<string, unknown>>(q: SqlFragment): Promise<T | null>;
15
+ /** Runs a write statement. */
16
+ run(q: SqlFragment): Promise<RunResult>;
17
+ /** One atomic batch (D1 has no interactive transactions). Returns the rows of each statement. */
18
+ batch<T = Record<string, unknown>>(qs: readonly SqlFragment[]): Promise<{
19
+ rows: T[];
20
+ changes: number;
21
+ }[]>;
22
+ }
@@ -0,0 +1,4 @@
1
+ import { SqlFragment, SqlInput, SqlValue, isSqlFragment, sql } from "./sql.js";
2
+ import { DbPort, RunResult } from "./db.js";
3
+ import { ActorInfo, ActorPort, AuditEntry, AuditPort, AuthorizePort, ClockPort, ErrorsPort, FilesPort, I18nPort, IdsPort, KeyringPort, LogFields, LogPort, MetricsPort, OpenedFile, PortOrFactory, RenderInput, RenderedFile, RendererPort, SchedulerPort, SettingsPort, StoredFile, TransportPort, UserInfo, UsersPort } from "./ports.js";
4
+ export { type ActorInfo, type ActorPort, type AuditEntry, type AuditPort, type AuthorizePort, type ClockPort, type DbPort, type ErrorsPort, type FilesPort, type I18nPort, type IdsPort, type KeyringPort, type LogFields, type LogPort, type MetricsPort, type OpenedFile, type PortOrFactory, type RenderInput, type RenderedFile, type RendererPort, type RunResult, type SchedulerPort, type SettingsPort, type SqlFragment, type SqlInput, type SqlValue, type StoredFile, type TransportPort, type UserInfo, type UsersPort, isSqlFragment, sql };
@@ -0,0 +1,257 @@
1
+ import { Audience } from "../contracts/chats.js";
2
+ import { TelegramProblem } from "../contracts/problems.js";
3
+ import { SqlFragment } from "./sql.js";
4
+ import { TelegramPluginError } from "../engine/errors.js";
5
+ import { Context } from "hono";
6
+ type MaybePromise<T> = T | Promise<T>;
7
+ /** What the plugin needs to know about an actor (for replies and menus). */
8
+ export interface ActorInfo {
9
+ /** Host user id; null for a synthetic group-audience actor. */
10
+ userId: string | null;
11
+ /** Host role (matched against command roles and `cacheFor: "audience-role"`); null when none. */
12
+ role: string | null;
13
+ /** Preferred locale (`en`, `mr`, …); falls back to the chat / default locale. */
14
+ locale?: string | undefined;
15
+ /** Display name for replies and admin screens. */
16
+ name?: string | undefined;
17
+ }
18
+ /** Who is calling (admin API) and who a Telegram user is (live, every time). Required. */
19
+ export interface ActorPort<A> {
20
+ /** Host session → actor, or null when not signed in (gives 401 `unauthenticated`). */
21
+ fromRequest(c: Context): MaybePromise<A | null>;
22
+ /** Linked app user → live actor, or null when the user is disabled or gone. */
23
+ forUser(userId: string): MaybePromise<A | null>;
24
+ /** Group audience → synthetic actor with no personal scopes. */
25
+ forAudience(audience: Audience): MaybePromise<A | null>;
26
+ /** Plain facts about an actor (sync, cheap; called often). */
27
+ describe(actor: A): ActorInfo;
28
+ }
29
+ /**
30
+ * Host permission check. `permission` is a plugin name (`telegram.bots.manage`) or a host data permission;
31
+ * `resource` is an optional object the check is about. False gives 403 `forbidden` on admin routes. Required.
32
+ */
33
+ export type AuthorizePort<A> = (actor: A, permission: string, resource?: unknown) => MaybePromise<boolean>;
34
+ /** A host user as shown in linking screens. */
35
+ export interface UserInfo {
36
+ /** Host user id (the value stored in `tg_chat.user_id`). */
37
+ id: string;
38
+ /** Display name. */
39
+ name: string;
40
+ /** Host role, or null. */
41
+ role: string | null;
42
+ /** Preferred locale. */
43
+ locale?: string | undefined;
44
+ }
45
+ /** The host's users, for linking screens and `{ role }` recipients. Optional. */
46
+ export interface UsersPort {
47
+ /** One user by id (checked before an admin link code is issued: unknown → 404 `not_found`). */
48
+ find(ref: string): MaybePromise<UserInfo | null>;
49
+ /**
50
+ * Users matching a search string, for the "link a user" picker (`GET /admin/users?q=`, needs
51
+ * `telegram.chats.manage`). Without it that route answers 404 `feature_disabled` and meta has `userSearch: false`.
52
+ * `limit` is 1–50 (default 20); return at most that many.
53
+ */
54
+ search?(query: string, opts: {
55
+ limit: number;
56
+ }): MaybePromise<UserInfo[]>;
57
+ /** All user ids with a role (for `{ role }` recipients). */
58
+ byRole?(role: string): MaybePromise<string[]>;
59
+ }
60
+ /** A file kept by the host's files port. */
61
+ export interface StoredFile {
62
+ /** Host file id or R2 key. */
63
+ ref: string;
64
+ /** File name including extension. */
65
+ name: string;
66
+ /** MIME type. */
67
+ mime: string;
68
+ /** Size in bytes, or null when unknown. */
69
+ size: number | null;
70
+ }
71
+ /** A stored file opened for reading. */
72
+ export interface OpenedFile extends StoredFile {
73
+ /** File contents (consumed once). */
74
+ body: ReadableStream<Uint8Array>;
75
+ }
76
+ /** The host's file service over R2 (+ its permissions). Optional; `r2Files` is the minimal adapter. */
77
+ export interface FilesPort<A = unknown> {
78
+ /**
79
+ * Stores a file (inbound photos / documents, rendered reports). `tags` always include `source: "telegram"`.
80
+ * `actor` is the user the file belongs to, or null for system writes.
81
+ */
82
+ put(input: {
83
+ name: string;
84
+ mime: string;
85
+ body: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array;
86
+ tags?: Record<string, string>;
87
+ }, actor: A | null): Promise<StoredFile>;
88
+ /** Opens a file by ref, or null when missing. `actor` null = a send after the read check already passed. */
89
+ open(ref: string, actor: A | null): Promise<OpenedFile | null>;
90
+ /**
91
+ * Read check for file sends by ref (false gives 403 `forbidden`). Required for `source: "files"` sends: without it
92
+ * every such send is refused (deny by default).
93
+ */
94
+ canRead?(actor: A, ref: string): MaybePromise<boolean>;
95
+ /** A link to the file in the app (sent instead of files over Telegram's 50 MB upload limit). */
96
+ url?(ref: string): MaybePromise<string | null>;
97
+ }
98
+ /** One audit entry. Never contains tokens, message text or chat ids. */
99
+ export interface AuditEntry {
100
+ /** Host user id of the actor; null for system jobs. */
101
+ actor: string | null;
102
+ /** Entity kind (`bot`, `template`, `schedule`, …). */
103
+ entity: string;
104
+ /** Id of the entity, or null. */
105
+ entityId: string | null;
106
+ /** What happened (`create`, `update`, `delete`, `rekey`, …). */
107
+ action: string;
108
+ /** Changed fields (secrets removed). */
109
+ diff?: Record<string, unknown> | undefined;
110
+ /** Epoch ms UTC. */
111
+ at: number;
112
+ }
113
+ /** Returns SQL to add to the same batch as the write it records. Default: insert into `tg_audit`. */
114
+ export type AuditPort = (entry: AuditEntry) => SqlFragment[];
115
+ /**
116
+ * Maps a plugin problem to the host's error type. When set, the plugin's routes throw what it returns (so the
117
+ * host's `onError` renders it) instead of answering problem+json themselves. `problem` is the full RFC 9457 body
118
+ * (`code`, `title`, `status`, `detail`, `instance` and extension members such as `issues`, `errors`, `reasons`,
119
+ * `retryAfter`); `error` is the original `TelegramPluginError`. Optional.
120
+ */
121
+ export type ErrorsPort = (problem: TelegramProblem, error: TelegramPluginError) => Error;
122
+ /** Structured log fields (JSON-serializable values). */
123
+ export type LogFields = Record<string, unknown>;
124
+ /**
125
+ * Structured log. `evt` is a stable name (`tg.send`, `tg.tick`). Never pass tokens, URLs, text or chat ids. Calls
126
+ * must not throw. Default `consoleLog` (JSON lines, secrets redacted).
127
+ */
128
+ export interface LogPort {
129
+ /** Verbose detail (off unless `logLevel: "debug"`). */
130
+ debug(evt: string, fields?: LogFields): void;
131
+ /** Normal operations. */
132
+ info(evt: string, fields?: LogFields): void;
133
+ /** Recoverable problems (retries, skipped deliveries). */
134
+ warn(evt: string, fields?: LogFields): void;
135
+ /** Failures that need attention. */
136
+ error(evt: string, fields?: LogFields): void;
137
+ }
138
+ /** Time source. Default `systemClock`; tests use `TestClock`. */
139
+ export interface ClockPort {
140
+ /** Epoch ms, UTC. */
141
+ now(): number;
142
+ /** Waits (drain pacing). Default `setTimeout`; tests pass a fake that advances `now()`. */
143
+ sleep?(ms: number): Promise<void>;
144
+ }
145
+ /** Id generator. Default `uuidv7Ids`. */
146
+ export interface IdsPort {
147
+ /** UUIDv7 (time-ordered) text id. */
148
+ uuid(): string;
149
+ }
150
+ /** Host locales and optional host translations of bot strings. */
151
+ export interface I18nPort {
152
+ /** Locales the bot offers (`/language`). The plugin ships `en` and `mr` strings. */
153
+ locales: readonly string[];
154
+ /** Locale for chats and users without one; must be in `locales`. */
155
+ defaultLocale: string;
156
+ /** Host translation; return undefined to fall back to the plugin's strings. */
157
+ t?(locale: string, key: string, vars?: Record<string, unknown>): string | undefined;
158
+ }
159
+ /** Host-wide formatting defaults. */
160
+ export interface SettingsPort {
161
+ /** Default IANA zone for schedules and dates. */
162
+ timezone: string;
163
+ /** ISO 4217 code for the `money` filter. */
164
+ currency?: string;
165
+ /** Digits in the minor unit (INR paise = 2). */
166
+ minorUnitDigits?: number;
167
+ /** Locale used for number formatting when the chat has none. */
168
+ numberLocale?: string;
169
+ }
170
+ /** Encrypts bot tokens and webhook secrets. Format `v1.<kid>.<iv>.<ct>`; AAD binds a ciphertext to its row. */
171
+ export interface KeyringPort {
172
+ /** Key id used for new ciphertexts. */
173
+ activeKid(): string;
174
+ /** Encrypts with the active key; `aad` is the row binding (for example the bot id). */
175
+ encrypt(plaintext: string, aad: string): Promise<string>;
176
+ /** Decrypts with the key named in the ciphertext. Throws on an unknown key or a wrong `aad`. */
177
+ decrypt(ciphertext: string, aad: string): Promise<string>;
178
+ /** Key id inside a ciphertext (for the rekey job and health). */
179
+ kidOf(ciphertext: string): string | null;
180
+ }
181
+ /** How queued deliveries get drained: by the tick (default), a Queue, or a Durable Object. */
182
+ export interface TransportPort {
183
+ /** Transport id, shown in meta and health. */
184
+ readonly name: "outbox" | "queue" | "do" | (string & {});
185
+ /** Ask for a drain soon (after a commit). Must be cheap and safe to call often. */
186
+ kick(botIds?: readonly string[]): Promise<void>;
187
+ }
188
+ /** How due schedules get fired: the minute tick (default) or DO alarms. */
189
+ export interface SchedulerPort {
190
+ /** Scheduler id, shown in meta and health. */
191
+ readonly name: "cron" | "do" | (string & {});
192
+ /** Called after a schedule's `next_run_at` changes (DO scheduler sets an alarm). */
193
+ scheduled?(scheduleId: string, nextRunAt: number | null): Promise<void>;
194
+ }
195
+ /** What a `RendererPort` receives for one report file. */
196
+ export interface RenderInput {
197
+ /** Rendered data rows / document model from the provider. */
198
+ data: unknown;
199
+ /** Output file name including extension. */
200
+ fileName: string;
201
+ /** Locale of the recipient. */
202
+ locale: string;
203
+ /** IANA zone for dates. */
204
+ timezone: string;
205
+ /** The template's layout options (columns, orientation…), renderer-specific. */
206
+ layout?: Record<string, unknown> | undefined;
207
+ /** For HTML-based renderers: the rendered template HTML. */
208
+ html?: string | undefined;
209
+ /** Report title (rendered file name without extension, or the layout title). */
210
+ title?: string | undefined;
211
+ /** ISO 4217 code and minor digits for money columns (host settings). */
212
+ currency?: string | undefined;
213
+ /** Digits in the currency's minor unit (money values are integer minor units). */
214
+ minorDigits?: number | undefined;
215
+ /** Localized words for `yesno` columns. */
216
+ labels?: {
217
+ yes: string;
218
+ no: string;
219
+ } | undefined;
220
+ }
221
+ /** A renderer's output. */
222
+ export interface RenderedFile {
223
+ /** File name including extension. */
224
+ name: string;
225
+ /** MIME type. */
226
+ mime: string;
227
+ /** File contents. */
228
+ body: Uint8Array | ReadableStream<Uint8Array>;
229
+ /** Size in bytes, when known (needed to pick upload vs link over 50 MB). */
230
+ size?: number | undefined;
231
+ }
232
+ /**
233
+ * Report file renderer (`csv`, `pdf`, or host custom). `env` is the Worker env of the current invocation (the
234
+ * value the plugin's `env` mapper received), so a renderer can use per-request bindings such as Browser Rendering.
235
+ */
236
+ export interface RendererPort<E = unknown> {
237
+ /** File format key used by templates (`csv`, `pdf`, `xlsx`, …). */
238
+ readonly format: string;
239
+ /** MIME type of the produced file. */
240
+ readonly mime: string;
241
+ /** Produces the file. A throw fails the report delivery (logged, retried by the outbox). */
242
+ render(input: RenderInput, env: E): Promise<RenderedFile>;
243
+ }
244
+ /** Optional counters (for example Analytics Engine via `analyticsEngineMetrics`). Calls must not throw. */
245
+ export interface MetricsPort {
246
+ /** Adds `value` (default 1) to a counter. */
247
+ count(name: string, value?: number, tags?: Record<string, string>): void;
248
+ /** Records a duration in ms. */
249
+ timing(name: string, ms: number, tags?: Record<string, string>): void;
250
+ }
251
+ /**
252
+ * A port given directly, or built per invocation from the Worker env (`(env) => analyticsEngineMetrics(env.AE)`),
253
+ * so it can use per-request bindings without capturing them globally. The factory runs once per request, job run
254
+ * or queue batch; returning undefined means "not available in this invocation".
255
+ */
256
+ export type PortOrFactory<P, E> = P | ((env: E) => P | undefined);
257
+ export {};