@zenalexa/unicli 0.213.1 → 0.213.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.
Files changed (350) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +4 -4
  3. package/README.zh-CN.md +3 -3
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +11 -2
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/describe.d.ts +26 -0
  8. package/dist/commands/describe.d.ts.map +1 -0
  9. package/dist/commands/describe.js +230 -0
  10. package/dist/commands/describe.js.map +1 -0
  11. package/dist/commands/dev.js +1 -1
  12. package/dist/commands/dev.js.map +1 -1
  13. package/dist/commands/dispatch.d.ts +14 -3
  14. package/dist/commands/dispatch.d.ts.map +1 -1
  15. package/dist/commands/dispatch.js +141 -81
  16. package/dist/commands/dispatch.js.map +1 -1
  17. package/dist/commands/health.d.ts.map +1 -1
  18. package/dist/commands/health.js +1 -1
  19. package/dist/commands/health.js.map +1 -1
  20. package/dist/commands/skills.d.ts.map +1 -1
  21. package/dist/commands/skills.js +1 -1
  22. package/dist/commands/skills.js.map +1 -1
  23. package/dist/constants.d.ts +2 -0
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/constants.js +2 -0
  26. package/dist/constants.js.map +1 -1
  27. package/dist/discovery/loader.d.ts +8 -0
  28. package/dist/discovery/loader.d.ts.map +1 -1
  29. package/dist/discovery/loader.js +22 -1
  30. package/dist/discovery/loader.js.map +1 -1
  31. package/dist/engine/args.d.ts +83 -0
  32. package/dist/engine/args.d.ts.map +1 -0
  33. package/dist/engine/args.js +260 -0
  34. package/dist/engine/args.js.map +1 -0
  35. package/dist/engine/executor.d.ts +20 -1
  36. package/dist/engine/executor.d.ts.map +1 -1
  37. package/dist/engine/executor.js +11 -2
  38. package/dist/engine/executor.js.map +1 -1
  39. package/dist/engine/harden.d.ts +48 -0
  40. package/dist/engine/harden.d.ts.map +1 -0
  41. package/dist/engine/harden.js +327 -0
  42. package/dist/engine/harden.js.map +1 -0
  43. package/dist/engine/invoke.d.ts +16 -0
  44. package/dist/engine/invoke.d.ts.map +1 -0
  45. package/dist/engine/invoke.js +15 -0
  46. package/dist/engine/invoke.js.map +1 -0
  47. package/dist/engine/kernel/compile.d.ts +30 -0
  48. package/dist/engine/kernel/compile.d.ts.map +1 -0
  49. package/dist/engine/kernel/compile.js +167 -0
  50. package/dist/engine/kernel/compile.js.map +1 -0
  51. package/dist/engine/kernel/execute.d.ts +35 -0
  52. package/dist/engine/kernel/execute.d.ts.map +1 -0
  53. package/dist/engine/kernel/execute.js +221 -0
  54. package/dist/engine/kernel/execute.js.map +1 -0
  55. package/dist/engine/kernel/types.d.ts +49 -0
  56. package/dist/engine/kernel/types.d.ts.map +1 -0
  57. package/dist/engine/kernel/types.js +9 -0
  58. package/dist/engine/kernel/types.js.map +1 -0
  59. package/dist/engine/kernel/ulid.d.ts +21 -0
  60. package/dist/engine/kernel/ulid.d.ts.map +1 -0
  61. package/dist/engine/kernel/ulid.js +76 -0
  62. package/dist/engine/kernel/ulid.js.map +1 -0
  63. package/dist/engine/template.d.ts.map +1 -1
  64. package/dist/engine/template.js +11 -0
  65. package/dist/engine/template.js.map +1 -1
  66. package/dist/manifest.json +1 -1
  67. package/dist/mcp/dispatch.d.ts +46 -0
  68. package/dist/mcp/dispatch.d.ts.map +1 -0
  69. package/dist/mcp/dispatch.js +109 -0
  70. package/dist/mcp/dispatch.js.map +1 -0
  71. package/dist/mcp/handler.d.ts +30 -0
  72. package/dist/mcp/handler.d.ts.map +1 -0
  73. package/dist/mcp/handler.js +293 -0
  74. package/dist/mcp/handler.js.map +1 -0
  75. package/dist/mcp/http-transport.d.ts +16 -0
  76. package/dist/mcp/http-transport.d.ts.map +1 -0
  77. package/dist/mcp/http-transport.js +124 -0
  78. package/dist/mcp/http-transport.js.map +1 -0
  79. package/dist/mcp/server.d.ts +17 -33
  80. package/dist/mcp/server.d.ts.map +1 -1
  81. package/dist/mcp/server.js +31 -742
  82. package/dist/mcp/server.js.map +1 -1
  83. package/dist/mcp/sse-transport.js.map +1 -1
  84. package/dist/mcp/streamable-http/handle-post.d.ts +23 -0
  85. package/dist/mcp/streamable-http/handle-post.d.ts.map +1 -0
  86. package/dist/mcp/streamable-http/handle-post.js +357 -0
  87. package/dist/mcp/streamable-http/handle-post.js.map +1 -0
  88. package/dist/mcp/streamable-http/index.d.ts +45 -0
  89. package/dist/mcp/streamable-http/index.d.ts.map +1 -0
  90. package/dist/mcp/streamable-http/index.js +150 -0
  91. package/dist/mcp/streamable-http/index.js.map +1 -0
  92. package/dist/mcp/streamable-http/session.d.ts +85 -0
  93. package/dist/mcp/streamable-http/session.d.ts.map +1 -0
  94. package/dist/mcp/streamable-http/session.js +104 -0
  95. package/dist/mcp/streamable-http/session.js.map +1 -0
  96. package/dist/mcp/streamable-http.d.ts +7 -85
  97. package/dist/mcp/streamable-http.d.ts.map +1 -1
  98. package/dist/mcp/streamable-http.js +6 -568
  99. package/dist/mcp/streamable-http.js.map +1 -1
  100. package/dist/mcp/tools.d.ts +57 -0
  101. package/dist/mcp/tools.d.ts.map +1 -0
  102. package/dist/mcp/tools.js +237 -0
  103. package/dist/mcp/tools.js.map +1 -0
  104. package/dist/output/envelope.d.ts +29 -0
  105. package/dist/output/envelope.d.ts.map +1 -1
  106. package/dist/output/envelope.js +6 -0
  107. package/dist/output/envelope.js.map +1 -1
  108. package/dist/output/next-actions.d.ts +18 -0
  109. package/dist/output/next-actions.d.ts.map +1 -0
  110. package/dist/output/next-actions.js +64 -0
  111. package/dist/output/next-actions.js.map +1 -0
  112. package/dist/output/projection.d.ts +93 -0
  113. package/dist/output/projection.d.ts.map +1 -0
  114. package/dist/output/projection.js +255 -0
  115. package/dist/output/projection.js.map +1 -0
  116. package/dist/protocol/acp-helpers.d.ts +32 -0
  117. package/dist/protocol/acp-helpers.d.ts.map +1 -0
  118. package/dist/protocol/acp-helpers.js +175 -0
  119. package/dist/protocol/acp-helpers.js.map +1 -0
  120. package/dist/protocol/acp.d.ts +2 -27
  121. package/dist/protocol/acp.d.ts.map +1 -1
  122. package/dist/protocol/acp.js +7 -170
  123. package/dist/protocol/acp.js.map +1 -1
  124. package/dist/types.d.ts +32 -0
  125. package/dist/types.d.ts.map +1 -1
  126. package/dist/types.js.map +1 -1
  127. package/package.json +13 -2
  128. package/src/adapters/1688/item.yaml +1 -0
  129. package/src/adapters/1688/store.yaml +1 -0
  130. package/src/adapters/36kr/article.yaml +1 -0
  131. package/src/adapters/amazon/bestsellers.yaml +2 -0
  132. package/src/adapters/amazon/movers-shakers.yaml +2 -0
  133. package/src/adapters/amazon/new-releases.yaml +2 -0
  134. package/src/adapters/amazon/rankings.yaml +1 -0
  135. package/src/adapters/apple-podcasts/episodes.yaml +1 -0
  136. package/src/adapters/arxiv/paper.yaml +1 -0
  137. package/src/adapters/audacity/convert.yaml +1 -0
  138. package/src/adapters/audacity/effects.yaml +1 -0
  139. package/src/adapters/audacity/info.yaml +1 -0
  140. package/src/adapters/audacity/mix.yaml +1 -0
  141. package/src/adapters/audacity/normalize.yaml +1 -0
  142. package/src/adapters/audacity/spectrogram.yaml +1 -0
  143. package/src/adapters/audacity/split-channels.yaml +1 -0
  144. package/src/adapters/audacity/trim.yaml +1 -0
  145. package/src/adapters/bilibili/favorites.yaml +1 -0
  146. package/src/adapters/blender/animation.yaml +2 -0
  147. package/src/adapters/blender/camera.yaml +1 -0
  148. package/src/adapters/blender/convert.yaml +1 -0
  149. package/src/adapters/blender/export.yaml +1 -0
  150. package/src/adapters/blender/import.yaml +1 -0
  151. package/src/adapters/blender/info.yaml +1 -0
  152. package/src/adapters/blender/lighting.yaml +1 -0
  153. package/src/adapters/blender/materials.yaml +1 -0
  154. package/src/adapters/blender/objects.yaml +1 -0
  155. package/src/adapters/blender/render.yaml +2 -0
  156. package/src/adapters/blender/scene.yaml +1 -0
  157. package/src/adapters/blender/screenshot.yaml +2 -0
  158. package/src/adapters/blender/script.yaml +1 -0
  159. package/src/adapters/boss/detail.yaml +2 -0
  160. package/src/adapters/cloudcompare/info.yaml +1 -0
  161. package/src/adapters/coupang/add-to-cart.yaml +1 -0
  162. package/src/adapters/ctrip/search.yaml +1 -0
  163. package/src/adapters/douban/download.yaml +1 -0
  164. package/src/adapters/douban/photos.yaml +1 -0
  165. package/src/adapters/douban/subject.yaml +2 -0
  166. package/src/adapters/doubao-web/detail.yaml +1 -0
  167. package/src/adapters/doubao-web/meeting-summary.yaml +1 -0
  168. package/src/adapters/doubao-web/meeting-transcript.yaml +1 -0
  169. package/src/adapters/drawio/export.yaml +2 -0
  170. package/src/adapters/facebook/join-group.yaml +2 -0
  171. package/src/adapters/ffmpeg/compress.yaml +2 -0
  172. package/src/adapters/ffmpeg/concat.yaml +1 -0
  173. package/src/adapters/ffmpeg/convert.yaml +1 -0
  174. package/src/adapters/ffmpeg/extract-audio.yaml +2 -0
  175. package/src/adapters/ffmpeg/gif.yaml +2 -0
  176. package/src/adapters/ffmpeg/normalize.yaml +2 -0
  177. package/src/adapters/ffmpeg/probe.yaml +1 -0
  178. package/src/adapters/ffmpeg/resize.yaml +2 -0
  179. package/src/adapters/ffmpeg/subtitles.yaml +2 -0
  180. package/src/adapters/ffmpeg/thumbnail.yaml +2 -0
  181. package/src/adapters/ffmpeg/trim.yaml +2 -0
  182. package/src/adapters/freecad/assembly.yaml +1 -0
  183. package/src/adapters/freecad/bom.yaml +1 -0
  184. package/src/adapters/freecad/boolean.yaml +1 -0
  185. package/src/adapters/freecad/check.yaml +1 -0
  186. package/src/adapters/freecad/convert.yaml +1 -0
  187. package/src/adapters/freecad/export-stl.yaml +1 -0
  188. package/src/adapters/freecad/import.yaml +1 -0
  189. package/src/adapters/freecad/info.yaml +1 -0
  190. package/src/adapters/freecad/macro.yaml +1 -0
  191. package/src/adapters/freecad/measure.yaml +1 -0
  192. package/src/adapters/freecad/mesh.yaml +1 -0
  193. package/src/adapters/freecad/properties.yaml +1 -0
  194. package/src/adapters/freecad/render.yaml +1 -0
  195. package/src/adapters/freecad/section.yaml +1 -0
  196. package/src/adapters/freecad/sketch.yaml +1 -0
  197. package/src/adapters/gimp/adjust.yaml +1 -0
  198. package/src/adapters/gimp/batch.yaml +1 -0
  199. package/src/adapters/gimp/convert.yaml +1 -0
  200. package/src/adapters/gimp/crop.yaml +1 -0
  201. package/src/adapters/gimp/filter.yaml +1 -0
  202. package/src/adapters/gimp/flip.yaml +1 -0
  203. package/src/adapters/gimp/info.yaml +1 -0
  204. package/src/adapters/gimp/layers.yaml +1 -0
  205. package/src/adapters/gimp/merge-layers.yaml +1 -0
  206. package/src/adapters/gimp/resize.yaml +1 -0
  207. package/src/adapters/gimp/rotate.yaml +1 -0
  208. package/src/adapters/gimp/text.yaml +1 -0
  209. package/src/adapters/godot/scene-export.yaml +1 -0
  210. package/src/adapters/hackernews/comments.yaml +1 -0
  211. package/src/adapters/hackernews/item.yaml +1 -0
  212. package/src/adapters/hf/top.yaml +1 -0
  213. package/src/adapters/imagemagick/composite.yaml +1 -0
  214. package/src/adapters/imagemagick/convert.yaml +1 -0
  215. package/src/adapters/imagemagick/identify.yaml +1 -0
  216. package/src/adapters/imagemagick/montage.yaml +1 -0
  217. package/src/adapters/imagemagick/resize.yaml +1 -0
  218. package/src/adapters/imdb/person.yaml +1 -0
  219. package/src/adapters/imdb/reviews.yaml +1 -0
  220. package/src/adapters/imdb/title.yaml +1 -0
  221. package/src/adapters/inkscape/convert.yaml +2 -0
  222. package/src/adapters/inkscape/export.yaml +2 -0
  223. package/src/adapters/inkscape/optimize.yaml +2 -0
  224. package/src/adapters/instagram/stories.yaml +1 -0
  225. package/src/adapters/jd/item.yaml +1 -0
  226. package/src/adapters/jike/post.yaml +2 -0
  227. package/src/adapters/jike/topic.yaml +2 -0
  228. package/src/adapters/kdenlive/info.yaml +1 -0
  229. package/src/adapters/kdenlive/render.yaml +1 -0
  230. package/src/adapters/krita/batch.yaml +1 -0
  231. package/src/adapters/krita/convert.yaml +1 -0
  232. package/src/adapters/krita/export.yaml +1 -0
  233. package/src/adapters/krita/info.yaml +1 -0
  234. package/src/adapters/libreoffice/convert.yaml +1 -0
  235. package/src/adapters/libreoffice/print.yaml +1 -0
  236. package/src/adapters/linear/issue-update.yaml +1 -0
  237. package/src/adapters/linux-do/category.yaml +1 -0
  238. package/src/adapters/linux-do/topic.yaml +1 -0
  239. package/src/adapters/macos/calendar-create.yaml +1 -0
  240. package/src/adapters/macos/finder-copy.yaml +1 -0
  241. package/src/adapters/macos/finder-move.yaml +1 -0
  242. package/src/adapters/macos/finder-new-folder.yaml +1 -0
  243. package/src/adapters/macos/finder-tags.yaml +1 -0
  244. package/src/adapters/macos/open.yaml +2 -0
  245. package/src/adapters/macos/screen-recording.yaml +1 -0
  246. package/src/adapters/macos/screenshot.yaml +1 -0
  247. package/src/adapters/macos/spotlight.yaml +1 -0
  248. package/src/adapters/macos/wallpaper.yaml +1 -0
  249. package/src/adapters/medium/article.yaml +1 -0
  250. package/src/adapters/mermaid/render.yaml +1 -0
  251. package/src/adapters/minimax/tts.yaml +1 -0
  252. package/src/adapters/motion-studio/component-get.yaml +1 -0
  253. package/src/adapters/musescore/convert.yaml +2 -0
  254. package/src/adapters/musescore/export.yaml +2 -0
  255. package/src/adapters/musescore/info.yaml +1 -0
  256. package/src/adapters/musescore/instruments.yaml +1 -0
  257. package/src/adapters/musescore/transpose.yaml +1 -0
  258. package/src/adapters/netease-music/playlist.yaml +1 -0
  259. package/src/adapters/netease-music/top.yaml +1 -0
  260. package/src/adapters/notebooklm/get.yaml +1 -0
  261. package/src/adapters/notebooklm/history.yaml +1 -0
  262. package/src/adapters/notebooklm/note-list.yaml +1 -0
  263. package/src/adapters/notebooklm/notes-get.yaml +1 -0
  264. package/src/adapters/notebooklm/open.yaml +1 -0
  265. package/src/adapters/notebooklm/source-fulltext.yaml +1 -0
  266. package/src/adapters/notebooklm/source-get.yaml +1 -0
  267. package/src/adapters/notebooklm/source-guide.yaml +1 -0
  268. package/src/adapters/notebooklm/source-list.yaml +1 -0
  269. package/src/adapters/notebooklm/summary.yaml +1 -0
  270. package/src/adapters/novita/status.yaml +1 -0
  271. package/src/adapters/obs/screenshot.yaml +1 -0
  272. package/src/adapters/obsidian/open.yaml +1 -0
  273. package/src/adapters/ones/login.yaml +1 -0
  274. package/src/adapters/ones/task.yaml +1 -0
  275. package/src/adapters/pandoc/convert.yaml +1 -0
  276. package/src/adapters/paperreview/feedback.yaml +2 -0
  277. package/src/adapters/paperreview/review.yaml +2 -0
  278. package/src/adapters/paperreview/submit.yaml +2 -0
  279. package/src/adapters/pixiv/detail.yaml +1 -0
  280. package/src/adapters/pixiv/download.yaml +2 -0
  281. package/src/adapters/quark/ls.yaml +1 -0
  282. package/src/adapters/reddit/comments.yaml +2 -0
  283. package/src/adapters/renderdoc/capture-list.yaml +1 -0
  284. package/src/adapters/renderdoc/frame-export.yaml +1 -0
  285. package/src/adapters/reuters/article.yaml +2 -0
  286. package/src/adapters/shotcut/info.yaml +1 -0
  287. package/src/adapters/shotcut/render.yaml +1 -0
  288. package/src/adapters/sinablog/article.yaml +1 -0
  289. package/src/adapters/sinablog/user.yaml +1 -0
  290. package/src/adapters/sketch/artboards.yaml +1 -0
  291. package/src/adapters/sketch/export.yaml +1 -0
  292. package/src/adapters/sketch/symbols.yaml +1 -0
  293. package/src/adapters/smzdm/article.yaml +1 -0
  294. package/src/adapters/stackoverflow/question.yaml +1 -0
  295. package/src/adapters/stagehand/wrap-observe.yaml +1 -0
  296. package/src/adapters/steam/wishlist.yaml +1 -0
  297. package/src/adapters/tieba/read.yaml +1 -0
  298. package/src/adapters/tiktok/comment.yaml +1 -0
  299. package/src/adapters/tiktok/like.yaml +1 -0
  300. package/src/adapters/tiktok/save.yaml +1 -0
  301. package/src/adapters/tiktok/unlike.yaml +1 -0
  302. package/src/adapters/tiktok/unsave.yaml +1 -0
  303. package/src/adapters/twitch/streams.yaml +1 -0
  304. package/src/adapters/twitter/quotes.yaml +2 -0
  305. package/src/adapters/twitter/retweets.yaml +1 -0
  306. package/src/adapters/v2ex/replies.yaml +1 -0
  307. package/src/adapters/v2ex/topic.yaml +1 -0
  308. package/src/adapters/vscode/install-ext.yaml +1 -0
  309. package/src/adapters/vscode/open.yaml +1 -0
  310. package/src/adapters/web/read.yaml +1 -0
  311. package/src/adapters/weibo/comments.yaml +1 -0
  312. package/src/adapters/weibo/post.yaml +1 -0
  313. package/src/adapters/weixin/download.yaml +1 -0
  314. package/src/adapters/wiremock/create-stub.yaml +2 -0
  315. package/src/adapters/wiremock/delete-stub.yaml +1 -0
  316. package/src/adapters/wiremock/verify.yaml +1 -0
  317. package/src/adapters/xianyu/item.yaml +1 -0
  318. package/src/adapters/xiaoe/catalog.yaml +1 -0
  319. package/src/adapters/xiaoe/content.yaml +1 -0
  320. package/src/adapters/xiaoe/detail.yaml +1 -0
  321. package/src/adapters/xiaoe/play-url.yaml +1 -0
  322. package/src/adapters/xiaoyuzhou/podcast.yaml +2 -0
  323. package/src/adapters/yollomi/edit.yaml +2 -0
  324. package/src/adapters/yollomi/remove-bg.yaml +2 -0
  325. package/src/adapters/yollomi/restore.yaml +2 -0
  326. package/src/adapters/yollomi/upload.yaml +2 -0
  327. package/src/adapters/yollomi/upscale.yaml +2 -0
  328. package/src/adapters/youtube/playlist.yaml +1 -0
  329. package/src/adapters/yt-dlp/download.yaml +2 -0
  330. package/src/adapters/yt-dlp/extract-audio.yaml +2 -0
  331. package/src/adapters/yt-dlp/info.yaml +1 -0
  332. package/src/adapters/zhihu/answer.yaml +1 -0
  333. package/src/adapters/zhihu/answers.yaml +2 -0
  334. package/src/adapters/zhihu/article.yaml +1 -0
  335. package/src/adapters/zhihu/articles.yaml +2 -0
  336. package/src/adapters/zhihu/collections.yaml +2 -0
  337. package/src/adapters/zhihu/columns.yaml +2 -0
  338. package/src/adapters/zhihu/comment.yaml +1 -0
  339. package/src/adapters/zhihu/download.yaml +1 -0
  340. package/src/adapters/zhihu/followers.yaml +2 -0
  341. package/src/adapters/zhihu/following.yaml +2 -0
  342. package/src/adapters/zhihu/pins.yaml +2 -0
  343. package/src/adapters/zhihu/question.yaml +1 -0
  344. package/src/adapters/zhihu/topic.yaml +1 -0
  345. package/src/adapters/zhihu/topics.yaml +1 -0
  346. package/src/adapters/zhihu/user.yaml +2 -0
  347. package/src/adapters/zoom/join.yaml +1 -0
  348. package/src/adapters/zsxq/search.yaml +1 -0
  349. package/src/adapters/zsxq/topic.yaml +1 -0
  350. package/src/adapters/zsxq/topics.yaml +1 -0
@@ -1,572 +1,10 @@
1
1
  /**
2
- * Streamable HTTP transport for the MCP server (spec 2025-11-25).
2
+ * Streamable HTTP transport compatibility re-export shim.
3
3
  *
4
- * Endpoints:
5
- * GET /mcp — server capabilities and supported protocol version
6
- * POST /mcp — JSON-RPC request (response as JSON or SSE per Accept header)
7
- * DELETE /mcp terminate session (requires MCP-Session-Id)
8
- * GET /health — server status + active session count
9
- *
10
- * Session management via MCP-Session-Id header.
11
- * MCP-Protocol-Version header enforced post-initialization.
12
- * CORS headers on all responses (not just OPTIONS preflight).
13
- *
14
- * Event ID / Last-Event-ID (spec 2025-11-25 §5.3 SSE resumability):
15
- * - Every SSE event carries an `id:` line.
16
- * - On POST requests with Accept: text/event-stream, the server reads
17
- * the `Last-Event-ID` header and logs it so future replay work can
18
- * plug into the same path. Full replay lands in v0.213 once the
19
- * server maintains a persistent per-session event buffer — today
20
- * the current single-response SSE path terminates after one event,
21
- * so there is nothing to replay, but a compliant client can still
22
- * include the header without breaking.
23
- *
24
- * Zero external dependencies — Node.js http + crypto only.
25
- */
26
- import { randomUUID } from "node:crypto";
27
- import { createServer, } from "node:http";
28
- import { VERSION, MCP_PROTOCOL_VERSION } from "../constants.js";
29
- import { handleOAuthRoute, createOAuthMiddleware } from "./oauth.js";
30
- // ── Constants ──────────────────────────────────────────────────────────────
31
- const MAX_BODY = 1_048_576; // 1 MB
32
- const SESSION_TTL_MS = 3_600_000; // 1 hour
33
- const PRUNE_INTERVAL_MS = 300_000; // 5 minutes
34
- const HEARTBEAT_MS = 30_000;
35
- // MCP_PROTOCOL_VERSION imported from ../constants.js (single source of truth)
36
- const ALLOWED_ORIGINS = new Set(["http://localhost", "http://127.0.0.1"]);
37
- const MAX_SESSIONS = 100;
38
- const MAX_ASYNC_TASKS = 200;
39
- // Methods that may produce long-running responses — served as SSE when
40
- // the client accepts text/event-stream.
41
- const STREAMING_METHODS = new Set(["tools/call"]);
42
- const sessions = new Map();
43
- const asyncTasks = new Map();
44
- // ── Helpers ────────────────────────────────────────────────────────────────
45
- /** CORS headers injected into every response. Uses validated origin, not wildcard. */
46
- function corsHeaders(req) {
47
- const origin = req?.headers?.origin;
48
- const allowed = origin && isOriginAllowed(req) ? origin : "http://localhost";
49
- return {
50
- "Access-Control-Allow-Origin": allowed,
51
- "Access-Control-Expose-Headers": "MCP-Session-Id, MCP-Protocol-Version",
52
- };
53
- }
54
- function jsonResponse(res, status, body, extraHeaders, req) {
55
- res.writeHead(status, {
56
- "Content-Type": "application/json",
57
- "Cache-Control": "no-store",
58
- ...corsHeaders(req),
59
- ...extraHeaders,
60
- });
61
- res.end(JSON.stringify(body));
62
- }
63
- function readBody(req) {
64
- return new Promise((resolve, reject) => {
65
- const chunks = [];
66
- let size = 0;
67
- req.on("data", (chunk) => {
68
- size += chunk.length;
69
- if (size > MAX_BODY) {
70
- req.destroy();
71
- reject(new Error("Request too large"));
72
- return;
73
- }
74
- chunks.push(chunk);
75
- });
76
- req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
77
- req.on("error", reject);
78
- });
79
- }
80
- function pruneStaleSessions() {
81
- const cutoff = Date.now() - SESSION_TTL_MS;
82
- for (const [id, session] of sessions) {
83
- if (session.lastSeen < cutoff)
84
- sessions.delete(id);
85
- }
86
- for (const [id, task] of asyncTasks) {
87
- if (task.created < cutoff)
88
- asyncTasks.delete(id);
89
- }
90
- }
91
- /**
92
- * Validate Origin header for DNS rebinding protection.
93
- * Allow requests with no Origin (non-browser clients) or from localhost.
94
- */
95
- function isOriginAllowed(req) {
96
- const origin = req.headers.origin;
97
- if (!origin)
98
- return true; // Non-browser clients omit Origin
99
- // Accept any localhost origin regardless of port
100
- try {
101
- const url = new URL(origin);
102
- if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
103
- return true;
104
- }
105
- }
106
- catch {
107
- // Malformed origin — reject
108
- }
109
- return ALLOWED_ORIGINS.has(origin);
110
- }
111
- function clientAcceptsSSE(req) {
112
- const accept = req.headers.accept ?? "";
113
- return accept.includes("text/event-stream");
114
- }
115
- // ── Async Task Handlers ───────────────────────────────────────────────────
116
- function handleTaskStatus(parsed, sessionId) {
117
- const taskId = parsed.params?.taskId;
118
- if (!taskId) {
119
- return {
120
- jsonrpc: "2.0",
121
- id: parsed.id ?? null,
122
- error: { code: -32602, message: "Missing required param: taskId" },
123
- };
124
- }
125
- const task = asyncTasks.get(taskId);
126
- if (!task || task.sessionId !== sessionId) {
127
- return {
128
- jsonrpc: "2.0",
129
- id: parsed.id ?? null,
130
- error: { code: -32602, message: "Task not found" },
131
- };
132
- }
133
- const resultPayload = {
134
- taskId: task.id,
135
- status: task.status,
136
- };
137
- if (task.progress)
138
- resultPayload.progress = task.progress;
139
- if (task.status === "completed" && task.result) {
140
- resultPayload.result = task.result;
141
- }
142
- if (task.status === "failed" && task.error) {
143
- resultPayload.error = task.error;
144
- }
145
- return { jsonrpc: "2.0", id: parsed.id ?? null, result: resultPayload };
146
- }
147
- function handleTaskCancel(parsed, sessionId) {
148
- const taskId = parsed.params?.taskId;
149
- if (!taskId) {
150
- return {
151
- jsonrpc: "2.0",
152
- id: parsed.id ?? null,
153
- error: { code: -32602, message: "Missing required param: taskId" },
154
- };
155
- }
156
- const task = asyncTasks.get(taskId);
157
- if (!task || task.sessionId !== sessionId) {
158
- return {
159
- jsonrpc: "2.0",
160
- id: parsed.id ?? null,
161
- error: { code: -32602, message: "Task not found" },
162
- };
163
- }
164
- if (task.status === "running") {
165
- task.status = "cancelled";
166
- }
167
- return {
168
- jsonrpc: "2.0",
169
- id: parsed.id ?? null,
170
- result: { taskId: task.id, status: task.status },
171
- };
172
- }
173
- // ── POST /mcp Handler ──────────────────────────────────────────────────────
174
- async function handlePost(req, res, handler) {
175
- // Origin validation
176
- if (!isOriginAllowed(req)) {
177
- jsonResponse(res, 403, {
178
- jsonrpc: "2.0",
179
- id: null,
180
- error: { code: -32600, message: "Forbidden: invalid Origin" },
181
- });
182
- return;
183
- }
184
- // Read and parse body
185
- let body;
186
- try {
187
- body = await readBody(req);
188
- }
189
- catch {
190
- jsonResponse(res, 413, {
191
- jsonrpc: "2.0",
192
- id: null,
193
- error: { code: -32600, message: "Request too large" },
194
- });
195
- return;
196
- }
197
- let parsed;
198
- try {
199
- parsed = JSON.parse(body);
200
- }
201
- catch {
202
- jsonResponse(res, 400, {
203
- jsonrpc: "2.0",
204
- id: null,
205
- error: { code: -32700, message: "Parse error" },
206
- });
207
- return;
208
- }
209
- const sessionId = req.headers["mcp-session-id"];
210
- const isInitialize = parsed.method === "initialize";
211
- // Session validation: post-init requests require a valid session.
212
- // MCP spec: expired/invalid session returns HTTP 404 (not 400).
213
- if (!isInitialize) {
214
- if (!sessionId || !sessions.has(sessionId)) {
215
- jsonResponse(res, 404, {
216
- jsonrpc: "2.0",
217
- id: parsed.id ?? null,
218
- error: { code: -32600, message: "Invalid or missing MCP-Session-Id" },
219
- });
220
- return;
221
- }
222
- // MCP spec 2025-11-25: MCP-Protocol-Version header required post-init.
223
- const clientProtocol = req.headers["mcp-protocol-version"];
224
- if (!clientProtocol) {
225
- jsonResponse(res, 400, {
226
- jsonrpc: "2.0",
227
- id: parsed.id ?? null,
228
- error: {
229
- code: -32600,
230
- message: "Missing MCP-Protocol-Version header",
231
- },
232
- });
233
- return;
234
- }
235
- if (clientProtocol !== MCP_PROTOCOL_VERSION) {
236
- jsonResponse(res, 400, {
237
- jsonrpc: "2.0",
238
- id: parsed.id ?? null,
239
- error: {
240
- code: -32600,
241
- message: `Unsupported protocol version: ${clientProtocol}`,
242
- },
243
- });
244
- return;
245
- }
246
- sessions.get(sessionId).lastSeen = Date.now();
247
- }
248
- // Route async task management methods — these are handled internally,
249
- // never forwarded to the application handler.
250
- if (parsed.method === "tasks/status" && parsed.id != null) {
251
- const headers = {};
252
- if (sessionId)
253
- headers["MCP-Session-Id"] = sessionId;
254
- jsonResponse(res, 200, handleTaskStatus(parsed, sessionId), headers);
255
- return;
256
- }
257
- if (parsed.method === "tasks/cancel" && parsed.id != null) {
258
- const headers = {};
259
- if (sessionId)
260
- headers["MCP-Session-Id"] = sessionId;
261
- jsonResponse(res, 200, handleTaskCancel(parsed, sessionId), headers);
262
- return;
263
- }
264
- // Notification (no id) — respond 204 No Content
265
- if (parsed.id === undefined || parsed.id === null) {
266
- try {
267
- await handler(parsed);
268
- }
269
- catch {
270
- // Notifications have no response — swallow errors
271
- }
272
- res.writeHead(204);
273
- res.end();
274
- return;
275
- }
276
- // Async task mode: client opts in via X-MCP-Async header for tools/call
277
- const wantsAsync = parsed.method === "tools/call" &&
278
- req.headers["x-mcp-async"] === "true" &&
279
- sessionId;
280
- if (wantsAsync) {
281
- if (asyncTasks.size >= MAX_ASYNC_TASKS) {
282
- jsonResponse(res, 503, {
283
- jsonrpc: "2.0",
284
- id: parsed.id ?? null,
285
- error: {
286
- code: -32603,
287
- message: "Server at capacity: too many active tasks",
288
- },
289
- }, undefined, req);
290
- return;
291
- }
292
- const taskId = randomUUID();
293
- const task = {
294
- id: taskId,
295
- sessionId: sessionId,
296
- status: "running",
297
- created: Date.now(),
298
- };
299
- asyncTasks.set(taskId, task);
300
- // If client accepts SSE, keep connection open and stream progress + completion
301
- if (clientAcceptsSSE(req)) {
302
- // Spec 2025-11-25 §5.3: a reconnecting client MAY send Last-Event-ID
303
- // so the server can resume after the last delivered event. v0.212
304
- // does not yet maintain a persistent replay buffer (the SSE path is
305
- // one-shot per POST), so we accept and log the header for
306
- // forward-compat testing without advertising resumability. Full
307
- // replay is tracked in docs/ROADMAP.md > v0.213.
308
- const lastEventId = req.headers["last-event-id"];
309
- if (lastEventId && process.env.UNICLI_DEBUG) {
310
- process.stderr.write(`mcp: Last-Event-ID=${lastEventId} received (replay lands in v0.213)\n`);
311
- }
312
- res.writeHead(202, {
313
- "Content-Type": "text/event-stream",
314
- "Cache-Control": "no-cache",
315
- Connection: "keep-alive",
316
- "MCP-Session-Id": sessionId,
317
- ...corsHeaders(req),
318
- });
319
- // Send the accepted event immediately. Every SSE event now carries
320
- // an explicit `id:` so a future replay buffer can anchor to it.
321
- const acceptedId = randomUUID();
322
- res.write(`id: ${acceptedId}\nevent: accepted\ndata: ${JSON.stringify({ taskId, status: "running" })}\n\n`);
323
- // Execute the handler in the background
324
- Promise.resolve(handler(parsed)).then((result) => {
325
- if (task.status === "cancelled") {
326
- if (!res.writableEnded) {
327
- res.write(`id: ${randomUUID()}\nevent: cancelled\ndata: ${JSON.stringify({ taskId })}\n\n`);
328
- res.end();
329
- }
330
- return;
331
- }
332
- task.status = "completed";
333
- task.result = result;
334
- if (!res.writableEnded) {
335
- res.write(`id: ${randomUUID()}\nevent: complete\ndata: ${JSON.stringify({ taskId, result })}\n\n`);
336
- res.end();
337
- }
338
- }, (err) => {
339
- if (task.status === "cancelled") {
340
- if (!res.writableEnded) {
341
- res.write(`id: ${randomUUID()}\nevent: cancelled\ndata: ${JSON.stringify({ taskId })}\n\n`);
342
- res.end();
343
- }
344
- return;
345
- }
346
- const msg = err instanceof Error ? err.message : String(err);
347
- task.status = "failed";
348
- task.error = msg;
349
- if (!res.writableEnded) {
350
- res.write(`id: ${randomUUID()}\nevent: error\ndata: ${JSON.stringify({ taskId, error: msg })}\n\n`);
351
- res.end();
352
- }
353
- });
354
- return;
355
- }
356
- // Non-SSE async: return 202 with task ID immediately, execute in background
357
- Promise.resolve(handler(parsed)).then((result) => {
358
- if (task.status === "cancelled")
359
- return;
360
- task.status = "completed";
361
- task.result = result;
362
- }, (err) => {
363
- if (task.status === "cancelled")
364
- return;
365
- const msg = err instanceof Error ? err.message : String(err);
366
- task.status = "failed";
367
- task.error = msg;
368
- });
369
- jsonResponse(res, 202, {
370
- jsonrpc: "2.0",
371
- id: parsed.id,
372
- result: { _meta: { taskId, status: "running" } },
373
- }, { "MCP-Session-Id": sessionId, ...corsHeaders(req) }, req);
374
- return;
375
- }
376
- // Execute the handler (synchronous path)
377
- let response;
378
- try {
379
- response = await handler(parsed);
380
- // Handler returns null for notifications — should not reach here due to
381
- // the check above, but guard anyway.
382
- if (!response) {
383
- res.writeHead(204);
384
- res.end();
385
- return;
386
- }
387
- }
388
- catch (err) {
389
- const message = err instanceof Error ? err.message : String(err);
390
- jsonResponse(res, 500, {
391
- jsonrpc: "2.0",
392
- id: parsed.id ?? null,
393
- error: { code: -32603, message: `Internal error: ${message}` },
394
- });
395
- return;
396
- }
397
- // For initialize: create session and return MCP-Session-Id
398
- if (isInitialize) {
399
- if (sessions.size >= MAX_SESSIONS) {
400
- jsonResponse(res, 503, {
401
- jsonrpc: "2.0",
402
- id: parsed.id ?? null,
403
- error: {
404
- code: -32603,
405
- message: "Server at capacity: too many active sessions",
406
- },
407
- }, undefined, req);
408
- return;
409
- }
410
- const newSessionId = randomUUID();
411
- sessions.set(newSessionId, {
412
- created: Date.now(),
413
- lastSeen: Date.now(),
414
- protocolVersion: MCP_PROTOCOL_VERSION,
415
- });
416
- jsonResponse(res, 200, response, {
417
- "MCP-Session-Id": newSessionId,
418
- "MCP-Protocol-Version": MCP_PROTOCOL_VERSION,
419
- });
420
- return;
421
- }
422
- // For streaming-eligible methods: respond with SSE if client accepts it
423
- if (STREAMING_METHODS.has(parsed.method) && clientAcceptsSSE(req)) {
424
- res.writeHead(200, {
425
- "Content-Type": "text/event-stream",
426
- "Cache-Control": "no-cache",
427
- Connection: "keep-alive",
428
- "MCP-Session-Id": sessionId,
429
- ...corsHeaders(req),
430
- });
431
- // Send the response as an SSE event
432
- const eventId = randomUUID();
433
- res.write(`id: ${eventId}\nevent: message\ndata: ${JSON.stringify(response)}\n\n`);
434
- // Close the stream after delivering the response
435
- res.end();
436
- return;
437
- }
438
- // Default: respond with JSON
439
- const headers = {};
440
- if (sessionId)
441
- headers["MCP-Session-Id"] = sessionId;
442
- jsonResponse(res, 200, response, headers);
443
- }
444
- // ── DELETE /mcp Handler ────────────────────────────────────────────────────
445
- function handleDelete(req, res) {
446
- const sessionId = req.headers["mcp-session-id"];
447
- // MCP spec: expired/invalid session returns HTTP 404 (not 400).
448
- if (!sessionId || !sessions.has(sessionId)) {
449
- jsonResponse(res, 404, {
450
- jsonrpc: "2.0",
451
- id: null,
452
- error: { code: -32600, message: "Invalid or missing MCP-Session-Id" },
453
- });
454
- return;
455
- }
456
- sessions.delete(sessionId);
457
- res.writeHead(204);
458
- res.end();
459
- }
460
- // ── Public API ─────────────────────────────────────────────────────────────
461
- /**
462
- * Start the MCP Streamable HTTP transport server (spec 2025-11-25).
463
- *
464
- * GET /mcp returns server capabilities. POST /mcp handles JSON-RPC.
465
- * DELETE /mcp terminates sessions. GET /health returns server info.
4
+ * v0.213.3 P3 split the transport into `streamable-http/{session,
5
+ * handle-post, index}.ts`. This file preserves the old import path
6
+ * (`./streamable-http.js`) so existing tests and external consumers
7
+ * keep working without churn. All logic lives in `streamable-http/`.
466
8
  */
467
- export async function startStreamableHttp(port, handler, options) {
468
- const oauthMiddleware = options?.auth ? createOAuthMiddleware() : null;
469
- // Periodic session pruning
470
- const pruneTimer = setInterval(pruneStaleSessions, PRUNE_INTERVAL_MS);
471
- pruneTimer.unref(); // Do not keep process alive for pruning
472
- const server = createServer((req, res) => {
473
- const method = req.method ?? "";
474
- const pathname = (req.url ?? "/").split("?")[0];
475
- // CORS preflight — use same origin validation as responses
476
- if (method === "OPTIONS") {
477
- const origin = req.headers.origin;
478
- const allowedOrigin = origin && isOriginAllowed(req) ? origin : "http://localhost";
479
- res.writeHead(204, {
480
- "Access-Control-Allow-Origin": allowedOrigin,
481
- "Access-Control-Allow-Methods": "GET, POST, DELETE, OPTIONS",
482
- "Access-Control-Allow-Headers": "Content-Type, MCP-Session-Id, MCP-Protocol-Version, Authorization, Accept, X-MCP-Async",
483
- "Access-Control-Expose-Headers": "MCP-Session-Id, MCP-Protocol-Version",
484
- "Access-Control-Max-Age": "86400",
485
- });
486
- res.end();
487
- return;
488
- }
489
- // OAuth routes — always public when auth is enabled
490
- if (options?.auth && handleOAuthRoute(req, res))
491
- return;
492
- // Health check
493
- if (method === "GET" && (pathname === "/health" || pathname === "/")) {
494
- jsonResponse(res, 200, {
495
- status: "ok",
496
- transport: "streamable-http",
497
- version: VERSION,
498
- sessions: sessions.size,
499
- protocolVersion: MCP_PROTOCOL_VERSION,
500
- });
501
- return;
502
- }
503
- // Main MCP endpoint
504
- if (pathname === "/mcp") {
505
- // OAuth middleware — block unauthenticated requests
506
- if (oauthMiddleware?.(req, res))
507
- return;
508
- // GET /mcp — return server metadata and supported protocol version.
509
- if (method === "GET") {
510
- jsonResponse(res, 200, {
511
- protocolVersion: MCP_PROTOCOL_VERSION,
512
- serverInfo: { name: "unicli", version: VERSION },
513
- capabilities: {},
514
- });
515
- return;
516
- }
517
- if (method === "POST") {
518
- handlePost(req, res, handler).catch(() => {
519
- if (!res.writableEnded) {
520
- jsonResponse(res, 500, {
521
- jsonrpc: "2.0",
522
- id: null,
523
- error: { code: -32603, message: "Unexpected server error" },
524
- });
525
- }
526
- });
527
- return;
528
- }
529
- if (method === "DELETE") {
530
- handleDelete(req, res);
531
- return;
532
- }
533
- }
534
- // Not found
535
- res.writeHead(404, { "Content-Type": "application/json" });
536
- res.end(JSON.stringify({ error: "Not found" }));
537
- });
538
- server.on("close", () => {
539
- clearInterval(pruneTimer);
540
- sessions.clear();
541
- asyncTasks.clear();
542
- });
543
- await new Promise((resolve, reject) => {
544
- server.once("error", reject);
545
- server.listen(port, "127.0.0.1", () => {
546
- server.off("error", reject);
547
- resolve();
548
- });
549
- });
550
- // Resolve the actually-bound port so callers that pass `port: 0` (let the
551
- // OS pick a free ephemeral port — used by tests to avoid Windows TIME_WAIT
552
- // collisions) get the real port back.
553
- const addr = server.address();
554
- const boundPort = addr && typeof addr === "object" ? addr.port : port;
555
- process.stderr.write(`unicli MCP server v${VERSION} — Streamable HTTP transport on http://127.0.0.1:${boundPort}\n` +
556
- ` MCP endpoint: GET/POST/DELETE http://127.0.0.1:${boundPort}/mcp\n` +
557
- ` Health check: GET http://127.0.0.1:${boundPort}/health\n` +
558
- ` Protocol: ${MCP_PROTOCOL_VERSION}\n`);
559
- return boundPort;
560
- }
561
- // Exported for testing
562
- export const _test = {
563
- sessions,
564
- asyncTasks,
565
- pruneStaleSessions,
566
- isOriginAllowed,
567
- ALLOWED_ORIGINS,
568
- SESSION_TTL_MS,
569
- HEARTBEAT_MS,
570
- MCP_PROTOCOL_VERSION,
571
- };
9
+ export { startStreamableHttp, _test } from "./streamable-http/index.js";
572
10
  //# sourceMappingURL=streamable-http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"streamable-http.js","sourceRoot":"","sources":["../../src/mcp/streamable-http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streamable-http.js","sourceRoot":"","sources":["../../src/mcp/streamable-http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * MCP tool-definition builders.
3
+ *
4
+ * Three build modes:
5
+ * 1. `buildDefaultTools()` — 4 meta-tools (~200 tokens handshake)
6
+ * 2. `buildExpandedTools()` — one tool per adapter command (~160K tokens)
7
+ * 3. `buildDeferredTools()` — stubs for ToolSearch/deferred clients (~8K)
8
+ *
9
+ * Extracted from `server.ts` to keep that file's responsibility limited to
10
+ * JSON-RPC transport wiring.
11
+ */
12
+ import type { AdapterManifest, AdapterCommand } from "../types.js";
13
+ import { type JsonSchemaObject } from "./schema.js";
14
+ export interface McpToolAnnotations {
15
+ readOnlyHint?: boolean;
16
+ destructiveHint?: boolean;
17
+ idempotentHint?: boolean;
18
+ openWorldHint?: boolean;
19
+ }
20
+ export interface McpTool {
21
+ name: string;
22
+ description: string;
23
+ inputSchema: JsonSchemaObject;
24
+ outputSchema?: JsonSchemaObject;
25
+ _meta?: Record<string, unknown>;
26
+ annotations?: McpToolAnnotations;
27
+ }
28
+ export interface ExpandedEntry {
29
+ adapter: AdapterManifest;
30
+ cmdName: string;
31
+ cmd: AdapterCommand;
32
+ }
33
+ /**
34
+ * Reverse-lookup registry for expanded-mode tool calls. Maps the normalized
35
+ * tool name to the resolved adapter + original command name.
36
+ */
37
+ export declare const expandedRegistry: Map<string, ExpandedEntry>;
38
+ export declare const DEFAULT_TOOL_NAMES: ReadonlySet<string>;
39
+ export declare function buildDefaultTools(): McpTool[];
40
+ /**
41
+ * Build the expanded tool set: 4 default meta-tools + one full tool per
42
+ * adapter command. Clients see the complete Uni-CLI surface area.
43
+ *
44
+ * Token cost: ~160K for 956 commands. Use only when the client can handle it.
45
+ */
46
+ export declare function buildExpandedTools(): McpTool[];
47
+ /**
48
+ * Build deferred tool set: 4 default meta-tools with full schemas, plus
49
+ * lightweight stubs for all adapter commands (name + searchHint only,
50
+ * minimal inputSchema). Clients like Claude Code's ToolSearch can discover
51
+ * tools by searchHint and then call them — the handler resolves the full
52
+ * command at call time via the expandedRegistry.
53
+ *
54
+ * Token cost: ~8K (vs ~160K for expanded). 95% reduction.
55
+ */
56
+ export declare function buildDeferredTools(): McpTool[];
57
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,KAAK,gBAAgB,EAKtB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,cAAc,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,4BAAmC,CAAC;AAEjE,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAMjD,CAAC;AAEH,wBAAgB,iBAAiB,IAAI,OAAO,EAAE,CA0H7C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,EAAE,CAwC9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,EAAE,CAqD9C"}