stitchkit 0.100.1 → 0.100.3
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/CHANGELOG.md +99 -0
- package/README.md +2 -1
- package/dist/application/process-lifecycle-transitions.d.ts +13 -2
- package/dist/application/process-lifecycle-transitions.d.ts.map +1 -1
- package/dist/application/process-lifecycle.d.ts +2 -1
- package/dist/application/process-lifecycle.d.ts.map +1 -1
- package/dist/entrypoints/agent-runtime/browser.js +119 -119
- package/dist/entrypoints/agent-runtime/coding-tools.js +15 -20
- package/dist/entrypoints/agent-runtime/harness.js +55 -63
- package/dist/entrypoints/agent-runtime/openrouter.js +6 -6
- package/dist/entrypoints/agent-runtime/sandbox.js +20 -25
- package/dist/entrypoints/agent-runtime/sqlite/bun.js +11 -13
- package/dist/entrypoints/agent-runtime/sqlite/node.js +11 -13
- package/dist/entrypoints/agent-runtime/testing.js +32 -34
- package/dist/entrypoints/agent-runtime.js +395 -402
- package/dist/entrypoints/application/diagnostic-journal.js +26 -27
- package/dist/entrypoints/application/directory-inbox.js +16 -17
- package/dist/entrypoints/application/grammy.js +13 -13
- package/dist/entrypoints/application/opentelemetry.js +13 -13
- package/dist/entrypoints/application/schemas.js +24 -24
- package/dist/entrypoints/application.d.ts +1 -1
- package/dist/entrypoints/application.d.ts.map +1 -1
- package/dist/entrypoints/application.js +218 -214
- package/dist/entrypoints/bin/upgrade-cli.js +2 -2
- package/dist/entrypoints/cli.js +81 -84
- package/dist/entrypoints/contract.js +54 -57
- package/dist/entrypoints/declaration.js +22 -22
- package/dist/entrypoints/files.js +18 -21
- package/dist/entrypoints/geo.js +7 -8
- package/dist/entrypoints/google.js +2 -2
- package/dist/entrypoints/index.js +150 -154
- package/dist/entrypoints/live.js +45 -47
- package/dist/entrypoints/node.js +68 -74
- package/dist/entrypoints/oauth.js +6 -6
- package/dist/entrypoints/observability.d.ts +1 -0
- package/dist/entrypoints/observability.d.ts.map +1 -1
- package/dist/entrypoints/observability.js +115 -87
- package/dist/entrypoints/primitives.js +35 -35
- package/dist/entrypoints/react/keyboard.d.ts +4 -0
- package/dist/entrypoints/react/keyboard.d.ts.map +1 -0
- package/dist/entrypoints/react/keyboard.js +397 -0
- package/dist/entrypoints/react.js +10 -10
- package/dist/entrypoints/release.js +7 -7
- package/dist/entrypoints/remote.js +15 -17
- package/dist/entrypoints/server.js +198 -200
- package/dist/entrypoints/telegram/html.d.ts +5 -0
- package/dist/entrypoints/telegram/html.d.ts.map +1 -0
- package/dist/entrypoints/telegram/html.js +26 -0
- package/dist/entrypoints/telegram/screens.d.ts +14 -0
- package/dist/entrypoints/telegram/screens.d.ts.map +1 -0
- package/dist/entrypoints/telegram/screens.js +2028 -0
- package/dist/entrypoints/telegram.d.ts +5 -1
- package/dist/entrypoints/telegram.d.ts.map +1 -1
- package/dist/entrypoints/telegram.js +548 -156
- package/dist/entrypoints/testing.js +75 -79
- package/dist/entrypoints/tools/connections.js +30 -32
- package/dist/entrypoints/tools/contract.js +18 -20
- package/dist/entrypoints/tools/invoker.js +12 -17
- package/dist/entrypoints/tools.js +223 -229
- package/dist/entrypoints/tracking/server.js +6 -6
- package/dist/entrypoints/tracking.js +40 -42
- package/dist/entrypoints/voice.js +3 -3
- package/dist/{index-eaysmdtq.js → index-0ndk4555.js} +56 -56
- package/dist/{index-2bxbyab0.js → index-1bx1xv1k.js} +1 -1
- package/dist/{index-p5r7qpdd.js → index-1eeqpadm.js} +4 -4
- package/dist/{index-hadmp193.js → index-3ct7hhq6.js} +210 -210
- package/dist/{index-e01r054k.js → index-45tdvqa3.js} +26 -26
- package/dist/{index-dce5wxcq.js → index-4s0fep5q.js} +8 -8
- package/dist/index-50ejfz75.js +9 -0
- package/dist/{index-m9zn6cpq.js → index-5107q189.js} +12 -12
- package/dist/{index-sbdmyz75.js → index-5cc6r990.js} +3 -3
- package/dist/index-6k1svmjh.js +141 -0
- package/dist/{index-c6bxbsnc.js → index-7kxw1awn.js} +2 -2
- package/dist/{index-0r0fbk7z.js → index-7z9ym7t8.js} +28 -28
- package/dist/{index-p7hgdyhb.js → index-814xpr6d.js} +2 -2
- package/dist/{index-gtj3zc53.js → index-8kzct1d6.js} +99 -99
- package/dist/{index-1zbbzgfh.js → index-9pw0a51a.js} +4 -4
- package/dist/{index-79z7m7dt.js → index-a9pd417t.js} +35 -35
- package/dist/{index-ham5sz8m.js → index-aaj97r4y.js} +45 -45
- package/dist/{index-s812ycat.js → index-aan6hqb9.js} +3 -3
- package/dist/{index-10x2hbx0.js → index-adhgd4pe.js} +44 -44
- package/dist/{index-2gxzjvyr.js → index-afjvjyck.js} +23 -23
- package/dist/{index-qmy6zq75.js → index-ahvsksw5.js} +16 -16
- package/dist/{index-hr4tzbwq.js → index-ap3gqe56.js} +3 -3
- package/dist/{index-znfs20ss.js → index-b2bz0kdm.js} +16 -16
- package/dist/{index-r066jx76.js → index-c6aagrbd.js} +148 -120
- package/dist/{index-k30h66yd.js → index-ck71tbcf.js} +9 -9
- package/dist/{index-eqqvgdb3.js → index-ct75c3at.js} +2 -2
- package/dist/{index-gw8bmyaj.js → index-djjhhgjk.js} +41 -41
- package/dist/{index-8qt2m66q.js → index-dvwj1f43.js} +43 -43
- package/dist/{index-fhwqwxe0.js → index-ej331hah.js} +1 -1
- package/dist/{index-9t3dffv2.js → index-ewbaywk5.js} +5 -5
- package/dist/{index-7p1f0vp2.js → index-fyphpknh.js} +25 -25
- package/dist/{index-83bdg97s.js → index-g149e9pk.js} +1 -1
- package/dist/{index-ngfhvfpd.js → index-g6a3na27.js} +4 -4
- package/dist/{index-qwhynv6x.js → index-h124epcf.js} +20 -20
- package/dist/{index-h6eeys1v.js → index-h97tqqp1.js} +9 -9
- package/dist/{index-zcgf3gqf.js → index-hby4qhax.js} +10 -10
- package/dist/{index-5jrd0yng.js → index-j8aw2c0e.js} +4 -4
- package/dist/{index-d8m8zpd8.js → index-jzczzcsb.js} +14 -14
- package/dist/index-kqnd6a85.js +26 -0
- package/dist/{index-35mh5bhj.js → index-kw1ws0cs.js} +12 -12
- package/dist/{index-yw4fzmdz.js → index-kzz6rq0w.js} +28 -17
- package/dist/{index-4gcnakhx.js → index-m38ej7e5.js} +2 -2
- package/dist/{index-ndddxtyx.js → index-m79yr938.js} +19 -19
- package/dist/{index-5p2m7we1.js → index-m9fndta6.js} +11 -11
- package/dist/index-mnkk1ffz.js +150 -0
- package/dist/index-n15jny5b.js +4 -0
- package/dist/{index-2vtcmrj9.js → index-n53mswt3.js} +20 -20
- package/dist/{index-bt14acb5.js → index-n5yqxd3d.js} +21 -21
- package/dist/{index-bm5rx7n6.js → index-n9tyz8z3.js} +12 -12
- package/dist/index-nmaqxdx7.js +463 -0
- package/dist/{index-mqv3b5rh.js → index-nx6eazt0.js} +30 -30
- package/dist/{index-3z73fh2c.js → index-q0th8q0z.js} +9 -9
- package/dist/{index-v260df89.js → index-qjeggp8w.js} +20 -20
- package/dist/{index-zfrhfn82.js → index-r1z0rd9c.js} +20 -20
- package/dist/{index-wqgjfstn.js → index-r5c4fedv.js} +3 -3
- package/dist/{index-cyktc4bp.js → index-r5hsgkz5.js} +118 -118
- package/dist/{index-0b1ess5e.js → index-r7a7r7ha.js} +1 -1
- package/dist/{index-1j8pm5t0.js → index-rfkh44ss.js} +15 -15
- package/dist/index-rz3z13e9.js +47 -0
- package/dist/{index-k6gpggb9.js → index-s80awwsw.js} +35 -35
- package/dist/{index-vqr7f7v8.js → index-ssmd41kh.js} +124 -124
- package/dist/{index-ensd0r74.js → index-v14qqmys.js} +41 -41
- package/dist/{index-paz6sgdp.js → index-v4a2fjtk.js} +36 -36
- package/dist/{index-d9pk3td4.js → index-w0eqdhyd.js} +14 -14
- package/dist/{index-5qn1kx34.js → index-w575evhq.js} +29 -29
- package/dist/{index-3gye9wzb.js → index-w5s3xftz.js} +26 -26
- package/dist/{index-tm88avnj.js → index-wykebpn9.js} +3 -3
- package/dist/{index-sh3s86na.js → index-xkhk5d6g.js} +17 -17
- package/dist/{index-6k1937bx.js → index-xqhede6x.js} +4 -4
- package/dist/{index-f4fx2tza.js → index-zs4ms3th.js} +181 -181
- package/dist/{index-k5hsfc3j.js → index-zsvzhjtk.js} +1 -1
- package/dist/observability/bounded-logger.d.ts +2 -0
- package/dist/observability/bounded-logger.d.ts.map +1 -1
- package/dist/observability/sanitize.d.ts +6 -0
- package/dist/observability/sanitize.d.ts.map +1 -1
- package/dist/observability/secret-values.d.ts +25 -0
- package/dist/observability/secret-values.d.ts.map +1 -0
- package/dist/react/keyboard/hooks.d.ts +71 -0
- package/dist/react/keyboard/hooks.d.ts.map +1 -0
- package/dist/react/keyboard/layers.d.ts +98 -0
- package/dist/react/keyboard/layers.d.ts.map +1 -0
- package/dist/react/keyboard/zone.d.ts +139 -0
- package/dist/react/keyboard/zone.d.ts.map +1 -0
- package/dist/telegram/crypto.d.ts +16 -0
- package/dist/telegram/crypto.d.ts.map +1 -0
- package/dist/telegram/html/check.d.ts +26 -0
- package/dist/telegram/html/check.d.ts.map +1 -0
- package/dist/telegram/html/nodes.d.ts +70 -0
- package/dist/telegram/html/nodes.d.ts.map +1 -0
- package/dist/telegram/html/parse.d.ts +35 -0
- package/dist/telegram/html/parse.d.ts.map +1 -0
- package/dist/telegram/html/render.d.ts +39 -0
- package/dist/telegram/html/render.d.ts.map +1 -0
- package/dist/telegram/init-data.d.ts.map +1 -1
- package/dist/telegram/operator-channel.d.ts +36 -3
- package/dist/telegram/operator-channel.d.ts.map +1 -1
- package/dist/telegram/screens/callback-codec.d.ts +34 -0
- package/dist/telegram/screens/callback-codec.d.ts.map +1 -0
- package/dist/telegram/screens/dispatch.d.ts +22 -0
- package/dist/telegram/screens/dispatch.d.ts.map +1 -0
- package/dist/telegram/screens/display.d.ts +70 -0
- package/dist/telegram/screens/display.d.ts.map +1 -0
- package/dist/telegram/screens/execute.d.ts +57 -0
- package/dist/telegram/screens/execute.d.ts.map +1 -0
- package/dist/telegram/screens/html.d.ts +36 -0
- package/dist/telegram/screens/html.d.ts.map +1 -0
- package/dist/telegram/screens/outcome.d.ts +74 -0
- package/dist/telegram/screens/outcome.d.ts.map +1 -0
- package/dist/telegram/screens/path.d.ts +29 -0
- package/dist/telegram/screens/path.d.ts.map +1 -0
- package/dist/telegram/screens/reconcile.d.ts +67 -0
- package/dist/telegram/screens/reconcile.d.ts.map +1 -0
- package/dist/telegram/screens/registry.d.ts +23 -0
- package/dist/telegram/screens/registry.d.ts.map +1 -0
- package/dist/telegram/screens/render.d.ts +70 -0
- package/dist/telegram/screens/render.d.ts.map +1 -0
- package/dist/telegram/screens/runtime.d.ts +133 -0
- package/dist/telegram/screens/runtime.d.ts.map +1 -0
- package/dist/telegram/screens/screen-types.d.ts +130 -0
- package/dist/telegram/screens/screen-types.d.ts.map +1 -0
- package/dist/telegram/screens/screen.d.ts +138 -0
- package/dist/telegram/screens/screen.d.ts.map +1 -0
- package/dist/telegram/screens/state.d.ts +115 -0
- package/dist/telegram/screens/state.d.ts.map +1 -0
- package/dist/telegram/screens/telegram-screens.d.ts +18 -0
- package/dist/telegram/screens/telegram-screens.d.ts.map +1 -0
- package/dist/telegram/screens/test-chat-telegram.d.ts +47 -0
- package/dist/telegram/screens/test-chat-telegram.d.ts.map +1 -0
- package/dist/telegram/screens/test-chat.d.ts +66 -0
- package/dist/telegram/screens/test-chat.d.ts.map +1 -0
- package/dist/telegram/screens/view.d.ts +89 -0
- package/dist/telegram/screens/view.d.ts.map +1 -0
- package/dist/telegram/send-failure.d.ts +19 -0
- package/dist/telegram/send-failure.d.ts.map +1 -1
- package/dist/telegram/update-intake.d.ts +78 -0
- package/dist/telegram/update-intake.d.ts.map +1 -0
- package/dist/telegram/update-store-sqlite.d.ts +26 -0
- package/dist/telegram/update-store-sqlite.d.ts.map +1 -0
- package/dist/telegram/update-store.d.ts +67 -0
- package/dist/telegram/update-store.d.ts.map +1 -0
- package/dist/telegram/webhook.d.ts +105 -0
- package/dist/telegram/webhook.d.ts.map +1 -0
- package/dist/tools/cli/args-fields.d.ts +8 -0
- package/dist/tools/cli/args-fields.d.ts.map +1 -1
- package/dist/tools/cli/args-route.d.ts.map +1 -1
- package/dist/tools/cli/args.d.ts.map +1 -1
- package/dist/tools/cli/help.d.ts.map +1 -1
- package/llms/application.2.txt +26 -1
- package/llms/application.txt +18 -27
- package/llms/cli.txt +8 -2
- package/llms/observability.txt +2 -1
- package/llms/react-keyboard.txt +193 -0
- package/llms/stitchkit.txt +7 -1
- package/llms/telegram-html.txt +35 -0
- package/llms/telegram-screens.txt +365 -0
- package/llms/telegram.txt +160 -4
- package/llms-full.txt +755 -11
- package/llms.txt +11 -6
- package/package.json +17 -2
- package/dist/index-2k4yrqkc.js +0 -9
- package/dist/index-crykmqkr.js +0 -26
- package/dist/index-y64k3s0h.js +0 -150
- package/dist/index-y91ry9h2.js +0 -4
- /package/dist/{index-hffjpmq9.js → index-9jfdm5tg.js} +0 -0
- /package/dist/{index-zjjyynm3.js → index-d4pa2bgs.js} +0 -0
- /package/dist/{index-rxfy4cq7.js → index-dwfv9a85.js} +0 -0
- /package/dist/{index-5jm36zv1.js → index-gfk7nrht.js} +0 -0
- /package/dist/{index-b9aefrqd.js → index-n1dqr7gf.js} +0 -0
- /package/dist/{index-q3pyb9n0.js → index-sykb5ag7.js} +0 -0
- /package/dist/{index-48ffdxgk.js → index-xhzq2qvj.js} +0 -0
- /package/dist/{index-kzfs85xp.js → index-zsarb5xp.js} +0 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
// src/telegram/html/nodes.ts
|
|
2
|
+
var TELEGRAM_TEXT_LIMIT2 = 4096;
|
|
3
|
+
var TELEGRAM_CAPTION_LIMIT2 = 1024;
|
|
4
|
+
var STYLES = new Set([
|
|
5
|
+
"b",
|
|
6
|
+
"i",
|
|
7
|
+
"u",
|
|
8
|
+
"s",
|
|
9
|
+
"tg-spoiler"
|
|
10
|
+
]);
|
|
11
|
+
function isStyle(tag) {
|
|
12
|
+
return STYLES.has(tag);
|
|
13
|
+
}
|
|
14
|
+
function holdsOnlyText(tag) {
|
|
15
|
+
return tag === "code" || tag === "pre" || tag === "tg-emoji" || tag === "tg-time";
|
|
16
|
+
}
|
|
17
|
+
function isAtomic(tag) {
|
|
18
|
+
return tag === "tg-emoji" || tag === "tg-time";
|
|
19
|
+
}
|
|
20
|
+
function mayOpenInside(tag, ancestors) {
|
|
21
|
+
if (isStyle(tag))
|
|
22
|
+
return !ancestors.some(holdsOnlyText);
|
|
23
|
+
return ancestors.every(isStyle);
|
|
24
|
+
}
|
|
25
|
+
function textOf(nodes) {
|
|
26
|
+
let text = "";
|
|
27
|
+
for (const node of nodes)
|
|
28
|
+
text += node.kind === "text" ? node.text : textOf(node.children);
|
|
29
|
+
return text;
|
|
30
|
+
}
|
|
31
|
+
function withChildren(element, children) {
|
|
32
|
+
return { ...element, children };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// src/telegram/html/parse.ts
|
|
36
|
+
var TAG = /<(\/?)([a-zA-Z][a-zA-Z0-9-]*)((?:\s[^<>]*?)?)\s*\/?>/y;
|
|
37
|
+
var ATTRIBUTE = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))?/g;
|
|
38
|
+
var ENTITY = /&(?:(amp|lt|gt|quot|apos|nbsp)|#(\d{1,7})|#[xX]([0-9a-fA-F]{1,6}));/y;
|
|
39
|
+
var NAMED = {
|
|
40
|
+
amp: "&",
|
|
41
|
+
lt: "<",
|
|
42
|
+
gt: ">",
|
|
43
|
+
quot: '"',
|
|
44
|
+
apos: "'",
|
|
45
|
+
nbsp: " "
|
|
46
|
+
};
|
|
47
|
+
var SYNONYMS = {
|
|
48
|
+
strong: "b",
|
|
49
|
+
em: "i",
|
|
50
|
+
ins: "u",
|
|
51
|
+
strike: "s",
|
|
52
|
+
del: "s"
|
|
53
|
+
};
|
|
54
|
+
var BLOCK_BREAKS = {
|
|
55
|
+
p: 2,
|
|
56
|
+
h1: 2,
|
|
57
|
+
h2: 2,
|
|
58
|
+
h3: 2,
|
|
59
|
+
h4: 2,
|
|
60
|
+
h5: 2,
|
|
61
|
+
h6: 2,
|
|
62
|
+
div: 1,
|
|
63
|
+
li: 1,
|
|
64
|
+
ul: 1,
|
|
65
|
+
ol: 1,
|
|
66
|
+
tr: 1,
|
|
67
|
+
table: 1,
|
|
68
|
+
section: 1,
|
|
69
|
+
article: 1,
|
|
70
|
+
header: 1,
|
|
71
|
+
footer: 1
|
|
72
|
+
};
|
|
73
|
+
var LINK_SCHEMES = new Set(["http:", "https:", "tg:", "mailto:"]);
|
|
74
|
+
var TIME_FORMAT = /^(?:r|w?[dD]?[tT]?)$/;
|
|
75
|
+
function decodeEntity(match) {
|
|
76
|
+
const [, named, decimal, hex] = match;
|
|
77
|
+
if (named !== undefined)
|
|
78
|
+
return NAMED[named];
|
|
79
|
+
const code = Number.parseInt(decimal ?? hex ?? "", decimal === undefined ? 16 : 10);
|
|
80
|
+
const valid = code > 0 && code <= 1114111 && (code < 55296 || code > 57343);
|
|
81
|
+
return valid ? String.fromCodePoint(code) : undefined;
|
|
82
|
+
}
|
|
83
|
+
function attributesOf(source) {
|
|
84
|
+
const attributes = new Map;
|
|
85
|
+
for (const [, name = "", double, single, bare] of source.matchAll(ATTRIBUTE)) {
|
|
86
|
+
attributes.set(name.toLowerCase(), decodeText(double ?? single ?? bare ?? ""));
|
|
87
|
+
}
|
|
88
|
+
return attributes;
|
|
89
|
+
}
|
|
90
|
+
function* tokenize(markup) {
|
|
91
|
+
let index = 0;
|
|
92
|
+
let textStart = 0;
|
|
93
|
+
const flush = function* () {
|
|
94
|
+
if (index > textStart)
|
|
95
|
+
yield { type: "text", text: markup.slice(textStart, index) };
|
|
96
|
+
};
|
|
97
|
+
while (index < markup.length) {
|
|
98
|
+
const char = markup[index];
|
|
99
|
+
if (char === "<") {
|
|
100
|
+
TAG.lastIndex = index;
|
|
101
|
+
const tag = TAG.exec(markup);
|
|
102
|
+
yield* flush();
|
|
103
|
+
if (tag) {
|
|
104
|
+
yield {
|
|
105
|
+
type: "tag",
|
|
106
|
+
closing: tag[1] === "/",
|
|
107
|
+
name: (tag[2] ?? "").toLowerCase(),
|
|
108
|
+
attributes: attributesOf(tag[3] ?? "")
|
|
109
|
+
};
|
|
110
|
+
index = TAG.lastIndex;
|
|
111
|
+
} else {
|
|
112
|
+
yield { type: "bare", char };
|
|
113
|
+
index += 1;
|
|
114
|
+
}
|
|
115
|
+
textStart = index;
|
|
116
|
+
} else if (char === "&") {
|
|
117
|
+
ENTITY.lastIndex = index;
|
|
118
|
+
const entity = ENTITY.exec(markup);
|
|
119
|
+
const text = entity ? decodeEntity(entity) : undefined;
|
|
120
|
+
yield* flush();
|
|
121
|
+
if (entity && text !== undefined) {
|
|
122
|
+
const named = entity[1];
|
|
123
|
+
yield {
|
|
124
|
+
type: "entity",
|
|
125
|
+
text,
|
|
126
|
+
named: named !== undefined,
|
|
127
|
+
telegram: named !== "apos" && named !== "nbsp"
|
|
128
|
+
};
|
|
129
|
+
index = ENTITY.lastIndex;
|
|
130
|
+
} else {
|
|
131
|
+
yield { type: "bare", char };
|
|
132
|
+
index += 1;
|
|
133
|
+
}
|
|
134
|
+
textStart = index;
|
|
135
|
+
} else if (char === ">") {
|
|
136
|
+
yield* flush();
|
|
137
|
+
yield { type: "bare", char };
|
|
138
|
+
index += 1;
|
|
139
|
+
textStart = index;
|
|
140
|
+
} else {
|
|
141
|
+
index += 1;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
yield* flush();
|
|
145
|
+
}
|
|
146
|
+
function decodeText(value) {
|
|
147
|
+
let text = "";
|
|
148
|
+
for (const token of tokenize(value)) {
|
|
149
|
+
if (token.type === "text" || token.type === "entity")
|
|
150
|
+
text += token.text;
|
|
151
|
+
else if (token.type === "bare")
|
|
152
|
+
text += token.char;
|
|
153
|
+
}
|
|
154
|
+
return text;
|
|
155
|
+
}
|
|
156
|
+
var KNOWN = new Set([
|
|
157
|
+
"b",
|
|
158
|
+
"i",
|
|
159
|
+
"u",
|
|
160
|
+
"s",
|
|
161
|
+
"tg-spoiler",
|
|
162
|
+
"code",
|
|
163
|
+
"a",
|
|
164
|
+
"pre",
|
|
165
|
+
"blockquote",
|
|
166
|
+
"tg-emoji",
|
|
167
|
+
"tg-time",
|
|
168
|
+
"span"
|
|
169
|
+
]);
|
|
170
|
+
function linkOf(href) {
|
|
171
|
+
const value = href?.trim();
|
|
172
|
+
if (!value || !URL.canParse(value))
|
|
173
|
+
return;
|
|
174
|
+
return LINK_SCHEMES.has(new URL(value).protocol) ? value : undefined;
|
|
175
|
+
}
|
|
176
|
+
function elementFor(tag, attributes) {
|
|
177
|
+
const children = [];
|
|
178
|
+
if (isStyle(tag) || tag === "code")
|
|
179
|
+
return { kind: "element", tag, children };
|
|
180
|
+
if (tag === "span") {
|
|
181
|
+
const spoiler = (attributes.get("class") ?? "").split(/\s+/).includes("tg-spoiler");
|
|
182
|
+
return spoiler ? { kind: "element", tag: "tg-spoiler", children } : undefined;
|
|
183
|
+
}
|
|
184
|
+
if (tag === "a") {
|
|
185
|
+
const href = linkOf(attributes.get("href"));
|
|
186
|
+
return href === undefined ? undefined : { kind: "element", tag, href, children };
|
|
187
|
+
}
|
|
188
|
+
if (tag === "pre")
|
|
189
|
+
return { kind: "element", tag, children };
|
|
190
|
+
if (tag === "blockquote") {
|
|
191
|
+
return { kind: "element", tag, expandable: attributes.has("expandable"), children };
|
|
192
|
+
}
|
|
193
|
+
if (tag === "tg-emoji") {
|
|
194
|
+
const emojiId = attributes.get("emoji-id") ?? "";
|
|
195
|
+
return /^\d{1,32}$/.test(emojiId) ? { kind: "element", tag, emojiId, children } : undefined;
|
|
196
|
+
}
|
|
197
|
+
if (tag === "tg-time") {
|
|
198
|
+
const unix = attributes.get("unix") ?? "";
|
|
199
|
+
const format = attributes.get("format");
|
|
200
|
+
if (!/^\d{1,12}$/.test(unix))
|
|
201
|
+
return;
|
|
202
|
+
return {
|
|
203
|
+
kind: "element",
|
|
204
|
+
tag,
|
|
205
|
+
unix: Number(unix),
|
|
206
|
+
...format !== undefined && TIME_FORMAT.test(format) && { format },
|
|
207
|
+
children
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
class TreeBuilder {
|
|
214
|
+
root = [];
|
|
215
|
+
#frames = [];
|
|
216
|
+
#trailing = 0;
|
|
217
|
+
#needed = 0;
|
|
218
|
+
#started = false;
|
|
219
|
+
#innermost() {
|
|
220
|
+
for (let index = this.#frames.length - 1;index >= 0; index -= 1) {
|
|
221
|
+
const draft = this.#frames[index]?.draft;
|
|
222
|
+
if (draft)
|
|
223
|
+
return draft;
|
|
224
|
+
}
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
text(value) {
|
|
228
|
+
if (value === "")
|
|
229
|
+
return;
|
|
230
|
+
this.#append(this.#pendingBreaks() + value);
|
|
231
|
+
this.#started = true;
|
|
232
|
+
}
|
|
233
|
+
#pendingBreaks() {
|
|
234
|
+
const breaks = this.#started ? `
|
|
235
|
+
`.repeat(Math.max(0, this.#needed - this.#trailing)) : "";
|
|
236
|
+
this.#needed = 0;
|
|
237
|
+
return breaks;
|
|
238
|
+
}
|
|
239
|
+
#append(text) {
|
|
240
|
+
if (text === "")
|
|
241
|
+
return;
|
|
242
|
+
const trailing = /\n*$/.exec(text)?.[0].length ?? 0;
|
|
243
|
+
this.#trailing = trailing === text.length ? this.#trailing + trailing : trailing;
|
|
244
|
+
const children = this.#innermost()?.children ?? this.root;
|
|
245
|
+
const last = children.at(-1);
|
|
246
|
+
if (last?.kind === "text")
|
|
247
|
+
children[children.length - 1] = { kind: "text", text: last.text + text };
|
|
248
|
+
else
|
|
249
|
+
children.push({ kind: "text", text });
|
|
250
|
+
}
|
|
251
|
+
lineBreaks(count, cumulative) {
|
|
252
|
+
this.#needed = cumulative ? Math.max(this.#needed, this.#trailing) + count : Math.max(this.#needed, count);
|
|
253
|
+
}
|
|
254
|
+
openTag(name, attributes) {
|
|
255
|
+
const tag = SYNONYMS[name] ?? name;
|
|
256
|
+
if (!KNOWN.has(tag))
|
|
257
|
+
return;
|
|
258
|
+
const parent = this.#innermost();
|
|
259
|
+
if (tag === "code" && parent?.element.tag === "pre") {
|
|
260
|
+
const language = /(?:^|\s)language-([\w+#.-]{1,64})(?:\s|$)/.exec(attributes.get("class") ?? "");
|
|
261
|
+
if (language?.[1] && parent.element.language === undefined) {
|
|
262
|
+
parent.element = { ...parent.element, language: language[1] };
|
|
263
|
+
}
|
|
264
|
+
this.#frames.push({ name: tag, draft: undefined });
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const element = elementFor(tag, attributes);
|
|
268
|
+
const open = this.#frames.flatMap((frame) => frame.draft ? [frame.draft.element.tag] : []);
|
|
269
|
+
if (!element || !mayOpenInside(element.tag, open)) {
|
|
270
|
+
this.#frames.push({ name: tag, draft: undefined });
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
this.#append(this.#pendingBreaks());
|
|
274
|
+
const draft = { kind: "element", element, children: [] };
|
|
275
|
+
(parent?.children ?? this.root).push(draft);
|
|
276
|
+
this.#frames.push({ name: tag, draft });
|
|
277
|
+
}
|
|
278
|
+
closeTag(name) {
|
|
279
|
+
const tag = SYNONYMS[name] ?? name;
|
|
280
|
+
for (let index = this.#frames.length - 1;index >= 0; index -= 1) {
|
|
281
|
+
if (this.#frames[index]?.name === tag) {
|
|
282
|
+
this.#frames.length = index;
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function finish(nodes) {
|
|
289
|
+
const result = [];
|
|
290
|
+
for (const node of nodes) {
|
|
291
|
+
if (node.kind === "text") {
|
|
292
|
+
const last = result.at(-1);
|
|
293
|
+
if (last?.kind === "text")
|
|
294
|
+
result[result.length - 1] = { kind: "text", text: last.text + node.text };
|
|
295
|
+
else
|
|
296
|
+
result.push(node);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const children = finish(node.children);
|
|
300
|
+
if (children.length > 0)
|
|
301
|
+
result.push({ ...node.element, children });
|
|
302
|
+
}
|
|
303
|
+
return result;
|
|
304
|
+
}
|
|
305
|
+
function parseTelegramHtml2(markup) {
|
|
306
|
+
const builder = new TreeBuilder;
|
|
307
|
+
for (const token of tokenize(markup)) {
|
|
308
|
+
if (token.type === "text" || token.type === "entity")
|
|
309
|
+
builder.text(token.text);
|
|
310
|
+
else if (token.type === "bare")
|
|
311
|
+
builder.text(token.char);
|
|
312
|
+
else if (token.name === "br") {
|
|
313
|
+
if (!token.closing)
|
|
314
|
+
builder.lineBreaks(1, true);
|
|
315
|
+
} else if (BLOCK_BREAKS[token.name] !== undefined) {
|
|
316
|
+
builder.lineBreaks(BLOCK_BREAKS[token.name] ?? 1, false);
|
|
317
|
+
} else if (token.closing)
|
|
318
|
+
builder.closeTag(token.name);
|
|
319
|
+
else
|
|
320
|
+
builder.openTag(token.name, token.attributes);
|
|
321
|
+
}
|
|
322
|
+
return finish(builder.root);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// src/telegram/html/render.ts
|
|
326
|
+
function escapeTelegramHtml2(text) {
|
|
327
|
+
return text.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """);
|
|
328
|
+
}
|
|
329
|
+
function openingTag(element) {
|
|
330
|
+
switch (element.tag) {
|
|
331
|
+
case "a":
|
|
332
|
+
return `<a href="${escapeTelegramHtml2(element.href)}">`;
|
|
333
|
+
case "pre":
|
|
334
|
+
return element.language === undefined ? "<pre>" : `<pre><code class="language-${escapeTelegramHtml2(element.language)}">`;
|
|
335
|
+
case "blockquote":
|
|
336
|
+
return element.expandable ? "<blockquote expandable>" : "<blockquote>";
|
|
337
|
+
case "tg-emoji":
|
|
338
|
+
return `<tg-emoji emoji-id="${element.emojiId}">`;
|
|
339
|
+
case "tg-time":
|
|
340
|
+
return element.format === undefined ? `<tg-time unix="${element.unix}">` : `<tg-time unix="${element.unix}" format="${element.format}">`;
|
|
341
|
+
default:
|
|
342
|
+
return `<${element.tag}>`;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
function closingTag(element) {
|
|
346
|
+
if (element.tag === "pre" && element.language !== undefined)
|
|
347
|
+
return "</code></pre>";
|
|
348
|
+
return `</${element.tag}>`;
|
|
349
|
+
}
|
|
350
|
+
function renderTelegramHtml2(nodes) {
|
|
351
|
+
let markup = "";
|
|
352
|
+
for (const node of nodes) {
|
|
353
|
+
markup += node.kind === "text" ? escapeTelegramHtml2(node.text) : openingTag(node) + renderTelegramHtml2(node.children) + closingTag(node);
|
|
354
|
+
}
|
|
355
|
+
return markup;
|
|
356
|
+
}
|
|
357
|
+
function sanitizeTelegramHtml2(markup) {
|
|
358
|
+
return renderTelegramHtml2(parseTelegramHtml2(markup));
|
|
359
|
+
}
|
|
360
|
+
function telegramHtmlText2(markup) {
|
|
361
|
+
return textOf(parseTelegramHtml2(markup));
|
|
362
|
+
}
|
|
363
|
+
function slice(nodes, from, to, start = 0) {
|
|
364
|
+
const result = [];
|
|
365
|
+
let offset = start;
|
|
366
|
+
for (const node of nodes) {
|
|
367
|
+
const length = node.kind === "text" ? node.text.length : textOf(node.children).length;
|
|
368
|
+
const end = offset + length;
|
|
369
|
+
if (end > from && offset < to) {
|
|
370
|
+
if (node.kind === "text") {
|
|
371
|
+
result.push({
|
|
372
|
+
kind: "text",
|
|
373
|
+
text: node.text.slice(Math.max(0, from - offset), to - offset)
|
|
374
|
+
});
|
|
375
|
+
} else if (isAtomic(node.tag)) {
|
|
376
|
+
if (offset >= from)
|
|
377
|
+
result.push(node);
|
|
378
|
+
} else {
|
|
379
|
+
const children = slice(node.children, from, to, offset);
|
|
380
|
+
if (children.length > 0)
|
|
381
|
+
result.push(withChildren(node, children));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
offset = end;
|
|
385
|
+
}
|
|
386
|
+
return result;
|
|
387
|
+
}
|
|
388
|
+
function atomicRanges(nodes, start = 0) {
|
|
389
|
+
const ranges = [];
|
|
390
|
+
let offset = start;
|
|
391
|
+
for (const node of nodes) {
|
|
392
|
+
const length = node.kind === "text" ? node.text.length : textOf(node.children).length;
|
|
393
|
+
if (node.kind === "element") {
|
|
394
|
+
if (isAtomic(node.tag))
|
|
395
|
+
ranges.push([offset, offset + length]);
|
|
396
|
+
else
|
|
397
|
+
ranges.push(...atomicRanges(node.children, offset));
|
|
398
|
+
}
|
|
399
|
+
offset += length;
|
|
400
|
+
}
|
|
401
|
+
return ranges;
|
|
402
|
+
}
|
|
403
|
+
function cutWithin(text, from, limit, atomic, structural) {
|
|
404
|
+
const last = from + limit;
|
|
405
|
+
const allowed = (index) => {
|
|
406
|
+
const code = text.charCodeAt(index - 1);
|
|
407
|
+
if (code >= 55296 && code <= 56319)
|
|
408
|
+
return false;
|
|
409
|
+
return !atomic.some(([start, end]) => index > start && index < end);
|
|
410
|
+
};
|
|
411
|
+
const find = (matches) => {
|
|
412
|
+
for (let index = last;index > from; index -= 1) {
|
|
413
|
+
const skip = matches(index);
|
|
414
|
+
if (skip >= 0 && allowed(index))
|
|
415
|
+
return { end: index, next: index + skip };
|
|
416
|
+
}
|
|
417
|
+
return;
|
|
418
|
+
};
|
|
419
|
+
const paragraph = () => find((index) => text.startsWith(`
|
|
420
|
+
|
|
421
|
+
`, index) ? 2 : -1);
|
|
422
|
+
const line = () => find((index) => text[index] === `
|
|
423
|
+
` ? 1 : -1);
|
|
424
|
+
return (structural ? paragraph() ?? line() : undefined) ?? find((index) => /\s/.test(text[index] ?? "") ? 1 : -1) ?? find(() => 0) ?? { end: last, next: last };
|
|
425
|
+
}
|
|
426
|
+
function checkedLimit(limit) {
|
|
427
|
+
if (!Number.isSafeInteger(limit) || limit < 2) {
|
|
428
|
+
throw new RangeError("[stitchkit] telegram html: a limit is an integer of at least 2");
|
|
429
|
+
}
|
|
430
|
+
return limit;
|
|
431
|
+
}
|
|
432
|
+
function splitTelegramHtml2(markup, options = {}) {
|
|
433
|
+
const limit = checkedLimit(options.limit ?? TELEGRAM_TEXT_LIMIT2);
|
|
434
|
+
const nodes = parseTelegramHtml2(markup);
|
|
435
|
+
const text = textOf(nodes);
|
|
436
|
+
const atomic = atomicRanges(nodes);
|
|
437
|
+
const parts = [];
|
|
438
|
+
let from = 0;
|
|
439
|
+
while (from < text.length) {
|
|
440
|
+
const cut = text.length - from <= limit ? { end: text.length, next: text.length } : cutWithin(text, from, limit, atomic, true);
|
|
441
|
+
if (text.slice(from, cut.end).trim() !== "") {
|
|
442
|
+
parts.push(renderTelegramHtml2(slice(nodes, from, cut.end)));
|
|
443
|
+
}
|
|
444
|
+
from = cut.next;
|
|
445
|
+
}
|
|
446
|
+
return parts;
|
|
447
|
+
}
|
|
448
|
+
function truncateTelegramHtml2(markup, options = {}) {
|
|
449
|
+
const limit = checkedLimit(options.limit ?? TELEGRAM_TEXT_LIMIT2);
|
|
450
|
+
const ellipsis = options.ellipsis ?? "…";
|
|
451
|
+
const nodes = parseTelegramHtml2(markup);
|
|
452
|
+
const text = textOf(nodes);
|
|
453
|
+
if (text.length <= limit)
|
|
454
|
+
return renderTelegramHtml2(nodes);
|
|
455
|
+
const room = limit - ellipsis.length;
|
|
456
|
+
if (room < 1)
|
|
457
|
+
throw new RangeError("[stitchkit] telegram html: the ellipsis leaves no room");
|
|
458
|
+
const { end } = cutWithin(text, 0, room, atomicRanges(nodes), false);
|
|
459
|
+
const kept = slice(nodes, 0, end);
|
|
460
|
+
return renderTelegramHtml2(kept).trimEnd() + escapeTelegramHtml2(ellipsis);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
export { TELEGRAM_TEXT_LIMIT2, TELEGRAM_CAPTION_LIMIT2, tokenize, parseTelegramHtml2, escapeTelegramHtml2, renderTelegramHtml2, sanitizeTelegramHtml2, telegramHtmlText2, splitTelegramHtml2, truncateTelegramHtml2 };
|
|
@@ -1,68 +1,68 @@
|
|
|
1
1
|
// src/agent-runtime/models.ts
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var AgentModelCapabilitySchema2 = z.enum(["tools", "vision", "reasoning", "files"]);
|
|
4
|
+
var AgentModelDescriptorSchema2 = z.object({
|
|
5
5
|
provider: z.string().min(1),
|
|
6
6
|
modelId: z.string().min(1),
|
|
7
7
|
contextWindow: z.int().positive(),
|
|
8
|
-
capabilities: z.array(
|
|
8
|
+
capabilities: z.array(AgentModelCapabilitySchema2),
|
|
9
9
|
observedAt: z.iso.datetime({ offset: true }).optional(),
|
|
10
10
|
source: z.string().min(1).optional(),
|
|
11
11
|
availability: z.enum(["available", "unavailable"]).optional()
|
|
12
12
|
});
|
|
13
|
-
var
|
|
13
|
+
var AgentModelRegistrySnapshotSchema2 = z.object({
|
|
14
14
|
schemaVersion: z.literal(1),
|
|
15
15
|
source: z.string().min(1),
|
|
16
16
|
observedAt: z.iso.datetime({ offset: true }),
|
|
17
|
-
models: z.record(z.string().min(1),
|
|
17
|
+
models: z.record(z.string().min(1), AgentModelDescriptorSchema2)
|
|
18
18
|
});
|
|
19
|
-
var
|
|
19
|
+
var AgentModelPriceSchema2 = z.object({
|
|
20
20
|
currency: z.string().length(3),
|
|
21
21
|
inputPerToken: z.string().regex(/^\d+(?:\.\d+)?$/).optional(),
|
|
22
22
|
outputPerToken: z.string().regex(/^\d+(?:\.\d+)?$/).optional()
|
|
23
23
|
}).strict();
|
|
24
|
-
var
|
|
24
|
+
var AgentModelMetricSchema2 = z.object({
|
|
25
25
|
metric: z.string().min(1),
|
|
26
26
|
value: z.number(),
|
|
27
27
|
unit: z.enum(["index", "elo", "percent", "milliseconds"]),
|
|
28
28
|
source: z.string().min(1),
|
|
29
29
|
observedAt: z.iso.datetime({ offset: true })
|
|
30
30
|
}).strict();
|
|
31
|
-
var
|
|
31
|
+
var AgentModelPopularitySchema2 = z.object({
|
|
32
32
|
rank: z.int().positive(),
|
|
33
33
|
window: z.literal("week"),
|
|
34
34
|
source: z.string().min(1),
|
|
35
35
|
observedAt: z.iso.datetime({ offset: true })
|
|
36
36
|
}).strict();
|
|
37
|
-
var
|
|
37
|
+
var AgentModelCatalogEntrySchema2 = z.object({
|
|
38
38
|
id: z.string().min(1),
|
|
39
39
|
name: z.string().min(1),
|
|
40
|
-
descriptor:
|
|
40
|
+
descriptor: AgentModelDescriptorSchema2,
|
|
41
41
|
description: z.string().optional(),
|
|
42
|
-
price:
|
|
43
|
-
popularity:
|
|
44
|
-
metrics: z.array(
|
|
42
|
+
price: AgentModelPriceSchema2.optional(),
|
|
43
|
+
popularity: AgentModelPopularitySchema2.optional(),
|
|
44
|
+
metrics: z.array(AgentModelMetricSchema2)
|
|
45
45
|
}).strict();
|
|
46
|
-
var
|
|
46
|
+
var AgentModelCatalogSchema2 = z.object({
|
|
47
47
|
schemaVersion: z.literal(1),
|
|
48
48
|
source: z.string().min(1),
|
|
49
49
|
observedAt: z.iso.datetime({ offset: true }),
|
|
50
50
|
completeness: z.enum(["complete", "partial"]),
|
|
51
|
-
models: z.array(
|
|
51
|
+
models: z.array(AgentModelCatalogEntrySchema2),
|
|
52
52
|
diagnostics: z.array(z.string())
|
|
53
53
|
}).strict();
|
|
54
|
-
var
|
|
54
|
+
var AgentModelSelectionSchema2 = z.object({
|
|
55
55
|
modelId: z.string().min(1),
|
|
56
56
|
selectedAt: z.iso.datetime({ offset: true })
|
|
57
57
|
}).strict();
|
|
58
|
-
var
|
|
59
|
-
var
|
|
60
|
-
models: z.array(
|
|
58
|
+
var AgentModelSearchInputSchema2 = z.object({ query: z.string().max(256).default(""), limit: z.int().positive().max(200) }).strict();
|
|
59
|
+
var AgentModelSearchResultSchema2 = z.object({
|
|
60
|
+
models: z.array(AgentModelCatalogEntrySchema2),
|
|
61
61
|
total: z.int().nonnegative(),
|
|
62
62
|
truncated: z.boolean()
|
|
63
63
|
}).strict();
|
|
64
|
-
function
|
|
65
|
-
const input =
|
|
64
|
+
function searchAgentModelCatalog2(catalog, rawInput) {
|
|
65
|
+
const input = AgentModelSearchInputSchema2.parse(rawInput);
|
|
66
66
|
const terms = input.query.toLocaleLowerCase().trim().split(/\s+/).filter(Boolean);
|
|
67
67
|
const matches = catalog.models.filter((model) => {
|
|
68
68
|
const searchable = `${model.id}
|
|
@@ -70,27 +70,27 @@ ${model.name}
|
|
|
70
70
|
${model.description ?? ""}`.toLocaleLowerCase();
|
|
71
71
|
return terms.every((term) => searchable.includes(term));
|
|
72
72
|
});
|
|
73
|
-
return
|
|
73
|
+
return AgentModelSearchResultSchema2.parse({
|
|
74
74
|
models: matches.slice(0, input.limit),
|
|
75
75
|
total: matches.length,
|
|
76
76
|
truncated: matches.length > input.limit
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
|
-
function
|
|
79
|
+
function createMemoryAgentModelSelectionStore2() {
|
|
80
80
|
const selections = new Map;
|
|
81
81
|
return {
|
|
82
82
|
load: (conversationId) => selections.get(conversationId),
|
|
83
83
|
save(conversationId, rawSelection) {
|
|
84
|
-
selections.set(conversationId,
|
|
84
|
+
selections.set(conversationId, AgentModelSelectionSchema2.parse(rawSelection));
|
|
85
85
|
}
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
|
-
function
|
|
88
|
+
function defineModelRegistry2(config) {
|
|
89
89
|
const descriptors = new Map;
|
|
90
90
|
for (const key in config.models) {
|
|
91
91
|
const declaration = config.models[key];
|
|
92
92
|
if (declaration)
|
|
93
|
-
descriptors.set(key,
|
|
93
|
+
descriptors.set(key, AgentModelDescriptorSchema2.parse(declaration));
|
|
94
94
|
}
|
|
95
95
|
const descriptor = (key) => {
|
|
96
96
|
const found = descriptors.get(key);
|
|
@@ -135,7 +135,7 @@ function defineModelRegistry(config) {
|
|
|
135
135
|
};
|
|
136
136
|
},
|
|
137
137
|
snapshot(input) {
|
|
138
|
-
return
|
|
138
|
+
return AgentModelRegistrySnapshotSchema2.parse({
|
|
139
139
|
schemaVersion: 1,
|
|
140
140
|
source: input.source,
|
|
141
141
|
observedAt: input.observedAt,
|
|
@@ -144,11 +144,11 @@ function defineModelRegistry(config) {
|
|
|
144
144
|
}
|
|
145
145
|
};
|
|
146
146
|
}
|
|
147
|
-
function
|
|
147
|
+
function validateAgentModelSnapshot2(input, policy) {
|
|
148
148
|
if (!Number.isSafeInteger(policy.maxAgeMs) || policy.maxAgeMs < 0) {
|
|
149
149
|
throw new TypeError("maxAgeMs must be a non-negative safe integer");
|
|
150
150
|
}
|
|
151
|
-
const snapshot =
|
|
151
|
+
const snapshot = AgentModelRegistrySnapshotSchema2.parse(input);
|
|
152
152
|
const now = policy.now?.() ?? new Date;
|
|
153
153
|
const age = now.getTime() - new Date(snapshot.observedAt).getTime();
|
|
154
154
|
if (age < 0 || age > policy.maxAgeMs) {
|
|
@@ -157,4 +157,4 @@ function validateAgentModelSnapshot(input, policy) {
|
|
|
157
157
|
return snapshot;
|
|
158
158
|
}
|
|
159
159
|
|
|
160
|
-
export {
|
|
160
|
+
export { AgentModelCapabilitySchema2, AgentModelDescriptorSchema2, AgentModelRegistrySnapshotSchema2, AgentModelPriceSchema2, AgentModelMetricSchema2, AgentModelPopularitySchema2, AgentModelCatalogEntrySchema2, AgentModelCatalogSchema2, AgentModelSelectionSchema2, AgentModelSearchInputSchema2, AgentModelSearchResultSchema2, searchAgentModelCatalog2, createMemoryAgentModelSelectionStore2, defineModelRegistry2, validateAgentModelSnapshot2 };
|
|
@@ -79,7 +79,7 @@ function createHttpStreamTracker() {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
// src/server/shutdown.ts
|
|
82
|
-
var
|
|
82
|
+
var ShutdownStateSchema2 = z.enum([
|
|
83
83
|
"running",
|
|
84
84
|
"draining-http",
|
|
85
85
|
"closing-realtime",
|
|
@@ -87,21 +87,21 @@ var ShutdownStateSchema = z.enum([
|
|
|
87
87
|
"clean",
|
|
88
88
|
"forced"
|
|
89
89
|
]);
|
|
90
|
-
var
|
|
90
|
+
var ShutdownOptionsSchema2 = z.object({
|
|
91
91
|
gracePeriodMs: z.number().int().nonnegative().default(30000),
|
|
92
92
|
realtimeCloseTimeoutMs: z.number().int().nonnegative().default(1000),
|
|
93
93
|
forceTimeoutMs: z.number().int().nonnegative().default(5000),
|
|
94
94
|
retryAfterSeconds: z.number().int().nonnegative().default(5),
|
|
95
95
|
signal: z.custom((value) => typeof value === "object" && value !== null && ("aborted" in value) && ("addEventListener" in value), "Expected an AbortSignal").optional()
|
|
96
96
|
});
|
|
97
|
-
var
|
|
98
|
-
state:
|
|
97
|
+
var ShutdownStatusSchema2 = z.object({
|
|
98
|
+
state: ShutdownStateSchema2,
|
|
99
99
|
acceptedRequests: z.number().int().nonnegative(),
|
|
100
100
|
completedRequests: z.number().int().nonnegative(),
|
|
101
101
|
pendingRequests: z.number().int().nonnegative(),
|
|
102
102
|
pendingWebSockets: z.number().int().nonnegative()
|
|
103
103
|
});
|
|
104
|
-
var
|
|
104
|
+
var ShutdownResultSchema2 = z.object({
|
|
105
105
|
outcome: z.enum(["clean", "forced"]),
|
|
106
106
|
reason: z.enum(["deadline", "signal"]).optional(),
|
|
107
107
|
acceptedRequests: z.number().int().nonnegative(),
|
|
@@ -192,7 +192,7 @@ function createServerLifecycle(getAdapter) {
|
|
|
192
192
|
const pendingRequests = () => Math.max(getAdapter().pendingRequests(), streams.pendingRequests);
|
|
193
193
|
const status = () => {
|
|
194
194
|
const adapter = getAdapter();
|
|
195
|
-
return
|
|
195
|
+
return ShutdownStatusSchema2.parse({
|
|
196
196
|
state,
|
|
197
197
|
acceptedRequests,
|
|
198
198
|
completedRequests,
|
|
@@ -220,7 +220,7 @@ function createServerLifecycle(getAdapter) {
|
|
|
220
220
|
const shutdown = (options) => {
|
|
221
221
|
if (shutdownPromise)
|
|
222
222
|
return shutdownPromise;
|
|
223
|
-
const parsed =
|
|
223
|
+
const parsed = ShutdownOptionsSchema2.parse(options ?? {});
|
|
224
224
|
retryAfterSeconds = parsed.retryAfterSeconds;
|
|
225
225
|
const startedAt = performance.now();
|
|
226
226
|
const adapter = getAdapter();
|
|
@@ -300,7 +300,7 @@ function createServerLifecycle(getAdapter) {
|
|
|
300
300
|
state = "clean";
|
|
301
301
|
}
|
|
302
302
|
cleanup();
|
|
303
|
-
resolve(
|
|
303
|
+
resolve(ShutdownResultSchema2.parse({
|
|
304
304
|
outcome: forcedReason ? "forced" : "clean",
|
|
305
305
|
...forcedReason && { reason: forcedReason },
|
|
306
306
|
acceptedRequests,
|
|
@@ -329,4 +329,4 @@ function createServerLifecycle(getAdapter) {
|
|
|
329
329
|
};
|
|
330
330
|
}
|
|
331
331
|
|
|
332
|
-
export { isStreamCancellation, ownHttpStream, settleStreamCleanup,
|
|
332
|
+
export { isStreamCancellation, ownHttpStream, settleStreamCleanup, ShutdownStateSchema2, ShutdownOptionsSchema2, ShutdownStatusSchema2, ShutdownResultSchema2, createServerLifecycle };
|