@adriangalilea/utils 0.31.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -3
- package/dist/bot/create.d.ts +98 -0
- package/dist/bot/create.d.ts.map +1 -0
- package/dist/bot/create.js +175 -0
- package/dist/bot/create.js.map +1 -0
- package/dist/bot/language.d.ts +8 -0
- package/dist/bot/language.d.ts.map +1 -1
- package/dist/bot/language.js +9 -2
- package/dist/bot/language.js.map +1 -1
- package/dist/bot/menu.d.ts +30 -5
- package/dist/bot/menu.d.ts.map +1 -1
- package/dist/bot/menu.js +47 -31
- package/dist/bot/menu.js.map +1 -1
- package/dist/bot/payments/derive.d.ts +1 -1
- package/dist/bot/payments/derive.js +1 -1
- package/dist/bot/payments/plugin.d.ts +6 -0
- package/dist/bot/payments/plugin.d.ts.map +1 -1
- package/dist/bot/payments/plugin.js +5 -2
- package/dist/bot/payments/plugin.js.map +1 -1
- package/dist/bot/storage-d1.d.ts +50 -0
- package/dist/bot/storage-d1.d.ts.map +1 -0
- package/dist/bot/storage-d1.js +65 -0
- package/dist/bot/storage-d1.js.map +1 -0
- package/dist/bot/worker.d.ts +57 -0
- package/dist/bot/worker.d.ts.map +1 -0
- package/dist/bot/worker.js +210 -0
- package/dist/bot/worker.js.map +1 -0
- package/package.json +13 -1
package/README.md
CHANGED
|
@@ -350,7 +350,7 @@ const notify = (msg: Polyglot<'en' | 'es'>, lang: 'en' | 'es') =>
|
|
|
350
350
|
transport.send(say(msg, lang))
|
|
351
351
|
```
|
|
352
352
|
|
|
353
|
-
In a bot, `bot/language` adds `ctx.
|
|
353
|
+
In a bot, `bot/language` adds `ctx.lang` + `ctx.say`. Both resolve stored explicit pick → Telegram client hint → configured default, at READ time — the hint is never persisted, and `session.language` is written only by an explicit pick (the plugin's menuItem action):
|
|
354
354
|
|
|
355
355
|
```typescript
|
|
356
356
|
ctx.say({ en: 'Continue', es: 'Continuar' }) // → string
|
|
@@ -367,6 +367,47 @@ Plugins for personal Telegram bots built on [GramIO](https://gramio.dev). Each p
|
|
|
367
367
|
pnpm add @adriangalilea/utils gramio @gramio/storage @gramio/session
|
|
368
368
|
```
|
|
369
369
|
|
|
370
|
+
#### One bot file, ideation → production (`bot/create`)
|
|
371
|
+
|
|
372
|
+
`createBot` is the composer: it constructs the storage + session pair ONCE and threads it into every feature, so "must be the SAME instance you passed to session()" is unrepresentable instead of a doc warning. The same file runs in every stage — **storage and transport are environment decisions, never code shape**:
|
|
373
|
+
|
|
374
|
+
| stage | run | session | transport |
|
|
375
|
+
|---|---|---|---|
|
|
376
|
+
| ideation | `BOT_TOKEN=… tsx bot.ts` | memory (ephemeral, announced) | long-poll |
|
|
377
|
+
| experiment | `BOT_PERSIST=./bot.sqlite tsx bot.ts` | sqlite | long-poll |
|
|
378
|
+
| prod · your own hardware | systemd/launchd unit running the same command | sqlite / `BOT_PERSIST=redis://…` | long-poll (a legitimate prod mode: dials out, no inbound port/TLS) |
|
|
379
|
+
| prod · Cloudflare Worker | `wrangler deploy` (D1 binding `DB`) | D1 (`bot/storage-d1`) | webhook (`bot/worker`) |
|
|
380
|
+
| prod · Node/Bun server | webhook behind your HTTP server | sqlite/redis | fetch-shaped handler |
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
import { createBot } from '@adriangalilea/utils/bot/create'
|
|
384
|
+
|
|
385
|
+
const app = createBot({
|
|
386
|
+
admins: 190202471,
|
|
387
|
+
language: { supported: ['en', 'es'] as const, default: 'en' },
|
|
388
|
+
menu: {
|
|
389
|
+
adminContact: '@you',
|
|
390
|
+
header: async (ctx) => `⚙️ hi ${ctx.from?.firstName}`, // async — read your db here
|
|
391
|
+
items: [/* … */],
|
|
392
|
+
personalData: { onForget: async (ctx, userId) => {/* wipe YOUR tables */} },
|
|
393
|
+
},
|
|
394
|
+
handlers: (bot) => bot.command('start', (ctx) => ctx.say({ en: 'hi', es: 'hola' })),
|
|
395
|
+
})
|
|
396
|
+
|
|
397
|
+
export default app // Worker: webhook + /setup + /pause + deploy DMs
|
|
398
|
+
if (app.isMain(import.meta)) app.poll() // Node: `tsx bot.ts` long-polls
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
Cloudflare is one adapter, not the architecture: `bot/worker` and `bot/storage-d1` are the workerd cap (~each 100 lines, both optional); `bot/kit`'s `gracefulStart` is the Node twin (signals + start/stop DMs) and stays the one deliberately Node-only corner. The worker-safe tripwire (`pnpm test:worker-safe`) guarantees the core never grows a Node dependency.
|
|
402
|
+
|
|
403
|
+
#### Design rules the bot plugins hold to (each learned the hard way)
|
|
404
|
+
|
|
405
|
+
- **Resolution is read-time.** Language resolves stored pick → live Telegram hint → default on every surface (`ctx.lang`, `ctx.say`, menu chrome, picker highlight). Inferred values are NEVER persisted — a user who switches their client language moves with it until they pick.
|
|
406
|
+
- **Only explicit user signals are stored.** The session holds picks, consent, state the user created — never derived values, never render caches. If a sync signature ever tempts you to cache a rendered string into the session, the signature is the bug (menu resolvers are async for exactly this reason).
|
|
407
|
+
- **Derives cover every event the user can speak through** — message, callback, AND inline. A feature that skips inline forces consumers to fork shadow helpers that read the session directly; those forks then read as design.
|
|
408
|
+
- **Forget actually forgets.** `personalData.onForget` runs inside the same try as the session delete: your message logs/metrics/credit rows get wiped too, or the user is told it failed — never a partial erasure reading as success.
|
|
409
|
+
- **The composer owns instance wiring.** Features still compose manually (below) when you need full control, but every "same instance" contract has one home.
|
|
410
|
+
|
|
370
411
|
#### Threaded Mode — pin the `@gramio/contexts` fork
|
|
371
412
|
|
|
372
413
|
Telegram added [Threaded Mode](https://telegram.org/blog/threaded-conversations) for private chats (BotFather → Bot Settings → Threaded Mode). gramio's `SendMixin` skips auto-threading there, and `CallbackQueryContext` doesn't expose `threadId` at all. Fixes [PR'd upstream](https://github.com/gramiojs/contexts/pull/4); until merged, pin the fork in **your bot project's** workspace root (pnpm only honors overrides at the root, not transitively — and pnpm ≥11 reads them from `pnpm-workspace.yaml`, not `package.json`):
|
|
@@ -392,8 +433,11 @@ Then `pnpm install`. Every `ctx.send` / `ctx.sendDocument` / `ctx.reply` / etc.
|
|
|
392
433
|
| `@adriangalilea/utils/bot/allow-list` | Static allow-list by **id and/or @username** — stateless, no session/storage. `allowList({ ids?, usernames? })` is a plugin that decorates `ctx.allowed` (boolean); gate in your handlers (`if (!ctx.allowed) return`). `makeAllowList(...)` is the pure framework-free predicate. The light counterpart to `access-control` (which adds an approve/deny flow + revocable store, needing session+storage). Username caveat: a `@username` is optional and mutable, and the Bot API can't resolve username→id ahead of time — prefer `ids` when known, `usernames` is the pragmatic fallback. |
|
|
393
434
|
| `@adriangalilea/utils/bot/coalesce` | Joins client-split inbound messages back into one. When a user pastes >4096 chars, Telegram clients fragment it into separate `message` updates with no marker. Middleware detects the burst and emits one combined event. |
|
|
394
435
|
| `@adriangalilea/utils/bot/llm` | The full LLM-chatbot pipeline in one module. **Input:** `streamChat(response)` parses OpenAI-compatible SSE (OpenAI, vllm, mlx-lm, llama.cpp, Together, Groq, …) into a typed `AsyncGenerator<{type: 'content' \| 'reasoning', text}>`. **Output:** `ctx.startStream()` (low-level: debounced markdown to Telegram, 4000-char split, exposes `wasPartial` after `.end()`). `ctx.startChatStream(response)` (high-level: consumes the stream, renders reasoning as a Telegram `expandable_blockquote` entity + content as streamed markdown — both go through `markdownToFormattable` with graceful degradation — returns `{ content, reasoning }`). **History:** `llmHistory({...})` returns `.plugin` (decorates `ctx.llm` with `.add() / .get() / .clear() / .all() / .clearAll()`, per-(user, thread) OpenAI `ChatMessage` shape, persisted in the shared session record so the menu's 🗑 Forget wipes it automatically) AND `.menuItem` (drop-in "🗑 Delete this thread" for `botMenu` — wipes the LLM history AND calls `deleteForumTopic` so the Telegram thread + all its messages disappear from the chat; falls back to Redis-only clear when no `threadId` is present). |
|
|
395
|
-
| `@adriangalilea/utils/bot/menu` | `botMenu({ command, description, items, privacy?, personalData?, adminContact })` — `/settings` command + InlineKeyboard router. Root view always renders a `🛡️ Privacy & data` submenu button that wraps the privacy policy link plus (if `personalData: { storage }`) 🗑 Forget + 📥 Export buttons. Items take `keepRow` (render on the same row as the next item — e.g. a two-per-row language picker) and `rootExtra` (render at the bottom of the root menu, below Privacy & data). `toggleMenuItem({ id, read, write, label: { off, on }, toast? })` — convenience factory for boolean-toggle items with dynamic label + optional toast, storage-agnostic via `read`/`write` closures. |
|
|
436
|
+
| `@adriangalilea/utils/bot/menu` | `botMenu({ command, description, items, privacy?, personalData?, adminContact })` — `/settings` command + InlineKeyboard router. Root view always renders a `🛡️ Privacy & data` submenu button that wraps the privacy policy link plus (if `personalData: { storage }`) 🗑 Forget + 📥 Export buttons. Items take `keepRow` (render on the same row as the next item — e.g. a two-per-row language picker) and `rootExtra` (render at the bottom of the root menu, below Privacy & data). `label` / `header` / `style` / `visible` resolvers may be **async** (read your db at render time — never cache render strings in the session); `parseMode: 'HTML'` renders the header formatted (you own escaping); `personalData.onForget(ctx, userId)` wipes YOUR tables inside the same try as the session delete, so Forget either forgets everything or reports failure. `toggleMenuItem({ id, read, write, label: { off, on }, toast? })` — convenience factory for boolean-toggle items with dynamic label + optional toast, storage-agnostic via `read`/`write` closures. |
|
|
396
437
|
| `@adriangalilea/utils/bot/payments` | `botPayments({ session, storage, paysupport, paysupportHint?, legal, waiver, vip?, credits?, perks? })` — Telegram Stars monetization in one drop-in plugin. **Three axes, all optional:** `vip` (positional tier ladder — single rung in v1 is just `vip: [{...}]`, ladder is `vip: [{...}, {...}]`; ids are `vip.1`, `vip.2`, …), `credits` (consumable balance + top-up packs `credits.1`, `credits.2`, …), `perks` (orthogonal one-shot unlocks `perks.<key>`). **Surface:** `ctx.payments.atLeast('vip')` / `atLeast('vip.2')` (typed rank check), `ctx.payments.tier()` / `.tier.level()` / `.tier.label()`, `ctx.payments.credits.{balance, consume, tryConsume}` (throws `InsufficientCredits`), `ctx.payments.has(perkId)`, `await ctx.payments.require('vip', { feature? })` (gate that sends a localized upgrade prompt deep-linked to `/settings → 💎 VIP`), `await ctx.payments.invoice(productKey)` (threads Art. 103(m) TRLGDCU consent inline before `sendInvoice`). **Owns:** waiver consent flow (versioned text → forces re-consent on bump, snapshotted on every charge for audit), `/paysupport` slash command (Telegram ToS §6.5; `paysupportHint` overrides the where-to-manage-charges line when your menu isn't `/settings`), idempotent `successful_payment` fulfillment via `pay:idempotency:{chargeId}` sentinel, lazy subscription expiry (no cron needed), tier upgrade auto-cancel of the lower rung's renewal, and admin-DM refund approval (mirror of `accessControl`'s [✅ Aprobar][❌ Denegar] pattern). **Returns:** `{ plugin, menuItem, payouts, onFulfilled }` — `menuItem` is the drop-in `💎 VIP` entry for `botMenu`; `payouts.{record, list, export, exportForUsers}` is the Fragment payout ledger (you receive TON, log the EUR conversion, export time-windowed CSV/JSON for your gestor); `onFulfilled(productKey \| '*', handler)` registers fire-and-forget hooks. **Stars-only by design** — Telegram ToS §6.2 forbids third-party payment providers for digital goods. Crypto Pay deferred (MiCA risk); Stripe-outside-Telegram is a future v2 channel. Full compliance memo (Spanish-autónomo seller-of-record analysis, Verifactu vs Crea y Crece, MiCA, Art. 103(m) waiver text, GDPR retention) in `src/bot/payments/CLAUDE.md`. |
|
|
438
|
+
| `@adriangalilea/utils/bot/create` | `createBot({ token?, storage?, admins?, language?, menu?, access?, payments?, handlers?, worker? })` — the composer (see "One bot file, ideation → production" above). Returns `{ build, poll, isMain, fetch }`: `poll()` long-polls, `export default app` is a complete Worker. Owns storage+session wiring; resolves storage per environment (D1 binding → `bot/storage-d1`; `BOT_PERSIST` path → sqlite, `redis://` → redis, lazily-imported optional peers; else announced-ephemeral memory). |
|
|
439
|
+
| `@adriangalilea/utils/bot/worker` | `botWorkerFetch(resolve)` — the Cloudflare Worker cap: secret-checked webhook (ack fast, work + storage flush ride `ctx.waitUntil`, errors DM admins throttled), `POST /setup` (webhook registration with handler-derived `allowed_updates` + a commit-narrating 🚀 deploy DM from the request body), `POST /deploy-started` (the 🛳 "what is shipping" DM — curl it from your deploy script on the still-live version, body `{sha, author, message, etaSeconds?}`), operator-authed `/pause` `/resume` `/webhook-status` (+ `statusExtra`), and a `routes` escape hatch tried before the built-ins. Structural bot type — no workers-types dependency. |
|
|
440
|
+
| `@adriangalilea/utils/bot/storage-d1` | `d1Storage({ db, table? })` — `@gramio/storage` adapter over a D1 `session` table (schema in the module doc). `flush()` matters: the session plugin writes un-awaited and workerd freezes the isolate the instant `fetch()` returns — hand `flush` to `bot/worker` (automatic via `createBot`) so writes survive. |
|
|
397
441
|
|
|
398
442
|
Standard wiring:
|
|
399
443
|
|
|
@@ -507,7 +551,7 @@ Field summary:
|
|
|
507
551
|
- `action` returns `void | string | Polyglot<string>`; the menu plugin sends a single `answerCallbackQuery` with that text. **Never call `ctx.answer(...)` from inside an action** — Telegram rejects the second answer, the action throws, and `refresh` never runs.
|
|
508
552
|
- `confirm: { prompt }` adds a one-step confirmation overlay before the action runs. Cancel returns to root. Use this for destructive actions instead of `ctx.answer({ show_alert: true })` — Telegram's alert UI doesn't compose with refresh / toast.
|
|
509
553
|
|
|
510
|
-
**Live state inside resolvers**: `label` / `style` resolvers fire AFTER the action mutated the session
|
|
554
|
+
**Live state inside resolvers**: `label` / `style` / `header` / `visible` resolvers fire AFTER the action mutated the session, and they may be **async** — read your database (or `ctx.session.<field>`) directly at render time; never cache render strings into the session to satisfy a signature. `ctx.lang` from `bot/language` is a snapshot at event start and goes stale within the same callback; `ctx.say(...)` IS live and safe to use anywhere.
|
|
511
555
|
|
|
512
556
|
See `src/bot/CLAUDE.md` for storage layout, design decisions, and gotchas.
|
|
513
557
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createBot` — one bot file from ideation to production.
|
|
3
|
+
*
|
|
4
|
+
* The composer owns the WIRING that used to be documented foot-guns: it
|
|
5
|
+
* constructs the storage + session pair ONCE and threads it into every
|
|
6
|
+
* feature (menu, language, access, payments), so "must be the SAME instance
|
|
7
|
+
* you passed to session()" is unrepresentable instead of a doc warning.
|
|
8
|
+
*
|
|
9
|
+
* The same file runs in every stage — storage and transport are environment
|
|
10
|
+
* decisions, never code shape:
|
|
11
|
+
*
|
|
12
|
+
* ideation BOT_TOKEN=… tsx bot.ts memory session, long-poll
|
|
13
|
+
* experiment BOT_PERSIST=./bot.sqlite tsx bot.ts sqlite session, long-poll
|
|
14
|
+
* prod worker wrangler deploy (D1 binding `DB`) D1 session, webhook (bot/worker)
|
|
15
|
+
* prod server systemd/launchd unit running poll() sqlite/redis, long-poll
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const app = createBot({
|
|
19
|
+
* language: { supported: ["en", "es"] as const, default: "en" },
|
|
20
|
+
* menu: { adminContact: "@you", items: [...] },
|
|
21
|
+
* handlers: (bot) => bot.command("start", (ctx) => ctx.say({ en: "hi", es: "hola" })),
|
|
22
|
+
* })
|
|
23
|
+
* export default app // Worker: webhook + /setup + /pause + deploy DMs
|
|
24
|
+
* if (app.isMain(import.meta)) app.poll() // Node: `tsx bot.ts` long-polls
|
|
25
|
+
*
|
|
26
|
+
* Worker-safe by construction: the Node-only conveniences (sqlite/redis
|
|
27
|
+
* adapters) load lazily on the poll path only; `bot/kit` stays out of the
|
|
28
|
+
* graph entirely (wrap `app.poll` with `gracefulStart` yourself if you want
|
|
29
|
+
* signal-handled start/stop DMs on a server).
|
|
30
|
+
*/
|
|
31
|
+
import { Bot } from "gramio";
|
|
32
|
+
import { type Storage } from "@gramio/storage";
|
|
33
|
+
import { type Admins } from "./admin.js";
|
|
34
|
+
import { type AccessControlOptions } from "./access-control.js";
|
|
35
|
+
import { type LanguageOptions } from "./language.js";
|
|
36
|
+
import { type BotMenuOptions, type PersonalDataOptions } from "./menu.js";
|
|
37
|
+
import { type BotPaymentsConfig } from "./payments/index.js";
|
|
38
|
+
import { type BotWorkerRuntime } from "./worker.js";
|
|
39
|
+
type EnvLike = Record<string, unknown>;
|
|
40
|
+
export type CreateBotOptions = {
|
|
41
|
+
/** Display name for startup logs. Default: the bot's username once known. */
|
|
42
|
+
name?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Bot token. Default: the `BOT_TOKEN` environment value (process env on
|
|
45
|
+
* Node, the Worker env in workerd). Missing token throws at build — a bot
|
|
46
|
+
* with no token must scream, not idle.
|
|
47
|
+
*/
|
|
48
|
+
token?: string | ((env: EnvLike) => string | undefined);
|
|
49
|
+
/**
|
|
50
|
+
* Session storage OVERRIDE. Default resolution (the lifecycle story):
|
|
51
|
+
* workerd → the `DB` D1 binding; Node → `BOT_PERSIST` (a path = sqlite via
|
|
52
|
+
* `@gramio/storage-sqlite`, `redis://…` = `@gramio/storage-redis`), else
|
|
53
|
+
* in-memory (ephemeral, announced at startup).
|
|
54
|
+
*/
|
|
55
|
+
storage?: Storage;
|
|
56
|
+
/** Admin user ids (static or a LIVE resolver) — enables access/payments admin flows + lifecycle DMs. */
|
|
57
|
+
admins?: Admins;
|
|
58
|
+
/** UI language feature (`ctx.lang`/`ctx.say`, read-time stored→hint→default). */
|
|
59
|
+
language?: Omit<LanguageOptions<readonly string[]>, "session">;
|
|
60
|
+
/**
|
|
61
|
+
* /settings menu. `personalData` is auto-wired to the composer's storage —
|
|
62
|
+
* pass `personalData: { onForget }` to also wipe your own tables, or
|
|
63
|
+
* `personalData: false` to drop Forget/Export entirely. When `language` is
|
|
64
|
+
* configured its picker item is appended automatically (opt out with
|
|
65
|
+
* `languagePicker: false`).
|
|
66
|
+
*/
|
|
67
|
+
menu?: Omit<BotMenuOptions, "personalData"> & {
|
|
68
|
+
personalData?: Pick<PersonalDataOptions, "onForget"> | false;
|
|
69
|
+
languagePicker?: boolean;
|
|
70
|
+
};
|
|
71
|
+
/** Gate the bot to admins + approved users (requires `admins`). */
|
|
72
|
+
access?: Omit<AccessControlOptions, "session" | "storage">;
|
|
73
|
+
/** Telegram Stars monetization (requires `admins` — the refund approver). */
|
|
74
|
+
payments?: Omit<BotPaymentsConfig<string>, "session" | "storage">;
|
|
75
|
+
/** Your commands/handlers — runs LAST, after every feature is wired. */
|
|
76
|
+
handlers?: (bot: Bot) => void;
|
|
77
|
+
/** Extra options forwarded to `bot/worker` in the Worker cap (routes, statusExtra, mode…). */
|
|
78
|
+
worker?: (env: EnvLike) => Partial<BotWorkerRuntime>;
|
|
79
|
+
};
|
|
80
|
+
export type BotApp = {
|
|
81
|
+
/** Build (memoized) — exposed for tests and custom runtimes. */
|
|
82
|
+
build(env?: EnvLike): Promise<{
|
|
83
|
+
bot: Bot;
|
|
84
|
+
storage: Storage;
|
|
85
|
+
flush?: () => Promise<void>;
|
|
86
|
+
}>;
|
|
87
|
+
/** Long-poll (Node/Bun/Deno). The ideation loop AND a legitimate prod mode on your own hardware. */
|
|
88
|
+
poll(): Promise<void>;
|
|
89
|
+
/** True when this module is the process entrypoint (`tsx bot.ts`). Always false on workerd. */
|
|
90
|
+
isMain(meta: ImportMeta): boolean;
|
|
91
|
+
/** The Worker fetch handler — `export default app` is a complete workerd bot. */
|
|
92
|
+
fetch(request: Request, env: EnvLike, ctx: {
|
|
93
|
+
waitUntil(p: Promise<unknown>): void;
|
|
94
|
+
}): Promise<Response>;
|
|
95
|
+
};
|
|
96
|
+
export declare function createBot(opts?: CreateBotOptions): BotApp;
|
|
97
|
+
export {};
|
|
98
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/bot/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,KAAK,OAAO,EAAmB,MAAM,iBAAiB,CAAC;AAGhE,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,KAAK,cAAc,EAAiB,KAAK,mBAAmB,EAAW,MAAM,WAAW,CAAC;AAClG,OAAO,EAAE,KAAK,iBAAiB,EAAe,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAE,KAAK,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAIpE,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvC,MAAM,MAAM,gBAAgB,GAAG;IAC9B,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;IACxD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wGAAwG;IACxG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/D;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG;QAC7C,YAAY,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;QAC7D,cAAc,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,mEAAmE;IACnE,MAAM,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IAC3D,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IAClE,wEAAwE;IACxE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,8FAA8F;IAC9F,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACpB,gEAAgE;IAChE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;IAC3F,oGAAoG;IACpG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,+FAA+F;IAC/F,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAClC,iFAAiF;IACjF,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;QAAE,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxG,CAAC;AAgBF,wBAAgB,SAAS,CAAC,IAAI,GAAE,gBAAqB,GAAG,MAAM,CA0H7D"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createBot` — one bot file from ideation to production.
|
|
3
|
+
*
|
|
4
|
+
* The composer owns the WIRING that used to be documented foot-guns: it
|
|
5
|
+
* constructs the storage + session pair ONCE and threads it into every
|
|
6
|
+
* feature (menu, language, access, payments), so "must be the SAME instance
|
|
7
|
+
* you passed to session()" is unrepresentable instead of a doc warning.
|
|
8
|
+
*
|
|
9
|
+
* The same file runs in every stage — storage and transport are environment
|
|
10
|
+
* decisions, never code shape:
|
|
11
|
+
*
|
|
12
|
+
* ideation BOT_TOKEN=… tsx bot.ts memory session, long-poll
|
|
13
|
+
* experiment BOT_PERSIST=./bot.sqlite tsx bot.ts sqlite session, long-poll
|
|
14
|
+
* prod worker wrangler deploy (D1 binding `DB`) D1 session, webhook (bot/worker)
|
|
15
|
+
* prod server systemd/launchd unit running poll() sqlite/redis, long-poll
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const app = createBot({
|
|
19
|
+
* language: { supported: ["en", "es"] as const, default: "en" },
|
|
20
|
+
* menu: { adminContact: "@you", items: [...] },
|
|
21
|
+
* handlers: (bot) => bot.command("start", (ctx) => ctx.say({ en: "hi", es: "hola" })),
|
|
22
|
+
* })
|
|
23
|
+
* export default app // Worker: webhook + /setup + /pause + deploy DMs
|
|
24
|
+
* if (app.isMain(import.meta)) app.poll() // Node: `tsx bot.ts` long-polls
|
|
25
|
+
*
|
|
26
|
+
* Worker-safe by construction: the Node-only conveniences (sqlite/redis
|
|
27
|
+
* adapters) load lazily on the poll path only; `bot/kit` stays out of the
|
|
28
|
+
* graph entirely (wrap `app.poll` with `gracefulStart` yourself if you want
|
|
29
|
+
* signal-handled start/stop DMs on a server).
|
|
30
|
+
*/
|
|
31
|
+
import { Bot } from "gramio";
|
|
32
|
+
import { inMemoryStorage } from "@gramio/storage";
|
|
33
|
+
import { createLogger } from "../universal/log.js";
|
|
34
|
+
import { runtime } from "../runtime.js";
|
|
35
|
+
import { adminContext } from "./admin.js";
|
|
36
|
+
import { accessControl } from "./access-control.js";
|
|
37
|
+
import { language } from "./language.js";
|
|
38
|
+
import { botMenu } from "./menu.js";
|
|
39
|
+
import { botPayments } from "./payments/index.js";
|
|
40
|
+
import { botSession } from "./session.js";
|
|
41
|
+
import { d1Storage } from "./storage-d1.js";
|
|
42
|
+
import { botWorkerFetch } from "./worker.js";
|
|
43
|
+
const log = createLogger("bot");
|
|
44
|
+
// Optional Node-only peers, loaded lazily on the poll path. The specifier goes
|
|
45
|
+
// through a variable so TS doesn't demand types for an optional dependency.
|
|
46
|
+
async function importPeer(name, why) {
|
|
47
|
+
try {
|
|
48
|
+
const specifier = name;
|
|
49
|
+
return await import(specifier);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new Error(`createBot: install ${name} for ${why}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const idsOf = (v) => (typeof v === "number" ? [v] : [...v]).filter((n) => Number.isFinite(n) && n > 0);
|
|
56
|
+
export function createBot(opts = {}) {
|
|
57
|
+
let built = null;
|
|
58
|
+
const resolveToken = (env) => {
|
|
59
|
+
const token = typeof opts.token === "string" ? opts.token : (opts.token?.(env) ?? env.BOT_TOKEN);
|
|
60
|
+
if (!token)
|
|
61
|
+
throw new Error("createBot: no token — set BOT_TOKEN or pass `token`");
|
|
62
|
+
return token;
|
|
63
|
+
};
|
|
64
|
+
const resolveStorage = async (env) => {
|
|
65
|
+
if (opts.storage)
|
|
66
|
+
return { storage: opts.storage, kind: "custom" };
|
|
67
|
+
const db = env.DB;
|
|
68
|
+
if (db && typeof db === "object" && "prepare" in db) {
|
|
69
|
+
const storage = d1Storage({ db });
|
|
70
|
+
return { storage, kind: "d1", flush: storage.flush };
|
|
71
|
+
}
|
|
72
|
+
const persist = env.BOT_PERSIST;
|
|
73
|
+
if (persist?.startsWith("redis://") || persist?.startsWith("rediss://")) {
|
|
74
|
+
const mod = await importPeer("@gramio/storage-redis", "BOT_PERSIST=redis://…");
|
|
75
|
+
const factory = mod.redisStorage;
|
|
76
|
+
if (!factory)
|
|
77
|
+
throw new Error("createBot: @gramio/storage-redis has no redisStorage export");
|
|
78
|
+
return { storage: factory(persist), kind: "redis" };
|
|
79
|
+
}
|
|
80
|
+
if (persist) {
|
|
81
|
+
const mod = (await importPeer("@gramio/storage-sqlite", "a BOT_PERSIST path"));
|
|
82
|
+
const factory = mod.sqliteStorage ?? mod.default;
|
|
83
|
+
if (!factory)
|
|
84
|
+
throw new Error("createBot: @gramio/storage-sqlite has no storage export");
|
|
85
|
+
return { storage: factory(persist), kind: `sqlite ${persist}` };
|
|
86
|
+
}
|
|
87
|
+
return { storage: inMemoryStorage(), kind: "memory (ephemeral — set BOT_PERSIST to keep state)" };
|
|
88
|
+
};
|
|
89
|
+
const build = (env) => {
|
|
90
|
+
built ??= (async () => {
|
|
91
|
+
const e = env ?? (runtime.isNode ? process.env : {});
|
|
92
|
+
const bot = new Bot(resolveToken(e));
|
|
93
|
+
const { storage, kind, flush } = await resolveStorage(e);
|
|
94
|
+
log.info(`session: ${kind}`);
|
|
95
|
+
// ONE session, threaded everywhere — the composer's whole job.
|
|
96
|
+
const session = botSession({ storage, initial: () => ({}) });
|
|
97
|
+
bot.extend(session);
|
|
98
|
+
const lang = opts.language ? language({ ...opts.language, session }) : null;
|
|
99
|
+
if (lang)
|
|
100
|
+
bot.extend(lang.plugin);
|
|
101
|
+
if (opts.admins)
|
|
102
|
+
bot.extend(adminContext(opts.admins));
|
|
103
|
+
if (opts.access) {
|
|
104
|
+
if (!opts.admins)
|
|
105
|
+
throw new Error("createBot: `access` needs `admins` (the approver)");
|
|
106
|
+
bot.extend(accessControl({ ...opts.access, session, storage }));
|
|
107
|
+
}
|
|
108
|
+
const payments = opts.payments ? botPayments({ ...opts.payments, session, storage }) : null;
|
|
109
|
+
if (payments) {
|
|
110
|
+
if (!opts.admins)
|
|
111
|
+
throw new Error("createBot: `payments` needs `admins` (the refund approver)");
|
|
112
|
+
bot.extend(payments.plugin);
|
|
113
|
+
}
|
|
114
|
+
if (opts.menu) {
|
|
115
|
+
const { personalData, languagePicker, items, ...menuOpts } = opts.menu;
|
|
116
|
+
const composed = [...(items ?? [])];
|
|
117
|
+
if (lang && languagePicker !== false)
|
|
118
|
+
composed.push(lang.menuItem);
|
|
119
|
+
if (payments)
|
|
120
|
+
composed.push(payments.menuItem);
|
|
121
|
+
bot.extend(botMenu({
|
|
122
|
+
...menuOpts,
|
|
123
|
+
items: composed,
|
|
124
|
+
...(personalData === false
|
|
125
|
+
? {}
|
|
126
|
+
: { personalData: { storage, onForget: personalData?.onForget } }),
|
|
127
|
+
}).plugin);
|
|
128
|
+
}
|
|
129
|
+
opts.handlers?.(bot);
|
|
130
|
+
return { bot, storage, flush };
|
|
131
|
+
})();
|
|
132
|
+
return built;
|
|
133
|
+
};
|
|
134
|
+
const adminIds = () => {
|
|
135
|
+
const a = opts.admins;
|
|
136
|
+
if (a === undefined)
|
|
137
|
+
return undefined;
|
|
138
|
+
return typeof a === "function" ? async () => idsOf(await a()) : async () => idsOf(a);
|
|
139
|
+
};
|
|
140
|
+
const workerFetch = botWorkerFetch(async (env) => {
|
|
141
|
+
const { bot, flush } = await build(env);
|
|
142
|
+
return {
|
|
143
|
+
bot: bot,
|
|
144
|
+
webhookSecret: env.WEBHOOK_SECRET,
|
|
145
|
+
operatorSecret: env.OPERATOR_SECRET,
|
|
146
|
+
mode: env.MODE ?? opts.name,
|
|
147
|
+
adminIds: adminIds(),
|
|
148
|
+
flush,
|
|
149
|
+
...opts.worker?.(env),
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
build,
|
|
154
|
+
async poll() {
|
|
155
|
+
const { bot } = await build();
|
|
156
|
+
await bot.start();
|
|
157
|
+
log.ready(`${opts.name ?? "bot"} polling as @${bot.info?.username}`);
|
|
158
|
+
},
|
|
159
|
+
isMain(meta) {
|
|
160
|
+
const main = meta.main;
|
|
161
|
+
if (main !== undefined)
|
|
162
|
+
return main;
|
|
163
|
+
if (!runtime.isNode)
|
|
164
|
+
return false;
|
|
165
|
+
// Fallback for runtimes without import.meta.main: entrypoint filename match.
|
|
166
|
+
const argv1 = process.argv[1];
|
|
167
|
+
if (!argv1)
|
|
168
|
+
return false;
|
|
169
|
+
const tail = argv1.split("/").pop();
|
|
170
|
+
return !!tail && meta.url.endsWith(`/${tail}`);
|
|
171
|
+
},
|
|
172
|
+
fetch: workerFetch,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/bot/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAgB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAA6B,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAwB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAgE,OAAO,EAAE,MAAM,WAAW,CAAC;AAClG,OAAO,EAA0B,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAyB,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AAwDhC,+EAA+E;AAC/E,4EAA4E;AAC5E,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,GAAW;IAClD,IAAI,CAAC;QACJ,MAAM,SAAS,GAAW,IAAI,CAAC;QAC/B,OAAO,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAA6B,EAAY,EAAE,CACzD,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEnF,MAAM,UAAU,SAAS,CAAC,OAAyB,EAAE;IACpD,IAAI,KAAK,GAAgF,IAAI,CAAC;IAE9F,MAAM,YAAY,GAAG,CAAC,GAAY,EAAU,EAAE;QAC7C,MAAM,KAAK,GACV,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAK,GAAG,CAAC,SAAgC,CAAC,CAAC;QAC5G,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,EAAE,GAAY,EAA4E,EAAE;QACvH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACnE,MAAM,EAAE,GAAG,GAAG,CAAC,EAAwB,CAAC;QACxC,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAiC,CAAC;QACtD,IAAI,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC;YAC/E,MAAM,OAAO,GAAI,GAAmD,CAAC,YAAY,CAAC;YAClF,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC7F,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,CAAC,MAAM,UAAU,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,CAG5E,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO,CAAC;YACjD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACzF,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,oDAAoD,EAAE,CAAC;IACnG,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,GAAa,EAAE,EAAE;QAC/B,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE;YACrB,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,OAAO,CAAC,GAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC;YACzD,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;YAE7B,+DAA+D;YAC/D,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7D,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5E,IAAI,IAAI;gBAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,IAAI,CAAC,MAAM;gBAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACvD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvF,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrG,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBAChG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvE,MAAM,QAAQ,GAAe,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChD,IAAI,IAAI,IAAI,cAAc,KAAK,KAAK;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnE,IAAI,QAAQ;oBAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC/C,GAAG,CAAC,MAAM,CACT,OAAO,CAAC;oBACP,GAAG,QAAQ;oBACX,KAAK,EAAE,QAAQ;oBACf,GAAG,CAAC,YAAY,KAAK,KAAK;wBACzB,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,CAAC;iBACnE,CAAC,CAAC,MAAM,CACT,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAChC,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAmD,EAAE;QACrE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACtC,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,cAAc,CAAU,KAAK,EAAE,GAAG,EAAE,EAAE;QACzD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO;YACN,GAAG,EAAE,GAAY;YACjB,aAAa,EAAE,GAAG,CAAC,cAAoC;YACvD,cAAc,EAAE,GAAG,CAAC,eAAqC;YACzD,IAAI,EAAG,GAAG,CAAC,IAA2B,IAAI,IAAI,CAAC,IAAI;YACnD,QAAQ,EAAE,QAAQ,EAAE;YACpB,KAAK;YACL,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;SACrB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACN,KAAK;QACL,KAAK,CAAC,IAAI;YACT,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,gBAAgB,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,CAAC,IAAgB;YACtB,MAAM,IAAI,GAAI,IAA2B,CAAC,IAAI,CAAC;YAC/C,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAClC,6EAA6E;YAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACpC,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,EAAE,WAAW;KAClB,CAAC;AACH,CAAC"}
|
package/dist/bot/language.d.ts
CHANGED
|
@@ -325,6 +325,14 @@ declare const buildLanguagePlugin: <Lang extends string>(args: {
|
|
|
325
325
|
lang: Lang;
|
|
326
326
|
say: Sayer<Lang>;
|
|
327
327
|
};
|
|
328
|
+
inline_query: {
|
|
329
|
+
lang: Lang;
|
|
330
|
+
say: Sayer<Lang>;
|
|
331
|
+
};
|
|
332
|
+
chosen_inline_result: {
|
|
333
|
+
lang: Lang;
|
|
334
|
+
say: Sayer<Lang>;
|
|
335
|
+
};
|
|
328
336
|
callback_query: {
|
|
329
337
|
lang: Lang;
|
|
330
338
|
say: Sayer<Lang>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAE,KAAK,QAAQ,EAAO,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI1C,8EAA8E;AAC9E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,GAAG,MAAM,KAAG,QACC,CAAC;AAE5C,oEAAoE;AACpE,eAAO,MAAM,UAAU,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,QAQ5C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SAG9D,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,aAAa,GACtB,qBAAqB,GACrB;IACA,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,OAAO,CAAC,EAAE,qBAAqB,CAAC;CAC/B,CAAC;AAEL,0EAA0E;AAC1E,KAAK,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,wEAAwE;AACxE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAE/E,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,SAAS,MAAM,EAAE,IAAI;IAC9D;;;;OAIG;IACH,OAAO,EAAE,oBAAoB,CAAC;IAC9B,2EAA2E;IAC3E,SAAS,EAAE,KAAK,CAAC;IACjB,uCAAuC;IACvC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,IAAI,SAAS,MAAM,IAAI;IAClD,MAAM,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,QAAQ,EAAE,QAAQ,CAAC;CACnB,CAAC;AAIF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,MAAM,IAAI;IACrC,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;IAC1C,IAAI,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,IAAI,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,eAAe,CAAC,IAAI,SAAS,MAAM,IAAI;IAC3C,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;CACjB,CAAC;AAkJF,eAAO,MAAM,QAAQ,GAAI,KAAK,CAAC,KAAK,SAAS,SAAS,MAAM,EAAE,EAC7D,MAAM,eAAe,CAAC,KAAK,CAAC,KAC1B,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CA+G/B,CAAC;AAIF,QAAA,MAAM,mBAAmB,GAAI,IAAI,SAAS,MAAM,EAAE,MAAM;IACvD,aAAa,EAAE,oBAAoB,CAAC;IACpC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,eAAe,EAAE,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,GAAG,SAAS,CAAC;IAC5D,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;CACpC;YAYgC,eAAe,CAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/language.js
CHANGED
|
@@ -304,15 +304,22 @@ const buildLanguagePlugin = (args) => {
|
|
|
304
304
|
// session derive runs exactly once per update — but the types
|
|
305
305
|
// (ctx.session: SessionLike) flow into our handlers below.
|
|
306
306
|
.extend(sessionPlugin)
|
|
307
|
-
.derive(
|
|
307
|
+
.derive(
|
|
308
|
+
// Inline events included: ctx.lang/ctx.say must exist wherever the
|
|
309
|
+
// user speaks to the bot, or consumers fork their own resolvers.
|
|
310
|
+
["message", "callback_query", "inline_query", "chosen_inline_result"], (ctx) => {
|
|
308
311
|
// The Telegram hint, scope-resolved ONCE per event (it can't change
|
|
309
312
|
// mid-handler): honored only in user-scoped resolution — in groups it
|
|
310
313
|
// would flicker per-speaker. Full tag first ("pt-BR"), then its
|
|
311
314
|
// primary subtag ("pt"). Never persisted: the read-time middle rung
|
|
312
315
|
// between a stored explicit pick and the configured default.
|
|
316
|
+
// Inline events carry no chat — they resolve as "private" (user-scoped),
|
|
317
|
+
// which is what an inline interaction is. Structural read: `message`
|
|
318
|
+
// only exists on callback ctxs in the widened event union.
|
|
313
319
|
const chatType = ctx.is("message")
|
|
314
320
|
? ctx.chat.type
|
|
315
|
-
: (ctx.message?.chat
|
|
321
|
+
: (ctx.message?.chat
|
|
322
|
+
.type ?? "private");
|
|
316
323
|
const strategy = resolveScope(scopeOpt, chatType);
|
|
317
324
|
const hintLang = strategy === "user"
|
|
318
325
|
? (matchSupported(ctx.from.languageCode) ??
|
package/dist/bot/language.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/menu.d.ts
CHANGED
|
@@ -127,9 +127,14 @@ export type MenuCtx = {
|
|
|
127
127
|
* label: { en: 'Settings', es: 'Ajustes' }
|
|
128
128
|
* label: (ctx) => `Hi ${ctx.from?.firstName}`
|
|
129
129
|
* label: (ctx) => ({ en: `Hi ${name}`, es: `Hola ${name}` })
|
|
130
|
+
* label: async (ctx) => `📊 ${await store.readCount(ctx)} left`
|
|
131
|
+
*
|
|
132
|
+
* Resolvers may be ASYNC (labels, headers, styles, visibility): the menu
|
|
133
|
+
* awaits them at render time, so state can come straight from a database —
|
|
134
|
+
* never cache render strings into the session to satisfy a sync signature.
|
|
130
135
|
*/
|
|
131
|
-
type Label = string | Polyglot<string> | ((ctx: MenuCtx) => string | Polyglot<string>);
|
|
132
|
-
type Predicate = (ctx: MenuCtx) => boolean
|
|
136
|
+
type Label = string | Polyglot<string> | ((ctx: MenuCtx) => string | Polyglot<string> | Promise<string | Polyglot<string>>);
|
|
137
|
+
type Predicate = (ctx: MenuCtx) => boolean | Promise<boolean>;
|
|
133
138
|
/**
|
|
134
139
|
* What a menu action's return value means:
|
|
135
140
|
*
|
|
@@ -161,7 +166,7 @@ type Action = (ctx: MenuCtx) => Promise<ActionResult> | ActionResult;
|
|
|
161
166
|
* is consistent with how Telegram itself surfaces selection state.
|
|
162
167
|
*/
|
|
163
168
|
export type ButtonStyle = "primary" | "success" | "danger";
|
|
164
|
-
type StyleResolver = ButtonStyle | ((ctx: MenuCtx) => ButtonStyle | undefined);
|
|
169
|
+
type StyleResolver = ButtonStyle | ((ctx: MenuCtx) => ButtonStyle | undefined | Promise<ButtonStyle | undefined>);
|
|
165
170
|
/**
|
|
166
171
|
* An entry in the menu. Three variants:
|
|
167
172
|
*
|
|
@@ -261,6 +266,15 @@ export type PersonalDataOptions = {
|
|
|
261
266
|
* same key shape by construction.
|
|
262
267
|
*/
|
|
263
268
|
storage: Storage;
|
|
269
|
+
/**
|
|
270
|
+
* Forget must actually forget. The storage delete above only wipes the
|
|
271
|
+
* SESSION record — if your bot keeps per-user state anywhere else
|
|
272
|
+
* (message logs, metrics tables, credit rows), wipe it HERE. Runs after
|
|
273
|
+
* the session delete, inside the same try: a failing onForget reports
|
|
274
|
+
* "Failed" + your admin contact to the user instead of lying about a
|
|
275
|
+
* partial erasure.
|
|
276
|
+
*/
|
|
277
|
+
onForget?: (ctx: MenuCtx, userId: number) => void | Promise<void>;
|
|
264
278
|
};
|
|
265
279
|
export type BotMenuOptions = {
|
|
266
280
|
/** Slash command that opens the menu. Default `'settings'`. */
|
|
@@ -276,7 +290,9 @@ export type BotMenuOptions = {
|
|
|
276
290
|
*/
|
|
277
291
|
privacy?: string;
|
|
278
292
|
/**
|
|
279
|
-
* Header text rendered above the keyboard.
|
|
293
|
+
* Header text rendered above the keyboard. May be an ASYNC resolver —
|
|
294
|
+
* read your database here instead of caching render strings in the
|
|
295
|
+
* session. Rendered with `parseMode` when set.
|
|
280
296
|
*/
|
|
281
297
|
header?: Label;
|
|
282
298
|
/**
|
|
@@ -294,6 +310,13 @@ export type BotMenuOptions = {
|
|
|
294
310
|
* no per-user state beyond what Telegram's standard policy covers).
|
|
295
311
|
*/
|
|
296
312
|
personalData?: PersonalDataOptions;
|
|
313
|
+
/**
|
|
314
|
+
* Parse mode for the HEADER text (`"HTML"` or `"MarkdownV2"`). Off by
|
|
315
|
+
* default (plain text). With it set, your header owns escaping — user
|
|
316
|
+
* content interpolated into an HTML header must be entity-escaped by you.
|
|
317
|
+
* Button labels are never parsed (Telegram renders them plain).
|
|
318
|
+
*/
|
|
319
|
+
parseMode?: "HTML" | "MarkdownV2";
|
|
297
320
|
/**
|
|
298
321
|
* Allow the menu to open and operate in group chats. Off by default: with
|
|
299
322
|
* `personalData` set the menu is private-only (data controls shouldn't surface
|
|
@@ -319,6 +342,7 @@ export declare const menuNavCb: CallbackData<{
|
|
|
319
342
|
}>;
|
|
320
343
|
type ResolvedPersonalData = {
|
|
321
344
|
storage: Storage;
|
|
345
|
+
onForget: ((ctx: MenuCtx, userId: number) => void | Promise<void>) | null;
|
|
322
346
|
};
|
|
323
347
|
type ResolvedOpts = {
|
|
324
348
|
command: string;
|
|
@@ -328,6 +352,7 @@ type ResolvedOpts = {
|
|
|
328
352
|
adminContact: string;
|
|
329
353
|
personalData: ResolvedPersonalData | null;
|
|
330
354
|
allowInGroups: boolean;
|
|
355
|
+
parseMode: "HTML" | "MarkdownV2" | null;
|
|
331
356
|
};
|
|
332
357
|
export declare class BotMenu {
|
|
333
358
|
/** @internal */
|
|
@@ -349,7 +374,7 @@ export type ToggleMenuItemOptions = {
|
|
|
349
374
|
* ctx.session?.someField ?? false`. Storage-agnostic — return
|
|
350
375
|
* `false` by default so the toggle starts in the OFF state.
|
|
351
376
|
*/
|
|
352
|
-
read: (ctx: MenuCtx) => boolean
|
|
377
|
+
read: (ctx: MenuCtx) => boolean | Promise<boolean>;
|
|
353
378
|
/**
|
|
354
379
|
* Persists the new value. Typically `(ctx, v) => {
|
|
355
380
|
* (ctx.session as any).someField = v }`. The menu plugin does NOT
|
package/dist/bot/menu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/bot/menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,KAAK,QAAQ,EAAO,MAAM,iBAAiB,CAAC;AAMrD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,IAAI,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EACrC,MAAM,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,CAAC,EAAE,CACP,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EACrC,MAAM,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAI9C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/bot/menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,KAAK,QAAQ,EAAO,MAAM,iBAAiB,CAAC;AAMrD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,IAAI,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EACrC,MAAM,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,CAAC,EAAE,CACP,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EACrC,MAAM,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAI9C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,KAAK,KAAK,GACP,MAAM,GACN,QAAQ,CAAC,MAAM,CAAC,GAChB,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtF,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;GAcG;AACH,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1D,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE3D,KAAK,aAAa,GACf,WAAW,GACX,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC;AAkBlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,MAAM,QAAQ,GACjB;IACA,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE;QACT,2DAA2D;QAC3D,MAAM,EAAE,KAAK,CAAC;QACd,2DAA2D;QAC3D,YAAY,CAAC,EAAE,KAAK,CAAC;QACrB,2DAA2D;QAC3D,WAAW,CAAC,EAAE,KAAK,CAAC;KACpB,CAAC;CACD,GACD;IACA,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;CACnB,GACD;IACA,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEL,MAAM,MAAM,mBAAmB,GAAG;IACjC;;;;;;;;;;OAUG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;IACf;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAClC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AASF;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS;;;;EAA0C,CAAC;AAejE,KAAK,oBAAoB,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;CAC1E,CAAC;AAEF,KAAK,YAAY,GAAG;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;CACxC,CAAC;AA8BF,qBAAa,OAAO;IACnB,gBAAgB;IAChB,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5B,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;gBAEjB,IAAI,EAAE,cAAc;IAoBhC,8CAA8C;IAC9C,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAMzB,8EAA8E;IAC9E,IAAI,MAAM,uDAET;CACD;AAED,eAAO,MAAM,OAAO,GAAI,MAAM,cAAc,KAAG,OAA4B,CAAC;AAI5E,MAAM,MAAM,qBAAqB,GAAG;IACnC,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX;;;;OAIG;IACH,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD;;;;OAIG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D;;;;;OAKG;IACH,KAAK,EAAE;QACN,GAAG,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,KAAK,CAAC;KACV,CAAC;IACF;;;OAGG;IACH,KAAK,CAAC,EAAE;QACP,GAAG,CAAC,EAAE,KAAK,CAAC;QACZ,EAAE,CAAC,EAAE,KAAK,CAAC;KACX,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,qBAAqB,KAAG,QA0B3D,CAAC"}
|