@zenalexa/unicli 0.213.1 → 0.215.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 (512) hide show
  1. package/AGENTS.md +10 -10
  2. package/README.md +40 -27
  3. package/README.zh-CN.md +36 -36
  4. package/dist/adapters/_electron/desktop-shared.d.ts +12 -0
  5. package/dist/adapters/_electron/desktop-shared.d.ts.map +1 -0
  6. package/dist/adapters/_electron/desktop-shared.js +312 -0
  7. package/dist/adapters/_electron/desktop-shared.js.map +1 -0
  8. package/dist/adapters/electron-desktop/electron-desktop.d.ts +9 -0
  9. package/dist/adapters/electron-desktop/electron-desktop.d.ts.map +1 -0
  10. package/dist/adapters/electron-desktop/electron-desktop.js +56 -0
  11. package/dist/adapters/electron-desktop/electron-desktop.js.map +1 -0
  12. package/dist/browser/adapter-authoring.d.ts +20 -0
  13. package/dist/browser/adapter-authoring.d.ts.map +1 -0
  14. package/dist/browser/adapter-authoring.js +68 -0
  15. package/dist/browser/adapter-authoring.js.map +1 -0
  16. package/dist/browser/analyze.d.ts +54 -0
  17. package/dist/browser/analyze.d.ts.map +1 -0
  18. package/dist/browser/analyze.js +205 -0
  19. package/dist/browser/analyze.js.map +1 -0
  20. package/dist/browser/bridge.d.ts +1 -1
  21. package/dist/browser/bridge.d.ts.map +1 -1
  22. package/dist/browser/bridge.js +2 -0
  23. package/dist/browser/bridge.js.map +1 -1
  24. package/dist/browser/daemon-client.d.ts.map +1 -1
  25. package/dist/browser/daemon-client.js +12 -1
  26. package/dist/browser/daemon-client.js.map +1 -1
  27. package/dist/browser/network-cache.d.ts +58 -0
  28. package/dist/browser/network-cache.d.ts.map +1 -0
  29. package/dist/browser/network-cache.js +146 -0
  30. package/dist/browser/network-cache.js.map +1 -0
  31. package/dist/browser/page.d.ts +1 -1
  32. package/dist/browser/page.d.ts.map +1 -1
  33. package/dist/browser/page.js +2 -1
  34. package/dist/browser/page.js.map +1 -1
  35. package/dist/browser/protocol.d.ts +6 -2
  36. package/dist/browser/protocol.d.ts.map +1 -1
  37. package/dist/browser/site-memory.d.ts +57 -0
  38. package/dist/browser/site-memory.d.ts.map +1 -0
  39. package/dist/browser/site-memory.js +127 -0
  40. package/dist/browser/site-memory.js.map +1 -0
  41. package/dist/browser/verify-fixture.d.ts +30 -0
  42. package/dist/browser/verify-fixture.d.ts.map +1 -0
  43. package/dist/browser/verify-fixture.js +168 -0
  44. package/dist/browser/verify-fixture.js.map +1 -0
  45. package/dist/browser/workspace.d.ts +8 -0
  46. package/dist/browser/workspace.d.ts.map +1 -0
  47. package/dist/browser/workspace.js +15 -0
  48. package/dist/browser/workspace.js.map +1 -0
  49. package/dist/cli.d.ts.map +1 -1
  50. package/dist/cli.js +11 -2
  51. package/dist/cli.js.map +1 -1
  52. package/dist/commands/browser-adapter-authoring.d.ts +3 -0
  53. package/dist/commands/browser-adapter-authoring.d.ts.map +1 -0
  54. package/dist/commands/browser-adapter-authoring.js +206 -0
  55. package/dist/commands/browser-adapter-authoring.js.map +1 -0
  56. package/dist/commands/browser-authoring-operator.d.ts +3 -0
  57. package/dist/commands/browser-authoring-operator.d.ts.map +1 -0
  58. package/dist/commands/browser-authoring-operator.js +110 -0
  59. package/dist/commands/browser-authoring-operator.js.map +1 -0
  60. package/dist/commands/browser-operator-runtime.d.ts +38 -0
  61. package/dist/commands/browser-operator-runtime.d.ts.map +1 -0
  62. package/dist/commands/browser-operator-runtime.js +281 -0
  63. package/dist/commands/browser-operator-runtime.js.map +1 -0
  64. package/dist/commands/browser-operator.d.ts +6 -0
  65. package/dist/commands/browser-operator.d.ts.map +1 -0
  66. package/dist/commands/browser-operator.js +374 -0
  67. package/dist/commands/browser-operator.js.map +1 -0
  68. package/dist/commands/browser.d.ts.map +1 -1
  69. package/dist/commands/browser.js +72 -1
  70. package/dist/commands/browser.js.map +1 -1
  71. package/dist/commands/daemon.d.ts.map +1 -1
  72. package/dist/commands/daemon.js +40 -4
  73. package/dist/commands/daemon.js.map +1 -1
  74. package/dist/commands/describe.d.ts +26 -0
  75. package/dist/commands/describe.d.ts.map +1 -0
  76. package/dist/commands/describe.js +230 -0
  77. package/dist/commands/describe.js.map +1 -0
  78. package/dist/commands/dev.js +1 -1
  79. package/dist/commands/dev.js.map +1 -1
  80. package/dist/commands/dispatch.d.ts +14 -3
  81. package/dist/commands/dispatch.d.ts.map +1 -1
  82. package/dist/commands/dispatch.js +141 -81
  83. package/dist/commands/dispatch.js.map +1 -1
  84. package/dist/commands/explore.d.ts.map +1 -1
  85. package/dist/commands/explore.js +4 -1
  86. package/dist/commands/explore.js.map +1 -1
  87. package/dist/commands/generate.d.ts.map +1 -1
  88. package/dist/commands/generate.js +4 -1
  89. package/dist/commands/generate.js.map +1 -1
  90. package/dist/commands/health.d.ts.map +1 -1
  91. package/dist/commands/health.js +1 -1
  92. package/dist/commands/health.js.map +1 -1
  93. package/dist/commands/mcp.d.ts.map +1 -1
  94. package/dist/commands/mcp.js +14 -14
  95. package/dist/commands/mcp.js.map +1 -1
  96. package/dist/commands/migrate-schema.d.ts.map +1 -1
  97. package/dist/commands/migrate-schema.js +10 -0
  98. package/dist/commands/migrate-schema.js.map +1 -1
  99. package/dist/commands/operate.d.ts +4 -3
  100. package/dist/commands/operate.d.ts.map +1 -1
  101. package/dist/commands/operate.js +8 -483
  102. package/dist/commands/operate.js.map +1 -1
  103. package/dist/commands/record.d.ts.map +1 -1
  104. package/dist/commands/record.js +2 -1
  105. package/dist/commands/record.js.map +1 -1
  106. package/dist/commands/search.js +1 -1
  107. package/dist/commands/search.js.map +1 -1
  108. package/dist/commands/skills.d.ts.map +1 -1
  109. package/dist/commands/skills.js +2 -2
  110. package/dist/commands/skills.js.map +1 -1
  111. package/dist/commands/synthesize.d.ts.map +1 -1
  112. package/dist/commands/synthesize.js +33 -3
  113. package/dist/commands/synthesize.js.map +1 -1
  114. package/dist/constants.d.ts +2 -0
  115. package/dist/constants.d.ts.map +1 -1
  116. package/dist/constants.js +2 -0
  117. package/dist/constants.js.map +1 -1
  118. package/dist/discovery/aliases.d.ts.map +1 -1
  119. package/dist/discovery/aliases.js +76 -1
  120. package/dist/discovery/aliases.js.map +1 -1
  121. package/dist/discovery/loader.d.ts +8 -0
  122. package/dist/discovery/loader.d.ts.map +1 -1
  123. package/dist/discovery/loader.js +25 -2
  124. package/dist/discovery/loader.js.map +1 -1
  125. package/dist/electron-apps.d.ts +22 -0
  126. package/dist/electron-apps.d.ts.map +1 -1
  127. package/dist/electron-apps.js +324 -0
  128. package/dist/electron-apps.js.map +1 -1
  129. package/dist/engine/args.d.ts +83 -0
  130. package/dist/engine/args.d.ts.map +1 -0
  131. package/dist/engine/args.js +260 -0
  132. package/dist/engine/args.js.map +1 -0
  133. package/dist/engine/download.d.ts.map +1 -1
  134. package/dist/engine/download.js +12 -5
  135. package/dist/engine/download.js.map +1 -1
  136. package/dist/engine/executor.d.ts +20 -1
  137. package/dist/engine/executor.d.ts.map +1 -1
  138. package/dist/engine/executor.js +11 -2
  139. package/dist/engine/executor.js.map +1 -1
  140. package/dist/engine/harden.d.ts +48 -0
  141. package/dist/engine/harden.d.ts.map +1 -0
  142. package/dist/engine/harden.js +327 -0
  143. package/dist/engine/harden.js.map +1 -0
  144. package/dist/engine/invoke.d.ts +16 -0
  145. package/dist/engine/invoke.d.ts.map +1 -0
  146. package/dist/engine/invoke.js +15 -0
  147. package/dist/engine/invoke.js.map +1 -0
  148. package/dist/engine/kernel/compile.d.ts +30 -0
  149. package/dist/engine/kernel/compile.d.ts.map +1 -0
  150. package/dist/engine/kernel/compile.js +167 -0
  151. package/dist/engine/kernel/compile.js.map +1 -0
  152. package/dist/engine/kernel/execute.d.ts +35 -0
  153. package/dist/engine/kernel/execute.d.ts.map +1 -0
  154. package/dist/engine/kernel/execute.js +221 -0
  155. package/dist/engine/kernel/execute.js.map +1 -0
  156. package/dist/engine/kernel/types.d.ts +49 -0
  157. package/dist/engine/kernel/types.d.ts.map +1 -0
  158. package/dist/engine/kernel/types.js +9 -0
  159. package/dist/engine/kernel/types.js.map +1 -0
  160. package/dist/engine/kernel/ulid.d.ts +21 -0
  161. package/dist/engine/kernel/ulid.d.ts.map +1 -0
  162. package/dist/engine/kernel/ulid.js +76 -0
  163. package/dist/engine/kernel/ulid.js.map +1 -0
  164. package/dist/engine/repair/engine.js +2 -2
  165. package/dist/engine/repair/engine.js.map +1 -1
  166. package/dist/engine/steps/desktop-ax.d.ts +10 -0
  167. package/dist/engine/steps/desktop-ax.d.ts.map +1 -1
  168. package/dist/engine/steps/desktop-ax.js +20 -0
  169. package/dist/engine/steps/desktop-ax.js.map +1 -1
  170. package/dist/engine/steps/exec.d.ts +1 -1
  171. package/dist/engine/steps/exec.d.ts.map +1 -1
  172. package/dist/engine/steps/exec.js +20 -1
  173. package/dist/engine/steps/exec.js.map +1 -1
  174. package/dist/engine/steps/write-temp.js +1 -1
  175. package/dist/engine/steps/write-temp.js.map +1 -1
  176. package/dist/engine/template.d.ts.map +1 -1
  177. package/dist/engine/template.js +21 -2
  178. package/dist/engine/template.js.map +1 -1
  179. package/dist/manifest-compact.txt +8 -7
  180. package/dist/manifest-search.json +1 -1
  181. package/dist/manifest.json +2161 -171
  182. package/dist/mcp/dispatch.d.ts +46 -0
  183. package/dist/mcp/dispatch.d.ts.map +1 -0
  184. package/dist/mcp/dispatch.js +109 -0
  185. package/dist/mcp/dispatch.js.map +1 -0
  186. package/dist/mcp/handler.d.ts +30 -0
  187. package/dist/mcp/handler.d.ts.map +1 -0
  188. package/dist/mcp/handler.js +293 -0
  189. package/dist/mcp/handler.js.map +1 -0
  190. package/dist/mcp/http-transport.d.ts +16 -0
  191. package/dist/mcp/http-transport.d.ts.map +1 -0
  192. package/dist/mcp/http-transport.js +121 -0
  193. package/dist/mcp/http-transport.js.map +1 -0
  194. package/dist/mcp/server.d.ts +17 -33
  195. package/dist/mcp/server.d.ts.map +1 -1
  196. package/dist/mcp/server.js +31 -742
  197. package/dist/mcp/server.js.map +1 -1
  198. package/dist/mcp/sse-transport.js.map +1 -1
  199. package/dist/mcp/streamable-http/handle-post.d.ts +23 -0
  200. package/dist/mcp/streamable-http/handle-post.d.ts.map +1 -0
  201. package/dist/mcp/streamable-http/handle-post.js +357 -0
  202. package/dist/mcp/streamable-http/handle-post.js.map +1 -0
  203. package/dist/mcp/streamable-http/index.d.ts +45 -0
  204. package/dist/mcp/streamable-http/index.d.ts.map +1 -0
  205. package/dist/mcp/streamable-http/index.js +150 -0
  206. package/dist/mcp/streamable-http/index.js.map +1 -0
  207. package/dist/mcp/streamable-http/session.d.ts +85 -0
  208. package/dist/mcp/streamable-http/session.d.ts.map +1 -0
  209. package/dist/mcp/streamable-http/session.js +104 -0
  210. package/dist/mcp/streamable-http/session.js.map +1 -0
  211. package/dist/mcp/streamable-http.d.ts +7 -85
  212. package/dist/mcp/streamable-http.d.ts.map +1 -1
  213. package/dist/mcp/streamable-http.js +6 -568
  214. package/dist/mcp/streamable-http.js.map +1 -1
  215. package/dist/mcp/tools.d.ts +58 -0
  216. package/dist/mcp/tools.d.ts.map +1 -0
  217. package/dist/mcp/tools.js +241 -0
  218. package/dist/mcp/tools.js.map +1 -0
  219. package/dist/output/envelope.d.ts +30 -5
  220. package/dist/output/envelope.d.ts.map +1 -1
  221. package/dist/output/envelope.js +7 -5
  222. package/dist/output/envelope.js.map +1 -1
  223. package/dist/output/formatter.d.ts +2 -2
  224. package/dist/output/formatter.js +3 -3
  225. package/dist/output/formatter.js.map +1 -1
  226. package/dist/output/next-actions.d.ts +18 -0
  227. package/dist/output/next-actions.d.ts.map +1 -0
  228. package/dist/output/next-actions.js +64 -0
  229. package/dist/output/next-actions.js.map +1 -0
  230. package/dist/output/projection.d.ts +93 -0
  231. package/dist/output/projection.d.ts.map +1 -0
  232. package/dist/output/projection.js +255 -0
  233. package/dist/output/projection.js.map +1 -0
  234. package/dist/protocol/acp-helpers.d.ts +32 -0
  235. package/dist/protocol/acp-helpers.d.ts.map +1 -0
  236. package/dist/protocol/acp-helpers.js +175 -0
  237. package/dist/protocol/acp-helpers.js.map +1 -0
  238. package/dist/protocol/acp.d.ts +2 -27
  239. package/dist/protocol/acp.d.ts.map +1 -1
  240. package/dist/protocol/acp.js +7 -170
  241. package/dist/protocol/acp.js.map +1 -1
  242. package/dist/transport/adapters/cua.d.ts +9 -10
  243. package/dist/transport/adapters/cua.d.ts.map +1 -1
  244. package/dist/transport/adapters/cua.js +22 -24
  245. package/dist/transport/adapters/cua.js.map +1 -1
  246. package/dist/transport/adapters/desktop-atspi.d.ts +1 -1
  247. package/dist/transport/adapters/desktop-atspi.js +2 -2
  248. package/dist/transport/adapters/desktop-atspi.js.map +1 -1
  249. package/dist/transport/adapters/desktop-ax-background-click-swift.d.ts +11 -0
  250. package/dist/transport/adapters/desktop-ax-background-click-swift.d.ts.map +1 -0
  251. package/dist/transport/adapters/desktop-ax-background-click-swift.js +136 -0
  252. package/dist/transport/adapters/desktop-ax-background-click-swift.js.map +1 -0
  253. package/dist/transport/adapters/desktop-ax-background-click.d.ts +4 -0
  254. package/dist/transport/adapters/desktop-ax-background-click.d.ts.map +1 -0
  255. package/dist/transport/adapters/desktop-ax-background-click.js +70 -0
  256. package/dist/transport/adapters/desktop-ax-background-click.js.map +1 -0
  257. package/dist/transport/adapters/desktop-ax-swift.d.ts +56 -0
  258. package/dist/transport/adapters/desktop-ax-swift.d.ts.map +1 -0
  259. package/dist/transport/adapters/desktop-ax-swift.js +458 -0
  260. package/dist/transport/adapters/desktop-ax-swift.js.map +1 -0
  261. package/dist/transport/adapters/desktop-ax.d.ts +14 -0
  262. package/dist/transport/adapters/desktop-ax.d.ts.map +1 -1
  263. package/dist/transport/adapters/desktop-ax.js +262 -32
  264. package/dist/transport/adapters/desktop-ax.js.map +1 -1
  265. package/dist/transport/adapters/desktop-uia.d.ts +1 -1
  266. package/dist/transport/adapters/desktop-uia.js +2 -2
  267. package/dist/transport/adapters/desktop-uia.js.map +1 -1
  268. package/dist/transport/adapters/http.js +1 -1
  269. package/dist/transport/adapters/http.js.map +1 -1
  270. package/dist/transport/capability.d.ts +1 -1
  271. package/dist/transport/capability.d.ts.map +1 -1
  272. package/dist/transport/capability.js +6 -1
  273. package/dist/transport/capability.js.map +1 -1
  274. package/dist/types.d.ts +32 -0
  275. package/dist/types.d.ts.map +1 -1
  276. package/dist/types.js.map +1 -1
  277. package/package.json +14 -3
  278. package/src/adapters/1688/item.yaml +1 -0
  279. package/src/adapters/1688/store.yaml +1 -0
  280. package/src/adapters/36kr/article.yaml +1 -0
  281. package/src/adapters/_electron/desktop-shared.ts +383 -0
  282. package/src/adapters/amazon/bestsellers.yaml +2 -0
  283. package/src/adapters/amazon/movers-shakers.yaml +2 -0
  284. package/src/adapters/amazon/new-releases.yaml +2 -0
  285. package/src/adapters/amazon/rankings.yaml +1 -0
  286. package/src/adapters/apple-podcasts/episodes.yaml +1 -0
  287. package/src/adapters/arxiv/paper.yaml +1 -0
  288. package/src/adapters/audacity/convert.yaml +1 -0
  289. package/src/adapters/audacity/effects.yaml +1 -0
  290. package/src/adapters/audacity/info.yaml +1 -0
  291. package/src/adapters/audacity/mix.yaml +1 -0
  292. package/src/adapters/audacity/normalize.yaml +1 -0
  293. package/src/adapters/audacity/spectrogram.yaml +1 -0
  294. package/src/adapters/audacity/split-channels.yaml +1 -0
  295. package/src/adapters/audacity/trim.yaml +1 -0
  296. package/src/adapters/bilibili/favorites.yaml +1 -0
  297. package/src/adapters/blender/animation.yaml +2 -0
  298. package/src/adapters/blender/camera.yaml +1 -0
  299. package/src/adapters/blender/convert.yaml +1 -0
  300. package/src/adapters/blender/export.yaml +1 -0
  301. package/src/adapters/blender/import.yaml +1 -0
  302. package/src/adapters/blender/info.yaml +1 -0
  303. package/src/adapters/blender/lighting.yaml +1 -0
  304. package/src/adapters/blender/materials.yaml +1 -0
  305. package/src/adapters/blender/objects.yaml +1 -0
  306. package/src/adapters/blender/render.yaml +2 -0
  307. package/src/adapters/blender/scene.yaml +1 -0
  308. package/src/adapters/blender/screenshot.yaml +2 -0
  309. package/src/adapters/blender/script.yaml +1 -0
  310. package/src/adapters/boss/detail.yaml +2 -0
  311. package/src/adapters/cloudcompare/info.yaml +1 -0
  312. package/src/adapters/coupang/add-to-cart.yaml +1 -0
  313. package/src/adapters/ctrip/search.yaml +1 -0
  314. package/src/adapters/docker/build.yaml +1 -1
  315. package/src/adapters/docker/images.yaml +1 -1
  316. package/src/adapters/docker/logs.yaml +1 -1
  317. package/src/adapters/docker/networks.yaml +1 -1
  318. package/src/adapters/docker/ps.yaml +1 -1
  319. package/src/adapters/docker/run.yaml +1 -1
  320. package/src/adapters/docker/volumes.yaml +1 -1
  321. package/src/adapters/douban/download.yaml +1 -0
  322. package/src/adapters/douban/photos.yaml +1 -0
  323. package/src/adapters/douban/subject.yaml +2 -0
  324. package/src/adapters/doubao-web/detail.yaml +1 -0
  325. package/src/adapters/doubao-web/meeting-summary.yaml +1 -0
  326. package/src/adapters/doubao-web/meeting-transcript.yaml +1 -0
  327. package/src/adapters/drawio/export.yaml +2 -0
  328. package/src/adapters/electron-desktop/electron-desktop.ts +57 -0
  329. package/src/adapters/facebook/join-group.yaml +2 -0
  330. package/src/adapters/ffmpeg/compress.yaml +2 -0
  331. package/src/adapters/ffmpeg/concat.yaml +1 -0
  332. package/src/adapters/ffmpeg/convert.yaml +1 -0
  333. package/src/adapters/ffmpeg/extract-audio.yaml +2 -0
  334. package/src/adapters/ffmpeg/gif.yaml +2 -0
  335. package/src/adapters/ffmpeg/normalize.yaml +2 -0
  336. package/src/adapters/ffmpeg/probe.yaml +1 -0
  337. package/src/adapters/ffmpeg/resize.yaml +2 -0
  338. package/src/adapters/ffmpeg/subtitles.yaml +2 -0
  339. package/src/adapters/ffmpeg/thumbnail.yaml +2 -0
  340. package/src/adapters/ffmpeg/trim.yaml +2 -0
  341. package/src/adapters/freecad/assembly.yaml +1 -0
  342. package/src/adapters/freecad/bom.yaml +1 -0
  343. package/src/adapters/freecad/boolean.yaml +1 -0
  344. package/src/adapters/freecad/check.yaml +1 -0
  345. package/src/adapters/freecad/convert.yaml +1 -0
  346. package/src/adapters/freecad/export-stl.yaml +1 -0
  347. package/src/adapters/freecad/import.yaml +1 -0
  348. package/src/adapters/freecad/info.yaml +1 -0
  349. package/src/adapters/freecad/macro.yaml +1 -0
  350. package/src/adapters/freecad/measure.yaml +1 -0
  351. package/src/adapters/freecad/mesh.yaml +1 -0
  352. package/src/adapters/freecad/properties.yaml +1 -0
  353. package/src/adapters/freecad/render.yaml +1 -0
  354. package/src/adapters/freecad/section.yaml +1 -0
  355. package/src/adapters/freecad/sketch.yaml +1 -0
  356. package/src/adapters/gimp/adjust.yaml +1 -0
  357. package/src/adapters/gimp/batch.yaml +1 -0
  358. package/src/adapters/gimp/convert.yaml +1 -0
  359. package/src/adapters/gimp/crop.yaml +1 -0
  360. package/src/adapters/gimp/filter.yaml +1 -0
  361. package/src/adapters/gimp/flip.yaml +1 -0
  362. package/src/adapters/gimp/info.yaml +1 -0
  363. package/src/adapters/gimp/layers.yaml +1 -0
  364. package/src/adapters/gimp/merge-layers.yaml +1 -0
  365. package/src/adapters/gimp/resize.yaml +1 -0
  366. package/src/adapters/gimp/rotate.yaml +1 -0
  367. package/src/adapters/gimp/text.yaml +1 -0
  368. package/src/adapters/godot/scene-export.yaml +1 -0
  369. package/src/adapters/hackernews/comments.yaml +1 -0
  370. package/src/adapters/hackernews/item.yaml +1 -0
  371. package/src/adapters/hf/top.yaml +1 -0
  372. package/src/adapters/imagemagick/composite.yaml +1 -0
  373. package/src/adapters/imagemagick/convert.yaml +1 -0
  374. package/src/adapters/imagemagick/identify.yaml +1 -0
  375. package/src/adapters/imagemagick/montage.yaml +1 -0
  376. package/src/adapters/imagemagick/resize.yaml +1 -0
  377. package/src/adapters/imdb/person.yaml +1 -0
  378. package/src/adapters/imdb/reviews.yaml +1 -0
  379. package/src/adapters/imdb/title.yaml +1 -0
  380. package/src/adapters/inkscape/convert.yaml +2 -0
  381. package/src/adapters/inkscape/export.yaml +2 -0
  382. package/src/adapters/inkscape/optimize.yaml +2 -0
  383. package/src/adapters/instagram/stories.yaml +1 -0
  384. package/src/adapters/jd/item.yaml +1 -0
  385. package/src/adapters/jike/post.yaml +2 -0
  386. package/src/adapters/jike/topic.yaml +2 -0
  387. package/src/adapters/kdenlive/info.yaml +1 -0
  388. package/src/adapters/kdenlive/render.yaml +1 -0
  389. package/src/adapters/krita/batch.yaml +1 -0
  390. package/src/adapters/krita/convert.yaml +1 -0
  391. package/src/adapters/krita/export.yaml +1 -0
  392. package/src/adapters/krita/info.yaml +1 -0
  393. package/src/adapters/libreoffice/convert.yaml +1 -0
  394. package/src/adapters/libreoffice/print.yaml +1 -0
  395. package/src/adapters/linear/issue-update.yaml +1 -0
  396. package/src/adapters/linux-do/category.yaml +1 -0
  397. package/src/adapters/linux-do/topic.yaml +1 -0
  398. package/src/adapters/macos/caffeinate.yaml +2 -2
  399. package/src/adapters/macos/calendar-create.yaml +1 -0
  400. package/src/adapters/macos/finder-copy.yaml +1 -0
  401. package/src/adapters/macos/finder-move.yaml +1 -0
  402. package/src/adapters/macos/finder-new-folder.yaml +1 -0
  403. package/src/adapters/macos/finder-tags.yaml +1 -0
  404. package/src/adapters/macos/open.yaml +2 -0
  405. package/src/adapters/macos/processes.yaml +3 -3
  406. package/src/adapters/macos/screen-recording.yaml +3 -2
  407. package/src/adapters/macos/screenshot.yaml +1 -0
  408. package/src/adapters/macos/spotlight.yaml +1 -0
  409. package/src/adapters/macos/wallpaper.yaml +1 -0
  410. package/src/adapters/medium/article.yaml +1 -0
  411. package/src/adapters/mermaid/render.yaml +1 -0
  412. package/src/adapters/minimax/tts.yaml +1 -0
  413. package/src/adapters/motion-studio/component-get.yaml +1 -0
  414. package/src/adapters/musescore/convert.yaml +2 -0
  415. package/src/adapters/musescore/export.yaml +2 -0
  416. package/src/adapters/musescore/info.yaml +1 -0
  417. package/src/adapters/musescore/instruments.yaml +1 -0
  418. package/src/adapters/musescore/transpose.yaml +1 -0
  419. package/src/adapters/netease-music/playlist.yaml +1 -0
  420. package/src/adapters/netease-music/top.yaml +1 -0
  421. package/src/adapters/notebooklm/get.yaml +1 -0
  422. package/src/adapters/notebooklm/history.yaml +1 -0
  423. package/src/adapters/notebooklm/note-list.yaml +1 -0
  424. package/src/adapters/notebooklm/notes-get.yaml +1 -0
  425. package/src/adapters/notebooklm/open.yaml +1 -0
  426. package/src/adapters/notebooklm/source-fulltext.yaml +1 -0
  427. package/src/adapters/notebooklm/source-get.yaml +1 -0
  428. package/src/adapters/notebooklm/source-guide.yaml +1 -0
  429. package/src/adapters/notebooklm/source-list.yaml +1 -0
  430. package/src/adapters/notebooklm/summary.yaml +1 -0
  431. package/src/adapters/novita/status.yaml +1 -0
  432. package/src/adapters/obs/screenshot.yaml +1 -0
  433. package/src/adapters/obsidian/open.yaml +1 -0
  434. package/src/adapters/ones/login.yaml +1 -0
  435. package/src/adapters/ones/task.yaml +1 -0
  436. package/src/adapters/pandoc/convert.yaml +1 -0
  437. package/src/adapters/paperreview/feedback.yaml +2 -0
  438. package/src/adapters/paperreview/review.yaml +2 -0
  439. package/src/adapters/paperreview/submit.yaml +2 -0
  440. package/src/adapters/pixiv/detail.yaml +1 -0
  441. package/src/adapters/pixiv/download.yaml +2 -0
  442. package/src/adapters/quark/ls.yaml +1 -0
  443. package/src/adapters/reddit/comments.yaml +2 -0
  444. package/src/adapters/renderdoc/capture-list.yaml +1 -0
  445. package/src/adapters/renderdoc/frame-export.yaml +1 -0
  446. package/src/adapters/reuters/article.yaml +2 -0
  447. package/src/adapters/shotcut/info.yaml +1 -0
  448. package/src/adapters/shotcut/render.yaml +1 -0
  449. package/src/adapters/sinablog/article.yaml +1 -0
  450. package/src/adapters/sinablog/user.yaml +1 -0
  451. package/src/adapters/sketch/artboards.yaml +1 -0
  452. package/src/adapters/sketch/export.yaml +1 -0
  453. package/src/adapters/sketch/symbols.yaml +1 -0
  454. package/src/adapters/smzdm/article.yaml +1 -0
  455. package/src/adapters/stackoverflow/question.yaml +1 -0
  456. package/src/adapters/stagehand/wrap-observe.yaml +1 -0
  457. package/src/adapters/steam/wishlist.yaml +1 -0
  458. package/src/adapters/substack/trending.yaml +2 -1
  459. package/src/adapters/tieba/read.yaml +1 -0
  460. package/src/adapters/tiktok/comment.yaml +1 -0
  461. package/src/adapters/tiktok/like.yaml +1 -0
  462. package/src/adapters/tiktok/save.yaml +1 -0
  463. package/src/adapters/tiktok/unlike.yaml +1 -0
  464. package/src/adapters/tiktok/unsave.yaml +1 -0
  465. package/src/adapters/twitch/streams.yaml +1 -0
  466. package/src/adapters/twitter/quotes.yaml +2 -0
  467. package/src/adapters/twitter/retweets.yaml +1 -0
  468. package/src/adapters/v2ex/replies.yaml +1 -0
  469. package/src/adapters/v2ex/topic.yaml +1 -0
  470. package/src/adapters/vscode/install-ext.yaml +1 -0
  471. package/src/adapters/vscode/open.yaml +1 -0
  472. package/src/adapters/web/read.yaml +1 -0
  473. package/src/adapters/weibo/comments.yaml +1 -0
  474. package/src/adapters/weibo/post.yaml +1 -0
  475. package/src/adapters/weixin/download.yaml +1 -0
  476. package/src/adapters/wiremock/create-stub.yaml +2 -0
  477. package/src/adapters/wiremock/delete-stub.yaml +1 -0
  478. package/src/adapters/wiremock/verify.yaml +1 -0
  479. package/src/adapters/xianyu/item.yaml +1 -0
  480. package/src/adapters/xiaoe/catalog.yaml +1 -0
  481. package/src/adapters/xiaoe/content.yaml +1 -0
  482. package/src/adapters/xiaoe/detail.yaml +1 -0
  483. package/src/adapters/xiaoe/play-url.yaml +1 -0
  484. package/src/adapters/xiaoyuzhou/podcast.yaml +2 -0
  485. package/src/adapters/yollomi/edit.yaml +2 -0
  486. package/src/adapters/yollomi/remove-bg.yaml +2 -0
  487. package/src/adapters/yollomi/restore.yaml +2 -0
  488. package/src/adapters/yollomi/upload.yaml +2 -0
  489. package/src/adapters/yollomi/upscale.yaml +2 -0
  490. package/src/adapters/youtube/playlist.yaml +1 -0
  491. package/src/adapters/yt-dlp/download.yaml +2 -0
  492. package/src/adapters/yt-dlp/extract-audio.yaml +2 -0
  493. package/src/adapters/yt-dlp/info.yaml +1 -0
  494. package/src/adapters/zhihu/answer.yaml +1 -0
  495. package/src/adapters/zhihu/answers.yaml +2 -0
  496. package/src/adapters/zhihu/article.yaml +1 -0
  497. package/src/adapters/zhihu/articles.yaml +2 -0
  498. package/src/adapters/zhihu/collections.yaml +2 -0
  499. package/src/adapters/zhihu/columns.yaml +2 -0
  500. package/src/adapters/zhihu/comment.yaml +1 -0
  501. package/src/adapters/zhihu/download.yaml +1 -0
  502. package/src/adapters/zhihu/followers.yaml +2 -0
  503. package/src/adapters/zhihu/following.yaml +2 -0
  504. package/src/adapters/zhihu/pins.yaml +2 -0
  505. package/src/adapters/zhihu/question.yaml +1 -0
  506. package/src/adapters/zhihu/topic.yaml +1 -0
  507. package/src/adapters/zhihu/topics.yaml +1 -0
  508. package/src/adapters/zhihu/user.yaml +2 -0
  509. package/src/adapters/zoom/join.yaml +1 -0
  510. package/src/adapters/zsxq/search.yaml +1 -0
  511. package/src/adapters/zsxq/topic.yaml +1 -0
  512. package/src/adapters/zsxq/topics.yaml +1 -0
@@ -0,0 +1,46 @@
1
+ /**
2
+ * MCP tool-call dispatcher — the bridge between JSON-RPC tool invocations
3
+ * and the invocation kernel.
4
+ *
5
+ * v0.213.3 R2: every MCP tool call funnels through `execute()` so the CLI
6
+ * and MCP surfaces produce byte-identical envelopes (modulo trace_id and
7
+ * duration_ms). Flat `params` shape preserved for D2 backward compat.
8
+ *
9
+ * Shape contract (backward compat with v0.213.2 and earlier):
10
+ * - success → `{ content: [{type:"text", text: JSON.stringify({count, results}, null, 2)}],
11
+ * structuredContent: { type: "json", data: {count, results} } }`
12
+ * - error → `{ isError: true, content, structuredContent.data.suggestion, _meta }`
13
+ * - warnings flow to `_meta.warnings` so agents can inspect them
14
+ */
15
+ import type { AdapterManifest, AdapterCommand } from "../types.js";
16
+ export interface McpStructuredContent {
17
+ type: "json";
18
+ data: unknown;
19
+ }
20
+ export interface McpToolResult {
21
+ content: Array<{
22
+ type: "text";
23
+ text: string;
24
+ }>;
25
+ structuredContent?: McpStructuredContent;
26
+ isError?: boolean;
27
+ _meta?: Record<string, unknown>;
28
+ }
29
+ /**
30
+ * 10 KB threshold above which MCP clients (Claude Code, Zed) may truncate
31
+ * tool output. When exceeded, we attach `_meta.anthropic/maxResultSizeChars`
32
+ * to raise the cap to 100 KB for this call.
33
+ */
34
+ export declare const MAX_RESULT_SIZE_CHARS = 10000;
35
+ /**
36
+ * Annotate a tool result with `_meta.anthropic/maxResultSizeChars` when the
37
+ * serialized payload exceeds MAX_RESULT_SIZE_CHARS.
38
+ */
39
+ export declare function annotateIfLarge(result: McpToolResult): McpToolResult;
40
+ /**
41
+ * Execute a resolved (adapter, command) pair via the invocation kernel and
42
+ * shape the result into the MCP `McpToolResult` envelope. Used by both the
43
+ * default `unicli_run` tool and every expanded `unicli_<site>_<command>`.
44
+ */
45
+ export declare function runResolvedCommand(adapter: AdapterManifest, cmd: AdapterCommand, cmdName: string, args: Record<string, unknown>): Promise<McpToolResult>;
46
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/mcp/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,oBAAoB,CAAC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAYpE;AAaD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC,CA0DxB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * MCP tool-call dispatcher — the bridge between JSON-RPC tool invocations
3
+ * and the invocation kernel.
4
+ *
5
+ * v0.213.3 R2: every MCP tool call funnels through `execute()` so the CLI
6
+ * and MCP surfaces produce byte-identical envelopes (modulo trace_id and
7
+ * duration_ms). Flat `params` shape preserved for D2 backward compat.
8
+ *
9
+ * Shape contract (backward compat with v0.213.2 and earlier):
10
+ * - success → `{ content: [{type:"text", text: JSON.stringify({count, results}, null, 2)}],
11
+ * structuredContent: { type: "json", data: {count, results} } }`
12
+ * - error → `{ isError: true, content, structuredContent.data.suggestion, _meta }`
13
+ * - warnings flow to `_meta.warnings` so agents can inspect them
14
+ */
15
+ import { buildInvocation, execute } from "../engine/kernel/execute.js";
16
+ import { coerceLimit } from "../engine/args.js";
17
+ /**
18
+ * 10 KB threshold above which MCP clients (Claude Code, Zed) may truncate
19
+ * tool output. When exceeded, we attach `_meta.anthropic/maxResultSizeChars`
20
+ * to raise the cap to 100 KB for this call.
21
+ */
22
+ export const MAX_RESULT_SIZE_CHARS = 10_000;
23
+ /**
24
+ * Annotate a tool result with `_meta.anthropic/maxResultSizeChars` when the
25
+ * serialized payload exceeds MAX_RESULT_SIZE_CHARS.
26
+ */
27
+ export function annotateIfLarge(result) {
28
+ const totalChars = result.content.reduce((sum, c) => sum + c.text.length, 0);
29
+ if (totalChars > MAX_RESULT_SIZE_CHARS) {
30
+ return {
31
+ ...result,
32
+ _meta: {
33
+ ...result._meta,
34
+ "anthropic/maxResultSizeChars": 100_000,
35
+ },
36
+ };
37
+ }
38
+ return result;
39
+ }
40
+ function withWarnings(result, warnings) {
41
+ if (warnings.length === 0)
42
+ return result;
43
+ return {
44
+ ...result,
45
+ _meta: { ...result._meta, warnings: [...warnings] },
46
+ };
47
+ }
48
+ /**
49
+ * Execute a resolved (adapter, command) pair via the invocation kernel and
50
+ * shape the result into the MCP `McpToolResult` envelope. Used by both the
51
+ * default `unicli_run` tool and every expanded `unicli_<site>_<command>`.
52
+ */
53
+ export async function runResolvedCommand(adapter, cmd, cmdName, args) {
54
+ // MCP preserves the flat-params contract. Apply the default `limit: 20`
55
+ // only when the adapter declares a `limit` arg — the kernel's ajv
56
+ // validator runs in strict mode (`additionalProperties: false`), so
57
+ // passing an undeclared `limit` would trip usage errors for adapters
58
+ // that don't paginate.
59
+ const declaresLimit = (cmd.adapterArgs ?? []).some((a) => a.name === "limit");
60
+ const mergedArgs = declaresLimit
61
+ ? { limit: 20, ...args }
62
+ : { ...args };
63
+ if (declaresLimit && args.limit !== undefined) {
64
+ const coerced = coerceLimit(args.limit);
65
+ if (coerced !== undefined)
66
+ mergedArgs.limit = coerced;
67
+ }
68
+ const inv = buildInvocation("mcp", adapter.name, cmdName, {
69
+ args: mergedArgs,
70
+ source: "mcp",
71
+ });
72
+ if (!inv) {
73
+ // Already filtered by handleRunCommand / handleExpandedTool before this
74
+ // point; still, guard so a misrouted call doesn't crash the server.
75
+ const errorData = {
76
+ error: `Unknown command: ${adapter.name} ${cmdName}`,
77
+ suggestion: "Use unicli_list to see available commands.",
78
+ };
79
+ return {
80
+ content: [{ type: "text", text: JSON.stringify(errorData, null, 2) }],
81
+ structuredContent: { type: "json", data: errorData },
82
+ isError: true,
83
+ };
84
+ }
85
+ const result = await execute(inv);
86
+ if (result.error) {
87
+ const errorData = {
88
+ error: result.error.message,
89
+ code: result.error.code,
90
+ adapter_path: result.error.adapter_path,
91
+ step: result.error.step,
92
+ suggestion: result.error.suggestion,
93
+ trace_id: inv.trace_id,
94
+ };
95
+ const base = {
96
+ content: [{ type: "text", text: JSON.stringify(errorData, null, 2) }],
97
+ structuredContent: { type: "json", data: errorData },
98
+ isError: true,
99
+ };
100
+ return withWarnings(base, result.warnings);
101
+ }
102
+ const data = { count: result.results.length, results: result.results };
103
+ const base = {
104
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
105
+ structuredContent: { type: "json", data },
106
+ };
107
+ return withWarnings(base, result.warnings);
108
+ }
109
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/mcp/dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * MCP JSON-RPC dispatch — `buildHandler(tools)` returns the per-request
3
+ * handler used by every transport (stdio, HTTP, Streamable HTTP).
4
+ *
5
+ * Extracted from `server.ts` so the top-level file only owns bootstrap,
6
+ * arg parsing, and transport wiring. This module owns:
7
+ * - `initialize` / `ping` / `tools/list` / `tools/call` method dispatch
8
+ * - The four built-in meta-tools (`unicli_list` / `unicli_run` /
9
+ * `unicli_search` / `unicli_explore` + deprecated aliases)
10
+ * - Fallthrough to expanded-tool dispatch via `./dispatch.ts`
11
+ */
12
+ import { type McpTool } from "./tools.js";
13
+ export interface JsonRpcRequest {
14
+ jsonrpc: "2.0";
15
+ id?: number | string | null;
16
+ method: string;
17
+ params?: Record<string, unknown>;
18
+ }
19
+ export interface JsonRpcResponse {
20
+ jsonrpc: "2.0";
21
+ id: number | string | null;
22
+ result?: unknown;
23
+ error?: {
24
+ code: number;
25
+ message: string;
26
+ data?: unknown;
27
+ };
28
+ }
29
+ export declare function buildHandler(tools: McpTool[]): (req: JsonRpcRequest) => JsonRpcResponse | undefined | Promise<JsonRpcResponse | undefined>;
30
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/mcp/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAoSD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EAAE,GACf,CACD,GAAG,EAAE,cAAc,KAChB,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAkCtE"}
@@ -0,0 +1,293 @@
1
+ /**
2
+ * MCP JSON-RPC dispatch — `buildHandler(tools)` returns the per-request
3
+ * handler used by every transport (stdio, HTTP, Streamable HTTP).
4
+ *
5
+ * Extracted from `server.ts` so the top-level file only owns bootstrap,
6
+ * arg parsing, and transport wiring. This module owns:
7
+ * - `initialize` / `ping` / `tools/list` / `tools/call` method dispatch
8
+ * - The four built-in meta-tools (`unicli_list` / `unicli_run` /
9
+ * `unicli_search` / `unicli_explore` + deprecated aliases)
10
+ * - Fallthrough to expanded-tool dispatch via `./dispatch.ts`
11
+ */
12
+ import { getAllAdapters, listCommands, resolveCommand } from "../registry.js";
13
+ import { annotateIfLarge, runResolvedCommand, } from "./dispatch.js";
14
+ import { expandedRegistry } from "./tools.js";
15
+ import { MCP_PROTOCOL_VERSION, VERSION } from "../constants.js";
16
+ import { resolveElicitation } from "./elicitation.js";
17
+ function handleListAdapters(params) {
18
+ let commands = listCommands();
19
+ const site = params.site;
20
+ const type = params.type;
21
+ if (site)
22
+ commands = commands.filter((c) => c.site.includes(site));
23
+ if (type)
24
+ commands = commands.filter((c) => c.type === type);
25
+ const adapters = getAllAdapters();
26
+ const siteMap = new Map();
27
+ for (const cmd of commands) {
28
+ let entry = siteMap.get(cmd.site);
29
+ if (!entry) {
30
+ const adapter = adapters.find((a) => a.name === cmd.site);
31
+ entry = { type: adapter?.type ?? cmd.type, commands: [] };
32
+ siteMap.set(cmd.site, entry);
33
+ }
34
+ entry.commands.push({ name: cmd.command, description: cmd.description });
35
+ }
36
+ const result = Array.from(siteMap.entries()).map(([name, info]) => ({
37
+ site: name,
38
+ type: info.type,
39
+ commands: info.commands,
40
+ }));
41
+ const data = {
42
+ total_sites: result.length,
43
+ total_commands: commands.length,
44
+ adapters: result,
45
+ };
46
+ return {
47
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
48
+ structuredContent: { type: "json", data },
49
+ };
50
+ }
51
+ async function handleRunCommand(params) {
52
+ const site = params.site;
53
+ const command = params.command;
54
+ const args = params.args ?? {};
55
+ if (!site || !command) {
56
+ const errorData = { error: "site and command are required" };
57
+ return {
58
+ content: [{ type: "text", text: JSON.stringify(errorData) }],
59
+ structuredContent: { type: "json", data: errorData },
60
+ isError: true,
61
+ };
62
+ }
63
+ const resolved = resolveCommand(site, command);
64
+ if (!resolved) {
65
+ const adapters = getAllAdapters();
66
+ const matchingSites = adapters
67
+ .filter((a) => a.name.includes(site))
68
+ .map((a) => ({
69
+ site: a.name,
70
+ commands: Object.keys(a.commands),
71
+ }));
72
+ const errorData = {
73
+ error: `Unknown command: ${site} ${command}`,
74
+ suggestion: matchingSites.length > 0
75
+ ? `Did you mean one of these? ${JSON.stringify(matchingSites)}`
76
+ : "Use list_adapters to see all available commands.",
77
+ };
78
+ return {
79
+ content: [{ type: "text", text: JSON.stringify(errorData, null, 2) }],
80
+ structuredContent: { type: "json", data: errorData },
81
+ isError: true,
82
+ };
83
+ }
84
+ return runResolvedCommand(resolved.adapter, resolved.command, command, args);
85
+ }
86
+ /**
87
+ * Expanded-tool dispatcher — look up `unicli_<site>_<command>` in the
88
+ * registry populated by buildExpandedTools / buildDeferredTools.
89
+ */
90
+ async function handleExpandedTool(toolName, args) {
91
+ if (!toolName.startsWith("unicli_"))
92
+ return undefined;
93
+ const entry = expandedRegistry.get(toolName);
94
+ if (!entry)
95
+ return undefined;
96
+ return runResolvedCommand(entry.adapter, entry.cmd, entry.cmdName, args);
97
+ }
98
+ function initializeResponse(id) {
99
+ return {
100
+ jsonrpc: "2.0",
101
+ id,
102
+ result: {
103
+ protocolVersion: MCP_PROTOCOL_VERSION,
104
+ capabilities: {
105
+ tools: { listChanged: false },
106
+ elicitation: { supported: true },
107
+ },
108
+ serverInfo: { name: "unicli", version: VERSION },
109
+ },
110
+ };
111
+ }
112
+ async function dispatchBuiltin(id, name, toolArgs) {
113
+ switch (name) {
114
+ case "unicli_list":
115
+ case "list_adapters": {
116
+ const result = handleListAdapters(toolArgs);
117
+ return { jsonrpc: "2.0", id, result: annotateIfLarge(result) };
118
+ }
119
+ case "unicli_run":
120
+ case "run_command": {
121
+ const result = await handleRunCommand(toolArgs);
122
+ return { jsonrpc: "2.0", id, result: annotateIfLarge(result) };
123
+ }
124
+ case "unicli_search":
125
+ return dispatchSearch(id, toolArgs);
126
+ case "unicli_explore":
127
+ case "unicli_discover":
128
+ return dispatchExplore(id, toolArgs);
129
+ }
130
+ return undefined;
131
+ }
132
+ async function dispatchSearch(id, toolArgs) {
133
+ const searchQuery = toolArgs.query;
134
+ const searchLimit = toolArgs.limit || 5;
135
+ if (!searchQuery) {
136
+ return {
137
+ jsonrpc: "2.0",
138
+ id,
139
+ error: { code: -32602, message: "Missing required parameter: query" },
140
+ };
141
+ }
142
+ const { search: searchFn } = await import("../discovery/search.js");
143
+ const results = searchFn(searchQuery, searchLimit);
144
+ const data = {
145
+ query: searchQuery,
146
+ count: results.length,
147
+ results: results.map((r) => ({
148
+ command: `unicli ${r.site} ${r.command}`,
149
+ site: r.site,
150
+ name: r.command,
151
+ description: r.description,
152
+ score: r.score,
153
+ category: r.category,
154
+ usage: r.usage,
155
+ })),
156
+ };
157
+ return {
158
+ jsonrpc: "2.0",
159
+ id,
160
+ result: annotateIfLarge({
161
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
162
+ structuredContent: { type: "json", data },
163
+ }),
164
+ };
165
+ }
166
+ async function dispatchExplore(id, toolArgs) {
167
+ const discoverUrl = toolArgs.url;
168
+ const discoverGoal = toolArgs.goal;
169
+ if (!discoverUrl) {
170
+ return {
171
+ jsonrpc: "2.0",
172
+ id,
173
+ error: { code: -32602, message: "Missing required parameter: url" },
174
+ };
175
+ }
176
+ if (!discoverUrl.startsWith("http://") &&
177
+ !discoverUrl.startsWith("https://")) {
178
+ return {
179
+ jsonrpc: "2.0",
180
+ id,
181
+ error: {
182
+ code: -32602,
183
+ message: "URL must start with http:// or https://",
184
+ },
185
+ };
186
+ }
187
+ const [{ execFile: ef }, { promisify: prom }] = await Promise.all([
188
+ import("node:child_process"),
189
+ import("node:util"),
190
+ ]);
191
+ const execFileP = prom(ef);
192
+ const discoverArgs = ["generate", discoverUrl, "--json"];
193
+ if (discoverGoal)
194
+ discoverArgs.push("--goal", discoverGoal);
195
+ try {
196
+ const { stdout } = await execFileP("unicli", discoverArgs, {
197
+ timeout: 120_000,
198
+ encoding: "utf-8",
199
+ });
200
+ return {
201
+ jsonrpc: "2.0",
202
+ id,
203
+ result: annotateIfLarge({
204
+ content: [{ type: "text", text: stdout }],
205
+ }),
206
+ };
207
+ }
208
+ catch (err) {
209
+ const message = err instanceof Error ? err.message : String(err);
210
+ return {
211
+ jsonrpc: "2.0",
212
+ id,
213
+ result: annotateIfLarge({
214
+ content: [{ type: "text", text: JSON.stringify({ error: message }) }],
215
+ isError: true,
216
+ }),
217
+ };
218
+ }
219
+ }
220
+ async function handleToolsCall(id, req) {
221
+ const params = req.params;
222
+ if (!params?.name) {
223
+ return {
224
+ jsonrpc: "2.0",
225
+ id,
226
+ error: { code: -32602, message: "Missing tool name" },
227
+ };
228
+ }
229
+ const toolArgs = params.arguments ?? {};
230
+ const builtin = await dispatchBuiltin(id, params.name, toolArgs);
231
+ if (builtin)
232
+ return builtin;
233
+ const result = await handleExpandedTool(params.name, toolArgs);
234
+ if (result) {
235
+ return { jsonrpc: "2.0", id, result: annotateIfLarge(result) };
236
+ }
237
+ return {
238
+ jsonrpc: "2.0",
239
+ id,
240
+ error: {
241
+ code: -32602,
242
+ message: `Unknown tool: ${params.name}. Use unicli_list to see available commands.`,
243
+ },
244
+ };
245
+ }
246
+ function handleElicitationResponse(id, req) {
247
+ const elicitParams = req.params;
248
+ if (elicitParams?.id == null || !elicitParams?.response) {
249
+ return {
250
+ jsonrpc: "2.0",
251
+ id,
252
+ error: {
253
+ code: -32602,
254
+ message: "Missing id or response in elicitation/response",
255
+ },
256
+ };
257
+ }
258
+ const resolved = resolveElicitation(elicitParams.id, elicitParams.response);
259
+ return { jsonrpc: "2.0", id, result: { resolved } };
260
+ }
261
+ export function buildHandler(tools) {
262
+ return function handleRequest(req) {
263
+ const id = req.id ?? null;
264
+ switch (req.method) {
265
+ case "initialize":
266
+ return initializeResponse(id);
267
+ case "notifications/initialized":
268
+ // Notifications have no response — transports already guard `if (response)`.
269
+ return undefined;
270
+ case "tools/list":
271
+ return { jsonrpc: "2.0", id, result: { tools } };
272
+ case "tools/call":
273
+ return handleToolsCall(id, req);
274
+ case "elicitation/response":
275
+ return handleElicitationResponse(id, req);
276
+ case "ping":
277
+ return { jsonrpc: "2.0", id, result: {} };
278
+ default:
279
+ if (id !== null && id !== undefined) {
280
+ return {
281
+ jsonrpc: "2.0",
282
+ id,
283
+ error: {
284
+ code: -32601,
285
+ message: `Method not found: ${req.method}`,
286
+ },
287
+ };
288
+ }
289
+ return undefined;
290
+ }
291
+ };
292
+ }
293
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/mcp/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Simple JSON-RPC over HTTP transport for MCP.
3
+ *
4
+ * POST /mcp accepts a single JSON-RPC envelope and returns a single JSON
5
+ * response. GET /mcp returns server info — handy for health checks from a
6
+ * browser.
7
+ *
8
+ * Note: this is intentionally NOT a full MCP Streamable HTTP transport —
9
+ * no SSE event stream, no session resume. See `./streamable-http.ts` for
10
+ * that. Most clients that "speak HTTP" to MCP only need request/response,
11
+ * and starting with the simpler shape means zero new dependencies and a
12
+ * tiny attack surface.
13
+ */
14
+ import type { buildHandler } from "./handler.js";
15
+ export declare function startHttp(handler: ReturnType<typeof buildHandler>, port: number, authEnabled?: boolean): Promise<void>;
16
+ //# sourceMappingURL=http-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../src/mcp/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,cAAc,CAAC;AAsFjE,wBAAsB,SAAS,CAC7B,OAAO,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EACxC,IAAI,EAAE,MAAM,EACZ,WAAW,UAAQ,GAClB,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Simple JSON-RPC over HTTP transport for MCP.
3
+ *
4
+ * POST /mcp accepts a single JSON-RPC envelope and returns a single JSON
5
+ * response. GET /mcp returns server info — handy for health checks from a
6
+ * browser.
7
+ *
8
+ * Note: this is intentionally NOT a full MCP Streamable HTTP transport —
9
+ * no SSE event stream, no session resume. See `./streamable-http.ts` for
10
+ * that. Most clients that "speak HTTP" to MCP only need request/response,
11
+ * and starting with the simpler shape means zero new dependencies and a
12
+ * tiny attack surface.
13
+ */
14
+ import { createServer, } from "node:http";
15
+ import { getAllAdapters, listCommands } from "../registry.js";
16
+ import { handleOAuthRoute, createOAuthMiddleware } from "./oauth.js";
17
+ import { VERSION } from "../constants.js";
18
+ import { buildDefaultTools } from "./tools.js";
19
+ const MAX_BODY = 1_048_576; // 1 MB
20
+ function writeJson(res, code, payload) {
21
+ res.writeHead(code, { "Content-Type": "application/json" });
22
+ res.end(JSON.stringify(payload));
23
+ }
24
+ function serveHealth(res) {
25
+ const adapterCount = getAllAdapters().length;
26
+ const commandCount = listCommands().length;
27
+ const defaultToolCount = buildDefaultTools().length;
28
+ const expandedCount = commandCount + defaultToolCount;
29
+ writeJson(res, 200, {
30
+ status: "ok",
31
+ adapters: adapterCount,
32
+ commands: commandCount,
33
+ tools: { default: defaultToolCount, expanded: expandedCount },
34
+ version: VERSION,
35
+ });
36
+ }
37
+ async function consumeBody(req, res) {
38
+ const chunks = [];
39
+ let bodySize = 0;
40
+ return await new Promise((resolve) => {
41
+ req.on("data", (chunk) => {
42
+ bodySize += chunk.length;
43
+ if (bodySize > MAX_BODY) {
44
+ writeJson(res, 413, {
45
+ jsonrpc: "2.0",
46
+ id: null,
47
+ error: { code: -32600, message: "Request too large" },
48
+ });
49
+ req.destroy();
50
+ resolve(null);
51
+ return;
52
+ }
53
+ chunks.push(chunk);
54
+ });
55
+ req.on("end", () => resolve(Buffer.concat(chunks)));
56
+ req.on("error", () => resolve(null));
57
+ });
58
+ }
59
+ async function dispatchPost(req, res, handler) {
60
+ const bodyBuf = await consumeBody(req, res);
61
+ if (!bodyBuf)
62
+ return;
63
+ const body = bodyBuf.toString("utf-8");
64
+ let parsed;
65
+ try {
66
+ parsed = JSON.parse(body);
67
+ }
68
+ catch {
69
+ writeJson(res, 400, {
70
+ jsonrpc: "2.0",
71
+ id: null,
72
+ error: { code: -32700, message: "Parse error" },
73
+ });
74
+ return;
75
+ }
76
+ try {
77
+ const response = await handler(parsed);
78
+ if (!response) {
79
+ res.writeHead(204);
80
+ res.end();
81
+ return;
82
+ }
83
+ writeJson(res, 200, response);
84
+ }
85
+ catch (err) {
86
+ const message = err instanceof Error ? err.message : String(err);
87
+ writeJson(res, 500, {
88
+ jsonrpc: "2.0",
89
+ id: parsed.id ?? null,
90
+ error: { code: -32603, message: `Internal error: ${message}` },
91
+ });
92
+ }
93
+ }
94
+ export async function startHttp(handler, port, authEnabled = false) {
95
+ const oauthMiddleware = authEnabled ? createOAuthMiddleware() : null;
96
+ const server = createServer((req, res) => {
97
+ if (authEnabled && handleOAuthRoute(req, res))
98
+ return;
99
+ if (req.method === "GET" &&
100
+ (req.url === "/" || req.url === "/mcp" || req.url === "/health")) {
101
+ serveHealth(res);
102
+ return;
103
+ }
104
+ if (req.method !== "POST" || req.url !== "/mcp") {
105
+ writeJson(res, 404, { error: "POST /mcp" });
106
+ return;
107
+ }
108
+ if (oauthMiddleware?.(req, res))
109
+ return;
110
+ void dispatchPost(req, res, handler);
111
+ });
112
+ await new Promise((resolve, reject) => {
113
+ server.once("error", reject);
114
+ server.listen(port, "127.0.0.1", () => {
115
+ server.off("error", reject);
116
+ resolve();
117
+ });
118
+ });
119
+ process.stderr.write(`unicli MCP server v${VERSION} — HTTP transport on http://127.0.0.1:${port}/mcp\n`);
120
+ }
121
+ //# sourceMappingURL=http-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../src/mcp/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,YAAY,GAGb,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,OAAO;AAEnC,SAAS,SAAS,CAAC,GAAmB,EAAE,IAAY,EAAE,OAAgB;IACpE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC5D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,WAAW,CAAC,GAAmB;IACtC,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC,MAAM,CAAC;IAC7C,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC,MAAM,CAAC;IAC3C,MAAM,gBAAgB,GAAG,iBAAiB,EAAE,CAAC,MAAM,CAAC;IACpD,MAAM,aAAa,GAAG,YAAY,GAAG,gBAAgB,CAAC;IACtD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;QAClB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE;QAC7D,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,GAAoB,EACpB,GAAmB;IAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,MAAM,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QAClD,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC/B,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;YACzB,IAAI,QAAQ,GAAG,QAAQ,EAAE,CAAC;gBACxB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;oBAClB,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE;iBACtD,CAAC,CAAC;gBACH,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAoB,EACpB,GAAmB,EACnB,OAAwC;IAExC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;YAClB,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE;SAChD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;YAClB,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,IAAI;YACrB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,OAAO,EAAE,EAAE;SAC/D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAwC,EACxC,IAAY,EACZ,WAAW,GAAG,KAAK;IAEnB,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAErE,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAoB,EAAE,GAAmB,EAAE,EAAE;QACxE,IAAI,WAAW,IAAI,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAO;QACtD,IACE,GAAG,CAAC,MAAM,KAAK,KAAK;YACpB,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,EAChE,CAAC;YACD,WAAW,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;YAChD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,IAAI,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAO;QACxC,KAAK,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sBAAsB,OAAO,yCAAyC,IAAI,QAAQ,CACnF,CAAC;AACJ,CAAC"}