stitchkit 0.100.2 → 0.101.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/CHANGELOG.md +153 -0
- package/README.md +2 -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.js +209 -210
- 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 +116 -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 +11 -3
- package/dist/entrypoints/telegram.d.ts.map +1 -1
- package/dist/entrypoints/telegram.js +779 -159
- 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 +224 -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-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-e05cjgtf.js +144 -0
- package/dist/{index-yw4fzmdz.js → index-e6c2spsd.js} +79 -30
- 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-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-sznqf8fx.js +20 -0
- 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/internal/secret-shapes.d.ts +21 -0
- package/dist/internal/secret-shapes.d.ts.map +1 -0
- 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/bot-api.d.ts +7 -4
- package/dist/telegram/bot-api.d.ts.map +1 -1
- 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 +3 -44
- package/dist/telegram/init-data.d.ts.map +1 -1
- package/dist/telegram/operator-channel.d.ts +19 -3
- package/dist/telegram/operator-channel.d.ts.map +1 -1
- package/dist/telegram/operator-dedupe.d.ts +44 -0
- package/dist/telegram/operator-dedupe.d.ts.map +1 -0
- 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 +25 -0
- package/dist/telegram/send-failure.d.ts.map +1 -1
- package/dist/telegram/update-intake.d.ts +82 -0
- package/dist/telegram/update-intake.d.ts.map +1 -0
- package/dist/telegram/update-store-check.d.ts +22 -0
- package/dist/telegram/update-store-check.d.ts.map +1 -0
- package/dist/telegram/update-store-postgres.d.ts +33 -0
- package/dist/telegram/update-store-postgres.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/user.d.ts +51 -0
- package/dist/telegram/user.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/cli.txt +8 -2
- package/llms/observability.txt +15 -2
- package/llms/react-keyboard.txt +193 -0
- package/llms/server.4.txt +16 -0
- package/llms/stitchkit.txt +10 -4
- package/llms/telegram-html.txt +35 -0
- package/llms/telegram-screens.txt +365 -0
- package/llms/telegram.txt +245 -11
- package/llms/{upgrading-0.74.0-0.100.0.txt → upgrading-0.74.0-0.101.0.txt} +39 -3
- package/llms/upgrading.txt +1 -1
- package/llms-full.txt +889 -19
- package/llms.txt +12 -7
- 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
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} from "./index-8qt2m66q.js";
|
|
2
|
+
isRetryableStatus2
|
|
3
|
+
} from "./index-n53mswt3.js";
|
|
5
4
|
import {
|
|
6
|
-
|
|
5
|
+
rebuildObject,
|
|
7
6
|
mergeSchemas,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from "./index-
|
|
7
|
+
assertToolExtensionCompatible,
|
|
8
|
+
projectToolSurface
|
|
9
|
+
} from "./index-7z9ym7t8.js";
|
|
11
10
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
toolErrorFromResult,
|
|
12
|
+
executeToolMethod
|
|
13
|
+
} from "./index-dvwj1f43.js";
|
|
14
14
|
|
|
15
15
|
// src/tools/mount.ts
|
|
16
16
|
import { z } from "zod";
|
|
@@ -33,7 +33,7 @@ function contractToolMountable(projected, extend) {
|
|
|
33
33
|
shouldExtend: projected.shouldExtend
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
|
-
function
|
|
36
|
+
function collectTools2(service, transport, config = {}) {
|
|
37
37
|
const { extend, flattenUnionInput = false, assertNames = true } = config;
|
|
38
38
|
const tools = [];
|
|
39
39
|
for (const projected of projectToolSurface({ services: [service] }, transport === "HTTP" ? "AGENT" : transport, {
|
|
@@ -72,7 +72,7 @@ function createToolRunner(config) {
|
|
|
72
72
|
function formatToolError(result, toolName, errorHint) {
|
|
73
73
|
const err = {
|
|
74
74
|
error: result.code,
|
|
75
|
-
retryable: result.retryable ??
|
|
75
|
+
retryable: result.retryable ?? isRetryableStatus2(toolErrorFromResult(result).status)
|
|
76
76
|
};
|
|
77
77
|
if (result.details)
|
|
78
78
|
err.details = result.details;
|
|
@@ -89,4 +89,4 @@ function formatToolError(result, toolName, errorHint) {
|
|
|
89
89
|
return err;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
export { contractToolMountable,
|
|
92
|
+
export { contractToolMountable, collectTools2, createToolRunner, formatToolError };
|
|
@@ -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 };
|