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.
Files changed (242) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +2 -1
  3. package/dist/entrypoints/agent-runtime/browser.js +119 -119
  4. package/dist/entrypoints/agent-runtime/coding-tools.js +15 -20
  5. package/dist/entrypoints/agent-runtime/harness.js +55 -63
  6. package/dist/entrypoints/agent-runtime/openrouter.js +6 -6
  7. package/dist/entrypoints/agent-runtime/sandbox.js +20 -25
  8. package/dist/entrypoints/agent-runtime/sqlite/bun.js +11 -13
  9. package/dist/entrypoints/agent-runtime/sqlite/node.js +11 -13
  10. package/dist/entrypoints/agent-runtime/testing.js +32 -34
  11. package/dist/entrypoints/agent-runtime.js +395 -402
  12. package/dist/entrypoints/application/diagnostic-journal.js +26 -27
  13. package/dist/entrypoints/application/directory-inbox.js +16 -17
  14. package/dist/entrypoints/application/grammy.js +13 -13
  15. package/dist/entrypoints/application/opentelemetry.js +13 -13
  16. package/dist/entrypoints/application/schemas.js +24 -24
  17. package/dist/entrypoints/application.js +209 -210
  18. package/dist/entrypoints/bin/upgrade-cli.js +2 -2
  19. package/dist/entrypoints/cli.js +81 -84
  20. package/dist/entrypoints/contract.js +54 -57
  21. package/dist/entrypoints/declaration.js +22 -22
  22. package/dist/entrypoints/files.js +18 -21
  23. package/dist/entrypoints/geo.js +7 -8
  24. package/dist/entrypoints/google.js +2 -2
  25. package/dist/entrypoints/index.js +150 -154
  26. package/dist/entrypoints/live.js +45 -47
  27. package/dist/entrypoints/node.js +68 -74
  28. package/dist/entrypoints/oauth.js +6 -6
  29. package/dist/entrypoints/observability.d.ts +1 -0
  30. package/dist/entrypoints/observability.d.ts.map +1 -1
  31. package/dist/entrypoints/observability.js +116 -87
  32. package/dist/entrypoints/primitives.js +35 -35
  33. package/dist/entrypoints/react/keyboard.d.ts +4 -0
  34. package/dist/entrypoints/react/keyboard.d.ts.map +1 -0
  35. package/dist/entrypoints/react/keyboard.js +397 -0
  36. package/dist/entrypoints/react.js +10 -10
  37. package/dist/entrypoints/release.js +7 -7
  38. package/dist/entrypoints/remote.js +15 -17
  39. package/dist/entrypoints/server.js +198 -200
  40. package/dist/entrypoints/telegram/html.d.ts +5 -0
  41. package/dist/entrypoints/telegram/html.d.ts.map +1 -0
  42. package/dist/entrypoints/telegram/html.js +26 -0
  43. package/dist/entrypoints/telegram/screens.d.ts +14 -0
  44. package/dist/entrypoints/telegram/screens.d.ts.map +1 -0
  45. package/dist/entrypoints/telegram/screens.js +2028 -0
  46. package/dist/entrypoints/telegram.d.ts +11 -3
  47. package/dist/entrypoints/telegram.d.ts.map +1 -1
  48. package/dist/entrypoints/telegram.js +779 -159
  49. package/dist/entrypoints/testing.js +75 -79
  50. package/dist/entrypoints/tools/connections.js +30 -32
  51. package/dist/entrypoints/tools/contract.js +18 -20
  52. package/dist/entrypoints/tools/invoker.js +12 -17
  53. package/dist/entrypoints/tools.js +224 -229
  54. package/dist/entrypoints/tracking/server.js +6 -6
  55. package/dist/entrypoints/tracking.js +40 -42
  56. package/dist/entrypoints/voice.js +3 -3
  57. package/dist/{index-eaysmdtq.js → index-0ndk4555.js} +56 -56
  58. package/dist/{index-2bxbyab0.js → index-1bx1xv1k.js} +1 -1
  59. package/dist/{index-p5r7qpdd.js → index-1eeqpadm.js} +4 -4
  60. package/dist/{index-hadmp193.js → index-3ct7hhq6.js} +210 -210
  61. package/dist/{index-e01r054k.js → index-45tdvqa3.js} +26 -26
  62. package/dist/{index-dce5wxcq.js → index-4s0fep5q.js} +8 -8
  63. package/dist/index-50ejfz75.js +9 -0
  64. package/dist/{index-m9zn6cpq.js → index-5107q189.js} +12 -12
  65. package/dist/{index-sbdmyz75.js → index-5cc6r990.js} +3 -3
  66. package/dist/{index-c6bxbsnc.js → index-7kxw1awn.js} +2 -2
  67. package/dist/{index-0r0fbk7z.js → index-7z9ym7t8.js} +28 -28
  68. package/dist/{index-p7hgdyhb.js → index-814xpr6d.js} +2 -2
  69. package/dist/{index-gtj3zc53.js → index-8kzct1d6.js} +99 -99
  70. package/dist/{index-1zbbzgfh.js → index-9pw0a51a.js} +4 -4
  71. package/dist/{index-79z7m7dt.js → index-a9pd417t.js} +35 -35
  72. package/dist/{index-ham5sz8m.js → index-aaj97r4y.js} +45 -45
  73. package/dist/{index-s812ycat.js → index-aan6hqb9.js} +3 -3
  74. package/dist/{index-10x2hbx0.js → index-adhgd4pe.js} +44 -44
  75. package/dist/{index-2gxzjvyr.js → index-afjvjyck.js} +23 -23
  76. package/dist/{index-qmy6zq75.js → index-ahvsksw5.js} +16 -16
  77. package/dist/{index-hr4tzbwq.js → index-ap3gqe56.js} +3 -3
  78. package/dist/{index-znfs20ss.js → index-b2bz0kdm.js} +16 -16
  79. package/dist/{index-r066jx76.js → index-c6aagrbd.js} +148 -120
  80. package/dist/{index-k30h66yd.js → index-ck71tbcf.js} +9 -9
  81. package/dist/{index-eqqvgdb3.js → index-ct75c3at.js} +2 -2
  82. package/dist/{index-gw8bmyaj.js → index-djjhhgjk.js} +41 -41
  83. package/dist/{index-8qt2m66q.js → index-dvwj1f43.js} +43 -43
  84. package/dist/index-e05cjgtf.js +144 -0
  85. package/dist/{index-yw4fzmdz.js → index-e6c2spsd.js} +79 -30
  86. package/dist/{index-fhwqwxe0.js → index-ej331hah.js} +1 -1
  87. package/dist/{index-9t3dffv2.js → index-ewbaywk5.js} +5 -5
  88. package/dist/{index-7p1f0vp2.js → index-fyphpknh.js} +25 -25
  89. package/dist/{index-83bdg97s.js → index-g149e9pk.js} +1 -1
  90. package/dist/{index-ngfhvfpd.js → index-g6a3na27.js} +4 -4
  91. package/dist/{index-qwhynv6x.js → index-h124epcf.js} +20 -20
  92. package/dist/{index-h6eeys1v.js → index-h97tqqp1.js} +9 -9
  93. package/dist/{index-zcgf3gqf.js → index-hby4qhax.js} +10 -10
  94. package/dist/{index-5jrd0yng.js → index-j8aw2c0e.js} +4 -4
  95. package/dist/{index-d8m8zpd8.js → index-jzczzcsb.js} +14 -14
  96. package/dist/index-kqnd6a85.js +26 -0
  97. package/dist/{index-35mh5bhj.js → index-kw1ws0cs.js} +12 -12
  98. package/dist/{index-4gcnakhx.js → index-m38ej7e5.js} +2 -2
  99. package/dist/{index-ndddxtyx.js → index-m79yr938.js} +19 -19
  100. package/dist/{index-5p2m7we1.js → index-m9fndta6.js} +11 -11
  101. package/dist/index-mnkk1ffz.js +150 -0
  102. package/dist/index-n15jny5b.js +4 -0
  103. package/dist/{index-2vtcmrj9.js → index-n53mswt3.js} +20 -20
  104. package/dist/{index-bt14acb5.js → index-n5yqxd3d.js} +21 -21
  105. package/dist/{index-bm5rx7n6.js → index-n9tyz8z3.js} +12 -12
  106. package/dist/index-nmaqxdx7.js +463 -0
  107. package/dist/{index-mqv3b5rh.js → index-nx6eazt0.js} +30 -30
  108. package/dist/{index-3z73fh2c.js → index-q0th8q0z.js} +9 -9
  109. package/dist/{index-v260df89.js → index-qjeggp8w.js} +20 -20
  110. package/dist/{index-zfrhfn82.js → index-r1z0rd9c.js} +20 -20
  111. package/dist/{index-wqgjfstn.js → index-r5c4fedv.js} +3 -3
  112. package/dist/{index-cyktc4bp.js → index-r5hsgkz5.js} +118 -118
  113. package/dist/{index-0b1ess5e.js → index-r7a7r7ha.js} +1 -1
  114. package/dist/{index-1j8pm5t0.js → index-rfkh44ss.js} +15 -15
  115. package/dist/index-rz3z13e9.js +47 -0
  116. package/dist/{index-k6gpggb9.js → index-s80awwsw.js} +35 -35
  117. package/dist/{index-vqr7f7v8.js → index-ssmd41kh.js} +124 -124
  118. package/dist/index-sznqf8fx.js +20 -0
  119. package/dist/{index-ensd0r74.js → index-v14qqmys.js} +41 -41
  120. package/dist/{index-paz6sgdp.js → index-v4a2fjtk.js} +36 -36
  121. package/dist/{index-d9pk3td4.js → index-w0eqdhyd.js} +14 -14
  122. package/dist/{index-5qn1kx34.js → index-w575evhq.js} +29 -29
  123. package/dist/{index-3gye9wzb.js → index-w5s3xftz.js} +26 -26
  124. package/dist/{index-tm88avnj.js → index-wykebpn9.js} +3 -3
  125. package/dist/{index-sh3s86na.js → index-xkhk5d6g.js} +17 -17
  126. package/dist/{index-6k1937bx.js → index-xqhede6x.js} +4 -4
  127. package/dist/{index-f4fx2tza.js → index-zs4ms3th.js} +181 -181
  128. package/dist/{index-k5hsfc3j.js → index-zsvzhjtk.js} +1 -1
  129. package/dist/internal/secret-shapes.d.ts +21 -0
  130. package/dist/internal/secret-shapes.d.ts.map +1 -0
  131. package/dist/observability/bounded-logger.d.ts +2 -0
  132. package/dist/observability/bounded-logger.d.ts.map +1 -1
  133. package/dist/observability/sanitize.d.ts +6 -0
  134. package/dist/observability/sanitize.d.ts.map +1 -1
  135. package/dist/observability/secret-values.d.ts +25 -0
  136. package/dist/observability/secret-values.d.ts.map +1 -0
  137. package/dist/react/keyboard/hooks.d.ts +71 -0
  138. package/dist/react/keyboard/hooks.d.ts.map +1 -0
  139. package/dist/react/keyboard/layers.d.ts +98 -0
  140. package/dist/react/keyboard/layers.d.ts.map +1 -0
  141. package/dist/react/keyboard/zone.d.ts +139 -0
  142. package/dist/react/keyboard/zone.d.ts.map +1 -0
  143. package/dist/telegram/bot-api.d.ts +7 -4
  144. package/dist/telegram/bot-api.d.ts.map +1 -1
  145. package/dist/telegram/crypto.d.ts +16 -0
  146. package/dist/telegram/crypto.d.ts.map +1 -0
  147. package/dist/telegram/html/check.d.ts +26 -0
  148. package/dist/telegram/html/check.d.ts.map +1 -0
  149. package/dist/telegram/html/nodes.d.ts +70 -0
  150. package/dist/telegram/html/nodes.d.ts.map +1 -0
  151. package/dist/telegram/html/parse.d.ts +35 -0
  152. package/dist/telegram/html/parse.d.ts.map +1 -0
  153. package/dist/telegram/html/render.d.ts +39 -0
  154. package/dist/telegram/html/render.d.ts.map +1 -0
  155. package/dist/telegram/init-data.d.ts +3 -44
  156. package/dist/telegram/init-data.d.ts.map +1 -1
  157. package/dist/telegram/operator-channel.d.ts +19 -3
  158. package/dist/telegram/operator-channel.d.ts.map +1 -1
  159. package/dist/telegram/operator-dedupe.d.ts +44 -0
  160. package/dist/telegram/operator-dedupe.d.ts.map +1 -0
  161. package/dist/telegram/screens/callback-codec.d.ts +34 -0
  162. package/dist/telegram/screens/callback-codec.d.ts.map +1 -0
  163. package/dist/telegram/screens/dispatch.d.ts +22 -0
  164. package/dist/telegram/screens/dispatch.d.ts.map +1 -0
  165. package/dist/telegram/screens/display.d.ts +70 -0
  166. package/dist/telegram/screens/display.d.ts.map +1 -0
  167. package/dist/telegram/screens/execute.d.ts +57 -0
  168. package/dist/telegram/screens/execute.d.ts.map +1 -0
  169. package/dist/telegram/screens/html.d.ts +36 -0
  170. package/dist/telegram/screens/html.d.ts.map +1 -0
  171. package/dist/telegram/screens/outcome.d.ts +74 -0
  172. package/dist/telegram/screens/outcome.d.ts.map +1 -0
  173. package/dist/telegram/screens/path.d.ts +29 -0
  174. package/dist/telegram/screens/path.d.ts.map +1 -0
  175. package/dist/telegram/screens/reconcile.d.ts +67 -0
  176. package/dist/telegram/screens/reconcile.d.ts.map +1 -0
  177. package/dist/telegram/screens/registry.d.ts +23 -0
  178. package/dist/telegram/screens/registry.d.ts.map +1 -0
  179. package/dist/telegram/screens/render.d.ts +70 -0
  180. package/dist/telegram/screens/render.d.ts.map +1 -0
  181. package/dist/telegram/screens/runtime.d.ts +133 -0
  182. package/dist/telegram/screens/runtime.d.ts.map +1 -0
  183. package/dist/telegram/screens/screen-types.d.ts +130 -0
  184. package/dist/telegram/screens/screen-types.d.ts.map +1 -0
  185. package/dist/telegram/screens/screen.d.ts +138 -0
  186. package/dist/telegram/screens/screen.d.ts.map +1 -0
  187. package/dist/telegram/screens/state.d.ts +115 -0
  188. package/dist/telegram/screens/state.d.ts.map +1 -0
  189. package/dist/telegram/screens/telegram-screens.d.ts +18 -0
  190. package/dist/telegram/screens/telegram-screens.d.ts.map +1 -0
  191. package/dist/telegram/screens/test-chat-telegram.d.ts +47 -0
  192. package/dist/telegram/screens/test-chat-telegram.d.ts.map +1 -0
  193. package/dist/telegram/screens/test-chat.d.ts +66 -0
  194. package/dist/telegram/screens/test-chat.d.ts.map +1 -0
  195. package/dist/telegram/screens/view.d.ts +89 -0
  196. package/dist/telegram/screens/view.d.ts.map +1 -0
  197. package/dist/telegram/send-failure.d.ts +25 -0
  198. package/dist/telegram/send-failure.d.ts.map +1 -1
  199. package/dist/telegram/update-intake.d.ts +82 -0
  200. package/dist/telegram/update-intake.d.ts.map +1 -0
  201. package/dist/telegram/update-store-check.d.ts +22 -0
  202. package/dist/telegram/update-store-check.d.ts.map +1 -0
  203. package/dist/telegram/update-store-postgres.d.ts +33 -0
  204. package/dist/telegram/update-store-postgres.d.ts.map +1 -0
  205. package/dist/telegram/update-store-sqlite.d.ts +26 -0
  206. package/dist/telegram/update-store-sqlite.d.ts.map +1 -0
  207. package/dist/telegram/update-store.d.ts +67 -0
  208. package/dist/telegram/update-store.d.ts.map +1 -0
  209. package/dist/telegram/user.d.ts +51 -0
  210. package/dist/telegram/user.d.ts.map +1 -0
  211. package/dist/telegram/webhook.d.ts +105 -0
  212. package/dist/telegram/webhook.d.ts.map +1 -0
  213. package/dist/tools/cli/args-fields.d.ts +8 -0
  214. package/dist/tools/cli/args-fields.d.ts.map +1 -1
  215. package/dist/tools/cli/args-route.d.ts.map +1 -1
  216. package/dist/tools/cli/args.d.ts.map +1 -1
  217. package/dist/tools/cli/help.d.ts.map +1 -1
  218. package/llms/cli.txt +8 -2
  219. package/llms/observability.txt +15 -2
  220. package/llms/react-keyboard.txt +193 -0
  221. package/llms/server.4.txt +16 -0
  222. package/llms/stitchkit.txt +10 -4
  223. package/llms/telegram-html.txt +35 -0
  224. package/llms/telegram-screens.txt +365 -0
  225. package/llms/telegram.txt +245 -11
  226. package/llms/{upgrading-0.74.0-0.100.0.txt → upgrading-0.74.0-0.101.0.txt} +39 -3
  227. package/llms/upgrading.txt +1 -1
  228. package/llms-full.txt +889 -19
  229. package/llms.txt +12 -7
  230. package/package.json +17 -2
  231. package/dist/index-2k4yrqkc.js +0 -9
  232. package/dist/index-crykmqkr.js +0 -26
  233. package/dist/index-y64k3s0h.js +0 -150
  234. package/dist/index-y91ry9h2.js +0 -4
  235. /package/dist/{index-hffjpmq9.js → index-9jfdm5tg.js} +0 -0
  236. /package/dist/{index-zjjyynm3.js → index-d4pa2bgs.js} +0 -0
  237. /package/dist/{index-rxfy4cq7.js → index-dwfv9a85.js} +0 -0
  238. /package/dist/{index-5jm36zv1.js → index-gfk7nrht.js} +0 -0
  239. /package/dist/{index-b9aefrqd.js → index-n1dqr7gf.js} +0 -0
  240. /package/dist/{index-q3pyb9n0.js → index-sykb5ag7.js} +0 -0
  241. /package/dist/{index-48ffdxgk.js → index-xhzq2qvj.js} +0 -0
  242. /package/dist/{index-kzfs85xp.js → index-zsarb5xp.js} +0 -0
@@ -1,16 +1,16 @@
1
1
  import {
2
- executeToolMethod,
3
- toolErrorFromResult
4
- } from "./index-8qt2m66q.js";
2
+ isRetryableStatus2
3
+ } from "./index-n53mswt3.js";
5
4
  import {
6
- assertToolExtensionCompatible,
5
+ rebuildObject,
7
6
  mergeSchemas,
8
- projectToolSurface,
9
- rebuildObject
10
- } from "./index-0r0fbk7z.js";
7
+ assertToolExtensionCompatible,
8
+ projectToolSurface
9
+ } from "./index-7z9ym7t8.js";
11
10
  import {
12
- isRetryableStatus
13
- } from "./index-2vtcmrj9.js";
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 collectTools(service, transport, config = {}) {
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 ?? isRetryableStatus(toolErrorFromResult(result).status)
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, collectTools, createToolRunner, formatToolError };
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("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;");
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 AgentModelCapabilitySchema = z.enum(["tools", "vision", "reasoning", "files"]);
4
- var AgentModelDescriptorSchema = z.object({
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(AgentModelCapabilitySchema),
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 AgentModelRegistrySnapshotSchema = z.object({
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), AgentModelDescriptorSchema)
17
+ models: z.record(z.string().min(1), AgentModelDescriptorSchema2)
18
18
  });
19
- var AgentModelPriceSchema = z.object({
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 AgentModelMetricSchema = z.object({
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 AgentModelPopularitySchema = z.object({
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 AgentModelCatalogEntrySchema = z.object({
37
+ var AgentModelCatalogEntrySchema2 = z.object({
38
38
  id: z.string().min(1),
39
39
  name: z.string().min(1),
40
- descriptor: AgentModelDescriptorSchema,
40
+ descriptor: AgentModelDescriptorSchema2,
41
41
  description: z.string().optional(),
42
- price: AgentModelPriceSchema.optional(),
43
- popularity: AgentModelPopularitySchema.optional(),
44
- metrics: z.array(AgentModelMetricSchema)
42
+ price: AgentModelPriceSchema2.optional(),
43
+ popularity: AgentModelPopularitySchema2.optional(),
44
+ metrics: z.array(AgentModelMetricSchema2)
45
45
  }).strict();
46
- var AgentModelCatalogSchema = z.object({
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(AgentModelCatalogEntrySchema),
51
+ models: z.array(AgentModelCatalogEntrySchema2),
52
52
  diagnostics: z.array(z.string())
53
53
  }).strict();
54
- var AgentModelSelectionSchema = z.object({
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 AgentModelSearchInputSchema = z.object({ query: z.string().max(256).default(""), limit: z.int().positive().max(200) }).strict();
59
- var AgentModelSearchResultSchema = z.object({
60
- models: z.array(AgentModelCatalogEntrySchema),
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 searchAgentModelCatalog(catalog, rawInput) {
65
- const input = AgentModelSearchInputSchema.parse(rawInput);
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 AgentModelSearchResultSchema.parse({
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 createMemoryAgentModelSelectionStore() {
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, AgentModelSelectionSchema.parse(rawSelection));
84
+ selections.set(conversationId, AgentModelSelectionSchema2.parse(rawSelection));
85
85
  }
86
86
  };
87
87
  }
88
- function defineModelRegistry(config) {
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, AgentModelDescriptorSchema.parse(declaration));
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 AgentModelRegistrySnapshotSchema.parse({
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 validateAgentModelSnapshot(input, policy) {
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 = AgentModelRegistrySnapshotSchema.parse(input);
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 { AgentModelCapabilitySchema, AgentModelDescriptorSchema, AgentModelRegistrySnapshotSchema, AgentModelPriceSchema, AgentModelMetricSchema, AgentModelPopularitySchema, AgentModelCatalogEntrySchema, AgentModelCatalogSchema, AgentModelSelectionSchema, AgentModelSearchInputSchema, AgentModelSearchResultSchema, searchAgentModelCatalog, createMemoryAgentModelSelectionStore, defineModelRegistry, validateAgentModelSnapshot };
160
+ export { AgentModelCapabilitySchema2, AgentModelDescriptorSchema2, AgentModelRegistrySnapshotSchema2, AgentModelPriceSchema2, AgentModelMetricSchema2, AgentModelPopularitySchema2, AgentModelCatalogEntrySchema2, AgentModelCatalogSchema2, AgentModelSelectionSchema2, AgentModelSearchInputSchema2, AgentModelSearchResultSchema2, searchAgentModelCatalog2, createMemoryAgentModelSelectionStore2, defineModelRegistry2, validateAgentModelSnapshot2 };