@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
package/dist/types.d.ts CHANGED
@@ -30,6 +30,32 @@ export interface AdapterArg {
30
30
  positional?: boolean;
31
31
  choices?: string[];
32
32
  description?: string;
33
+ /**
34
+ * JSON Schema draft-2020-12 `format:` vocabulary (standard). Validated
35
+ * fail-closed via ajv's format-assertion vocabulary — a declared `format`
36
+ * is a hard precondition, not an annotation. See v0.213.3 spec §D5.
37
+ */
38
+ format?: "uri" | "uuid" | "date-time" | "email" | "hostname" | "ipv4" | "ipv6" | "regex";
39
+ /**
40
+ * Bespoke `x-unicli-kind:` extension — dispatches to the harden-step
41
+ * validators that have no standard JSON Schema equivalent.
42
+ *
43
+ * - `path` → filesystem sandbox (no traversal, NUL, or CWD/$HOME escape)
44
+ * - `adapter-ref` → `<site>/<command>` shaped token
45
+ * - `selector` → CSS/XPath-ish; reject `<script` or unescaped backtick
46
+ * - `shell-safe` → reject `$` `` ` `` `;` `|` `&` `>` (command-injection vector)
47
+ * - `id` → bare resource token (no URL punctuation `?` `#` or
48
+ * `%XX` percent-escapes); pair with `x-unicli-accepts:
49
+ * [url]` on adapters (zhihu, douban, jike…) whose `id`
50
+ * arg also accepts a full URL.
51
+ */
52
+ "x-unicli-kind"?: "path" | "adapter-ref" | "selector" | "shell-safe" | "id";
53
+ /**
54
+ * Dual-accept fallback — if the primary kind fails validation, try each
55
+ * listed secondary kind before rejecting. Used by adapters whose `id` arg
56
+ * legitimately accepts URL slugs (zhihu, twitter) or vice versa.
57
+ */
58
+ "x-unicli-accepts"?: Array<"url" | "id">;
33
59
  }
34
60
  export interface OutputSchema {
35
61
  type?: "array" | "object" | "string";
@@ -61,6 +87,12 @@ export interface AdapterCommand {
61
87
  * future runtime dispatcher for capability-aware routing.
62
88
  */
63
89
  minimum_capability?: string;
90
+ /**
91
+ * When true, the command accepts `--cursor <next_cursor>` for pagination
92
+ * and surfaces `meta.pagination.next_cursor` in its envelope. The kernel
93
+ * uses this flag to add a pagination hint to the success `next_actions`.
94
+ */
95
+ paginated?: boolean;
64
96
  pipeline?: PipelineStep[];
65
97
  adapterArgs?: AdapterArg[];
66
98
  func?: (page: IPage, kwargs: Record<string, unknown>) => Promise<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAN,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,gCAAiB,CAAA;IACjB,kCAAmB,CAAA;AACrB,CAAC,EANW,WAAW,KAAX,WAAW,QAMtB;AAED,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,mCAAuB,CAAA;IACvB,qBAAS,CAAA;AACX,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AAiPD,sCAAsC;AACtC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,EAAE;IAChB,mBAAmB,EAAE,EAAE;IACvB,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,YAAY,EAAE,EAAE;CACR,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAN,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,gCAAiB,CAAA;IACjB,kCAAmB,CAAA;AACrB,CAAC,EANW,WAAW,KAAX,WAAW,QAMtB;AAED,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,mCAAuB,CAAA;IACvB,qBAAS,CAAA;AACX,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AA0RD,sCAAsC;AACtC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,EAAE;IAChB,mBAAmB,EAAE,EAAE;IACvB,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,YAAY,EAAE,EAAE;CACR,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenalexa/unicli",
3
- "version": "0.213.1",
3
+ "version": "0.215.0",
4
4
  "description": "The universal interface between AI agents and the world's software",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -118,7 +118,7 @@
118
118
  "dev": "tsx src/main.ts",
119
119
  "build": "tsc && tsx scripts/build-manifest.js && tsx scripts/count-stats.ts && tsx scripts/build-readme.ts && tsx scripts/build-agents.ts && npx prettier --write AGENTS.md",
120
120
  "postbuild": "node -e \"require('fs').chmodSync('dist/main.js', 0o755)\"",
121
- "stats": "tsx scripts/count-stats.ts && tsx scripts/build-readme.ts",
121
+ "stats": "tsx scripts/build-manifest.js && tsx scripts/count-stats.ts && tsx scripts/build-readme.ts && tsx scripts/build-agents.ts",
122
122
  "stats:check": "tsx scripts/count-consistency.ts",
123
123
  "build:agents": "tsx scripts/build-agents.ts",
124
124
  "test": "vitest run --project unit",
@@ -157,6 +157,9 @@
157
157
  "preversion": "npm run verify",
158
158
  "postversion": "npm run build && tsx scripts/release.ts",
159
159
  "bench": "tsx bench/report.ts",
160
+ "bench:quick": "tsx bench/agent/report.ts",
161
+ "bench:agent": "tsx bench/agent/sdk-runner.ts",
162
+ "bench:gate": "node scripts/bench/check-ship-gate.js",
160
163
  "refs:verify": "tsx scripts/verify-refs.ts",
161
164
  "sync:ref": "bash scripts/sync-ref.sh"
162
165
  },
@@ -186,27 +189,35 @@
186
189
  "node": ">=20.0.0"
187
190
  },
188
191
  "dependencies": {
192
+ "ajv": "^8.18.0",
193
+ "ajv-formats": "^3.0.1",
189
194
  "chalk": "^5.4.1",
190
195
  "cli-table3": "^0.6.5",
191
196
  "commander": "^14.0.3",
192
197
  "js-yaml": "^4.1.0",
198
+ "jsonpath-plus": "^10.4.0",
193
199
  "turndown": "^7.2.4",
194
200
  "undici": "^8.0.2",
195
201
  "ws": "^8.18.0",
196
202
  "zod": "^4.3.6"
197
203
  },
198
204
  "devDependencies": {
205
+ "@ai-sdk/openai-compatible": "^2.0.41",
199
206
  "@changesets/cli": "^2.30.0",
200
207
  "@types/js-yaml": "^4.0.9",
201
208
  "@types/node": "^25.6.0",
209
+ "@types/shell-quote": "^1.7.5",
202
210
  "@types/turndown": "^5.0.6",
203
211
  "@types/ws": "^8.5.14",
212
+ "ai": "^6.0.168",
204
213
  "lefthook": "^2.1.5",
205
214
  "oxlint": "^1.0.0",
206
215
  "prettier": "^3.5.0",
216
+ "shell-quote": "^1.8.3",
207
217
  "tsx": "^4.19.0",
208
218
  "typescript": "^6.0.2",
209
219
  "vitepress": "^1.6.0",
210
- "vitest": "^3.2.4"
220
+ "vitest": "^3.2.4",
221
+ "yaml": "^2.8.3"
211
222
  }
212
223
  }
@@ -12,6 +12,7 @@ args:
12
12
  required: true
13
13
  positional: true
14
14
  description: Offer/product ID
15
+ x-unicli-kind: id
15
16
 
16
17
  pipeline:
17
18
  - navigate:
@@ -11,6 +11,7 @@ args:
11
11
  required: true
12
12
  positional: true
13
13
  description: Store member ID
14
+ x-unicli-kind: id
14
15
  limit:
15
16
  type: int
16
17
  default: 20
@@ -10,6 +10,7 @@ args:
10
10
  required: true
11
11
  positional: true
12
12
  description: Article ID
13
+ x-unicli-kind: id
13
14
  limit:
14
15
  type: int
15
16
  default: 1
@@ -0,0 +1,383 @@
1
+ import { cli, Strategy } from "../../registry.js";
2
+ import {
3
+ getElectronApp,
4
+ resolveAppControlPolicy,
5
+ } from "../../electron-apps.js";
6
+ import { launchElectronApp } from "../../browser/launcher.js";
7
+ import { connectElectronApp } from "./shared.js";
8
+ import type { BrowserPage } from "../../browser/page.js";
9
+
10
+ export interface ElectronMediaProfile {
11
+ likedText: string;
12
+ playAllText: string;
13
+ }
14
+
15
+ export interface ElectronDesktopCommandProfile {
16
+ displayName?: string;
17
+ media?: ElectronMediaProfile;
18
+ }
19
+
20
+ export const ELECTRON_DESKTOP_BASE_COMMANDS = [
21
+ "open-app",
22
+ "status-app",
23
+ "dump",
24
+ "snapshot-app",
25
+ "click-text",
26
+ "type-text",
27
+ "press",
28
+ ] as const;
29
+
30
+ export const ELECTRON_DESKTOP_MEDIA_COMMANDS = [
31
+ "play-liked",
32
+ "play",
33
+ "pause",
34
+ "toggle",
35
+ "next",
36
+ "prev",
37
+ ] as const;
38
+
39
+ export function registerElectronDesktopCommands(
40
+ site: string,
41
+ profile: ElectronDesktopCommandProfile = {},
42
+ ): void {
43
+ const app = getElectronApp(site);
44
+ const displayName = profile.displayName ?? app?.displayName ?? site;
45
+
46
+ cli({
47
+ site,
48
+ name: "open-app",
49
+ description: `Open ${displayName} desktop Electron app with CDP enabled for AI control. 打开${displayName}桌面版并启用 CDP 控制。`,
50
+ strategy: Strategy.PUBLIC,
51
+ func: async () => {
52
+ const endpoint = await launchElectronApp(site);
53
+ return [
54
+ {
55
+ app: displayName,
56
+ site,
57
+ port: endpoint.port,
58
+ wsUrl: endpoint.wsUrl,
59
+ policy: resolveAppControlPolicy(site),
60
+ },
61
+ ];
62
+ },
63
+ });
64
+
65
+ cli({
66
+ site,
67
+ name: "status-app",
68
+ description: `Inspect current ${displayName} desktop app page, title, URL, visible controls, and text summary. 查看${displayName}桌面版当前状态和可见内容。`,
69
+ strategy: Strategy.PUBLIC,
70
+ func: async () => [await readDesktopStatus(site, displayName)],
71
+ });
72
+
73
+ cli({
74
+ site,
75
+ name: "dump",
76
+ description: `Dump visible text from the ${displayName} desktop Electron app via CDP DOM. 读取${displayName}桌面版可见文本。`,
77
+ strategy: Strategy.PUBLIC,
78
+ args: [
79
+ {
80
+ name: "limit",
81
+ required: false,
82
+ positional: false,
83
+ description: "Maximum text characters to return",
84
+ },
85
+ ],
86
+ func: async (_page: unknown, kwargs: Record<string, unknown>) => {
87
+ const p = await connectElectronApp(site);
88
+ const limit = readInt(kwargs.limit, 2000);
89
+ return [await dumpVisibleText(p, displayName, limit)];
90
+ },
91
+ });
92
+
93
+ cli({
94
+ site,
95
+ name: "snapshot-app",
96
+ description: `List visible clickable text, buttons, inputs, and regions in ${displayName}. 枚举${displayName}桌面版可交互内容。`,
97
+ strategy: Strategy.PUBLIC,
98
+ func: async () => {
99
+ const p = await connectElectronApp(site);
100
+ return (await p.evaluate(visibleInteractivesJs())) as unknown[];
101
+ },
102
+ });
103
+
104
+ cli({
105
+ site,
106
+ name: "click-text",
107
+ description: `Click visible text, aria-label, title, or button content in ${displayName}. 按文本点击${displayName}桌面版控件。`,
108
+ strategy: Strategy.PUBLIC,
109
+ args: [
110
+ {
111
+ name: "text",
112
+ required: true,
113
+ positional: true,
114
+ description: "Visible text, aria-label, or title to click",
115
+ },
116
+ ],
117
+ func: async (_page: unknown, kwargs: Record<string, unknown>) => {
118
+ const p = await connectElectronApp(site);
119
+ return [await clickVisibleText(p, String(kwargs.text), displayName)];
120
+ },
121
+ });
122
+
123
+ cli({
124
+ site,
125
+ name: "type-text",
126
+ description: `Type text into the focused field or a text-matched target in ${displayName}. 向${displayName}桌面版输入文本。`,
127
+ strategy: Strategy.PUBLIC,
128
+ args: [
129
+ {
130
+ name: "text",
131
+ required: true,
132
+ positional: true,
133
+ description: "Text to type",
134
+ },
135
+ {
136
+ name: "target",
137
+ required: false,
138
+ positional: false,
139
+ description: "Optional visible text to click before typing",
140
+ },
141
+ ],
142
+ func: async (_page: unknown, kwargs: Record<string, unknown>) => {
143
+ const p = await connectElectronApp(site);
144
+ if (kwargs.target !== undefined) {
145
+ await clickVisibleText(p, String(kwargs.target), displayName);
146
+ }
147
+ await p.insertText(String(kwargs.text));
148
+ return [{ app: displayName, typed: true }];
149
+ },
150
+ });
151
+
152
+ cli({
153
+ site,
154
+ name: "press",
155
+ description: `Press a key in ${displayName}, with optional comma-separated modifiers. 在${displayName}桌面版发送按键。`,
156
+ strategy: Strategy.PUBLIC,
157
+ args: [
158
+ {
159
+ name: "key",
160
+ required: true,
161
+ positional: true,
162
+ description: "Key name",
163
+ },
164
+ {
165
+ name: "modifiers",
166
+ required: false,
167
+ positional: false,
168
+ description: "Comma-separated modifiers such as meta,shift",
169
+ },
170
+ ],
171
+ func: async (_page: unknown, kwargs: Record<string, unknown>) => {
172
+ const p = await connectElectronApp(site);
173
+ const modifiers =
174
+ typeof kwargs.modifiers === "string"
175
+ ? kwargs.modifiers
176
+ .split(",")
177
+ .map((s) => s.trim())
178
+ .filter(Boolean)
179
+ : undefined;
180
+ await p.press(String(kwargs.key), modifiers);
181
+ return [{ app: displayName, key: String(kwargs.key), modifiers }];
182
+ },
183
+ });
184
+
185
+ if (profile.media) {
186
+ registerMediaCommands(site, displayName, profile.media);
187
+ }
188
+ }
189
+
190
+ function registerMediaCommands(
191
+ site: string,
192
+ displayName: string,
193
+ media: ElectronMediaProfile,
194
+ ): void {
195
+ cli({
196
+ site,
197
+ name: "play-liked",
198
+ description: `Open ${displayName} liked songs and play the liked playlist. 打开${displayName}我喜欢的音乐/喜欢的歌曲并播放。`,
199
+ strategy: Strategy.PUBLIC,
200
+ func: async () => {
201
+ const p = await connectElectronApp(site);
202
+ const liked = await clickVisibleText(p, media.likedText, displayName);
203
+ await p.wait(1);
204
+ const play = await clickVisibleText(p, media.playAllText, displayName);
205
+ await p.wait(1.5);
206
+ return [{ app: displayName, liked, play, status: await mediaStatus(p) }];
207
+ },
208
+ });
209
+
210
+ for (const action of ["play", "pause", "toggle", "next", "prev"] as const) {
211
+ cli({
212
+ site,
213
+ name: action,
214
+ description: `${action} playback in the ${displayName} desktop app. 控制${displayName}桌面版播放:${action}。`,
215
+ strategy: Strategy.PUBLIC,
216
+ func: async () => {
217
+ const p = await connectElectronApp(site);
218
+ const clicked = await clickMediaControl(p, action, displayName);
219
+ await p.wait(0.8);
220
+ return [
221
+ { app: displayName, action, clicked, status: await mediaStatus(p) },
222
+ ];
223
+ },
224
+ });
225
+ }
226
+ }
227
+
228
+ async function readDesktopStatus(
229
+ site: string,
230
+ displayName: string,
231
+ ): Promise<Record<string, unknown>> {
232
+ const endpoint = await launchElectronApp(site);
233
+ const p = await connectElectronApp(site);
234
+ return {
235
+ app: displayName,
236
+ site,
237
+ port: endpoint.port,
238
+ title: await p.title(),
239
+ url: await p.url(),
240
+ policy: resolveAppControlPolicy(site),
241
+ content: await dumpVisibleText(p, displayName, 700),
242
+ controls: await p.evaluate(visibleInteractivesJs(20)),
243
+ };
244
+ }
245
+
246
+ async function dumpVisibleText(
247
+ p: BrowserPage,
248
+ app: string,
249
+ limit: number,
250
+ ): Promise<Record<string, unknown>> {
251
+ const text = (await p.evaluate(
252
+ `document.body.innerText.slice(0, ${Math.max(1, limit)})`,
253
+ )) as string;
254
+ return { app, text };
255
+ }
256
+
257
+ async function clickVisibleText(
258
+ p: BrowserPage,
259
+ text: string,
260
+ app: string,
261
+ ): Promise<Record<string, unknown>> {
262
+ const result = (await p.evaluate(clickTextJs(text))) as {
263
+ found: boolean;
264
+ x?: number;
265
+ y?: number;
266
+ text?: string;
267
+ };
268
+ if (!result.found || result.x === undefined || result.y === undefined) {
269
+ return { app, clicked: false, text, reason: "text_not_found" };
270
+ }
271
+ await p.nativeClick(result.x, result.y);
272
+ return { app, clicked: true, match: result.text, x: result.x, y: result.y };
273
+ }
274
+
275
+ async function clickMediaControl(
276
+ p: BrowserPage,
277
+ action: "play" | "pause" | "toggle" | "next" | "prev",
278
+ app: string,
279
+ ): Promise<Record<string, unknown>> {
280
+ const target = (await p.evaluate(mediaControlJs(action))) as {
281
+ found: boolean;
282
+ x?: number;
283
+ y?: number;
284
+ label?: string;
285
+ };
286
+ if (!target.found || target.x === undefined || target.y === undefined) {
287
+ return { app, clicked: false, action, reason: "control_not_found" };
288
+ }
289
+ await p.nativeClick(target.x, target.y);
290
+ return { app, clicked: true, action, label: target.label };
291
+ }
292
+
293
+ async function mediaStatus(p: BrowserPage): Promise<unknown> {
294
+ return p.evaluate(`
295
+ (() => {
296
+ const pause = Array.from(document.querySelectorAll('button[title="暂停"]'))
297
+ .find(el => el.getBoundingClientRect().y < innerHeight - 90);
298
+ const row = pause?.closest('.tr');
299
+ return {
300
+ playing: !!pause,
301
+ currentRow: (row?.innerText || '').trim().replace(/\\s+/g, ' ').slice(0, 200),
302
+ bodyTail: document.body.innerText.slice(-300)
303
+ };
304
+ })()
305
+ `);
306
+ }
307
+
308
+ function clickTextJs(text: string): string {
309
+ return `
310
+ (() => {
311
+ const needle = ${JSON.stringify(text)}.trim().toLowerCase();
312
+ const nodes = Array.from(document.querySelectorAll('button,a,[role],div,span,input,textarea'));
313
+ for (const el of nodes) {
314
+ const raw = (el.innerText || el.textContent || el.getAttribute('aria-label') || el.title || el.placeholder || '').trim();
315
+ if (!raw) continue;
316
+ const hay = raw.toLowerCase();
317
+ if (hay !== needle && !hay.includes(needle)) continue;
318
+ const target = el.closest('button,a,[role="button"],.ItemContainer_ijv59hq,.tr') || el;
319
+ const r = target.getBoundingClientRect();
320
+ if (r.width < 1 || r.height < 1 || r.x < -5 || r.y < -5) continue;
321
+ return { found: true, text: raw.slice(0, 160), x: r.x + r.width / 2, y: r.y + r.height / 2 };
322
+ }
323
+ return { found: false };
324
+ })()
325
+ `;
326
+ }
327
+
328
+ function mediaControlJs(action: string): string {
329
+ return `
330
+ (() => {
331
+ const bottom = Array.from(document.querySelectorAll('button')).map((el, index) => {
332
+ const r = el.getBoundingClientRect();
333
+ const label = [el.title, el.getAttribute('aria-label'), el.innerText, el.textContent].filter(Boolean).join(' ').trim();
334
+ return { el, index, label, cls: String(el.className || ''), x: r.x, y: r.y, w: r.width, h: r.height };
335
+ }).filter(b => b.w > 0 && b.h > 0 && b.y > innerHeight - 90).sort((a, b) => a.x - b.x);
336
+ const pick = (b) => ({ found: true, label: b.label || b.cls, x: b.x + b.w / 2, y: b.y + b.h / 2 });
337
+ const rx = {
338
+ next: /下一首|下一个|next/i,
339
+ prev: /上一首|上一个|previous|prev/i,
340
+ play: /播放|play/i,
341
+ pause: /暂停|pause/i
342
+ }[${JSON.stringify(action)}];
343
+ if (rx) {
344
+ const labeled = bottom.find(b => rx.test(b.label));
345
+ if (labeled) return pick(labeled);
346
+ }
347
+ const center = bottom.find(b => b.cls.includes('play-pause-btn')) ||
348
+ bottom.slice().sort((a, b) => Math.abs((a.x + a.w / 2) - innerWidth / 2) - Math.abs((b.x + b.w / 2) - innerWidth / 2))[0];
349
+ if (!center) return { found: false };
350
+ if (${JSON.stringify(action)} === 'toggle' || ${JSON.stringify(action)} === 'play' || ${JSON.stringify(action)} === 'pause') return pick(center);
351
+ const idx = bottom.indexOf(center);
352
+ const neighbor = ${JSON.stringify(action)} === 'next' ? bottom[idx + 1] : bottom[idx - 1];
353
+ return neighbor ? pick(neighbor) : { found: false };
354
+ })()
355
+ `;
356
+ }
357
+
358
+ function visibleInteractivesJs(limit = 80): string {
359
+ return `
360
+ (() => {
361
+ const out = [];
362
+ const nodes = document.querySelectorAll('button,a,input,textarea,[role="button"],[role="textbox"],[contenteditable="true"]');
363
+ for (const el of nodes) {
364
+ const r = el.getBoundingClientRect();
365
+ if (r.width < 1 || r.height < 1 || r.y < -5 || r.y > innerHeight + 5) continue;
366
+ const text = (el.innerText || el.textContent || el.getAttribute('aria-label') || el.title || el.placeholder || '').trim().replace(/\\s+/g, ' ');
367
+ out.push({ tag: el.tagName, role: el.getAttribute('role'), text: text.slice(0, 120), title: el.title, rect: { x: r.x, y: r.y, w: r.width, h: r.height } });
368
+ if (out.length >= ${limit}) break;
369
+ }
370
+ return out;
371
+ })()
372
+ `;
373
+ }
374
+
375
+ function readInt(value: unknown, fallback: number): number {
376
+ const n =
377
+ typeof value === "number"
378
+ ? value
379
+ : typeof value === "string"
380
+ ? Number.parseInt(value, 10)
381
+ : Number.NaN;
382
+ return Number.isFinite(n) && n > 0 ? Math.trunc(n) : fallback;
383
+ }
@@ -10,6 +10,8 @@ args:
10
10
  type: str
11
11
  default: ""
12
12
  description: "Best sellers URL or category path (default: top-level)"
13
+ x-unicli-kind: path
14
+ x-unicli-accepts: [url]
13
15
  limit:
14
16
  type: int
15
17
  default: 20
@@ -10,6 +10,8 @@ args:
10
10
  type: str
11
11
  default: ""
12
12
  description: "Movers & Shakers URL or category path"
13
+ x-unicli-kind: path
14
+ x-unicli-accepts: [url]
13
15
  limit:
14
16
  type: int
15
17
  default: 20
@@ -10,6 +10,8 @@ args:
10
10
  type: str
11
11
  default: ""
12
12
  description: "New releases URL or category path"
13
+ x-unicli-kind: path
14
+ x-unicli-accepts: [url]
13
15
  limit:
14
16
  type: int
15
17
  default: 20
@@ -11,6 +11,7 @@ args:
11
11
  required: true
12
12
  positional: true
13
13
  description: "Rankings page URL"
14
+ format: uri
14
15
  limit:
15
16
  type: int
16
17
  default: 20
@@ -11,6 +11,7 @@ args:
11
11
  required: true
12
12
  positional: true
13
13
  description: Podcast ID (collectionId from search output)
14
+ x-unicli-kind: id
14
15
  limit:
15
16
  type: int
16
17
  default: 15
@@ -11,6 +11,7 @@ args:
11
11
  required: true
12
12
  positional: true
13
13
  description: "arXiv paper ID (e.g. 1706.03762)"
14
+ x-unicli-kind: id
14
15
 
15
16
  pipeline:
16
17
  - fetch_text:
@@ -16,6 +16,7 @@ args:
16
16
  type: str
17
17
  required: true
18
18
  description: Output file path (format inferred from extension)
19
+ x-unicli-kind: path
19
20
 
20
21
  pipeline:
21
22
  - exec:
@@ -16,6 +16,7 @@ args:
16
16
  type: str
17
17
  required: true
18
18
  description: Output file path
19
+ x-unicli-kind: path
19
20
  effect:
20
21
  type: str
21
22
  required: true
@@ -12,6 +12,7 @@ args:
12
12
  required: true
13
13
  positional: true
14
14
  description: Path to audio file
15
+ x-unicli-kind: path
15
16
 
16
17
  pipeline:
17
18
  - exec:
@@ -16,6 +16,7 @@ args:
16
16
  type: str
17
17
  required: true
18
18
  description: Output file path
19
+ x-unicli-kind: path
19
20
 
20
21
  pipeline:
21
22
  - exec:
@@ -16,6 +16,7 @@ args:
16
16
  type: str
17
17
  required: true
18
18
  description: Output file path
19
+ x-unicli-kind: path
19
20
  level:
20
21
  type: float
21
22
  default: -1.0
@@ -16,6 +16,7 @@ args:
16
16
  type: str
17
17
  required: true
18
18
  description: Output PNG file path
19
+ x-unicli-kind: path
19
20
  title:
20
21
  type: str
21
22
  default: ""
@@ -16,6 +16,7 @@ args:
16
16
  type: str
17
17
  required: true
18
18
  description: Output file path prefix (will append _left/_right)
19
+ x-unicli-kind: path
19
20
 
20
21
  pipeline:
21
22
  - exec: