@adriangalilea/utils 2.26.0 → 2.28.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 +48 -0
- package/dist/bot/text.d.ts +23 -0
- package/dist/bot/text.d.ts.map +1 -0
- package/dist/bot/text.js +40 -0
- package/dist/bot/text.js.map +1 -0
- package/dist/bot/update-identity.d.ts +19 -0
- package/dist/bot/update-identity.d.ts.map +1 -0
- package/dist/bot/update-identity.js +92 -0
- package/dist/bot/update-identity.js.map +1 -0
- package/dist/bot/worker.d.ts +62 -0
- package/dist/bot/worker.d.ts.map +1 -1
- package/dist/bot/worker.js +181 -0
- package/dist/bot/worker.js.map +1 -1
- package/dist/cli/text.d.ts +2 -1
- package/dist/cli/text.d.ts.map +1 -1
- package/dist/cli/text.js +2 -2
- package/dist/cli/text.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/universal/ansi.d.ts +28 -0
- package/dist/universal/ansi.d.ts.map +1 -0
- package/dist/universal/ansi.js +39 -0
- package/dist/universal/ansi.js.map +1 -0
- package/dist/universal/time.d.ts +31 -0
- package/dist/universal/time.d.ts.map +1 -0
- package/dist/universal/time.js +95 -0
- package/dist/universal/time.js.map +1 -0
- package/package.json +19 -1
package/README.md
CHANGED
|
@@ -123,6 +123,54 @@ money(100, 'EUR') // "€100.00"
|
|
|
123
123
|
usdIntlOptions(0.43387) // { style: 'currency', currency: 'USD', minimumFractionDigits: 3, ... }
|
|
124
124
|
```
|
|
125
125
|
|
|
126
|
+
### ANSI primitives (`ansi`)
|
|
127
|
+
|
|
128
|
+
Raw escape codes, ALWAYS ON — the vocabulary under the TTY-aware layers. The
|
|
129
|
+
logger and `cli` palettes decide *whether* to color (TTY, `NO_COLOR`,
|
|
130
|
+
`FORCE_COLOR`); this module is for output whose consumer renders ANSI
|
|
131
|
+
regardless of what stdout is: Claude Code status lines, tmux status strings,
|
|
132
|
+
files a terminal will cat. 256-color first (`fg`/`bg` — stable across
|
|
133
|
+
terminals and multiplexers); `rgb` for known-truecolor consumers. Out-of-range
|
|
134
|
+
indices panic.
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
import { fg, bg, rgb, BOLD, RESET, stripAnsi, ANSI_RE } from '@adriangalilea/utils/ansi'
|
|
138
|
+
|
|
139
|
+
`${BOLD}${fg(171)}Fable 5${RESET}` // bold bright violet
|
|
140
|
+
fg(196) // red foreground
|
|
141
|
+
bg(238) // dark gray background
|
|
142
|
+
rgb(173, 127, 168) // 24-bit, when the consumer renders it
|
|
143
|
+
stripAnsi(styled) // the string minus its escapes
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
`cli`'s ANSI-aware `width()` / `clip()` measure strings styled with these
|
|
147
|
+
(they share `ANSI_RE`).
|
|
148
|
+
|
|
149
|
+
### Time (`time`)
|
|
150
|
+
|
|
151
|
+
Humanized time — three questions, three functions: how long is a duration
|
|
152
|
+
(`span`), how long ago was an instant (`ago`, raw-duration twin `since`), how
|
|
153
|
+
long until an instant (`until`). `ago` degrades by distance instead of
|
|
154
|
+
stacking units: fresh instants stay relative, older ones snap to the clock the
|
|
155
|
+
reader would check. Accepts `Date | ISO string | epoch ms | null | undefined`
|
|
156
|
+
(null renders `"—"`); epoch numbers are milliseconds only, by design — a
|
|
157
|
+
seconds heuristic would silently shift dates near the boundary.
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
import { span, since, ago, until } from '@adriangalilea/utils/time'
|
|
161
|
+
|
|
162
|
+
span(6_000_000) // "1h 40m" (also "45s", "47m", "2d 3h")
|
|
163
|
+
since(sessionStart) // "47m" — elapsed, no "ago"
|
|
164
|
+
ago(twoMinutesAgo) // "2m ago" ("now" under a minute)
|
|
165
|
+
ago(fiveHoursAgo) // "5h 12m ago" (relative up to 6h)
|
|
166
|
+
ago(thisMorning) // "10:30" (clock time, today)
|
|
167
|
+
ago(lastNight) // "yst 22:15"
|
|
168
|
+
ago(fourDaysAgo) // "Mon 09:00" (within a week)
|
|
169
|
+
ago(lastMonth) // "07/28"
|
|
170
|
+
until(weeklyReset) // "in 3d 13h" ("now" if passed)
|
|
171
|
+
ago(null) // "—" (every function)
|
|
172
|
+
```
|
|
173
|
+
|
|
126
174
|
### URL (`url`)
|
|
127
175
|
|
|
128
176
|
URLs, from user-typed text to cache identity. The whole funnel — *is there a
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram outbound-text mechanics: the message size limit, deterministic
|
|
3
|
+
* fitting under it, and the "message is not modified" edit no-op classifier.
|
|
4
|
+
* Dependency-free and Worker-safe.
|
|
5
|
+
*/
|
|
6
|
+
/** Telegram's post-entity character limit for one message. */
|
|
7
|
+
export declare const TELEGRAM_MAX_CHARS = 4096;
|
|
8
|
+
export interface FitTelegramTextOptions {
|
|
9
|
+
maxChars?: number;
|
|
10
|
+
/** Retain a short final paragraph, useful for a summary's source/footer block. */
|
|
11
|
+
preserveFinalBlock?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Deterministically fit plain text to Telegram's post-entity character limit. */
|
|
14
|
+
export declare function fitTelegramText(text: string, opts?: FitTelegramTextOptions): string;
|
|
15
|
+
/**
|
|
16
|
+
* Telegram rejects an edit whose result equals the current message with
|
|
17
|
+
* "message is not modified". That is a no-op, not an error — the desired state
|
|
18
|
+
* is already live. Callers treat it as delivered instead of falling back to a
|
|
19
|
+
* degraded (e.g. plain-text) retry that WOULD differ and silently strip
|
|
20
|
+
* formatting, or wrongly sending a duplicate.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isNotModified(err: unknown): boolean;
|
|
23
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/bot/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,sBAA2B,GAC/B,MAAM,CAmBR;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGnD"}
|
package/dist/bot/text.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram outbound-text mechanics: the message size limit, deterministic
|
|
3
|
+
* fitting under it, and the "message is not modified" edit no-op classifier.
|
|
4
|
+
* Dependency-free and Worker-safe.
|
|
5
|
+
*/
|
|
6
|
+
/** Telegram's post-entity character limit for one message. */
|
|
7
|
+
export const TELEGRAM_MAX_CHARS = 4096;
|
|
8
|
+
/** Deterministically fit plain text to Telegram's post-entity character limit. */
|
|
9
|
+
export function fitTelegramText(text, opts = {}) {
|
|
10
|
+
const maxChars = Math.max(1, Math.floor(opts.maxChars ?? TELEGRAM_MAX_CHARS));
|
|
11
|
+
if (text.length <= maxChars)
|
|
12
|
+
return text;
|
|
13
|
+
const ellipsis = maxChars >= 4 ? "\n\n…" : "…".slice(0, maxChars);
|
|
14
|
+
const divider = opts.preserveFinalBlock ? text.lastIndexOf("\n\n") : -1;
|
|
15
|
+
const possibleTail = divider > maxChars / 2 ? text.slice(divider) : "";
|
|
16
|
+
const tail = possibleTail.length <= Math.min(640, Math.floor(maxChars / 3))
|
|
17
|
+
? possibleTail
|
|
18
|
+
: "";
|
|
19
|
+
const budget = maxChars - ellipsis.length - tail.length;
|
|
20
|
+
let prefix = text.slice(0, Math.max(0, budget)).trimEnd();
|
|
21
|
+
// Never strand half of a UTF-16 surrogate pair at the truncation boundary.
|
|
22
|
+
if (/[\uD800-\uDBFF]$/.test(prefix))
|
|
23
|
+
prefix = prefix.slice(0, -1);
|
|
24
|
+
const boundary = Math.max(prefix.lastIndexOf("\n"), prefix.lastIndexOf(" "));
|
|
25
|
+
if (boundary >= Math.floor(prefix.length * 0.9))
|
|
26
|
+
prefix = prefix.slice(0, boundary).trimEnd();
|
|
27
|
+
return `${prefix}${ellipsis}${tail}`.slice(0, maxChars);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Telegram rejects an edit whose result equals the current message with
|
|
31
|
+
* "message is not modified". That is a no-op, not an error — the desired state
|
|
32
|
+
* is already live. Callers treat it as delivered instead of falling back to a
|
|
33
|
+
* degraded (e.g. plain-text) retry that WOULD differ and silently strip
|
|
34
|
+
* formatting, or wrongly sending a duplicate.
|
|
35
|
+
*/
|
|
36
|
+
export function isNotModified(err) {
|
|
37
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
38
|
+
return /not modified/i.test(message);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/bot/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAQvC,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAC9B,IAAY,EACZ,OAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,kBAAkB,CAAC,CAAC,CAAC;IAC9E,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,IAAI,GACT,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACxD,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1D,2EAA2E;IAC3E,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;QAC9C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACzC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure Telegram-update identity: who an update is from, which conversation it
|
|
3
|
+
* belongs to, and what (if anything) it carries as callback data. Dependency-free
|
|
4
|
+
* and Worker-safe, so the webhook ingress, durable runners, and tests all share
|
|
5
|
+
* one directly-testable routing/deduplication contract.
|
|
6
|
+
*/
|
|
7
|
+
/** Telegram's globally unique integer update id, used for durable de-duplication. */
|
|
8
|
+
export declare function telegramUpdateId(update: unknown): number | null;
|
|
9
|
+
/** The raw callback_data payload, when this is a callback-query update. */
|
|
10
|
+
export declare function telegramCallbackData(update: unknown): string | null;
|
|
11
|
+
/** The tapper's Telegram user id, when this is a callback-query update. */
|
|
12
|
+
export declare function telegramCallbackUserId(update: unknown): number | null;
|
|
13
|
+
/**
|
|
14
|
+
* Route one conversation to one Durable Object so its updates remain ordered while unrelated chats
|
|
15
|
+
* can run concurrently. Every current Telegram update shape either carries a chat or an actor; the
|
|
16
|
+
* update id is the safe final partition when it carries neither (for example a poll update).
|
|
17
|
+
*/
|
|
18
|
+
export declare function telegramUpdatePartition(update: unknown): string | null;
|
|
19
|
+
//# sourceMappingURL=update-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-identity.d.ts","sourceRoot":"","sources":["../../src/bot/update-identity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE/D;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAErE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmDtE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure Telegram-update identity: who an update is from, which conversation it
|
|
3
|
+
* belongs to, and what (if anything) it carries as callback data. Dependency-free
|
|
4
|
+
* and Worker-safe, so the webhook ingress, durable runners, and tests all share
|
|
5
|
+
* one directly-testable routing/deduplication contract.
|
|
6
|
+
*/
|
|
7
|
+
function record(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
9
|
+
? value
|
|
10
|
+
: null;
|
|
11
|
+
}
|
|
12
|
+
function integer(value) {
|
|
13
|
+
return typeof value === "number" && Number.isSafeInteger(value)
|
|
14
|
+
? value
|
|
15
|
+
: null;
|
|
16
|
+
}
|
|
17
|
+
function nestedId(value, parent) {
|
|
18
|
+
return integer(record(record(value)?.[parent])?.id);
|
|
19
|
+
}
|
|
20
|
+
/** Telegram's globally unique integer update id, used for durable de-duplication. */
|
|
21
|
+
export function telegramUpdateId(update) {
|
|
22
|
+
return integer(record(update)?.update_id);
|
|
23
|
+
}
|
|
24
|
+
/** The raw callback_data payload, when this is a callback-query update. */
|
|
25
|
+
export function telegramCallbackData(update) {
|
|
26
|
+
const data = record(record(update)?.callback_query)?.data;
|
|
27
|
+
return typeof data === "string" ? data : null;
|
|
28
|
+
}
|
|
29
|
+
/** The tapper's Telegram user id, when this is a callback-query update. */
|
|
30
|
+
export function telegramCallbackUserId(update) {
|
|
31
|
+
return nestedId(record(update)?.callback_query, "from");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Route one conversation to one Durable Object so its updates remain ordered while unrelated chats
|
|
35
|
+
* can run concurrently. Every current Telegram update shape either carries a chat or an actor; the
|
|
36
|
+
* update id is the safe final partition when it carries neither (for example a poll update).
|
|
37
|
+
*/
|
|
38
|
+
export function telegramUpdatePartition(update) {
|
|
39
|
+
const root = record(update);
|
|
40
|
+
const updateId = telegramUpdateId(update);
|
|
41
|
+
if (!root || updateId === null)
|
|
42
|
+
return null;
|
|
43
|
+
const chatCarriers = [
|
|
44
|
+
"message",
|
|
45
|
+
"edited_message",
|
|
46
|
+
"channel_post",
|
|
47
|
+
"edited_channel_post",
|
|
48
|
+
"business_message",
|
|
49
|
+
"edited_business_message",
|
|
50
|
+
"deleted_business_messages",
|
|
51
|
+
"message_reaction",
|
|
52
|
+
"message_reaction_count",
|
|
53
|
+
"my_chat_member",
|
|
54
|
+
"chat_member",
|
|
55
|
+
"chat_join_request",
|
|
56
|
+
"chat_boost",
|
|
57
|
+
"removed_chat_boost",
|
|
58
|
+
];
|
|
59
|
+
for (const key of chatCarriers) {
|
|
60
|
+
const chatId = nestedId(root[key], "chat");
|
|
61
|
+
if (chatId !== null)
|
|
62
|
+
return `chat:${chatId}`;
|
|
63
|
+
}
|
|
64
|
+
const callback = record(root.callback_query);
|
|
65
|
+
const callbackChatId = nestedId(callback?.message, "chat");
|
|
66
|
+
if (callbackChatId !== null)
|
|
67
|
+
return `chat:${callbackChatId}`;
|
|
68
|
+
const actorCarriers = [
|
|
69
|
+
"inline_query",
|
|
70
|
+
"chosen_inline_result",
|
|
71
|
+
"callback_query",
|
|
72
|
+
"shipping_query",
|
|
73
|
+
"pre_checkout_query",
|
|
74
|
+
"purchased_paid_media",
|
|
75
|
+
"poll_answer",
|
|
76
|
+
"business_connection",
|
|
77
|
+
];
|
|
78
|
+
for (const key of actorCarriers) {
|
|
79
|
+
const carrier = root[key];
|
|
80
|
+
const fromId = nestedId(carrier, "from");
|
|
81
|
+
if (fromId !== null)
|
|
82
|
+
return `user:${fromId}`;
|
|
83
|
+
const userId = nestedId(carrier, "user");
|
|
84
|
+
if (userId !== null)
|
|
85
|
+
return `user:${userId}`;
|
|
86
|
+
const voterChatId = nestedId(carrier, "voter_chat");
|
|
87
|
+
if (voterChatId !== null)
|
|
88
|
+
return `chat:${voterChatId}`;
|
|
89
|
+
}
|
|
90
|
+
return `update:${updateId}`;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=update-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-identity.js","sourceRoot":"","sources":["../../src/bot/update-identity.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/worker.d.ts
CHANGED
|
@@ -34,6 +34,24 @@ type WaitUntilCtx = {
|
|
|
34
34
|
* echoes — they're the conversation.
|
|
35
35
|
*/
|
|
36
36
|
export declare function isSelfEcho(update: unknown, selfId: number): boolean;
|
|
37
|
+
/** The slice of a Durable Object namespace binding the durable ingress touches. */
|
|
38
|
+
export type UpdateRunnerNamespace = {
|
|
39
|
+
idFromName(name: string): unknown;
|
|
40
|
+
get(id: unknown): {
|
|
41
|
+
fetch(input: string, init?: RequestInit): Promise<Response>;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export type DurableUpdates = {
|
|
45
|
+
/** The namespace bound to the class built by {@link telegramUpdateRunner}. */
|
|
46
|
+
namespace: UpdateRunnerNamespace;
|
|
47
|
+
/**
|
|
48
|
+
* Route SELECTED updates outside their conversation queue — for a time-critical
|
|
49
|
+
* callback that must not wait behind slow work already running for its chat.
|
|
50
|
+
* Return a partition name, or null/undefined for the default
|
|
51
|
+
* `telegramUpdatePartition` (one Durable Object per conversation).
|
|
52
|
+
*/
|
|
53
|
+
partition?: (update: unknown) => string | null | undefined;
|
|
54
|
+
};
|
|
37
55
|
export type BotWorkerRuntime = {
|
|
38
56
|
bot: WorkerBot;
|
|
39
57
|
/** Telegram webhook secret; unset → webhook/setup respond 500 (a misconfigured prod must scream). */
|
|
@@ -59,6 +77,8 @@ export type BotWorkerRuntime = {
|
|
|
59
77
|
routes?: (request: Request, url: URL, ctx: WaitUntilCtx) => Promise<Response | null> | Response | null;
|
|
60
78
|
/** Error-alert throttle (share one to share its budget). Default: own 60s window. */
|
|
61
79
|
errorThrottle?: AlertThrottle;
|
|
80
|
+
/** Durable webhook ingress: persist-before-ack into per-conversation runner DOs. */
|
|
81
|
+
durableUpdates?: DurableUpdates;
|
|
62
82
|
};
|
|
63
83
|
/**
|
|
64
84
|
* Build the Worker `fetch` handler. `resolve` runs per request — memoize your
|
|
@@ -66,5 +86,47 @@ export type BotWorkerRuntime = {
|
|
|
66
86
|
* isolate builds once.
|
|
67
87
|
*/
|
|
68
88
|
export declare function botWorkerFetch<Env>(resolve: (env: Env) => Promise<BotWorkerRuntime> | BotWorkerRuntime): (request: Request, env: Env, ctx: WaitUntilCtx) => Promise<Response>;
|
|
89
|
+
/** The slice of a Durable Object storage transaction the runner touches. */
|
|
90
|
+
type RunnerTxn = {
|
|
91
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
92
|
+
put(key: string, value: unknown): Promise<void>;
|
|
93
|
+
delete(key: string | string[]): Promise<unknown>;
|
|
94
|
+
};
|
|
95
|
+
/** The slice of DurableObjectState the runner touches — satisfied by the real binding. */
|
|
96
|
+
export type UpdateRunnerState = {
|
|
97
|
+
storage: RunnerTxn & {
|
|
98
|
+
getAlarm(): Promise<number | null>;
|
|
99
|
+
setAlarm(time: number): Promise<void>;
|
|
100
|
+
transaction<T>(fn: (txn: RunnerTxn) => Promise<T>): Promise<T>;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
export interface UpdateRunnerOptions {
|
|
104
|
+
/** Application retries per update before it is dropped as completed. Default 3. */
|
|
105
|
+
maxAttempts?: number;
|
|
106
|
+
/** Backoff (ms) before retry N+1; one entry per non-final attempt. Default [5s, 30s]. */
|
|
107
|
+
retryMs?: readonly number[];
|
|
108
|
+
/** Completed update ids retained for webhook de-duplication. Default 512. */
|
|
109
|
+
dedupeLimit?: number;
|
|
110
|
+
}
|
|
111
|
+
/** The Durable Object surface the factory-built runner class exposes. */
|
|
112
|
+
export type TelegramUpdateRunnerClass<Env> = new (state: UpdateRunnerState, env: Env) => {
|
|
113
|
+
fetch(request: Request): Promise<Response>;
|
|
114
|
+
alarm(): Promise<void>;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Build the durable, per-conversation Telegram update runner class — bind it in
|
|
118
|
+
* wrangler and hand its namespace to the runtime's `durableUpdates`. The webhook
|
|
119
|
+
* ingress only persists a job and sets an alarm; each alarm handles ONE update
|
|
120
|
+
* and checkpoints before scheduling the next. Unlike an HTTP waitUntil tail, an
|
|
121
|
+
* alarm handler owns its full invocation, so slow transcript/LLM work is not
|
|
122
|
+
* cancelled ~30 seconds after Telegram receives its acknowledgement.
|
|
123
|
+
*
|
|
124
|
+
* `resolve` is the same (memoized) runtime loader given to `botWorkerFetch`:
|
|
125
|
+
*
|
|
126
|
+
* const loadRuntime = async (env: Env) => ({ bot: await getBot(env), ... })
|
|
127
|
+
* export class TelegramUpdateRunner extends telegramUpdateRunner(loadRuntime) {}
|
|
128
|
+
* export default { fetch: botWorkerFetch(loadRuntime) }
|
|
129
|
+
*/
|
|
130
|
+
export declare function telegramUpdateRunner<Env>(resolve: (env: Env) => Promise<BotWorkerRuntime> | BotWorkerRuntime, options?: UpdateRunnerOptions): TelegramUpdateRunnerClass<Env>;
|
|
69
131
|
export {};
|
|
70
132
|
//# sourceMappingURL=worker.d.ts.map
|
package/dist/bot/worker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/worker.js
CHANGED
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
* POST / webhook — `X-Telegram-Bot-Api-Secret-Token` checked,
|
|
10
10
|
* acked immediately; the update (+ storage flush) rides
|
|
11
11
|
* `ctx.waitUntil`, errors DM the admins (throttled).
|
|
12
|
+
* With `durableUpdates` set, the update is instead
|
|
13
|
+
* PERSISTED into a per-conversation TelegramUpdateRunner
|
|
14
|
+
* Durable Object BEFORE the ack, and a DO alarm owns the
|
|
15
|
+
* full update: slow transcript/LLM work is not cancelled
|
|
16
|
+
* ~30s after Telegram receives its acknowledgement, and
|
|
17
|
+
* a non-2xx (nothing persisted) makes Telegram retry.
|
|
12
18
|
* POST /setup registers the webhook with `allowed_updates` DERIVED
|
|
13
19
|
* from the bot's handlers (a new handler type never
|
|
14
20
|
* fires until /setup reruns — deploys should end here).
|
|
@@ -42,6 +48,7 @@
|
|
|
42
48
|
import { buildAllowedUpdates } from "gramio";
|
|
43
49
|
import { createLogger } from "../universal/log.js";
|
|
44
50
|
import { alertAdminError, alertThrottle, notifyAdmins, } from "./notify.js";
|
|
51
|
+
import { telegramUpdateId, telegramUpdatePartition, } from "./update-identity.js";
|
|
45
52
|
const log = createLogger("bot/worker");
|
|
46
53
|
const MESSAGE_KEYS = [
|
|
47
54
|
"message",
|
|
@@ -112,6 +119,36 @@ export function botWorkerFetch(resolve) {
|
|
|
112
119
|
if (rt.selfId !== undefined && isSelfEcho(update, rt.selfId)) {
|
|
113
120
|
return new Response("OK");
|
|
114
121
|
}
|
|
122
|
+
// Durable ingress: persist into the partition's runner DO, THEN ack.
|
|
123
|
+
// A non-2xx tells Telegram to retry; never acknowledge an update
|
|
124
|
+
// that was not persisted.
|
|
125
|
+
if (rt.durableUpdates) {
|
|
126
|
+
const partition = rt.durableUpdates.partition?.(update) ??
|
|
127
|
+
telegramUpdatePartition(update);
|
|
128
|
+
if (!partition)
|
|
129
|
+
return new Response("Bad Request", { status: 400 });
|
|
130
|
+
const { namespace } = rt.durableUpdates;
|
|
131
|
+
try {
|
|
132
|
+
const queued = await namespace
|
|
133
|
+
.get(namespace.idFromName(partition))
|
|
134
|
+
.fetch("https://telegram-update-runner/enqueue", {
|
|
135
|
+
method: "POST",
|
|
136
|
+
headers: { "content-type": "application/json" },
|
|
137
|
+
body: JSON.stringify(update),
|
|
138
|
+
});
|
|
139
|
+
if (!queued.ok) {
|
|
140
|
+
log.error(`update enqueue failed · ${queued.status}`);
|
|
141
|
+
return new Response("update queue unavailable", {
|
|
142
|
+
status: 503,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return new Response("OK");
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
log.error("update enqueue failed:", error instanceof Error ? error.message : error);
|
|
149
|
+
return new Response("update queue unavailable", { status: 503 });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
115
152
|
// Ack Telegram immediately, then keep the Worker alive for the slow
|
|
116
153
|
// work (avoids GramIO's 30s webhook timeout).
|
|
117
154
|
ctx.waitUntil((async () => {
|
|
@@ -262,4 +299,148 @@ function etaSeconds(meta) {
|
|
|
262
299
|
function escapeHtml(s) {
|
|
263
300
|
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
264
301
|
}
|
|
302
|
+
const runnerLog = createLogger("bot/update-runner");
|
|
303
|
+
const HEAD_KEY = "head";
|
|
304
|
+
const TAIL_KEY = "tail";
|
|
305
|
+
const DONE_KEY = "done";
|
|
306
|
+
const jobKey = (sequence) => `job:${sequence.toString().padStart(16, "0")}`;
|
|
307
|
+
const dedupeKey = (updateId) => `update:${updateId}`;
|
|
308
|
+
/**
|
|
309
|
+
* Build the durable, per-conversation Telegram update runner class — bind it in
|
|
310
|
+
* wrangler and hand its namespace to the runtime's `durableUpdates`. The webhook
|
|
311
|
+
* ingress only persists a job and sets an alarm; each alarm handles ONE update
|
|
312
|
+
* and checkpoints before scheduling the next. Unlike an HTTP waitUntil tail, an
|
|
313
|
+
* alarm handler owns its full invocation, so slow transcript/LLM work is not
|
|
314
|
+
* cancelled ~30 seconds after Telegram receives its acknowledgement.
|
|
315
|
+
*
|
|
316
|
+
* `resolve` is the same (memoized) runtime loader given to `botWorkerFetch`:
|
|
317
|
+
*
|
|
318
|
+
* const loadRuntime = async (env: Env) => ({ bot: await getBot(env), ... })
|
|
319
|
+
* export class TelegramUpdateRunner extends telegramUpdateRunner(loadRuntime) {}
|
|
320
|
+
* export default { fetch: botWorkerFetch(loadRuntime) }
|
|
321
|
+
*/
|
|
322
|
+
export function telegramUpdateRunner(resolve, options = {}) {
|
|
323
|
+
const maxAttempts = options.maxAttempts ?? 3;
|
|
324
|
+
const retryMs = options.retryMs ?? [5_000, 30_000];
|
|
325
|
+
const dedupeLimit = options.dedupeLimit ?? 512;
|
|
326
|
+
const fallbackThrottle = alertThrottle();
|
|
327
|
+
return class TelegramUpdateRunner {
|
|
328
|
+
state;
|
|
329
|
+
env;
|
|
330
|
+
constructor(state, env) {
|
|
331
|
+
this.state = state;
|
|
332
|
+
this.env = env;
|
|
333
|
+
}
|
|
334
|
+
async fetch(request) {
|
|
335
|
+
if (request.method !== "POST" ||
|
|
336
|
+
new URL(request.url).pathname !== "/enqueue") {
|
|
337
|
+
return new Response("not found", { status: 404 });
|
|
338
|
+
}
|
|
339
|
+
const update = await request.json().catch(() => null);
|
|
340
|
+
const updateId = telegramUpdateId(update);
|
|
341
|
+
if (updateId === null)
|
|
342
|
+
return new Response("invalid Telegram update", { status: 400 });
|
|
343
|
+
const enqueued = await this.state.storage.transaction(async (txn) => {
|
|
344
|
+
if (await txn.get(dedupeKey(updateId)))
|
|
345
|
+
return false;
|
|
346
|
+
const tail = ((await txn.get(TAIL_KEY)) ?? 0) + 1;
|
|
347
|
+
const head = await txn.get(HEAD_KEY);
|
|
348
|
+
await txn.put(jobKey(tail), {
|
|
349
|
+
updateId,
|
|
350
|
+
update,
|
|
351
|
+
attempts: 0,
|
|
352
|
+
enqueuedAt: Date.now(),
|
|
353
|
+
});
|
|
354
|
+
await txn.put(TAIL_KEY, tail);
|
|
355
|
+
if (head === undefined)
|
|
356
|
+
await txn.put(HEAD_KEY, tail);
|
|
357
|
+
await txn.put(dedupeKey(updateId), "queued");
|
|
358
|
+
return true;
|
|
359
|
+
});
|
|
360
|
+
// A duplicate delivery is also a recovery kick: if the first attempt
|
|
361
|
+
// committed the job but failed while arming its alarm, Telegram's retry
|
|
362
|
+
// must repair that gap before we acknowledge it.
|
|
363
|
+
if ((await this.state.storage.get(HEAD_KEY)) !== undefined &&
|
|
364
|
+
(await this.state.storage.getAlarm()) === null) {
|
|
365
|
+
await this.state.storage.setAlarm(Date.now());
|
|
366
|
+
}
|
|
367
|
+
return new Response(JSON.stringify({ enqueued, duplicate: !enqueued }), {
|
|
368
|
+
headers: { "content-type": "application/json" },
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
async alarm() {
|
|
372
|
+
const sequence = await this.state.storage.get(HEAD_KEY);
|
|
373
|
+
if (sequence === undefined)
|
|
374
|
+
return;
|
|
375
|
+
const key = jobKey(sequence);
|
|
376
|
+
const job = await this.state.storage.get(key);
|
|
377
|
+
if (!job) {
|
|
378
|
+
await this.finish(sequence, null);
|
|
379
|
+
await this.scheduleNext();
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
let rt;
|
|
383
|
+
try {
|
|
384
|
+
rt = await resolve(this.env);
|
|
385
|
+
await rt.bot.updates.handleUpdate(job.update);
|
|
386
|
+
if (rt.flush)
|
|
387
|
+
await rt.flush();
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
job.attempts += 1;
|
|
391
|
+
runnerLog.error(`queued update ${job.updateId} failed · attempt ${job.attempts}/${maxAttempts}:`, error instanceof Error ? error.message : error);
|
|
392
|
+
if (rt) {
|
|
393
|
+
const runtime = rt;
|
|
394
|
+
await (runtime.adminIds?.() ?? Promise.resolve([]))
|
|
395
|
+
.then((ids) => alertAdminError(runtime.bot, ids, `queued Telegram update ${job.updateId} failed`, error, runtime.errorThrottle ?? fallbackThrottle))
|
|
396
|
+
.catch(() => { });
|
|
397
|
+
}
|
|
398
|
+
if (job.attempts >= maxAttempts) {
|
|
399
|
+
await this.finish(sequence, job.updateId);
|
|
400
|
+
await this.scheduleNext();
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
await this.state.storage.put(key, job);
|
|
404
|
+
await this.state.storage.setAlarm(Date.now() + (retryMs[job.attempts - 1] ?? retryMs.at(-1) ?? 30_000));
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
// Checkpointing sits outside the processing catch: if storage/alarm
|
|
408
|
+
// scheduling itself fails, let the platform retry the alarm from durable
|
|
409
|
+
// state instead of misclassifying the completed Telegram update as an
|
|
410
|
+
// application failure and rebuilding a retired job.
|
|
411
|
+
await this.finish(sequence, job.updateId);
|
|
412
|
+
runnerLog.info(`queued update ${job.updateId} completed · ${Date.now() - job.enqueuedAt}ms`);
|
|
413
|
+
await this.scheduleNext();
|
|
414
|
+
}
|
|
415
|
+
/** Retire the head job and retain a bounded completed-id window for webhook de-duplication. */
|
|
416
|
+
async finish(sequence, updateId) {
|
|
417
|
+
await this.state.storage.transaction(async (txn) => {
|
|
418
|
+
await txn.delete(jobKey(sequence));
|
|
419
|
+
if (updateId !== null) {
|
|
420
|
+
await txn.put(dedupeKey(updateId), "done");
|
|
421
|
+
const done = (await txn.get(DONE_KEY)) ?? [];
|
|
422
|
+
done.push(updateId);
|
|
423
|
+
while (done.length > dedupeLimit) {
|
|
424
|
+
const expired = done.shift();
|
|
425
|
+
if (expired !== undefined)
|
|
426
|
+
await txn.delete(dedupeKey(expired));
|
|
427
|
+
}
|
|
428
|
+
await txn.put(DONE_KEY, done);
|
|
429
|
+
}
|
|
430
|
+
const tail = (await txn.get(TAIL_KEY)) ?? sequence;
|
|
431
|
+
if (sequence >= tail) {
|
|
432
|
+
await txn.delete([HEAD_KEY, TAIL_KEY]);
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
await txn.put(HEAD_KEY, sequence + 1);
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
async scheduleNext() {
|
|
440
|
+
if ((await this.state.storage.get(HEAD_KEY)) !== undefined) {
|
|
441
|
+
await this.state.storage.setAlarm(Date.now());
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
}
|
|
265
446
|
//# sourceMappingURL=worker.js.map
|
package/dist/bot/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/text.d.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* (`cli/index` — table/kv/tree) and the live layer (`cli/live` — pinned
|
|
5
5
|
* region/spinner) build on these; keeping them here avoids an import cycle.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
import { ANSI_RE } from "../universal/ansi.js";
|
|
8
|
+
export { ANSI_RE };
|
|
8
9
|
/** Visible width of a string — ANSI escapes stripped, counted by grapheme cluster. */
|
|
9
10
|
export declare const width: (s: string) => number;
|
|
10
11
|
/**
|
package/dist/cli/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/cli/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/cli/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,OAAO,EAAE,OAAO,EAAE,CAAC;AAanB,sFAAsF;AACtF,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,MACoB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAwBjD;AAED,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MACL,CAAC;AAC3C,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MACP,CAAC;AAE3C,gFAAgF;AAChF,eAAO,MAAM,EAAE;cACJ,MAAM;gBACJ,MAAM;eACP,MAAM;YACT,MAAM;cACJ,MAAM;aACP,MAAM;IACf,+CAA+C;aACtC,MAAM;CACf,CAAC"}
|
package/dist/cli/text.js
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* (`cli/index` — table/kv/tree) and the live layer (`cli/live` — pinned
|
|
5
5
|
* region/spinner) build on these; keeping them here avoids an import cycle.
|
|
6
6
|
*/
|
|
7
|
+
import { ANSI_RE } from "../universal/ansi.js";
|
|
7
8
|
import { bold, cyan, dim, gray, green, red, yellow } from "../universal/log.js";
|
|
8
|
-
|
|
9
|
-
export const ANSI_RE = /\x1b\[[0-9;]*m/g;
|
|
9
|
+
export { ANSI_RE };
|
|
10
10
|
// biome-ignore lint/suspicious/noControlCharactersInRegex: split on ANSI escapes, keeping them
|
|
11
11
|
const ANSI_SPLIT_RE = /(\x1b\[[0-9;]*m)/;
|
|
12
12
|
// Grapheme clusters, not code points: what the terminal renders as ONE symbol
|
package/dist/cli/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/cli/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEhF,
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/cli/text.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,8 +13,10 @@ export * from "./platform/xdg.js";
|
|
|
13
13
|
export type { RuntimeCapabilities } from "./runtime.js";
|
|
14
14
|
export { ProcessExitError, runtime } from "./runtime.js";
|
|
15
15
|
export * from "./say/index.js";
|
|
16
|
+
export * from "./universal/ansi.js";
|
|
16
17
|
export * from "./universal/currency/index.js";
|
|
17
18
|
export * from "./universal/format.js";
|
|
18
19
|
export * from "./universal/log.js";
|
|
20
|
+
export * from "./universal/time.js";
|
|
19
21
|
export * from "./universal/url/index.js";
|
|
20
22
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,cAAc,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,cAAc,gBAAgB,CAAC;AAE/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -17,9 +17,11 @@ export * from "./platform/xdg.js";
|
|
|
17
17
|
export { ProcessExitError, runtime } from "./runtime.js";
|
|
18
18
|
// Polyglot strings — TS-enforced multi-language values
|
|
19
19
|
export * from "./say/index.js";
|
|
20
|
+
// Universal utilities - work everywhere
|
|
21
|
+
export * from "./universal/ansi.js";
|
|
20
22
|
export * from "./universal/currency/index.js";
|
|
21
23
|
export * from "./universal/format.js";
|
|
22
|
-
// Universal utilities - work everywhere
|
|
23
24
|
export * from "./universal/log.js";
|
|
25
|
+
export * from "./universal/time.js";
|
|
24
26
|
export * from "./universal/url/index.js";
|
|
25
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yDAAyD;AACzD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,8BAA8B;AAC9B,mEAAmE;AACnE,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAElC,8CAA8C;AAC9C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACzD,uDAAuD;AACvD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yDAAyD;AACzD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,8BAA8B;AAC9B,mEAAmE;AACnE,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAElC,8CAA8C;AAC9C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACzD,uDAAuD;AACvD,cAAc,gBAAgB,CAAC;AAC/B,wCAAwC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw ANSI escape primitives — ALWAYS ON, no TTY detection, no env checks.
|
|
3
|
+
* The vocabulary, not the policy: ./log and ../cli decide WHETHER to color
|
|
4
|
+
* (TTY, NO_COLOR, FORCE_COLOR) and build semantics on top; this module is for
|
|
5
|
+
* output whose consumer renders ANSI regardless of what stdout is — Claude
|
|
6
|
+
* Code status lines, tmux status strings, files a terminal will cat. A
|
|
7
|
+
* TTY-gated palette emits nothing through those pipes, which is exactly wrong.
|
|
8
|
+
*
|
|
9
|
+
* 256-color escapes (`fg`/`bg`) over 24-bit as the house default: the xterm
|
|
10
|
+
* cube is stable across every terminal/multiplexer, while 24-bit gets
|
|
11
|
+
* quantized or dropped by tmux/screen configs. `rgb` exists for when the
|
|
12
|
+
* consumer is known to render truecolor.
|
|
13
|
+
*/
|
|
14
|
+
export declare const RESET = "\u001B[0m";
|
|
15
|
+
export declare const BOLD = "\u001B[1m";
|
|
16
|
+
export declare const DIM = "\u001B[2m";
|
|
17
|
+
export declare const ITALIC = "\u001B[3m";
|
|
18
|
+
export declare const UNDERLINE = "\u001B[4m";
|
|
19
|
+
/** Foreground, xterm-256 palette index. */
|
|
20
|
+
export declare function fg(n: number): string;
|
|
21
|
+
/** Background, xterm-256 palette index. */
|
|
22
|
+
export declare function bg(n: number): string;
|
|
23
|
+
/** Foreground, 24-bit — only when the consumer is known to render truecolor. */
|
|
24
|
+
export declare function rgb(r: number, g: number, b: number): string;
|
|
25
|
+
export declare const ANSI_RE: RegExp;
|
|
26
|
+
/** The string minus its ANSI style escapes. */
|
|
27
|
+
export declare const stripAnsi: (s: string) => string;
|
|
28
|
+
//# sourceMappingURL=ansi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../../src/universal/ansi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,eAAO,MAAM,KAAK,cAAY,CAAC;AAC/B,eAAO,MAAM,IAAI,cAAY,CAAC;AAC9B,eAAO,MAAM,GAAG,cAAY,CAAC;AAC7B,eAAO,MAAM,MAAM,cAAY,CAAC;AAChC,eAAO,MAAM,SAAS,cAAY,CAAC;AAEnC,2CAA2C;AAC3C,wBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpC;AAED,2CAA2C;AAC3C,wBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpC;AAED,gFAAgF;AAChF,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAS3D;AAGD,eAAO,MAAM,OAAO,QAAoB,CAAC;AAEzC,+CAA+C;AAC/C,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAAgC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw ANSI escape primitives — ALWAYS ON, no TTY detection, no env checks.
|
|
3
|
+
* The vocabulary, not the policy: ./log and ../cli decide WHETHER to color
|
|
4
|
+
* (TTY, NO_COLOR, FORCE_COLOR) and build semantics on top; this module is for
|
|
5
|
+
* output whose consumer renders ANSI regardless of what stdout is — Claude
|
|
6
|
+
* Code status lines, tmux status strings, files a terminal will cat. A
|
|
7
|
+
* TTY-gated palette emits nothing through those pipes, which is exactly wrong.
|
|
8
|
+
*
|
|
9
|
+
* 256-color escapes (`fg`/`bg`) over 24-bit as the house default: the xterm
|
|
10
|
+
* cube is stable across every terminal/multiplexer, while 24-bit gets
|
|
11
|
+
* quantized or dropped by tmux/screen configs. `rgb` exists for when the
|
|
12
|
+
* consumer is known to render truecolor.
|
|
13
|
+
*/
|
|
14
|
+
import { assert } from "../offensive.js";
|
|
15
|
+
export const RESET = "\x1b[0m";
|
|
16
|
+
export const BOLD = "\x1b[1m";
|
|
17
|
+
export const DIM = "\x1b[2m";
|
|
18
|
+
export const ITALIC = "\x1b[3m";
|
|
19
|
+
export const UNDERLINE = "\x1b[4m";
|
|
20
|
+
/** Foreground, xterm-256 palette index. */
|
|
21
|
+
export function fg(n) {
|
|
22
|
+
assert(Number.isInteger(n) && n >= 0 && n <= 255, "xterm-256 index:", n);
|
|
23
|
+
return `\x1b[38;5;${n}m`;
|
|
24
|
+
}
|
|
25
|
+
/** Background, xterm-256 palette index. */
|
|
26
|
+
export function bg(n) {
|
|
27
|
+
assert(Number.isInteger(n) && n >= 0 && n <= 255, "xterm-256 index:", n);
|
|
28
|
+
return `\x1b[48;5;${n}m`;
|
|
29
|
+
}
|
|
30
|
+
/** Foreground, 24-bit — only when the consumer is known to render truecolor. */
|
|
31
|
+
export function rgb(r, g, b) {
|
|
32
|
+
assert([r, g, b].every((v) => Number.isInteger(v) && v >= 0 && v <= 255), "rgb components:", r, g, b);
|
|
33
|
+
return `\x1b[38;2;${r};${g};${b}m`;
|
|
34
|
+
}
|
|
35
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: matching ANSI escapes is the point
|
|
36
|
+
export const ANSI_RE = /\x1b\[[0-9;]*m/g;
|
|
37
|
+
/** The string minus its ANSI style escapes. */
|
|
38
|
+
export const stripAnsi = (s) => s.replace(ANSI_RE, "");
|
|
39
|
+
//# sourceMappingURL=ansi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi.js","sourceRoot":"","sources":["../../src/universal/ansi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC;AAC9B,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;AAC7B,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC;AAChC,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC;AAEnC,2CAA2C;AAC3C,MAAM,UAAU,EAAE,CAAC,CAAS;IAC3B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACzE,OAAO,aAAa,CAAC,GAAG,CAAC;AAC1B,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,EAAE,CAAC,CAAS;IAC3B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACzE,OAAO,aAAa,CAAC,GAAG,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAClD,MAAM,CACL,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EACjE,iBAAiB,EACjB,CAAC,EACD,CAAC,EACD,CAAC,CACD,CAAC;IACF,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACpC,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAEzC,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Humanized time. Three questions, three functions: how long is this
|
|
3
|
+
* duration (`span`), how long ago was this instant (`ago` — and its raw-
|
|
4
|
+
* duration twin `since`), how long until this instant (`until`).
|
|
5
|
+
*
|
|
6
|
+
* `ago` degrades by distance instead of stacking units: fresh instants are
|
|
7
|
+
* relative ("now", "3m ago", "2h 15m ago"), older ones snap to the clock the
|
|
8
|
+
* reader would check — "10:30" earlier today, "yst 22:15" yesterday,
|
|
9
|
+
* "Mon 09:00" within a week, "07/28" beyond. Relative wording past a few
|
|
10
|
+
* hours ("19h ago") makes the reader do calendar math; a clock time doesn't.
|
|
11
|
+
*
|
|
12
|
+
* Accepts `Date | ISO string | epoch ms | null | undefined` and renders "—"
|
|
13
|
+
* for null/undefined, same contract as ./format. Epoch numbers are
|
|
14
|
+
* MILLISECONDS only — a seconds heuristic would silently misread dates near
|
|
15
|
+
* the boundary, and a wrong timestamp should scream, not shift by 1000×.
|
|
16
|
+
* Weekday/date fallbacks are en-pinned like every formatter here.
|
|
17
|
+
*/
|
|
18
|
+
export type Dateish = Date | string | number | null | undefined;
|
|
19
|
+
/** Duration in ms → "45s", "47m", "1h 40m", "2d 3h". Negative clamps to "0s". */
|
|
20
|
+
export declare function span(ms: number): string;
|
|
21
|
+
/** Elapsed since an instant, as a bare duration: "47m", "1h 40m" (no "ago"). */
|
|
22
|
+
export declare function since(d: Dateish, now?: Dateish): string;
|
|
23
|
+
/**
|
|
24
|
+
* Past instant, humanized: "now" (<1m), "3m ago", "2h 15m ago" (<6h), then
|
|
25
|
+
* clock time — "10:30" today, "yst 22:15" yesterday, "Mon 09:00" within 7
|
|
26
|
+
* days, "07/28" beyond. Future inputs render "now".
|
|
27
|
+
*/
|
|
28
|
+
export declare function ago(d: Dateish, now?: Dateish): string;
|
|
29
|
+
/** Future instant, humanized: "now", "in 40m", "in 5h 12m", "in 3d 13h". */
|
|
30
|
+
export declare function until(d: Dateish, now?: Dateish): string;
|
|
31
|
+
//# sourceMappingURL=time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/universal/time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAuBhE,iFAAiF;AACjF,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAOvC;AAED,gFAAgF;AAChF,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAE,OAAoB,GAAG,MAAM,CAKnE;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAE,OAAoB,GAAG,MAAM,CAejE;AAED,4EAA4E;AAC5E,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAE,OAAoB,GAAG,MAAM,CAOnE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Humanized time. Three questions, three functions: how long is this
|
|
3
|
+
* duration (`span`), how long ago was this instant (`ago` — and its raw-
|
|
4
|
+
* duration twin `since`), how long until this instant (`until`).
|
|
5
|
+
*
|
|
6
|
+
* `ago` degrades by distance instead of stacking units: fresh instants are
|
|
7
|
+
* relative ("now", "3m ago", "2h 15m ago"), older ones snap to the clock the
|
|
8
|
+
* reader would check — "10:30" earlier today, "yst 22:15" yesterday,
|
|
9
|
+
* "Mon 09:00" within a week, "07/28" beyond. Relative wording past a few
|
|
10
|
+
* hours ("19h ago") makes the reader do calendar math; a clock time doesn't.
|
|
11
|
+
*
|
|
12
|
+
* Accepts `Date | ISO string | epoch ms | null | undefined` and renders "—"
|
|
13
|
+
* for null/undefined, same contract as ./format. Epoch numbers are
|
|
14
|
+
* MILLISECONDS only — a seconds heuristic would silently misread dates near
|
|
15
|
+
* the boundary, and a wrong timestamp should scream, not shift by 1000×.
|
|
16
|
+
* Weekday/date fallbacks are en-pinned like every formatter here.
|
|
17
|
+
*/
|
|
18
|
+
import { NO_DATA } from "./format.js";
|
|
19
|
+
const MIN = 60_000;
|
|
20
|
+
const HOUR = 3_600_000;
|
|
21
|
+
const DAY = 86_400_000;
|
|
22
|
+
const WEEK = 604_800_000;
|
|
23
|
+
const WEEKDAY = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
24
|
+
function toMs(d) {
|
|
25
|
+
if (d == null)
|
|
26
|
+
return null;
|
|
27
|
+
if (d instanceof Date)
|
|
28
|
+
return d.getTime();
|
|
29
|
+
const ms = typeof d === "number" ? d : Date.parse(d);
|
|
30
|
+
return Number.isNaN(ms) ? null : ms;
|
|
31
|
+
}
|
|
32
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
33
|
+
const clock = (d) => `${pad(d.getHours())}:${pad(d.getMinutes())}`;
|
|
34
|
+
const sameDay = (a, b) => a.getFullYear() === b.getFullYear() &&
|
|
35
|
+
a.getMonth() === b.getMonth() &&
|
|
36
|
+
a.getDate() === b.getDate();
|
|
37
|
+
/** Duration in ms → "45s", "47m", "1h 40m", "2d 3h". Negative clamps to "0s". */
|
|
38
|
+
export function span(ms) {
|
|
39
|
+
if (ms < 0)
|
|
40
|
+
ms = 0;
|
|
41
|
+
if (ms < MIN)
|
|
42
|
+
return `${Math.floor(ms / 1000)}s`;
|
|
43
|
+
if (ms < HOUR)
|
|
44
|
+
return `${Math.floor(ms / MIN)}m`;
|
|
45
|
+
if (ms < DAY)
|
|
46
|
+
return `${Math.floor(ms / HOUR)}h ${Math.floor((ms % HOUR) / MIN)}m`;
|
|
47
|
+
return `${Math.floor(ms / DAY)}d ${Math.floor((ms % DAY) / HOUR)}h`;
|
|
48
|
+
}
|
|
49
|
+
/** Elapsed since an instant, as a bare duration: "47m", "1h 40m" (no "ago"). */
|
|
50
|
+
export function since(d, now = Date.now()) {
|
|
51
|
+
const ms = toMs(d);
|
|
52
|
+
const ref = toMs(now);
|
|
53
|
+
if (ms == null || ref == null)
|
|
54
|
+
return NO_DATA;
|
|
55
|
+
return span(ref - ms);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Past instant, humanized: "now" (<1m), "3m ago", "2h 15m ago" (<6h), then
|
|
59
|
+
* clock time — "10:30" today, "yst 22:15" yesterday, "Mon 09:00" within 7
|
|
60
|
+
* days, "07/28" beyond. Future inputs render "now".
|
|
61
|
+
*/
|
|
62
|
+
export function ago(d, now = Date.now()) {
|
|
63
|
+
const ms = toMs(d);
|
|
64
|
+
const ref = toMs(now);
|
|
65
|
+
if (ms == null || ref == null)
|
|
66
|
+
return NO_DATA;
|
|
67
|
+
const delta = ref - ms;
|
|
68
|
+
if (delta < MIN)
|
|
69
|
+
return "now";
|
|
70
|
+
if (delta < HOUR)
|
|
71
|
+
return `${Math.floor(delta / MIN)}m ago`;
|
|
72
|
+
if (delta < 6 * HOUR)
|
|
73
|
+
return `${Math.floor(delta / HOUR)}h ${Math.floor((delta % HOUR) / MIN)}m ago`;
|
|
74
|
+
const date = new Date(ms);
|
|
75
|
+
const refDate = new Date(ref);
|
|
76
|
+
if (sameDay(date, refDate))
|
|
77
|
+
return clock(date);
|
|
78
|
+
if (sameDay(date, new Date(ref - DAY)))
|
|
79
|
+
return `yst ${clock(date)}`;
|
|
80
|
+
if (delta < WEEK)
|
|
81
|
+
return `${WEEKDAY[date.getDay()]} ${clock(date)}`;
|
|
82
|
+
return `${pad(date.getMonth() + 1)}/${pad(date.getDate())}`;
|
|
83
|
+
}
|
|
84
|
+
/** Future instant, humanized: "now", "in 40m", "in 5h 12m", "in 3d 13h". */
|
|
85
|
+
export function until(d, now = Date.now()) {
|
|
86
|
+
const ms = toMs(d);
|
|
87
|
+
const ref = toMs(now);
|
|
88
|
+
if (ms == null || ref == null)
|
|
89
|
+
return NO_DATA;
|
|
90
|
+
const delta = ms - ref;
|
|
91
|
+
if (delta < MIN)
|
|
92
|
+
return "now";
|
|
93
|
+
return `in ${span(delta)}`;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/universal/time.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.
|
|
3
|
+
"version": "2.28.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",
|
|
@@ -20,10 +20,18 @@
|
|
|
20
20
|
"types": "./dist/runtime.d.ts",
|
|
21
21
|
"default": "./dist/runtime.js"
|
|
22
22
|
},
|
|
23
|
+
"./ansi": {
|
|
24
|
+
"types": "./dist/universal/ansi.d.ts",
|
|
25
|
+
"default": "./dist/universal/ansi.js"
|
|
26
|
+
},
|
|
23
27
|
"./format": {
|
|
24
28
|
"types": "./dist/universal/format.d.ts",
|
|
25
29
|
"default": "./dist/universal/format.js"
|
|
26
30
|
},
|
|
31
|
+
"./time": {
|
|
32
|
+
"types": "./dist/universal/time.d.ts",
|
|
33
|
+
"default": "./dist/universal/time.js"
|
|
34
|
+
},
|
|
27
35
|
"./url": {
|
|
28
36
|
"types": "./dist/universal/url/index.d.ts",
|
|
29
37
|
"default": "./dist/universal/url/index.js"
|
|
@@ -179,6 +187,14 @@
|
|
|
179
187
|
"./bot/metrics": {
|
|
180
188
|
"types": "./dist/bot/metrics.d.ts",
|
|
181
189
|
"default": "./dist/bot/metrics.js"
|
|
190
|
+
},
|
|
191
|
+
"./bot/text": {
|
|
192
|
+
"types": "./dist/bot/text.d.ts",
|
|
193
|
+
"default": "./dist/bot/text.js"
|
|
194
|
+
},
|
|
195
|
+
"./bot/update-identity": {
|
|
196
|
+
"types": "./dist/bot/update-identity.d.ts",
|
|
197
|
+
"default": "./dist/bot/update-identity.js"
|
|
182
198
|
}
|
|
183
199
|
},
|
|
184
200
|
"files": [
|
|
@@ -211,6 +227,8 @@
|
|
|
211
227
|
"test:llm": "tsx tests/llm-live-test.ts",
|
|
212
228
|
"test:tg-md": "tsx tests/tg-md-test.ts",
|
|
213
229
|
"test:self-echo": "tsx tests/self-echo-test.ts",
|
|
230
|
+
"test:update-identity": "tsx tests/update-identity-test.ts",
|
|
231
|
+
"test:bot-text": "tsx tests/bot-text-test.ts",
|
|
214
232
|
"test:url": "tsx tests/url-test.ts",
|
|
215
233
|
"test:bot-urls": "tsx tests/bot-urls-test.ts",
|
|
216
234
|
"test:bot-updates": "tsx tests/bot-updates-test.ts",
|