@zenalexa/unicli 0.216.3 → 0.217.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/AGENTS.md +7 -6
  2. package/README.md +67 -19
  3. package/README.zh-CN.md +44 -16
  4. package/crates/unicli-atspi/Cargo.toml +47 -0
  5. package/crates/unicli-atspi/README.md +6 -0
  6. package/crates/unicli-atspi/src/errors.rs +213 -0
  7. package/crates/unicli-atspi/src/input.rs +1004 -0
  8. package/crates/unicli-atspi/src/invoke.rs +1132 -0
  9. package/crates/unicli-atspi/src/main.rs +130 -0
  10. package/crates/unicli-atspi/src/refs.rs +24 -0
  11. package/crates/unicli-atspi/src/screenshot.rs +756 -0
  12. package/crates/unicli-atspi/src/tree.rs +2319 -0
  13. package/crates/unicli-shared/Cargo.toml +13 -0
  14. package/crates/unicli-shared/src/lib.rs +77 -0
  15. package/crates/unicli-uia/Cargo.toml +29 -0
  16. package/crates/unicli-uia/README.md +6 -0
  17. package/crates/unicli-uia/src/errors.rs +179 -0
  18. package/crates/unicli-uia/src/input.rs +790 -0
  19. package/crates/unicli-uia/src/invoke.rs +977 -0
  20. package/crates/unicli-uia/src/main.rs +130 -0
  21. package/crates/unicli-uia/src/refs.rs +24 -0
  22. package/crates/unicli-uia/src/screenshot.rs +685 -0
  23. package/crates/unicli-uia/src/tree.rs +2135 -0
  24. package/dist/adapters/_electron/desktop-shared.d.ts.map +1 -1
  25. package/dist/adapters/_electron/desktop-shared.js +13 -0
  26. package/dist/adapters/_electron/desktop-shared.js.map +1 -1
  27. package/dist/adapters/_electron/shared.d.ts +1 -0
  28. package/dist/adapters/_electron/shared.d.ts.map +1 -1
  29. package/dist/adapters/_electron/shared.js +49 -2
  30. package/dist/adapters/_electron/shared.js.map +1 -1
  31. package/dist/adapters/macos/actions.d.ts +9 -0
  32. package/dist/adapters/macos/actions.d.ts.map +1 -0
  33. package/dist/adapters/macos/actions.js +55 -0
  34. package/dist/adapters/macos/actions.js.map +1 -0
  35. package/dist/browser/bridge.d.ts +5 -1
  36. package/dist/browser/bridge.d.ts.map +1 -1
  37. package/dist/browser/bridge.js +86 -23
  38. package/dist/browser/bridge.js.map +1 -1
  39. package/dist/browser/cdp-client.d.ts +2 -0
  40. package/dist/browser/cdp-client.d.ts.map +1 -1
  41. package/dist/browser/cdp-client.js +7 -0
  42. package/dist/browser/cdp-client.js.map +1 -1
  43. package/dist/browser/page.d.ts +2 -0
  44. package/dist/browser/page.d.ts.map +1 -1
  45. package/dist/browser/page.js +35 -0
  46. package/dist/browser/page.js.map +1 -1
  47. package/dist/cli.d.ts.map +1 -1
  48. package/dist/cli.js +17 -2
  49. package/dist/cli.js.map +1 -1
  50. package/dist/commands/approvals.d.ts +3 -0
  51. package/dist/commands/approvals.d.ts.map +1 -0
  52. package/dist/commands/approvals.js +123 -0
  53. package/dist/commands/approvals.js.map +1 -0
  54. package/dist/commands/browser-operator-runtime.d.ts.map +1 -1
  55. package/dist/commands/browser-operator-runtime.js +5 -2
  56. package/dist/commands/browser-operator-runtime.js.map +1 -1
  57. package/dist/commands/browser-operator.d.ts.map +1 -1
  58. package/dist/commands/browser-operator.js +182 -38
  59. package/dist/commands/browser-operator.js.map +1 -1
  60. package/dist/commands/compute.d.ts +3 -0
  61. package/dist/commands/compute.d.ts.map +1 -0
  62. package/dist/commands/compute.js +324 -0
  63. package/dist/commands/compute.js.map +1 -0
  64. package/dist/commands/describe.d.ts.map +1 -1
  65. package/dist/commands/describe.js +20 -1
  66. package/dist/commands/describe.js.map +1 -1
  67. package/dist/commands/dispatch.d.ts +3 -0
  68. package/dist/commands/dispatch.d.ts.map +1 -1
  69. package/dist/commands/dispatch.js +76 -4
  70. package/dist/commands/dispatch.js.map +1 -1
  71. package/dist/commands/doctor-compute.d.ts +38 -0
  72. package/dist/commands/doctor-compute.d.ts.map +1 -0
  73. package/dist/commands/doctor-compute.js +376 -0
  74. package/dist/commands/doctor-compute.js.map +1 -0
  75. package/dist/commands/lint.d.ts.map +1 -1
  76. package/dist/commands/lint.js +69 -1
  77. package/dist/commands/lint.js.map +1 -1
  78. package/dist/commands/mcp.d.ts.map +1 -1
  79. package/dist/commands/mcp.js +4 -0
  80. package/dist/commands/mcp.js.map +1 -1
  81. package/dist/commands/runs.d.ts +3 -0
  82. package/dist/commands/runs.d.ts.map +1 -0
  83. package/dist/commands/runs.js +367 -0
  84. package/dist/commands/runs.js.map +1 -0
  85. package/dist/core/envelope.d.ts +8 -0
  86. package/dist/core/envelope.d.ts.map +1 -1
  87. package/dist/core/envelope.js +1 -0
  88. package/dist/core/envelope.js.map +1 -1
  89. package/dist/core/schema-v2.d.ts +2 -2
  90. package/dist/discovery/aliases.d.ts.map +1 -1
  91. package/dist/discovery/aliases.js +15 -0
  92. package/dist/discovery/aliases.js.map +1 -1
  93. package/dist/discovery/loader.d.ts.map +1 -1
  94. package/dist/discovery/loader.js +11 -0
  95. package/dist/discovery/loader.js.map +1 -1
  96. package/dist/discovery/macos-dynamic.d.ts +58 -0
  97. package/dist/discovery/macos-dynamic.d.ts.map +1 -0
  98. package/dist/discovery/macos-dynamic.js +429 -0
  99. package/dist/discovery/macos-dynamic.js.map +1 -0
  100. package/dist/discovery/search.d.ts.map +1 -1
  101. package/dist/discovery/search.js +152 -3
  102. package/dist/discovery/search.js.map +1 -1
  103. package/dist/electron-apps.d.ts +1 -0
  104. package/dist/electron-apps.d.ts.map +1 -1
  105. package/dist/electron-apps.js +1 -0
  106. package/dist/electron-apps.js.map +1 -1
  107. package/dist/engine/approval-store.d.ts +43 -0
  108. package/dist/engine/approval-store.d.ts.map +1 -0
  109. package/dist/engine/approval-store.js +193 -0
  110. package/dist/engine/approval-store.js.map +1 -0
  111. package/dist/engine/browser/action-evidence.d.ts +30 -0
  112. package/dist/engine/browser/action-evidence.d.ts.map +1 -0
  113. package/dist/engine/browser/action-evidence.js +354 -0
  114. package/dist/engine/browser/action-evidence.js.map +1 -0
  115. package/dist/engine/browser/evidence.d.ts +85 -0
  116. package/dist/engine/browser/evidence.d.ts.map +1 -0
  117. package/dist/engine/browser/evidence.js +373 -0
  118. package/dist/engine/browser/evidence.js.map +1 -0
  119. package/dist/engine/browser/session-lease.d.ts +53 -0
  120. package/dist/engine/browser/session-lease.d.ts.map +1 -0
  121. package/dist/engine/browser/session-lease.js +100 -0
  122. package/dist/engine/browser/session-lease.js.map +1 -0
  123. package/dist/engine/browser/session-lock.d.ts +17 -0
  124. package/dist/engine/browser/session-lock.d.ts.map +1 -0
  125. package/dist/engine/browser/session-lock.js +114 -0
  126. package/dist/engine/browser/session-lock.js.map +1 -0
  127. package/dist/engine/browser/session-runtime.d.ts +10 -0
  128. package/dist/engine/browser/session-runtime.d.ts.map +1 -0
  129. package/dist/engine/browser/session-runtime.js +87 -0
  130. package/dist/engine/browser/session-runtime.js.map +1 -0
  131. package/dist/engine/capability-policy.d.ts +50 -0
  132. package/dist/engine/capability-policy.d.ts.map +1 -0
  133. package/dist/engine/capability-policy.js +305 -0
  134. package/dist/engine/capability-policy.js.map +1 -0
  135. package/dist/engine/executor.d.ts +8 -3
  136. package/dist/engine/executor.d.ts.map +1 -1
  137. package/dist/engine/executor.js +9 -2
  138. package/dist/engine/executor.js.map +1 -1
  139. package/dist/engine/kernel/execute.d.ts +5 -1
  140. package/dist/engine/kernel/execute.d.ts.map +1 -1
  141. package/dist/engine/kernel/execute.js +215 -11
  142. package/dist/engine/kernel/execute.js.map +1 -1
  143. package/dist/engine/kernel/types.d.ts +15 -0
  144. package/dist/engine/kernel/types.d.ts.map +1 -1
  145. package/dist/engine/operation-policy.d.ts +60 -0
  146. package/dist/engine/operation-policy.d.ts.map +1 -0
  147. package/dist/engine/operation-policy.js +364 -0
  148. package/dist/engine/operation-policy.js.map +1 -0
  149. package/dist/engine/permission-rules.d.ts +43 -0
  150. package/dist/engine/permission-rules.d.ts.map +1 -0
  151. package/dist/engine/permission-rules.js +401 -0
  152. package/dist/engine/permission-rules.js.map +1 -0
  153. package/dist/engine/permission-runtime.d.ts +11 -0
  154. package/dist/engine/permission-runtime.d.ts.map +1 -0
  155. package/dist/engine/permission-runtime.js +21 -0
  156. package/dist/engine/permission-runtime.js.map +1 -0
  157. package/dist/engine/repair/remedies.d.ts +4 -0
  158. package/dist/engine/repair/remedies.d.ts.map +1 -0
  159. package/dist/engine/repair/remedies.js +169 -0
  160. package/dist/engine/repair/remedies.js.map +1 -0
  161. package/dist/engine/runtime-resource-guard.d.ts +23 -0
  162. package/dist/engine/runtime-resource-guard.d.ts.map +1 -0
  163. package/dist/engine/runtime-resource-guard.js +85 -0
  164. package/dist/engine/runtime-resource-guard.js.map +1 -0
  165. package/dist/engine/session/args.d.ts +3 -0
  166. package/dist/engine/session/args.d.ts.map +1 -0
  167. package/dist/engine/session/args.js +17 -0
  168. package/dist/engine/session/args.js.map +1 -0
  169. package/dist/engine/session/compare.d.ts +92 -0
  170. package/dist/engine/session/compare.d.ts.map +1 -0
  171. package/dist/engine/session/compare.js +324 -0
  172. package/dist/engine/session/compare.js.map +1 -0
  173. package/dist/engine/session/environment.d.ts +4 -0
  174. package/dist/engine/session/environment.d.ts.map +1 -0
  175. package/dist/engine/session/environment.js +25 -0
  176. package/dist/engine/session/environment.js.map +1 -0
  177. package/dist/engine/session/events.d.ts +24 -0
  178. package/dist/engine/session/events.d.ts.map +1 -0
  179. package/dist/engine/session/events.js +78 -0
  180. package/dist/engine/session/events.js.map +1 -0
  181. package/dist/engine/session/query.d.ts +47 -0
  182. package/dist/engine/session/query.d.ts.map +1 -0
  183. package/dist/engine/session/query.js +299 -0
  184. package/dist/engine/session/query.js.map +1 -0
  185. package/dist/engine/session/replay.d.ts +35 -0
  186. package/dist/engine/session/replay.d.ts.map +1 -0
  187. package/dist/engine/session/replay.js +144 -0
  188. package/dist/engine/session/replay.js.map +1 -0
  189. package/dist/engine/session/run-loop.d.ts +11 -0
  190. package/dist/engine/session/run-loop.d.ts.map +1 -0
  191. package/dist/engine/session/run-loop.js +212 -0
  192. package/dist/engine/session/run-loop.js.map +1 -0
  193. package/dist/engine/session/store.d.ts +26 -0
  194. package/dist/engine/session/store.d.ts.map +1 -0
  195. package/dist/engine/session/store.js +214 -0
  196. package/dist/engine/session/store.js.map +1 -0
  197. package/dist/engine/session/types.d.ts +39 -0
  198. package/dist/engine/session/types.d.ts.map +1 -0
  199. package/dist/engine/session/types.js +2 -0
  200. package/dist/engine/session/types.js.map +1 -0
  201. package/dist/engine/steps/compute.d.ts +41 -0
  202. package/dist/engine/steps/compute.d.ts.map +1 -0
  203. package/dist/engine/steps/compute.js +55 -0
  204. package/dist/engine/steps/compute.js.map +1 -0
  205. package/dist/engine/steps/desktop-ax.d.ts +8 -0
  206. package/dist/engine/steps/desktop-ax.d.ts.map +1 -1
  207. package/dist/engine/steps/desktop-ax.js +16 -0
  208. package/dist/engine/steps/desktop-ax.js.map +1 -1
  209. package/dist/engine/steps/desktop-sidecar.d.ts +49 -0
  210. package/dist/engine/steps/desktop-sidecar.d.ts.map +1 -0
  211. package/dist/engine/steps/desktop-sidecar.js +50 -0
  212. package/dist/engine/steps/desktop-sidecar.js.map +1 -0
  213. package/dist/engine/steps/download.d.ts +1 -1
  214. package/dist/engine/steps/download.d.ts.map +1 -1
  215. package/dist/engine/steps/download.js +24 -2
  216. package/dist/engine/steps/download.js.map +1 -1
  217. package/dist/engine/steps/exec.d.ts +1 -1
  218. package/dist/engine/steps/exec.d.ts.map +1 -1
  219. package/dist/engine/steps/exec.js +23 -7
  220. package/dist/engine/steps/exec.js.map +1 -1
  221. package/dist/engine/steps/fetch-text.d.ts +2 -2
  222. package/dist/engine/steps/fetch-text.d.ts.map +1 -1
  223. package/dist/engine/steps/fetch-text.js +61 -19
  224. package/dist/engine/steps/fetch-text.js.map +1 -1
  225. package/dist/engine/steps/fetch.d.ts +3 -1
  226. package/dist/engine/steps/fetch.d.ts.map +1 -1
  227. package/dist/engine/steps/fetch.js +36 -7
  228. package/dist/engine/steps/fetch.js.map +1 -1
  229. package/dist/engine/steps/index.d.ts +2 -0
  230. package/dist/engine/steps/index.d.ts.map +1 -1
  231. package/dist/engine/steps/index.js +2 -0
  232. package/dist/engine/steps/index.js.map +1 -1
  233. package/dist/engine/steps/navigate.d.ts +1 -1
  234. package/dist/engine/steps/navigate.d.ts.map +1 -1
  235. package/dist/engine/steps/navigate.js +29 -2
  236. package/dist/engine/steps/navigate.js.map +1 -1
  237. package/dist/engine/steps/parse-rss.d.ts.map +1 -1
  238. package/dist/engine/steps/parse-rss.js +9 -4
  239. package/dist/engine/steps/parse-rss.js.map +1 -1
  240. package/dist/engine/template.d.ts.map +1 -1
  241. package/dist/engine/template.js +2 -1
  242. package/dist/engine/template.js.map +1 -1
  243. package/dist/engine/text-normalize.d.ts +6 -0
  244. package/dist/engine/text-normalize.d.ts.map +1 -0
  245. package/dist/engine/text-normalize.js +63 -0
  246. package/dist/engine/text-normalize.js.map +1 -0
  247. package/dist/fast-path.d.ts.map +1 -1
  248. package/dist/fast-path.js +291 -8
  249. package/dist/fast-path.js.map +1 -1
  250. package/dist/main.d.ts +1 -1
  251. package/dist/main.js +1 -1
  252. package/dist/manifest-compact.txt +2 -2
  253. package/dist/manifest-search.json +1 -1
  254. package/dist/manifest.json +4313 -533
  255. package/dist/mcp/dispatch.d.ts +3 -3
  256. package/dist/mcp/dispatch.d.ts.map +1 -1
  257. package/dist/mcp/dispatch.js +6 -5
  258. package/dist/mcp/dispatch.js.map +1 -1
  259. package/dist/mcp/handler.d.ts +2 -2
  260. package/dist/mcp/handler.d.ts.map +1 -1
  261. package/dist/mcp/handler.js +59 -5
  262. package/dist/mcp/handler.js.map +1 -1
  263. package/dist/mcp/profiles/computer-use.d.ts +4 -0
  264. package/dist/mcp/profiles/computer-use.d.ts.map +1 -0
  265. package/dist/mcp/profiles/computer-use.js +305 -0
  266. package/dist/mcp/profiles/computer-use.js.map +1 -0
  267. package/dist/mcp/server.d.ts.map +1 -1
  268. package/dist/mcp/server.js +30 -6
  269. package/dist/mcp/server.js.map +1 -1
  270. package/dist/mcp/tools.d.ts +9 -0
  271. package/dist/mcp/tools.d.ts.map +1 -1
  272. package/dist/mcp/tools.js +20 -0
  273. package/dist/mcp/tools.js.map +1 -1
  274. package/dist/output/envelope.d.ts +6 -0
  275. package/dist/output/envelope.d.ts.map +1 -1
  276. package/dist/output/envelope.js.map +1 -1
  277. package/dist/output/error-map.d.ts.map +1 -1
  278. package/dist/output/error-map.js +25 -0
  279. package/dist/output/error-map.js.map +1 -1
  280. package/dist/protocol/acp-helpers.d.ts +2 -2
  281. package/dist/protocol/acp-helpers.d.ts.map +1 -1
  282. package/dist/protocol/acp-helpers.js +5 -4
  283. package/dist/protocol/acp-helpers.js.map +1 -1
  284. package/dist/registry.d.ts +4 -1
  285. package/dist/registry.d.ts.map +1 -1
  286. package/dist/registry.js +7 -0
  287. package/dist/registry.js.map +1 -1
  288. package/dist/transport/adapters/cdp-browser.d.ts +38 -2
  289. package/dist/transport/adapters/cdp-browser.d.ts.map +1 -1
  290. package/dist/transport/adapters/cdp-browser.js +349 -22
  291. package/dist/transport/adapters/cdp-browser.js.map +1 -1
  292. package/dist/transport/adapters/desktop-atspi.d.ts +23 -17
  293. package/dist/transport/adapters/desktop-atspi.d.ts.map +1 -1
  294. package/dist/transport/adapters/desktop-atspi.js +143 -32
  295. package/dist/transport/adapters/desktop-atspi.js.map +1 -1
  296. package/dist/transport/adapters/desktop-ax-helpers.d.ts +24 -0
  297. package/dist/transport/adapters/desktop-ax-helpers.d.ts.map +1 -0
  298. package/dist/transport/adapters/desktop-ax-helpers.js +190 -0
  299. package/dist/transport/adapters/desktop-ax-helpers.js.map +1 -0
  300. package/dist/transport/adapters/desktop-ax-swift.d.ts +13 -0
  301. package/dist/transport/adapters/desktop-ax-swift.d.ts.map +1 -1
  302. package/dist/transport/adapters/desktop-ax-swift.js +176 -2
  303. package/dist/transport/adapters/desktop-ax-swift.js.map +1 -1
  304. package/dist/transport/adapters/desktop-ax.d.ts +11 -2
  305. package/dist/transport/adapters/desktop-ax.d.ts.map +1 -1
  306. package/dist/transport/adapters/desktop-ax.js +131 -16
  307. package/dist/transport/adapters/desktop-ax.js.map +1 -1
  308. package/dist/transport/adapters/desktop-sidecar-errors.d.ts +3 -0
  309. package/dist/transport/adapters/desktop-sidecar-errors.d.ts.map +1 -0
  310. package/dist/transport/adapters/desktop-sidecar-errors.js +34 -0
  311. package/dist/transport/adapters/desktop-sidecar-errors.js.map +1 -0
  312. package/dist/transport/adapters/desktop-sidecar-snapshot.d.ts +10 -0
  313. package/dist/transport/adapters/desktop-sidecar-snapshot.d.ts.map +1 -0
  314. package/dist/transport/adapters/desktop-sidecar-snapshot.js +89 -0
  315. package/dist/transport/adapters/desktop-sidecar-snapshot.js.map +1 -0
  316. package/dist/transport/adapters/desktop-uia.d.ts +23 -17
  317. package/dist/transport/adapters/desktop-uia.d.ts.map +1 -1
  318. package/dist/transport/adapters/desktop-uia.js +142 -32
  319. package/dist/transport/adapters/desktop-uia.js.map +1 -1
  320. package/dist/transport/adapters/subprocess.d.ts +7 -0
  321. package/dist/transport/adapters/subprocess.d.ts.map +1 -1
  322. package/dist/transport/adapters/subprocess.js +64 -0
  323. package/dist/transport/adapters/subprocess.js.map +1 -1
  324. package/dist/transport/bus.d.ts +2 -0
  325. package/dist/transport/bus.d.ts.map +1 -1
  326. package/dist/transport/bus.js +7 -11
  327. package/dist/transport/bus.js.map +1 -1
  328. package/dist/transport/capability.d.ts.map +1 -1
  329. package/dist/transport/capability.js +123 -98
  330. package/dist/transport/capability.js.map +1 -1
  331. package/dist/transport/cascade.d.ts +5 -0
  332. package/dist/transport/cascade.d.ts.map +1 -0
  333. package/dist/transport/cascade.js +550 -0
  334. package/dist/transport/cascade.js.map +1 -0
  335. package/dist/transport/cdp-session.d.ts +11 -0
  336. package/dist/transport/cdp-session.d.ts.map +1 -0
  337. package/dist/transport/cdp-session.js +52 -0
  338. package/dist/transport/cdp-session.js.map +1 -0
  339. package/dist/transport/refs.d.ts +51 -0
  340. package/dist/transport/refs.d.ts.map +1 -0
  341. package/dist/transport/refs.js +135 -0
  342. package/dist/transport/refs.js.map +1 -0
  343. package/dist/transport/sidecar-binary.d.ts +18 -0
  344. package/dist/transport/sidecar-binary.d.ts.map +1 -0
  345. package/dist/transport/sidecar-binary.js +55 -0
  346. package/dist/transport/sidecar-binary.js.map +1 -0
  347. package/dist/transport/sidecar.d.ts +35 -0
  348. package/dist/transport/sidecar.d.ts.map +1 -0
  349. package/dist/transport/sidecar.js +134 -0
  350. package/dist/transport/sidecar.js.map +1 -0
  351. package/dist/transport/snapshot-encoder.d.ts +34 -0
  352. package/dist/transport/snapshot-encoder.d.ts.map +1 -0
  353. package/dist/transport/snapshot-encoder.js +139 -0
  354. package/dist/transport/snapshot-encoder.js.map +1 -0
  355. package/dist/transport/types.d.ts +6 -1
  356. package/dist/transport/types.d.ts.map +1 -1
  357. package/dist/types.d.ts +11 -1
  358. package/dist/types.d.ts.map +1 -1
  359. package/dist/types.js.map +1 -1
  360. package/docs/mcp/clients/claude-code.md +29 -0
  361. package/docs/mcp/clients/claude-desktop.md +47 -0
  362. package/docs/mcp/clients/codex.md +29 -0
  363. package/docs/mcp/clients/cursor.md +38 -0
  364. package/docs/mcp/clients/gemini-cli.md +38 -0
  365. package/docs/operate/compute.md +172 -0
  366. package/docs/operate/electron.md +87 -0
  367. package/docs/operate/focus-behavior.md +40 -0
  368. package/docs/operate/troubleshooting.md +379 -0
  369. package/package.json +44 -19
  370. package/src/adapters/36kr/news.yaml +4 -1
  371. package/src/adapters/_electron/desktop-shared.ts +14 -0
  372. package/src/adapters/_electron/shared.ts +54 -2
  373. package/src/adapters/juejin/hot.test.ts +25 -0
  374. package/src/adapters/juejin/hot.yaml +52 -0
  375. package/src/adapters/juejin/search.test.ts +27 -0
  376. package/src/adapters/juejin/search.yaml +58 -0
  377. package/src/adapters/leetcode/discuss-search.test.ts +29 -0
  378. package/src/adapters/leetcode/discuss-search.yaml +56 -0
  379. package/src/adapters/macos/actions.ts +63 -0
@@ -43,6 +43,20 @@ export interface AIChatConfig {
43
43
  displayName?: string;
44
44
  }
45
45
 
46
+ function normalizeModelText(value: string): string {
47
+ return value.trim().toLowerCase().replace(/\s+/g, " ");
48
+ }
49
+
50
+ export function isRequestedModelActive(
51
+ currentModelText: string,
52
+ requestedModel: string,
53
+ ): boolean {
54
+ const observed = normalizeModelText(currentModelText);
55
+ const requested = normalizeModelText(requestedModel);
56
+ if (!observed || !requested || observed === "unknown") return false;
57
+ return observed === requested || observed.includes(requested);
58
+ }
59
+
46
60
  /**
47
61
  * Register standard AI chat commands for an Electron app.
48
62
  * Each app gets: ask, send, read, model, status, new, screenshot, dump
@@ -60,6 +74,10 @@ export function registerAIChatCommands(
60
74
  sendButtonSelector,
61
75
  displayName = site,
62
76
  } = config;
77
+ const desktopCommandMeta = {
78
+ adapter_path: `src/adapters/${site}/${site}.ts`,
79
+ target_surface: "desktop" as const,
80
+ };
63
81
 
64
82
  /** Escape single quotes in selectors for use in evaluate strings */
65
83
  const esc = (s: string): string => s.replace(/'/g, "\\'");
@@ -70,6 +88,7 @@ export function registerAIChatCommands(
70
88
  name: "ask",
71
89
  description: `Send a prompt to ${displayName} and wait for response`,
72
90
  strategy: Strategy.PUBLIC,
91
+ ...desktopCommandMeta,
73
92
  args: [
74
93
  {
75
94
  name: "prompt",
@@ -114,6 +133,7 @@ export function registerAIChatCommands(
114
133
  name: "send",
115
134
  description: `Send text to ${displayName} without waiting`,
116
135
  strategy: Strategy.PUBLIC,
136
+ ...desktopCommandMeta,
117
137
  args: [{ name: "text", required: true, positional: true }],
118
138
  func: async (_page: unknown, kwargs: Record<string, unknown>) => {
119
139
  const p = await connectElectronApp(site);
@@ -135,6 +155,7 @@ export function registerAIChatCommands(
135
155
  name: "read",
136
156
  description: `Read the last response from ${displayName}`,
137
157
  strategy: Strategy.PUBLIC,
158
+ ...desktopCommandMeta,
138
159
  func: async () => {
139
160
  const p = await connectElectronApp(site);
140
161
  const text = (await p.evaluate(
@@ -151,13 +172,40 @@ export function registerAIChatCommands(
151
172
  name: "model",
152
173
  description: `Read or switch the current model in ${displayName}`,
153
174
  strategy: Strategy.PUBLIC,
175
+ ...desktopCommandMeta,
154
176
  args: [{ name: "name", required: false, positional: true }],
155
- func: async (_page: unknown, _kwargs: Record<string, unknown>) => {
177
+ func: async (_page: unknown, kwargs: Record<string, unknown>) => {
156
178
  const p = await connectElectronApp(site);
179
+ const requested =
180
+ typeof kwargs.name === "string" ? kwargs.name.trim() : "";
181
+ if (requested) {
182
+ await p.click(modelSelector);
183
+ await p.wait(0.5);
184
+ await p.evaluate(`(() => {
185
+ const wanted = ${JSON.stringify(requested.toLowerCase())};
186
+ const nodes = Array.from(document.querySelectorAll('button,[role="button"],[role="menuitem"],[role="option"],li,div,span'));
187
+ const candidate = nodes.find((node) => {
188
+ const text = (node.textContent || '').trim().toLowerCase();
189
+ return text === wanted || text.includes(wanted);
190
+ });
191
+ if (!candidate) return false;
192
+ candidate.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));
193
+ return true;
194
+ })()`);
195
+ await p.wait(0.8);
196
+ }
157
197
  const current = (await p.evaluate(
158
198
  `document.querySelector('${esc(modelSelector)}')?.innerText ?? 'unknown'`,
159
199
  )) as string;
160
- return [{ model: current }];
200
+ return requested
201
+ ? [
202
+ {
203
+ model: current,
204
+ requested,
205
+ switched: isRequestedModelActive(current, requested),
206
+ },
207
+ ]
208
+ : [{ model: current }];
161
209
  },
162
210
  });
163
211
  }
@@ -168,6 +216,7 @@ export function registerAIChatCommands(
168
216
  name: "status",
169
217
  description: `Check ${displayName} app status`,
170
218
  strategy: Strategy.PUBLIC,
219
+ ...desktopCommandMeta,
171
220
  func: async () => {
172
221
  const p = await connectElectronApp(site);
173
222
  const title = await p.title();
@@ -188,6 +237,7 @@ export function registerAIChatCommands(
188
237
  name: "new",
189
238
  description: `Start a new conversation in ${displayName}`,
190
239
  strategy: Strategy.PUBLIC,
240
+ ...desktopCommandMeta,
191
241
  func: async () => {
192
242
  const p = await connectElectronApp(site);
193
243
  if (newChatSelector.startsWith("key:")) {
@@ -213,6 +263,7 @@ export function registerAIChatCommands(
213
263
  name: "screenshot",
214
264
  description: `Capture screenshot of ${displayName}`,
215
265
  strategy: Strategy.PUBLIC,
266
+ ...desktopCommandMeta,
216
267
  args: [
217
268
  {
218
269
  name: "path",
@@ -235,6 +286,7 @@ export function registerAIChatCommands(
235
286
  name: "dump",
236
287
  description: `Dump full page content from ${displayName}`,
237
288
  strategy: Strategy.PUBLIC,
289
+ ...desktopCommandMeta,
238
290
  func: async () => {
239
291
  const p = await connectElectronApp(site);
240
292
  const snapshot = await p.snapshot({ compact: true });
@@ -0,0 +1,25 @@
1
+ import { describe, it } from "vitest";
2
+ import {
3
+ runAdapterWithFixture,
4
+ expectAdapterShape,
5
+ } from "../../../tests/adapter-runner.js";
6
+
7
+ describe("juejin hot", () => {
8
+ it("returns rows with declared columns against fixture", async () => {
9
+ const { output } = await runAdapterWithFixture("juejin", "hot");
10
+ expectAdapterShape(output, {
11
+ columns: [
12
+ "rank",
13
+ "title",
14
+ "author",
15
+ "company",
16
+ "views",
17
+ "diggs",
18
+ "comments",
19
+ "hot_index",
20
+ "url",
21
+ ],
22
+ minItems: 1,
23
+ });
24
+ });
25
+ });
@@ -0,0 +1,52 @@
1
+ site: juejin
2
+ name: hot
3
+ description: 掘金全站热门推荐 / Juejin all-categories hot feed
4
+ domain: juejin.cn
5
+ type: web-api
6
+ strategy: public
7
+
8
+ args:
9
+ limit:
10
+ type: int
11
+ default: 20
12
+ description: Number of items
13
+
14
+ pipeline:
15
+ - fetch:
16
+ url: https://api.juejin.cn/recommend_api/v1/article/recommend_all_feed?aid=2608&uuid=&spider=0
17
+ method: POST
18
+ headers:
19
+ Content-Type: application/json
20
+ User-Agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
21
+ body:
22
+ id_type: 2
23
+ client_type: 2608
24
+ sort_type: 200
25
+ cursor: "0"
26
+ limit: 30
27
+
28
+ - select: data
29
+
30
+ - filter: item.item_type === 2 && item.item_info && item.item_info.article_info
31
+
32
+ - map:
33
+ rank: ${{ index + 1 }}
34
+ title: ${{ item.item_info.article_info.title }}
35
+ author: ${{ item.item_info.author_user_info && item.item_info.author_user_info.user_name }}
36
+ company: ${{ item.item_info.author_user_info && item.item_info.author_user_info.company }}
37
+ views: ${{ item.item_info.article_info.view_count }}
38
+ diggs: ${{ item.item_info.article_info.digg_count }}
39
+ comments: ${{ item.item_info.article_info.comment_count }}
40
+ hot_index: ${{ item.item_info.article_info.hot_index }}
41
+ url: https://juejin.cn/post/${{ item.item_info.article_info.article_id }}
42
+
43
+ - limit: ${{ args.limit }}
44
+
45
+ columns: [rank, title, author, company, views, diggs, comments, hot_index, url]
46
+
47
+ capabilities: ["http.fetch"]
48
+ minimum_capability: http.fetch
49
+ trust: public
50
+ confidentiality: public
51
+ quarantine: false
52
+ schema_version: v2
@@ -0,0 +1,27 @@
1
+ import { describe, it } from "vitest";
2
+ import {
3
+ runAdapterWithFixture,
4
+ expectAdapterShape,
5
+ } from "../../../tests/adapter-runner.js";
6
+
7
+ describe("juejin search", () => {
8
+ it("returns rows with declared columns against fixture", async () => {
9
+ const { output } = await runAdapterWithFixture("juejin", "search", {
10
+ args: { query: "Anthropic" },
11
+ });
12
+ expectAdapterShape(output, {
13
+ columns: [
14
+ "rank",
15
+ "title",
16
+ "excerpt",
17
+ "author",
18
+ "company",
19
+ "views",
20
+ "diggs",
21
+ "comments",
22
+ "url",
23
+ ],
24
+ minItems: 1,
25
+ });
26
+ });
27
+ });
@@ -0,0 +1,58 @@
1
+ site: juejin
2
+ name: search
3
+ description: 掘金全文搜索 / Juejin full-text search
4
+ domain: juejin.cn
5
+ type: web-api
6
+ strategy: public
7
+
8
+ args:
9
+ query:
10
+ required: true
11
+ positional: true
12
+ description: Search keyword
13
+ limit:
14
+ type: int
15
+ default: 20
16
+ description: Number of results
17
+
18
+ pipeline:
19
+ - fetch:
20
+ url: https://api.juejin.cn/search_api/v1/search
21
+ params:
22
+ aid: "2608"
23
+ uuid: ""
24
+ spider: "0"
25
+ query: "${{ args.query }}"
26
+ id_type: "0"
27
+ cursor: "0"
28
+ limit: "${{ args.limit }}"
29
+ search_type: "0"
30
+ sort_type: "0"
31
+ headers:
32
+ User-Agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
33
+
34
+ - select: data
35
+
36
+ - filter: item.result_type === 2 && item.result_model && item.result_model.article_info
37
+
38
+ - map:
39
+ rank: ${{ index + 1 }}
40
+ title: ${{ item.result_model.article_info.title }}
41
+ excerpt: ${{ String(item.result_model.article_info.brief_content || '').slice(0, 150) }}
42
+ author: ${{ item.result_model.author_user_info && item.result_model.author_user_info.user_name }}
43
+ company: ${{ item.result_model.author_user_info && item.result_model.author_user_info.company }}
44
+ views: ${{ item.result_model.article_info.view_count }}
45
+ diggs: ${{ item.result_model.article_info.digg_count }}
46
+ comments: ${{ item.result_model.article_info.comment_count }}
47
+ url: https://juejin.cn/post/${{ item.result_model.article_info.article_id }}
48
+
49
+ - limit: ${{ args.limit }}
50
+
51
+ columns: [rank, title, excerpt, author, company, views, diggs, comments, url]
52
+
53
+ capabilities: ["http.fetch"]
54
+ minimum_capability: http.fetch
55
+ trust: public
56
+ confidentiality: public
57
+ quarantine: false
58
+ schema_version: v2
@@ -0,0 +1,29 @@
1
+ import { describe, it } from "vitest";
2
+ import {
3
+ runAdapterWithFixture,
4
+ expectAdapterShape,
5
+ } from "../../../tests/adapter-runner.js";
6
+
7
+ describe("leetcode discuss-search", () => {
8
+ it("returns rows with declared columns against fixture", async () => {
9
+ const { output } = await runAdapterWithFixture(
10
+ "leetcode",
11
+ "discuss-search",
12
+ {
13
+ args: { query: "Anthropic" },
14
+ },
15
+ );
16
+ expectAdapterShape(output, {
17
+ columns: [
18
+ "rank",
19
+ "title",
20
+ "summary",
21
+ "author",
22
+ "views",
23
+ "created",
24
+ "url",
25
+ ],
26
+ minItems: 1,
27
+ });
28
+ });
29
+ });
@@ -0,0 +1,56 @@
1
+ site: leetcode
2
+ name: discuss-search
3
+ description: LeetCode Discuss 文章关键词搜索 / Search LeetCode Discuss articles by keyword
4
+ domain: leetcode.com
5
+ type: web-api
6
+ strategy: public
7
+
8
+ args:
9
+ query:
10
+ required: true
11
+ positional: true
12
+ description: Search keyword (single string; matched against title and body)
13
+ limit:
14
+ type: int
15
+ default: 20
16
+ description: Number of articles
17
+ order:
18
+ type: string
19
+ default: MOST_RECENT
20
+ description: Sort order — MOST_RECENT or HOTTEST
21
+
22
+ pipeline:
23
+ - fetch:
24
+ url: https://leetcode.com/graphql/
25
+ method: POST
26
+ headers:
27
+ Content-Type: application/json
28
+ Referer: https://leetcode.com/discuss/
29
+ Origin: https://leetcode.com
30
+ User-Agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"
31
+ body:
32
+ query: '{ ugcArticleDiscussionArticles(orderBy: ${{ args.order }}, skip: 0, first: ${{ args.limit }}, keywords: ["${{ args.query }}"], tagSlugs: []) { totalNum edges { node { uuid title summary slug createdAt hitCount author { userName realName } } } } }'
33
+
34
+ - select: data.ugcArticleDiscussionArticles.edges
35
+
36
+ - filter: item.node && item.node.title
37
+
38
+ - map:
39
+ rank: ${{ index + 1 }}
40
+ title: ${{ item.node.title }}
41
+ summary: ${{ String(item.node.summary || '').slice(0, 200) }}
42
+ author: ${{ item.node.author && (item.node.author.realName || item.node.author.userName) }}
43
+ views: ${{ item.node.hitCount }}
44
+ created: ${{ item.node.createdAt }}
45
+ url: https://leetcode.com/discuss/post/${{ item.node.slug }}/
46
+
47
+ - limit: ${{ args.limit }}
48
+
49
+ columns: [rank, title, summary, author, views, created, url]
50
+
51
+ capabilities: ["http.fetch"]
52
+ minimum_capability: http.fetch
53
+ trust: public
54
+ confidentiality: public
55
+ quarantine: false
56
+ schema_version: v2
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Stable macOS Shortcuts/App Intent discovery entry points.
3
+ *
4
+ * The concrete `shortcut-*` and `app-action-*` commands are runtime-discovered
5
+ * from the current Mac. These two commands are committed static adapters so
6
+ * docs, manifests, and agents have a reproducible entry point everywhere.
7
+ */
8
+
9
+ import { cli, Strategy } from "../../registry.js";
10
+ import {
11
+ listMacosAppActions,
12
+ runMacosAutomationSmoke,
13
+ } from "../../discovery/macos-dynamic.js";
14
+
15
+ cli({
16
+ site: "macos",
17
+ name: "app-actions",
18
+ description:
19
+ "List real-time Shortcuts app actions and App Intents exposed by installed macOS apps",
20
+ strategy: Strategy.PUBLIC,
21
+ target_surface: "desktop",
22
+ adapter_path: "src/adapters/macos/actions.ts",
23
+ args: [
24
+ {
25
+ name: "app",
26
+ type: "str",
27
+ description: "Filter by app or bundle display name, e.g. WhatsApp",
28
+ },
29
+ {
30
+ name: "query",
31
+ type: "str",
32
+ description: "Filter by action name, description, or identifier",
33
+ },
34
+ {
35
+ name: "limit",
36
+ type: "int",
37
+ default: 200,
38
+ description: "Maximum actions to return",
39
+ },
40
+ ],
41
+ columns: ["app", "name", "id", "kind", "description"],
42
+ func: async (_page, kwargs) => listMacosAppActions(kwargs),
43
+ });
44
+
45
+ cli({
46
+ site: "macos",
47
+ name: "automation-smoke",
48
+ description:
49
+ "Probe macOS automation reproducibility across Shortcuts CLI, Shortcuts ToolKit API, and AX/System Events",
50
+ strategy: Strategy.PUBLIC,
51
+ target_surface: "desktop",
52
+ adapter_path: "src/adapters/macos/actions.ts",
53
+ args: [
54
+ {
55
+ name: "apps",
56
+ type: "str",
57
+ description:
58
+ "Comma-separated app names to summarize, default: Finder,Safari,Mail,Messages,Reminders,Notes,WhatsApp",
59
+ },
60
+ ],
61
+ columns: ["layers", "apps"],
62
+ func: async (_page, kwargs) => runMacosAutomationSmoke(kwargs),
63
+ });