@adriangalilea/utils 2.31.0 → 2.32.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # ts-utils
2
2
 
3
- TypeScript utilities - logger, currency, offensive programming, file operations, environment management, and more. The sibling of [swift-utils](https://github.com/adriangalilea/swift-utils), py-utils, and go-utils.
3
+ TypeScript utilities - logger, currency, offensive programming, file operations, environment management, and more. The sibling of [swift-utils](https://github.com/adriangalilea/swift-utils), [py-utils](https://github.com/adriangalilea/py-utils), and [go-utils](https://github.com/adriangalilea/go-utils). The logging doctrine the three share, and the harness that proves they emit the same record line, live in [utils](https://github.com/adriangalilea/utils).
4
4
 
5
5
  ## Installation
6
6
 
@@ -1,3 +1,55 @@
1
+ /**
2
+ * Telegram message reactions: WHICH emoji are allowed, and WHO owns the bot's
3
+ * reaction on a given message.
4
+ *
5
+ * Two halves, one domain. `TELEGRAM_REACTIONS` / `isReaction` / `reactionsFor`
6
+ * answer what Telegram will accept; `reactionPolicy` further down arbitrates
7
+ * between independent features that want to react to the same message.
8
+ *
9
+ * # The accepted set
10
+ *
11
+ * ## Why this is a list and not an API call
12
+ *
13
+ * The Bot API does not enumerate them. `getChat().available_reactions` is
14
+ * populated ONLY when a chat restricts its own reactions; a chat that allows
15
+ * all of them returns `null`, which is the common case. So a caller that wants
16
+ * to know the set — to offer it to a language model, to validate input, to
17
+ * build a picker — has no method to ask.
18
+ *
19
+ * ## Where these came from
20
+ *
21
+ * Measured, not copied from documentation: `scripts/probe-reactions.ts` sets
22
+ * each candidate on a real message and records Telegram's verdict. Re-run it to
23
+ * refresh this list.
24
+ *
25
+ * BOT_TOKEN=… bun scripts/probe-reactions.ts <chat_id> <message_id>
26
+ *
27
+ * Gathered **2026-08-07**: 86 candidates probed, 73 accepted, 13 refused with
28
+ * `Bad Request: REACTION_INVALID`.
29
+ *
30
+ * The refusals are worth knowing, because they are the ones people (and models)
31
+ * reach for by instinct:
32
+ *
33
+ * 👋 😊 🙂 😄 ✅ 🤖 💪 🙌 😅 🥳 😂 ❓ ‼
34
+ *
35
+ * **There is no wave.** A greeting has to be answered with something from the
36
+ * accepted set — 🤝 🫡 🤗 😁 — or with words.
37
+ */
38
+ export declare const TELEGRAM_REACTIONS: readonly ["👍", "👎", "❤", "🔥", "🥰", "👏", "😁", "🤔", "🤯", "😱", "🤬", "😢", "🎉", "🤩", "🤮", "💩", "🙏", "👌", "🕊", "🤡", "🥱", "🥴", "😍", "🐳", "❤‍🔥", "🌚", "🌭", "💯", "🤣", "⚡", "🍌", "🏆", "💔", "🤨", "😐", "🍓", "🍾", "💋", "🖕", "😈", "😴", "😭", "🤓", "👻", "👨‍💻", "👀", "🎃", "🙈", "😇", "😨", "🤝", "✍", "🤗", "🫡", "🎅", "🎄", "☃", "💅", "🤪", "🗿", "🆒", "💘", "🙉", "🦄", "😘", "💊", "🙊", "😎", "👾", "🤷‍♂", "🤷", "🤷‍♀", "😡"];
39
+ export type TelegramReaction = (typeof TELEGRAM_REACTIONS)[number];
40
+ /** Probed and refused on the date above — kept so callers can explain a rejection. */
41
+ export declare const REFUSED_REACTIONS: readonly ["👋", "😊", "🙂", "😄", "✅", "🤖", "💪", "🙌", "😅", "🥳", "😂", "❓", "‼"];
42
+ /** Whether Telegram will accept this emoji as a reaction. */
43
+ export declare const isReaction: (emoji: string) => emoji is TelegramReaction;
44
+ /**
45
+ * The set a chat will actually accept: what `getChat` reports when the room
46
+ * restricts its reactions, otherwise the full measured set. Pass
47
+ * `chat.available_reactions` straight through.
48
+ */
49
+ export declare const reactionsFor: (available?: {
50
+ type: string;
51
+ emoji?: string;
52
+ }[] | null) => readonly string[];
1
53
  /**
2
54
  * Message-reaction arbitration: ONE owner for the bot's reaction on each
3
55
  * message. Telegram's setMessageReaction REPLACES the bot's whole reaction
@@ -1 +1 @@
1
- {"version":3,"file":"reactions.d.ts","sourceRoot":"","sources":["../../src/bot/reactions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,iBAAiB;IACjC,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;iFAGiF;AACjF,MAAM,WAAW,WAAW;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM;IAC/C,kEAAkE;IAClE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAClB;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/B;AAMD,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACzE,MAAM,EAAE,CAAC;IAKR,yEAAyE;iBAC5D,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;EA0BxD"}
1
+ {"version":3,"file":"reactions.d.ts","sourceRoot":"","sources":["../../src/bot/reactions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,kBAAkB,scA0ErB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,sFAcpB,CAAC;AAIX,6DAA6D;AAC7D,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,gBAChC,CAAC;AAErB;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACxB,YAAY;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,IAAI,KACnD,SAAS,MAAM,EAKI,CAAC;AAKvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,iBAAiB;IACjC,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;iFAGiF;AACjF,MAAM,WAAW,WAAW;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM;IAC/C,kEAAkE;IAClE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAClB;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/B;AAMD,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACzE,MAAM,EAAE,CAAC;IAKR,yEAAyE;iBAC5D,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;EA0BxD"}
@@ -1,35 +1,144 @@
1
1
  /**
2
- * Message-reaction arbitration: ONE owner for the bot's reaction on each
3
- * message. Telegram's setMessageReaction REPLACES the bot's whole reaction
4
- * set, so independent features reacting to the same message (an "on it" ack,
5
- * an outcome, a side-feature's shrug) silently clobber each other — last
6
- * writer wins, and the client shows flickering swaps.
2
+ * Telegram message reactions: WHICH emoji are allowed, and WHO owns the bot's
3
+ * reaction on a given message.
7
4
  *
8
- * The fix is semantic states with ranks, arbitrated per message:
5
+ * Two halves, one domain. `TELEGRAM_REACTIONS` / `isReaction` / `reactionsFor`
6
+ * answer what Telegram will accept; `reactionPolicy` further down arbitrates
7
+ * between independent features that want to react to the same message.
9
8
  *
10
- * const status = reactionPolicy({
11
- * working: { emoji: "🫡", rank: 1 },
12
- * offTopic: { emoji: "🤷", rank: 2 },
13
- * failed: { emoji: "👎", rank: 3 },
14
- * done: { emoji: "🫡", rank: 4 }, // same emoji as working: no API call, but locks out offTopic
15
- * });
16
- * const r = status.for(ctx);
17
- * await r.set("working"); // applied
18
- * await r.set("done"); // rank bookkeeping only (same emoji) — zero API calls, zero flicker
19
- * await r.set("offTopic"); // REJECTED: outranked by done — the shrug never lands
9
+ * # The accepted set
20
10
  *
21
- * Guarantees:
22
- * - a state only applies when its rank is >= the current state's rank
23
- * (equal rank may refine; strictly lower is rejected — returns false);
24
- * - setting the current state again is a no-op (idempotent, no API call);
25
- * - a transition between states sharing an emoji makes NO API call
26
- * (rank bookkeeping without flicker);
27
- * - react() failures are swallowed — reactions are decoration, they must
28
- * never break the flow that set them;
29
- * - state is keyed by chat:message, so one policy instance serves every
30
- * message concurrently, and is bounded (reactions are transient
31
- * request-lifetime coordination, not durable state).
11
+ * ## Why this is a list and not an API call
12
+ *
13
+ * The Bot API does not enumerate them. `getChat().available_reactions` is
14
+ * populated ONLY when a chat restricts its own reactions; a chat that allows
15
+ * all of them returns `null`, which is the common case. So a caller that wants
16
+ * to know the set — to offer it to a language model, to validate input, to
17
+ * build a picker — has no method to ask.
18
+ *
19
+ * ## Where these came from
20
+ *
21
+ * Measured, not copied from documentation: `scripts/probe-reactions.ts` sets
22
+ * each candidate on a real message and records Telegram's verdict. Re-run it to
23
+ * refresh this list.
24
+ *
25
+ * BOT_TOKEN=… bun scripts/probe-reactions.ts <chat_id> <message_id>
26
+ *
27
+ * Gathered **2026-08-07**: 86 candidates probed, 73 accepted, 13 refused with
28
+ * `Bad Request: REACTION_INVALID`.
29
+ *
30
+ * The refusals are worth knowing, because they are the ones people (and models)
31
+ * reach for by instinct:
32
+ *
33
+ * 👋 😊 🙂 😄 ✅ 🤖 💪 🙌 😅 🥳 😂 ❓ ‼
34
+ *
35
+ * **There is no wave.** A greeting has to be answered with something from the
36
+ * accepted set — 🤝 🫡 🤗 😁 — or with words.
37
+ */
38
+ export const TELEGRAM_REACTIONS = [
39
+ "👍",
40
+ "👎",
41
+ "❤",
42
+ "🔥",
43
+ "🥰",
44
+ "👏",
45
+ "😁",
46
+ "🤔",
47
+ "🤯",
48
+ "😱",
49
+ "🤬",
50
+ "😢",
51
+ "🎉",
52
+ "🤩",
53
+ "🤮",
54
+ "💩",
55
+ "🙏",
56
+ "👌",
57
+ "🕊",
58
+ "🤡",
59
+ "🥱",
60
+ "🥴",
61
+ "😍",
62
+ "🐳",
63
+ "❤‍🔥",
64
+ "🌚",
65
+ "🌭",
66
+ "💯",
67
+ "🤣",
68
+ "⚡",
69
+ "🍌",
70
+ "🏆",
71
+ "💔",
72
+ "🤨",
73
+ "😐",
74
+ "🍓",
75
+ "🍾",
76
+ "💋",
77
+ "🖕",
78
+ "😈",
79
+ "😴",
80
+ "😭",
81
+ "🤓",
82
+ "👻",
83
+ "👨‍💻",
84
+ "👀",
85
+ "🎃",
86
+ "🙈",
87
+ "😇",
88
+ "😨",
89
+ "🤝",
90
+ "✍",
91
+ "🤗",
92
+ "🫡",
93
+ "🎅",
94
+ "🎄",
95
+ "☃",
96
+ "💅",
97
+ "🤪",
98
+ "🗿",
99
+ "🆒",
100
+ "💘",
101
+ "🙉",
102
+ "🦄",
103
+ "😘",
104
+ "💊",
105
+ "🙊",
106
+ "😎",
107
+ "👾",
108
+ "🤷‍♂",
109
+ "🤷",
110
+ "🤷‍♀",
111
+ "😡",
112
+ ];
113
+ /** Probed and refused on the date above — kept so callers can explain a rejection. */
114
+ export const REFUSED_REACTIONS = [
115
+ "👋",
116
+ "😊",
117
+ "🙂",
118
+ "😄",
119
+ "✅",
120
+ "🤖",
121
+ "💪",
122
+ "🙌",
123
+ "😅",
124
+ "🥳",
125
+ "😂",
126
+ "❓",
127
+ "‼",
128
+ ];
129
+ const ACCEPTED = new Set(TELEGRAM_REACTIONS);
130
+ /** Whether Telegram will accept this emoji as a reaction. */
131
+ export const isReaction = (emoji) => ACCEPTED.has(emoji);
132
+ /**
133
+ * The set a chat will actually accept: what `getChat` reports when the room
134
+ * restricts its reactions, otherwise the full measured set. Pass
135
+ * `chat.available_reactions` straight through.
32
136
  */
137
+ export const reactionsFor = (available) => available
138
+ ? available
139
+ .filter((reaction) => reaction.type === "emoji" && reaction.emoji)
140
+ .map((reaction) => reaction.emoji)
141
+ : TELEGRAM_REACTIONS;
33
142
  // Transient per-isolate coordination, not durable state: bound it so a
34
143
  // long-lived isolate can't grow the map without limit.
35
144
  const MAX_TRACKED_MESSAGES = 512;
@@ -1 +1 @@
1
- {"version":3,"file":"reactions.js","sourceRoot":"","sources":["../../src/bot/reactions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AA+BH,uEAAuE;AACvE,uDAAuD;AACvD,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAC7B,MAAS;IAET,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEpD,OAAO;QACN,yEAAyE;QACzE,GAAG,CAAC,OAAgB;YACnB,MAAM,GAAG,GAAG,OAAsB,CAAC;YACnC,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU;gBAClC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YAChC,OAAO;gBACN,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;gBACrC,KAAK,CAAC,GAAG,CAAC,IAAI;oBACb,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC1B,IAAI,CAAC,IAAI;wBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACtE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC9B,IAAI,IAAI,KAAK,IAAI;wBAAE,OAAO,IAAI,CAAC,CAAC,aAAa;oBAC7C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI;wBAAE,OAAO,KAAK,CAAC,CAAC,YAAY;oBACnF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,oBAAoB;wBAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACvB,4EAA4E;oBAC5E,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;wBAC1D,OAAO,IAAI,CAAC;oBACb,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAC5C,OAAO,IAAI,CAAC;gBACb,CAAC;aACD,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"reactions.js","sourceRoot":"","sources":["../../src/bot/reactions.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adriangalilea/utils",
3
- "version": "2.31.0",
3
+ "version": "2.32.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",
@@ -104,6 +104,10 @@
104
104
  "types": "./dist/bot/llm.d.ts",
105
105
  "default": "./dist/bot/llm.js"
106
106
  },
107
+ "./bot/reactions": {
108
+ "types": "./dist/bot/reactions.d.ts",
109
+ "default": "./dist/bot/reactions.js"
110
+ },
107
111
  "./bot/payments": {
108
112
  "types": "./dist/bot/payments/index.d.ts",
109
113
  "default": "./dist/bot/payments/index.js"
@@ -172,10 +176,6 @@
172
176
  "types": "./dist/bot/updates.d.ts",
173
177
  "default": "./dist/bot/updates.js"
174
178
  },
175
- "./bot/reactions": {
176
- "types": "./dist/bot/reactions.d.ts",
177
- "default": "./dist/bot/reactions.js"
178
- },
179
179
  "./llm": {
180
180
  "types": "./dist/llm/index.d.ts",
181
181
  "default": "./dist/llm/index.js"