@adriangalilea/utils 1.4.2 → 1.6.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 +2 -1
- package/dist/bot/create.d.ts +4 -4
- package/dist/bot/create.js +4 -4
- package/dist/bot/flags.d.ts +65 -0
- package/dist/bot/flags.d.ts.map +1 -0
- package/dist/bot/flags.js +171 -0
- package/dist/bot/flags.js.map +1 -0
- package/dist/bot/kit.d.ts +2 -2
- package/dist/bot/language.d.ts.map +1 -1
- package/dist/bot/language.js +1 -2
- package/dist/bot/language.js.map +1 -1
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -438,7 +438,7 @@ Then `pnpm install`. Every `ctx.send` / `ctx.sendDocument` / `ctx.reply` / etc.
|
|
|
438
438
|
| `@adriangalilea/utils/bot/ctx` | Structural ctx types (`BotMessageCtx`, `BotCallbackCtx`, …) and the `narrow<T>(ctx)` cast helper. Pure typing — no runtime state. |
|
|
439
439
|
| `@adriangalilea/utils/bot/keys` | The bot-id key namespace, a **persisted contract**: `botId(ctx)`, `botStorageKey(ctx, userId)` → `bot-<id>:<userId>`, `botSubKey(ctx, sub)` → `bot-<id>:<sub>`. Every storage key the library writes derives from here, and those keys live in YOUR Redis/D1 rows — the shape never changes. Pure functions of `ctx.bot.info.id` (no env/fs), which is what keeps the whole bot surface Worker-safe. |
|
|
440
440
|
| `@adriangalilea/utils/bot/kit` | The Node-only corner. `gracefulStart(bot, opts?)` — SIGINT/SIGTERM → `bot.stop()` → exit; force-kills if shutdown hangs. DMs the admin `@<bot> started.` / `@<bot> shutting down.` by default when `KEV.TELEGRAM_ADMIN_ID` is set (graceful only — crashes don't trigger `onStop`); pass `notifyAdmin: false` to disable or `notifyAdmin: 12345` for an explicit chat id.<br>`adminContext({ adminId? })` — reads `TELEGRAM_ADMIN_ID` from `kev` (with optional hardcoded fallback), decorates `ctx.adminId` + `ctx.isAdmin`.<br>Also re-exports `botSession` / `prefixStorage` from `bot/session` so Node consumers keep one import. |
|
|
441
|
-
| `@adriangalilea/utils/bot/session` | `botSession(opts)` — **drop-in replacement for `@gramio/session`'s `session()`** that auto-namespaces every key as `bot-<id>:<senderId>` using `ctx.bot.info.id` (populated by `getMe()` at startup). Use this instead of `session()` — full stop. Multiple bots sharing one Redis/D1 stay isolated by construction; every plugin in this package derives the same prefix internally via `botStorageKey(ctx, userId)` / `botSubKey(ctx, sub)` (from `bot/keys`). No regex, no manual prefix argument, no way to forget.<br>`prefixStorage(storage, prefix)` — escape hatch for adding a top-level prefix on top of the bot-id namespace; almost never needed. Worker-safe
|
|
441
|
+
| `@adriangalilea/utils/bot/session` | `botSession(opts)` — **drop-in replacement for `@gramio/session`'s `session()`** that auto-namespaces every key as `bot-<id>:<senderId>` using `ctx.bot.info.id` (populated by `getMe()` at startup). Use this instead of `session()` — full stop. Multiple bots sharing one Redis/D1 stay isolated by construction; every plugin in this package derives the same prefix internally via `botStorageKey(ctx, userId)` / `botSubKey(ctx, sub)` (from `bot/keys`). No regex, no manual prefix argument, no way to forget.<br>`prefixStorage(storage, prefix)` — escape hatch for adding a top-level prefix on top of the bot-id namespace; almost never needed. Worker-safe. |
|
|
442
442
|
| `@adriangalilea/utils/bot/notify` | Best-effort admin DMs, worker-safe (you pass the ids; no env, no process). `notifyAdmins(bot, adminIds, text, extra?)` — DM each admin, failures logged and swallowed (a notification must never take the bot down). `alertAdminError(bot, adminIds, label, error, throttle?)` — truncated `🚨 label\nName: message`, rate-limited through a caller-owned `alertThrottle(ms?)` so a failure storm sends one alert per window. `gracefulStart`'s start/stop DMs are built on this. |
|
|
443
443
|
| `@adriangalilea/utils/bot/profile` | `syncBotProfile(bot, { name?, description?, about?, commands?, expects?, adminIds? })` — the bot's Telegram-facing identity as CODE, never BotFather: localized name / description / About / public command list, reconciled idempotently on every boot (get → compare → set per field per language; unchanged values cost one read, so cold-start firing is rate-limit-free). `expects: { inline: true }` declares the BotFather-only capabilities the code assumes — a mismatch (inline mode off on an inline-dependent bot) DMs the admins, since the API can only detect it, not fix it. Never throws; failures log and the bot keeps running. |
|
|
444
444
|
| `@adriangalilea/utils/bot/access-control` | Personal-bot ACL — gates non-admin/non-default users; admin gets DM with `[✅ Aprobar][❌ Denegar]` on first attempt; `/access` opens a persistent menu (revoke / reapprove / list pending). Backed by `@gramio/session` per-user + a small index. **Native alternative**: BotFather → Bot Settings → Access → "Restrict bot usage" — flat allow-list at Telegram. Use this plugin when you want in-bot approval flow instead of a BotFather round-trip; both can coexist. |
|
|
@@ -449,6 +449,7 @@ Then `pnpm install`. Every `ctx.send` / `ctx.sendDocument` / `ctx.reply` / etc.
|
|
|
449
449
|
| `@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)` / `onRefunded(...)` register fire-and-forget hooks (purchase applied / admin-approved refund — a revenue ledger writes on one, reverses on the other). **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`. |
|
|
450
450
|
| `@adriangalilea/utils/bot/create` | `createBot<S>({ token?, storage?, initial?, admins?, language?, menu?, access?, payments?, handlers?, worker? })` — the composer (see "One bot file, ideation → production" above). Returns `{ build, session, poll, isMain, fetch }`: `poll()` long-polls, `export default app` is a complete Worker, `app.session(ctx)` / the `handlers` callback's `session(ctx)` is the TYPED accessor for your `S` fields. 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) — or pass `storage: (env) => Storage` when the choice is env-dependent (e.g. a D1 binding not named `DB`). Boot NARRATES the composition (`session: memory …`, `features: language(en,es) · menu(/settings)`) so every implicit decision is visible where you're looking. Runnable demo: `pnpm demo:bot`. |
|
|
451
451
|
| `@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. |
|
|
452
|
+
| `@adriangalilea/utils/bot/flags` | `defineFlags(spec, { read, write? })` — feature flags declared ONCE in code, resolved LIVE from the bot's operator-config record (D1 json row, Redis hash — storage-agnostic, Worker-safe, zero deps). Each flag: `{ kind: 'bool'\|'number'\|'string', label, help?, default }`, where `default` is a scalar or a **tier map** `{ free, vip?, 'vip.N'? }` resolved off `ctx.payments.tier()` — "free users get this limit, premium users get that model" is one declaration, zero branching at the call site (ladder walks down: exact rung → lower rungs → `vip` → `free`). Read sites: `await flags.<key>(ctx)` — stored override wins over the code default, per-ctx reads coalesce into one config fetch. `flags.describe()` is the JSON schema admin panels render generically, so a new flag appears in every panel with zero panel edits; `flags.set(ctx, key, value)` writes a kind-checked live override (`null` clears it — RFC 7386 null-delete, matching SQLite `json_patch`); `flags.overrides(ctx)` lists what's overridden. Corrupt stored values scream (`SourcedError`); bad specs panic at construction. |
|
|
452
453
|
| `@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. |
|
|
453
454
|
|
|
454
455
|
Standard wiring:
|
package/dist/bot/create.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `createBot` — one bot file from ideation to production.
|
|
3
3
|
*
|
|
4
|
-
* The composer
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* The composer makes the wiring foot-guns unrepresentable: it constructs
|
|
5
|
+
* the storage + session pair ONCE and threads it into every feature (menu,
|
|
6
|
+
* language, access, payments), so "must be the SAME instance you passed to
|
|
7
|
+
* session()" is structural instead of a doc warning.
|
|
8
8
|
*
|
|
9
9
|
* The same file runs in every stage — storage and transport are environment
|
|
10
10
|
* decisions, never code shape:
|
package/dist/bot/create.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `createBot` — one bot file from ideation to production.
|
|
3
3
|
*
|
|
4
|
-
* The composer
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* The composer makes the wiring foot-guns unrepresentable: it constructs
|
|
5
|
+
* the storage + session pair ONCE and threads it into every feature (menu,
|
|
6
|
+
* language, access, payments), so "must be the SAME instance you passed to
|
|
7
|
+
* session()" is structural instead of a doc warning.
|
|
8
8
|
*
|
|
9
9
|
* The same file runs in every stage — storage and transport are environment
|
|
10
10
|
* decisions, never code shape:
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Per-tier values: `free` is the floor everyone resolves to. */
|
|
2
|
+
export type TierMap<T> = {
|
|
3
|
+
free: T;
|
|
4
|
+
vip?: T;
|
|
5
|
+
} & {
|
|
6
|
+
[rung: `vip.${number}`]: T;
|
|
7
|
+
};
|
|
8
|
+
type KindValue = {
|
|
9
|
+
bool: boolean;
|
|
10
|
+
number: number;
|
|
11
|
+
string: string;
|
|
12
|
+
};
|
|
13
|
+
export type FlagKind = keyof KindValue;
|
|
14
|
+
export type FlagSpec<K extends FlagKind = FlagKind> = {
|
|
15
|
+
kind: K;
|
|
16
|
+
/** Short human label for admin surfaces ("rich text (global)"). */
|
|
17
|
+
label: string;
|
|
18
|
+
/** One-line operator hint, shown next to the control. */
|
|
19
|
+
help?: string;
|
|
20
|
+
/** Code default — a scalar, or a tier map for per-tier values. */
|
|
21
|
+
default: KindValue[K] | TierMap<KindValue[K]>;
|
|
22
|
+
};
|
|
23
|
+
/** What `describe()` returns per flag — JSON-safe, for panels/consoles. */
|
|
24
|
+
export type FlagDescriptor = {
|
|
25
|
+
key: string;
|
|
26
|
+
kind: FlagKind;
|
|
27
|
+
label: string;
|
|
28
|
+
help?: string;
|
|
29
|
+
default: unknown;
|
|
30
|
+
/** Whether the DECLARED default is per-tier (panels offer tier inputs). */
|
|
31
|
+
tiered: boolean;
|
|
32
|
+
};
|
|
33
|
+
export type FlagsBackend = {
|
|
34
|
+
/** Read the bot's operator-config record (plain JSON object). */
|
|
35
|
+
read: (ctx: unknown) => Promise<Record<string, unknown>>;
|
|
36
|
+
/**
|
|
37
|
+
* Merge a patch into that record (RFC 7386 style: a `null` value deletes
|
|
38
|
+
* the key — SQLite's `json_patch` and most merge-patch writers already
|
|
39
|
+
* behave this way). Required for `flags.set`.
|
|
40
|
+
*/
|
|
41
|
+
write?: (ctx: unknown, patch: Record<string, unknown>) => Promise<unknown>;
|
|
42
|
+
};
|
|
43
|
+
type Resolver<S extends FlagSpec> = (ctx: unknown) => Promise<KindValue[S["kind"]]>;
|
|
44
|
+
export type Flags<Spec extends Record<string, FlagSpec>> = {
|
|
45
|
+
[K in keyof Spec]: Resolver<Spec[K]>;
|
|
46
|
+
} & {
|
|
47
|
+
/** Every flag's declaration, JSON-safe — the schema panels render from. */
|
|
48
|
+
describe: () => FlagDescriptor[];
|
|
49
|
+
/** Raw stored overrides (only keys that are actually overridden). */
|
|
50
|
+
overrides: (ctx: unknown) => Promise<Record<string, unknown>>;
|
|
51
|
+
/**
|
|
52
|
+
* Resolve a flag by RUNTIME key — same resolution as the typed accessor,
|
|
53
|
+
* loosely typed. For generic admin surfaces iterating `describe()`; call
|
|
54
|
+
* sites use `await flags.<key>(ctx)`.
|
|
55
|
+
*/
|
|
56
|
+
get: (ctx: unknown, key: keyof Spec & string) => Promise<unknown>;
|
|
57
|
+
/**
|
|
58
|
+
* Write a live override (scalar or tier map, kind-checked), or `null`
|
|
59
|
+
* to clear it back to the code default. Panics without a `write` backend.
|
|
60
|
+
*/
|
|
61
|
+
set: (ctx: unknown, key: keyof Spec & string, value: unknown) => Promise<void>;
|
|
62
|
+
};
|
|
63
|
+
export declare function defineFlags<Spec extends Record<string, FlagSpec>>(spec: Spec, backend: FlagsBackend): Flags<Spec>;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/bot/flags.ts"],"names":[],"mappings":"AA4DA,iEAAiE;AACjE,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,CAAC,CAAA;CAAE,GAAG;IAC/C,CAAC,IAAI,EAAE,OAAO,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B,CAAC;AAEF,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;AAEvC,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI;IACrD,IAAI,EAAE,CAAC,CAAC;IACR,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9C,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,cAAc,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B,iEAAiE;IACjE,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E,CAAC;AAIF,KAAK,QAAQ,CAAC,CAAC,SAAS,QAAQ,IAAI,CACnC,GAAG,EAAE,OAAO,KACR,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEnC,MAAM,MAAM,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI;KACzD,CAAC,IAAI,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CACpC,GAAG;IACH,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,cAAc,EAAE,CAAC;IACjC,qEAAqE;IACrE,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D;;;;OAIG;IACH,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE;;;OAGG;IACH,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E,CAAC;AA6CF,wBAAgB,WAAW,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChE,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,YAAY,GACnB,KAAK,CAAC,IAAI,CAAC,CA4Eb"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flags declared ONCE in code, resolved LIVE from operator config.
|
|
3
|
+
*
|
|
4
|
+
* The whole lifecycle in one move: a bot author adds an entry to their
|
|
5
|
+
* `defineFlags` spec and ships it. From that moment the flag
|
|
6
|
+
*
|
|
7
|
+
* - resolves at every read site via `await flags.<key>(ctx)` — the stored
|
|
8
|
+
* override wins, else the code default;
|
|
9
|
+
* - varies by paid tier when its value is a tier map (`{ free, vip,
|
|
10
|
+
* "vip.N" }`), resolved off `ctx.payments.tier()` from `bot/payments` —
|
|
11
|
+
* "free users get this limit, premium users get that model" is one
|
|
12
|
+
* declaration, zero branching at the call site;
|
|
13
|
+
* - self-describes via `flags.describe()`, so admin surfaces (an in-bot
|
|
14
|
+
* /admin tab, a web console) render every flag generically — a new flag
|
|
15
|
+
* appears in the panels with no panel changes;
|
|
16
|
+
* - flips live via `flags.set(ctx, key, value)` (or any external writer
|
|
17
|
+
* patching the same config record): no redeploy, no schema migration —
|
|
18
|
+
* values live in whatever key-value/JSON config store the bot already
|
|
19
|
+
* has.
|
|
20
|
+
*
|
|
21
|
+
* Storage-agnostic and Worker-safe: the bot injects `read` (and optionally
|
|
22
|
+
* `write`) over its own config record — a D1 row, a Redis hash, a file. The
|
|
23
|
+
* stored shape is plain JSON: `{ "<key>": <scalar | tier map> }`. An
|
|
24
|
+
* override REPLACES the declared default wholesale (a tiered default
|
|
25
|
+
* overridden with a scalar applies to every tier, and vice versa).
|
|
26
|
+
*
|
|
27
|
+
* ## Tier resolution (the ladder)
|
|
28
|
+
*
|
|
29
|
+
* A tier map holds `free` (required) plus any of `vip` / `"vip.1"` /
|
|
30
|
+
* `"vip.2"` / …. For a user on `vip.N` the lookup walks DOWN the ladder —
|
|
31
|
+
* exact rung, then lower rungs, then bare `vip`, then `free` — so higher
|
|
32
|
+
* tiers inherit everything not explicitly upgraded. Without `bot/payments`
|
|
33
|
+
* wired, every user resolves as `free`.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* import { defineFlags } from '@adriangalilea/utils/bot/flags'
|
|
37
|
+
*
|
|
38
|
+
* export const flags = defineFlags(
|
|
39
|
+
* {
|
|
40
|
+
* richText: { kind: 'bool', label: 'rich text (global)', default: true },
|
|
41
|
+
* maxInputChars: { kind: 'number', label: 'input clamp (chars)',
|
|
42
|
+
* default: { free: 50_000, vip: 250_000 } },
|
|
43
|
+
* model: { kind: 'string', label: 'summary model',
|
|
44
|
+
* default: { free: 'google/gemini-3-flash', 'vip.2': 'anthropic/claude-sonnet-5' } },
|
|
45
|
+
* },
|
|
46
|
+
* { read: (ctx) => store.readConfig(ctx), write: (ctx, patch) => store.writeConfig(ctx, patch) },
|
|
47
|
+
* )
|
|
48
|
+
*
|
|
49
|
+
* // at any call site — tier-aware, live, one line:
|
|
50
|
+
* const clamp = await flags.maxInputChars(ctx)
|
|
51
|
+
*
|
|
52
|
+
* // in an admin surface — render every flag without naming any:
|
|
53
|
+
* for (const d of flags.describe()) { ... d.key, d.kind, d.label, d.tiered ... }
|
|
54
|
+
* await flags.set(ctx, 'richText', false) // live override
|
|
55
|
+
* await flags.set(ctx, 'richText', null) // clear → back to the code default
|
|
56
|
+
*/
|
|
57
|
+
import { SourcedError, panic } from "../offensive.js";
|
|
58
|
+
// ─── internals ───────────────────────────────────────────────────────
|
|
59
|
+
const RESERVED = new Set(["describe", "overrides", "get", "set"]);
|
|
60
|
+
/** Scalars are never objects, so `free` presence is the whole test. */
|
|
61
|
+
const isTierMap = (v) => typeof v === "object" && v !== null && "free" in v;
|
|
62
|
+
/** `ctx.payments.tier()` when bot/payments is wired; `free` otherwise. */
|
|
63
|
+
const tierOf = (ctx) => {
|
|
64
|
+
const payments = ctx?.payments;
|
|
65
|
+
try {
|
|
66
|
+
return payments?.tier?.() ?? "free";
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return "free";
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
/** Walk the ladder down: vip.N → … → vip.1 → vip → free. */
|
|
73
|
+
const resolveTiered = (value, tier) => {
|
|
74
|
+
if (!isTierMap(value))
|
|
75
|
+
return value;
|
|
76
|
+
if (tier.startsWith("vip.")) {
|
|
77
|
+
const rung = Number.parseInt(tier.slice(4), 10);
|
|
78
|
+
for (let i = rung; i >= 1; i--) {
|
|
79
|
+
const hit = value[`vip.${i}`];
|
|
80
|
+
if (hit !== undefined)
|
|
81
|
+
return hit;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (tier !== "free" && value.vip !== undefined)
|
|
85
|
+
return value.vip;
|
|
86
|
+
return value.free;
|
|
87
|
+
};
|
|
88
|
+
const kindOk = (kind, v) => kind === "bool" ? typeof v === "boolean" : typeof v === kind;
|
|
89
|
+
/** A scalar of the right kind, or a tier map whose every value is. */
|
|
90
|
+
const valueOk = (kind, v) => {
|
|
91
|
+
if (isTierMap(v))
|
|
92
|
+
return Object.values(v).every((t) => kindOk(kind, t));
|
|
93
|
+
return kindOk(kind, v);
|
|
94
|
+
};
|
|
95
|
+
// ─── the factory ─────────────────────────────────────────────────────
|
|
96
|
+
export function defineFlags(spec, backend) {
|
|
97
|
+
for (const [key, s] of Object.entries(spec)) {
|
|
98
|
+
if (RESERVED.has(key))
|
|
99
|
+
panic(`flags: "${key}" is a reserved name`);
|
|
100
|
+
if (!valueOk(s.kind, s.default))
|
|
101
|
+
panic(`flags: "${key}" default doesn't match kind "${s.kind}":`, s.default);
|
|
102
|
+
}
|
|
103
|
+
// One config read per update: multiple flag reads on the same ctx share
|
|
104
|
+
// the same in-flight promise (keyed on ctx object identity).
|
|
105
|
+
const cache = new WeakMap();
|
|
106
|
+
const configFor = (ctx) => {
|
|
107
|
+
if (typeof ctx !== "object" || ctx === null)
|
|
108
|
+
return backend.read(ctx);
|
|
109
|
+
const hit = cache.get(ctx);
|
|
110
|
+
if (hit)
|
|
111
|
+
return hit;
|
|
112
|
+
const p = backend.read(ctx);
|
|
113
|
+
cache.set(ctx, p);
|
|
114
|
+
return p;
|
|
115
|
+
};
|
|
116
|
+
const resolve = async (ctx, key) => {
|
|
117
|
+
const s = spec[key];
|
|
118
|
+
const stored = (await configFor(ctx))[key];
|
|
119
|
+
const declared = stored !== undefined && stored !== null ? stored : s.default;
|
|
120
|
+
if (!valueOk(s.kind, declared))
|
|
121
|
+
throw new SourcedError({
|
|
122
|
+
source: "flags",
|
|
123
|
+
operation: "resolve",
|
|
124
|
+
message: `stored override for "${key}" doesn't match kind "${s.kind}"`,
|
|
125
|
+
context: { key, stored },
|
|
126
|
+
});
|
|
127
|
+
return resolveTiered(declared, tierOf(ctx));
|
|
128
|
+
};
|
|
129
|
+
const flags = {
|
|
130
|
+
describe: () => Object.entries(spec).map(([key, s]) => ({
|
|
131
|
+
key,
|
|
132
|
+
kind: s.kind,
|
|
133
|
+
label: s.label,
|
|
134
|
+
...(s.help !== undefined ? { help: s.help } : {}),
|
|
135
|
+
default: s.default,
|
|
136
|
+
tiered: isTierMap(s.default),
|
|
137
|
+
})),
|
|
138
|
+
overrides: async (ctx) => {
|
|
139
|
+
const stored = await configFor(ctx);
|
|
140
|
+
return Object.fromEntries(Object.keys(spec)
|
|
141
|
+
.filter((k) => stored[k] !== undefined && stored[k] !== null)
|
|
142
|
+
.map((k) => [k, stored[k]]));
|
|
143
|
+
},
|
|
144
|
+
get: (ctx, key) => {
|
|
145
|
+
if (!spec[key])
|
|
146
|
+
panic(`flags: unknown flag "${key}"`);
|
|
147
|
+
return resolve(ctx, key);
|
|
148
|
+
},
|
|
149
|
+
set: async (ctx, key, value) => {
|
|
150
|
+
const s = spec[key] ?? panic(`flags: unknown flag "${key}"`);
|
|
151
|
+
if (!backend.write)
|
|
152
|
+
panic("flags: set() needs a write backend");
|
|
153
|
+
if (value !== null && !valueOk(s.kind, value))
|
|
154
|
+
throw new SourcedError({
|
|
155
|
+
source: "flags",
|
|
156
|
+
operation: "set",
|
|
157
|
+
message: `value for "${key}" doesn't match kind "${s.kind}"`,
|
|
158
|
+
context: { key, value },
|
|
159
|
+
});
|
|
160
|
+
await backend.write(ctx, { [key]: value });
|
|
161
|
+
// The next read must see the write, even on the same ctx.
|
|
162
|
+
if (typeof ctx === "object" && ctx !== null)
|
|
163
|
+
cache.delete(ctx);
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
for (const key of Object.keys(spec)) {
|
|
167
|
+
flags[key] = (ctx) => resolve(ctx, key);
|
|
168
|
+
}
|
|
169
|
+
return flags;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/bot/flags.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/kit.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Foundational helpers for NODE bots — the library's deliberately
|
|
3
3
|
* Node-only corner (process signals, KEV env resolution). Worker bots
|
|
4
4
|
* use the worker-safe subpaths instead: `bot/session` (namespaced
|
|
5
|
-
* sessions) and `bot/notify` (admin DMs) hold the pieces that
|
|
6
|
-
*
|
|
5
|
+
* sessions) and `bot/notify` (admin DMs) hold the pieces that never
|
|
6
|
+
* needed an OS.
|
|
7
7
|
*
|
|
8
8
|
* `gracefulStart(bot, opts?)` — wires SIGINT/SIGTERM to bot.stop(),
|
|
9
9
|
* runs an optional shutdown hook, force-kills if it hangs. DMs the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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
|
|
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
|
@@ -265,8 +265,7 @@ export const language = (opts) => {
|
|
|
265
265
|
// Pack the picker two languages per row (break after each odd index).
|
|
266
266
|
keepRow: i % 2 === 0 && i < arr.length - 1,
|
|
267
267
|
// The user's EFFECTIVE language renders blue (Telegram's `primary`
|
|
268
|
-
// style); the rest stay at app default.
|
|
269
|
-
// markers — same signal, native Telegram styling.
|
|
268
|
+
// style); the rest stay at app default.
|
|
270
269
|
//
|
|
271
270
|
// Resolves stored → hint → default LIVE (not `ctx.lang`, the
|
|
272
271
|
// event-start snapshot — stale within the same callback after the
|
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adriangalilea/utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "TypeScript utilities - logger, currency, formatter, GramIO bot plugins, and more",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -123,6 +123,10 @@
|
|
|
123
123
|
"./bot/profile": {
|
|
124
124
|
"types": "./dist/bot/profile.d.ts",
|
|
125
125
|
"default": "./dist/bot/profile.js"
|
|
126
|
+
},
|
|
127
|
+
"./bot/flags": {
|
|
128
|
+
"types": "./dist/bot/flags.d.ts",
|
|
129
|
+
"default": "./dist/bot/flags.js"
|
|
126
130
|
}
|
|
127
131
|
},
|
|
128
132
|
"files": [
|
|
@@ -146,7 +150,8 @@
|
|
|
146
150
|
"prepublishOnly": "pnpm run build",
|
|
147
151
|
"test:worker-safe": "pnpm run build && tsx tests/worker-safe-test.ts",
|
|
148
152
|
"demo:bot": "tsx tests/create-demo.ts",
|
|
149
|
-
"test:tg-html": "tsx tests/tg-html-test.ts"
|
|
153
|
+
"test:tg-html": "tsx tests/tg-html-test.ts",
|
|
154
|
+
"test:flags": "tsx tests/flags-test.ts"
|
|
150
155
|
},
|
|
151
156
|
"keywords": [
|
|
152
157
|
"typescript",
|