@zenalexa/unicli 0.217.0 → 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 (341) hide show
  1. package/AGENTS.md +7 -6
  2. package/README.md +59 -19
  3. package/README.zh-CN.md +36 -15
  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/macos/actions.d.ts +9 -0
  25. package/dist/adapters/macos/actions.d.ts.map +1 -0
  26. package/dist/adapters/macos/actions.js +55 -0
  27. package/dist/adapters/macos/actions.js.map +1 -0
  28. package/dist/browser/bridge.d.ts +2 -0
  29. package/dist/browser/bridge.d.ts.map +1 -1
  30. package/dist/browser/bridge.js +39 -0
  31. package/dist/browser/bridge.js.map +1 -1
  32. package/dist/browser/cdp-client.d.ts +2 -0
  33. package/dist/browser/cdp-client.d.ts.map +1 -1
  34. package/dist/browser/cdp-client.js +7 -0
  35. package/dist/browser/cdp-client.js.map +1 -1
  36. package/dist/browser/page.d.ts +2 -0
  37. package/dist/browser/page.d.ts.map +1 -1
  38. package/dist/browser/page.js +35 -0
  39. package/dist/browser/page.js.map +1 -1
  40. package/dist/cli.d.ts.map +1 -1
  41. package/dist/cli.js +13 -1
  42. package/dist/cli.js.map +1 -1
  43. package/dist/commands/approvals.d.ts +3 -0
  44. package/dist/commands/approvals.d.ts.map +1 -0
  45. package/dist/commands/approvals.js +123 -0
  46. package/dist/commands/approvals.js.map +1 -0
  47. package/dist/commands/browser-operator-runtime.d.ts.map +1 -1
  48. package/dist/commands/browser-operator-runtime.js +1 -0
  49. package/dist/commands/browser-operator-runtime.js.map +1 -1
  50. package/dist/commands/browser-operator.d.ts.map +1 -1
  51. package/dist/commands/browser-operator.js +84 -12
  52. package/dist/commands/browser-operator.js.map +1 -1
  53. package/dist/commands/compute.d.ts +3 -0
  54. package/dist/commands/compute.d.ts.map +1 -0
  55. package/dist/commands/compute.js +324 -0
  56. package/dist/commands/compute.js.map +1 -0
  57. package/dist/commands/dispatch.d.ts.map +1 -1
  58. package/dist/commands/dispatch.js +10 -4
  59. package/dist/commands/dispatch.js.map +1 -1
  60. package/dist/commands/doctor-compute.d.ts +38 -0
  61. package/dist/commands/doctor-compute.d.ts.map +1 -0
  62. package/dist/commands/doctor-compute.js +376 -0
  63. package/dist/commands/doctor-compute.js.map +1 -0
  64. package/dist/commands/lint.d.ts.map +1 -1
  65. package/dist/commands/lint.js +69 -1
  66. package/dist/commands/lint.js.map +1 -1
  67. package/dist/commands/mcp.d.ts.map +1 -1
  68. package/dist/commands/mcp.js +4 -0
  69. package/dist/commands/mcp.js.map +1 -1
  70. package/dist/commands/runs.d.ts +3 -0
  71. package/dist/commands/runs.d.ts.map +1 -0
  72. package/dist/commands/runs.js +367 -0
  73. package/dist/commands/runs.js.map +1 -0
  74. package/dist/core/envelope.d.ts +8 -0
  75. package/dist/core/envelope.d.ts.map +1 -1
  76. package/dist/core/envelope.js +1 -0
  77. package/dist/core/envelope.js.map +1 -1
  78. package/dist/discovery/aliases.d.ts.map +1 -1
  79. package/dist/discovery/aliases.js +15 -0
  80. package/dist/discovery/aliases.js.map +1 -1
  81. package/dist/discovery/loader.d.ts.map +1 -1
  82. package/dist/discovery/loader.js +9 -0
  83. package/dist/discovery/loader.js.map +1 -1
  84. package/dist/discovery/macos-dynamic.d.ts +58 -0
  85. package/dist/discovery/macos-dynamic.d.ts.map +1 -0
  86. package/dist/discovery/macos-dynamic.js +429 -0
  87. package/dist/discovery/macos-dynamic.js.map +1 -0
  88. package/dist/discovery/search.d.ts.map +1 -1
  89. package/dist/discovery/search.js +152 -3
  90. package/dist/discovery/search.js.map +1 -1
  91. package/dist/electron-apps.d.ts +1 -0
  92. package/dist/electron-apps.d.ts.map +1 -1
  93. package/dist/electron-apps.js +1 -0
  94. package/dist/electron-apps.js.map +1 -1
  95. package/dist/engine/approval-store.d.ts +43 -0
  96. package/dist/engine/approval-store.d.ts.map +1 -0
  97. package/dist/engine/approval-store.js +193 -0
  98. package/dist/engine/approval-store.js.map +1 -0
  99. package/dist/engine/browser/action-evidence.d.ts +2 -0
  100. package/dist/engine/browser/action-evidence.d.ts.map +1 -1
  101. package/dist/engine/browser/action-evidence.js +35 -1
  102. package/dist/engine/browser/action-evidence.js.map +1 -1
  103. package/dist/engine/browser/evidence.d.ts +22 -0
  104. package/dist/engine/browser/evidence.d.ts.map +1 -1
  105. package/dist/engine/browser/evidence.js +72 -0
  106. package/dist/engine/browser/evidence.js.map +1 -1
  107. package/dist/engine/browser/session-lease.d.ts +53 -0
  108. package/dist/engine/browser/session-lease.d.ts.map +1 -0
  109. package/dist/engine/browser/session-lease.js +100 -0
  110. package/dist/engine/browser/session-lease.js.map +1 -0
  111. package/dist/engine/browser/session-lock.d.ts +17 -0
  112. package/dist/engine/browser/session-lock.d.ts.map +1 -0
  113. package/dist/engine/browser/session-lock.js +114 -0
  114. package/dist/engine/browser/session-lock.js.map +1 -0
  115. package/dist/engine/browser/session-runtime.d.ts +10 -0
  116. package/dist/engine/browser/session-runtime.d.ts.map +1 -0
  117. package/dist/engine/browser/session-runtime.js +87 -0
  118. package/dist/engine/browser/session-runtime.js.map +1 -0
  119. package/dist/engine/capability-policy.d.ts +13 -2
  120. package/dist/engine/capability-policy.d.ts.map +1 -1
  121. package/dist/engine/capability-policy.js +113 -3
  122. package/dist/engine/capability-policy.js.map +1 -1
  123. package/dist/engine/executor.d.ts +8 -3
  124. package/dist/engine/executor.d.ts.map +1 -1
  125. package/dist/engine/executor.js +9 -2
  126. package/dist/engine/executor.js.map +1 -1
  127. package/dist/engine/kernel/execute.d.ts +1 -0
  128. package/dist/engine/kernel/execute.d.ts.map +1 -1
  129. package/dist/engine/kernel/execute.js +125 -3
  130. package/dist/engine/kernel/execute.js.map +1 -1
  131. package/dist/engine/kernel/types.d.ts +13 -0
  132. package/dist/engine/kernel/types.d.ts.map +1 -1
  133. package/dist/engine/operation-policy.d.ts +9 -1
  134. package/dist/engine/operation-policy.d.ts.map +1 -1
  135. package/dist/engine/operation-policy.js +6 -2
  136. package/dist/engine/operation-policy.js.map +1 -1
  137. package/dist/engine/permission-rules.d.ts +43 -0
  138. package/dist/engine/permission-rules.d.ts.map +1 -0
  139. package/dist/engine/permission-rules.js +401 -0
  140. package/dist/engine/permission-rules.js.map +1 -0
  141. package/dist/engine/permission-runtime.d.ts +11 -0
  142. package/dist/engine/permission-runtime.d.ts.map +1 -0
  143. package/dist/engine/permission-runtime.js +21 -0
  144. package/dist/engine/permission-runtime.js.map +1 -0
  145. package/dist/engine/repair/remedies.d.ts +4 -0
  146. package/dist/engine/repair/remedies.d.ts.map +1 -0
  147. package/dist/engine/repair/remedies.js +169 -0
  148. package/dist/engine/repair/remedies.js.map +1 -0
  149. package/dist/engine/runtime-resource-guard.d.ts +23 -0
  150. package/dist/engine/runtime-resource-guard.d.ts.map +1 -0
  151. package/dist/engine/runtime-resource-guard.js +85 -0
  152. package/dist/engine/runtime-resource-guard.js.map +1 -0
  153. package/dist/engine/session/args.d.ts +3 -0
  154. package/dist/engine/session/args.d.ts.map +1 -0
  155. package/dist/engine/session/args.js +17 -0
  156. package/dist/engine/session/args.js.map +1 -0
  157. package/dist/engine/session/compare.d.ts +92 -0
  158. package/dist/engine/session/compare.d.ts.map +1 -0
  159. package/dist/engine/session/compare.js +324 -0
  160. package/dist/engine/session/compare.js.map +1 -0
  161. package/dist/engine/session/environment.d.ts +4 -0
  162. package/dist/engine/session/environment.d.ts.map +1 -0
  163. package/dist/engine/session/environment.js +25 -0
  164. package/dist/engine/session/environment.js.map +1 -0
  165. package/dist/engine/session/events.d.ts +2 -0
  166. package/dist/engine/session/events.d.ts.map +1 -1
  167. package/dist/engine/session/events.js +12 -0
  168. package/dist/engine/session/events.js.map +1 -1
  169. package/dist/engine/session/query.d.ts +47 -0
  170. package/dist/engine/session/query.d.ts.map +1 -0
  171. package/dist/engine/session/query.js +299 -0
  172. package/dist/engine/session/query.js.map +1 -0
  173. package/dist/engine/session/replay.d.ts +35 -0
  174. package/dist/engine/session/replay.d.ts.map +1 -0
  175. package/dist/engine/session/replay.js +144 -0
  176. package/dist/engine/session/replay.js.map +1 -0
  177. package/dist/engine/session/run-loop.d.ts.map +1 -1
  178. package/dist/engine/session/run-loop.js +62 -23
  179. package/dist/engine/session/run-loop.js.map +1 -1
  180. package/dist/engine/session/store.d.ts +7 -0
  181. package/dist/engine/session/store.d.ts.map +1 -1
  182. package/dist/engine/session/store.js +131 -1
  183. package/dist/engine/session/store.js.map +1 -1
  184. package/dist/engine/session/types.d.ts +3 -1
  185. package/dist/engine/session/types.d.ts.map +1 -1
  186. package/dist/engine/steps/compute.d.ts +41 -0
  187. package/dist/engine/steps/compute.d.ts.map +1 -0
  188. package/dist/engine/steps/compute.js +55 -0
  189. package/dist/engine/steps/compute.js.map +1 -0
  190. package/dist/engine/steps/desktop-ax.d.ts +8 -0
  191. package/dist/engine/steps/desktop-ax.d.ts.map +1 -1
  192. package/dist/engine/steps/desktop-ax.js +16 -0
  193. package/dist/engine/steps/desktop-ax.js.map +1 -1
  194. package/dist/engine/steps/desktop-sidecar.d.ts +49 -0
  195. package/dist/engine/steps/desktop-sidecar.d.ts.map +1 -0
  196. package/dist/engine/steps/desktop-sidecar.js +50 -0
  197. package/dist/engine/steps/desktop-sidecar.js.map +1 -0
  198. package/dist/engine/steps/download.d.ts +1 -1
  199. package/dist/engine/steps/download.d.ts.map +1 -1
  200. package/dist/engine/steps/download.js +24 -2
  201. package/dist/engine/steps/download.js.map +1 -1
  202. package/dist/engine/steps/exec.d.ts +1 -1
  203. package/dist/engine/steps/exec.d.ts.map +1 -1
  204. package/dist/engine/steps/exec.js +23 -7
  205. package/dist/engine/steps/exec.js.map +1 -1
  206. package/dist/engine/steps/fetch-text.d.ts +1 -1
  207. package/dist/engine/steps/fetch-text.d.ts.map +1 -1
  208. package/dist/engine/steps/fetch-text.js +12 -4
  209. package/dist/engine/steps/fetch-text.js.map +1 -1
  210. package/dist/engine/steps/fetch.d.ts +2 -1
  211. package/dist/engine/steps/fetch.d.ts.map +1 -1
  212. package/dist/engine/steps/fetch.js +29 -6
  213. package/dist/engine/steps/fetch.js.map +1 -1
  214. package/dist/engine/steps/index.d.ts +2 -0
  215. package/dist/engine/steps/index.d.ts.map +1 -1
  216. package/dist/engine/steps/index.js +2 -0
  217. package/dist/engine/steps/index.js.map +1 -1
  218. package/dist/engine/steps/navigate.d.ts +1 -1
  219. package/dist/engine/steps/navigate.d.ts.map +1 -1
  220. package/dist/engine/steps/navigate.js +29 -2
  221. package/dist/engine/steps/navigate.js.map +1 -1
  222. package/dist/fast-path.d.ts.map +1 -1
  223. package/dist/fast-path.js +96 -12
  224. package/dist/fast-path.js.map +1 -1
  225. package/dist/manifest-compact.txt +2 -2
  226. package/dist/manifest-search.json +1 -1
  227. package/dist/manifest.json +1024 -1
  228. package/dist/mcp/handler.d.ts +2 -2
  229. package/dist/mcp/handler.d.ts.map +1 -1
  230. package/dist/mcp/handler.js +59 -5
  231. package/dist/mcp/handler.js.map +1 -1
  232. package/dist/mcp/profiles/computer-use.d.ts +4 -0
  233. package/dist/mcp/profiles/computer-use.d.ts.map +1 -0
  234. package/dist/mcp/profiles/computer-use.js +305 -0
  235. package/dist/mcp/profiles/computer-use.js.map +1 -0
  236. package/dist/mcp/server.d.ts.map +1 -1
  237. package/dist/mcp/server.js +30 -6
  238. package/dist/mcp/server.js.map +1 -1
  239. package/dist/mcp/tools.d.ts +9 -0
  240. package/dist/mcp/tools.d.ts.map +1 -1
  241. package/dist/mcp/tools.js +20 -0
  242. package/dist/mcp/tools.js.map +1 -1
  243. package/dist/output/envelope.d.ts +6 -0
  244. package/dist/output/envelope.d.ts.map +1 -1
  245. package/dist/output/envelope.js.map +1 -1
  246. package/dist/output/error-map.d.ts.map +1 -1
  247. package/dist/output/error-map.js +4 -0
  248. package/dist/output/error-map.js.map +1 -1
  249. package/dist/registry.d.ts +1 -0
  250. package/dist/registry.d.ts.map +1 -1
  251. package/dist/registry.js +5 -0
  252. package/dist/registry.js.map +1 -1
  253. package/dist/transport/adapters/cdp-browser.d.ts +38 -2
  254. package/dist/transport/adapters/cdp-browser.d.ts.map +1 -1
  255. package/dist/transport/adapters/cdp-browser.js +349 -22
  256. package/dist/transport/adapters/cdp-browser.js.map +1 -1
  257. package/dist/transport/adapters/desktop-atspi.d.ts +23 -17
  258. package/dist/transport/adapters/desktop-atspi.d.ts.map +1 -1
  259. package/dist/transport/adapters/desktop-atspi.js +143 -32
  260. package/dist/transport/adapters/desktop-atspi.js.map +1 -1
  261. package/dist/transport/adapters/desktop-ax-helpers.d.ts +24 -0
  262. package/dist/transport/adapters/desktop-ax-helpers.d.ts.map +1 -0
  263. package/dist/transport/adapters/desktop-ax-helpers.js +190 -0
  264. package/dist/transport/adapters/desktop-ax-helpers.js.map +1 -0
  265. package/dist/transport/adapters/desktop-ax-swift.d.ts +13 -0
  266. package/dist/transport/adapters/desktop-ax-swift.d.ts.map +1 -1
  267. package/dist/transport/adapters/desktop-ax-swift.js +176 -2
  268. package/dist/transport/adapters/desktop-ax-swift.js.map +1 -1
  269. package/dist/transport/adapters/desktop-ax.d.ts +11 -2
  270. package/dist/transport/adapters/desktop-ax.d.ts.map +1 -1
  271. package/dist/transport/adapters/desktop-ax.js +131 -16
  272. package/dist/transport/adapters/desktop-ax.js.map +1 -1
  273. package/dist/transport/adapters/desktop-sidecar-errors.d.ts +3 -0
  274. package/dist/transport/adapters/desktop-sidecar-errors.d.ts.map +1 -0
  275. package/dist/transport/adapters/desktop-sidecar-errors.js +34 -0
  276. package/dist/transport/adapters/desktop-sidecar-errors.js.map +1 -0
  277. package/dist/transport/adapters/desktop-sidecar-snapshot.d.ts +10 -0
  278. package/dist/transport/adapters/desktop-sidecar-snapshot.d.ts.map +1 -0
  279. package/dist/transport/adapters/desktop-sidecar-snapshot.js +89 -0
  280. package/dist/transport/adapters/desktop-sidecar-snapshot.js.map +1 -0
  281. package/dist/transport/adapters/desktop-uia.d.ts +23 -17
  282. package/dist/transport/adapters/desktop-uia.d.ts.map +1 -1
  283. package/dist/transport/adapters/desktop-uia.js +142 -32
  284. package/dist/transport/adapters/desktop-uia.js.map +1 -1
  285. package/dist/transport/adapters/subprocess.d.ts +7 -0
  286. package/dist/transport/adapters/subprocess.d.ts.map +1 -1
  287. package/dist/transport/adapters/subprocess.js +64 -0
  288. package/dist/transport/adapters/subprocess.js.map +1 -1
  289. package/dist/transport/bus.d.ts +2 -0
  290. package/dist/transport/bus.d.ts.map +1 -1
  291. package/dist/transport/bus.js +7 -11
  292. package/dist/transport/bus.js.map +1 -1
  293. package/dist/transport/capability.d.ts.map +1 -1
  294. package/dist/transport/capability.js +123 -98
  295. package/dist/transport/capability.js.map +1 -1
  296. package/dist/transport/cascade.d.ts +5 -0
  297. package/dist/transport/cascade.d.ts.map +1 -0
  298. package/dist/transport/cascade.js +550 -0
  299. package/dist/transport/cascade.js.map +1 -0
  300. package/dist/transport/cdp-session.d.ts +11 -0
  301. package/dist/transport/cdp-session.d.ts.map +1 -0
  302. package/dist/transport/cdp-session.js +52 -0
  303. package/dist/transport/cdp-session.js.map +1 -0
  304. package/dist/transport/refs.d.ts +51 -0
  305. package/dist/transport/refs.d.ts.map +1 -0
  306. package/dist/transport/refs.js +135 -0
  307. package/dist/transport/refs.js.map +1 -0
  308. package/dist/transport/sidecar-binary.d.ts +18 -0
  309. package/dist/transport/sidecar-binary.d.ts.map +1 -0
  310. package/dist/transport/sidecar-binary.js +55 -0
  311. package/dist/transport/sidecar-binary.js.map +1 -0
  312. package/dist/transport/sidecar.d.ts +35 -0
  313. package/dist/transport/sidecar.d.ts.map +1 -0
  314. package/dist/transport/sidecar.js +134 -0
  315. package/dist/transport/sidecar.js.map +1 -0
  316. package/dist/transport/snapshot-encoder.d.ts +34 -0
  317. package/dist/transport/snapshot-encoder.d.ts.map +1 -0
  318. package/dist/transport/snapshot-encoder.js +139 -0
  319. package/dist/transport/snapshot-encoder.js.map +1 -0
  320. package/dist/transport/types.d.ts +6 -1
  321. package/dist/transport/types.d.ts.map +1 -1
  322. package/dist/types.d.ts +2 -0
  323. package/dist/types.d.ts.map +1 -1
  324. package/dist/types.js.map +1 -1
  325. package/docs/mcp/clients/claude-code.md +29 -0
  326. package/docs/mcp/clients/claude-desktop.md +47 -0
  327. package/docs/mcp/clients/codex.md +29 -0
  328. package/docs/mcp/clients/cursor.md +38 -0
  329. package/docs/mcp/clients/gemini-cli.md +38 -0
  330. package/docs/operate/compute.md +172 -0
  331. package/docs/operate/electron.md +87 -0
  332. package/docs/operate/focus-behavior.md +40 -0
  333. package/docs/operate/troubleshooting.md +379 -0
  334. package/package.json +29 -4
  335. package/src/adapters/juejin/hot.test.ts +25 -0
  336. package/src/adapters/juejin/hot.yaml +52 -0
  337. package/src/adapters/juejin/search.test.ts +27 -0
  338. package/src/adapters/juejin/search.yaml +58 -0
  339. package/src/adapters/leetcode/discuss-search.test.ts +29 -0
  340. package/src/adapters/leetcode/discuss-search.yaml +56 -0
  341. package/src/adapters/macos/actions.ts +63 -0
@@ -0,0 +1,379 @@
1
+ # Compute Troubleshooting
2
+
3
+ `unicli compute` failures include `minimum_capability` and, where known, a
4
+ structured `remedy`. Use this page when `unicli doctor compute` or a failed
5
+ compute command points at one of these keys.
6
+
7
+ ## desktop-uia.binary_missing
8
+
9
+ Cause: the Windows UIA sidecar binary is not installed or is not on the expected
10
+ path.
11
+
12
+ Remedy: run `unicli doctor compute --install`, then retry the compute command.
13
+
14
+ Fallback: use CDP-backed Electron/browser control or CUA screenshot fallback if
15
+ configured.
16
+
17
+ ## desktop-uia.startup_failed
18
+
19
+ Cause: the UIA sidecar started and exited before responding.
20
+
21
+ Remedy: run `UNICLI_TRACE=1 unicli doctor compute` and inspect antivirus,
22
+ Defender, or SmartScreen quarantine.
23
+
24
+ Fallback: retry after reinstalling the sidecar package.
25
+
26
+ ## desktop-uia.permission
27
+
28
+ Cause: Windows denied the UIA operation.
29
+
30
+ Remedy: run from an elevated terminal or install the sidecar with UIAccess.
31
+
32
+ Fallback: use CDP for Electron/browser targets.
33
+
34
+ ## desktop-uia.no_element
35
+
36
+ Cause: the saved ref no longer points at a live element.
37
+
38
+ Remedy: run `unicli compute snapshot` again, then retry with a fresh ref.
39
+
40
+ Fallback: target by app/window and take a new snapshot.
41
+
42
+ ## desktop-uia.not_invokable
43
+
44
+ Cause: the target element does not expose the UIA Invoke pattern.
45
+
46
+ Remedy: use `unicli compute type`, `unicli compute press`, or focus the control
47
+ first and retry.
48
+
49
+ Fallback: use CUA when no structured pattern is exposed.
50
+
51
+ ## desktop-uia.timeout
52
+
53
+ Cause: the UIA sidecar did not respond within the request timeout.
54
+
55
+ Remedy: retry the command; the sidecar boundary is designed to restart after
56
+ timeouts.
57
+
58
+ Fallback: run `UNICLI_TRACE=1 unicli doctor compute` if the timeout repeats.
59
+
60
+ ## desktop-uia.sidecar_crashed
61
+
62
+ Cause: the UIA sidecar process exited or closed its pipe while a request was in
63
+ flight.
64
+
65
+ Remedy: retry once. If it repeats, run
66
+ `UNICLI_TRACE=1 unicli doctor compute`.
67
+
68
+ Fallback: use CDP for Electron/browser targets while inspecting sidecar logs.
69
+
70
+ ## Windows UIA Native Scope
71
+
72
+ Current Windows UIA support has two layers:
73
+
74
+ - Top-level app/window inventory, snapshot, find, wait, observe, assert, focus,
75
+ invoke, type, scroll, screenshot, and direct launch helpers use native
76
+ Win32/UIA-adjacent calls such as `EnumWindows`, `SetForegroundWindow`,
77
+ `SendInput`, HWND/GDI capture, and PowerShell `Start-Process`.
78
+ - Live descendant UIA traversal populates refs where the OS exposes a control
79
+ tree. Descendant invoke, value, and focus actions prefer UIA patterns before
80
+ bounded fallback paths; descendant screenshot crops the owning window bitmap.
81
+
82
+ Stable top-level refs look like `desktop-uia:pid-1234:Window[0]`. When passed to
83
+ wait, Uni-CLI polls the native top-level window inventory for a matching
84
+ role/name/title/app/pid filter until timeout. Observe ranks the same top-level
85
+ window refs by goal/title token overlap. Assert checks the same inventory for
86
+ top-level title text and visible/appear/enabled state.
87
+
88
+ ## desktop-atspi.binary_missing
89
+
90
+ Cause: the Linux AT-SPI sidecar binary is not installed or is not on the
91
+ expected path.
92
+
93
+ Remedy: run `unicli doctor compute --install`, then retry.
94
+
95
+ Fallback: use CDP-backed Electron/browser control or CUA screenshot fallback if
96
+ configured.
97
+
98
+ ## desktop-atspi.dbus_blocked
99
+
100
+ Cause: the AT-SPI bus daemon is not reachable.
101
+
102
+ Remedy: run `systemctl --user start at-spi-dbus-bus`.
103
+
104
+ Fallback: restart the desktop session if the bus cannot be started.
105
+
106
+ ## desktop-atspi.no_a11y_attr
107
+
108
+ Cause: the target app does not expose a usable AT-SPI tree.
109
+
110
+ Remedy: enable accessibility support for the app. Electron apps may need an
111
+ accessibility flag at launch.
112
+
113
+ Fallback: use CDP for Electron/browser targets or CUA screenshot fallback.
114
+
115
+ ## desktop-atspi.atspi_apps
116
+
117
+ Cause: the Linux top-level app inventory helper is missing or failed.
118
+
119
+ Remedy: ensure the AT-SPI bus is running. Uni-CLI prefers `wmctrl -lG -p` for
120
+ real X11 window ids and geometry, but can fall back to AT-SPI-only registry
121
+ roots when `wmctrl` is missing or empty.
122
+
123
+ Fallback: target an Electron/browser app through CDP, or use CUA fallback.
124
+
125
+ ## desktop-atspi.atspi_windows
126
+
127
+ Cause: the Linux top-level window inventory helper is missing or failed.
128
+
129
+ Remedy: install `wmctrl` when real X11 window ids are needed. On Wayland or
130
+ minimal environments, verify the AT-SPI bus is running so Uni-CLI can use
131
+ synthetic `atspi-root-N` windows from the accessibility registry.
132
+
133
+ Fallback: use `compute snapshot` on another transport or CUA fallback.
134
+
135
+ ## desktop-atspi.wayland-input
136
+
137
+ Cause: Wayland input fallback tools are missing.
138
+
139
+ Remedy: install `wtype` for text and printable key dispatch. Install `ydotool`
140
+ for supported modifier combos and Wayland scroll fallback.
141
+
142
+ Fallback: use structured AT-SPI actions that do not need synthetic input.
143
+
144
+ ## desktop-atspi.x11-input
145
+
146
+ Cause: X11 input fallback tools are missing.
147
+
148
+ Remedy: install `xdotool` for text, key, and scroll dispatch.
149
+
150
+ Fallback: use structured AT-SPI actions that do not need synthetic input.
151
+
152
+ ## desktop-atspi.atspi_screenshot
153
+
154
+ Cause: no supported Linux screenshot helper is available, or the helper failed.
155
+
156
+ Remedy: install ImageMagick `import` for X11 top-level window capture, or
157
+ install `grim` for Wayland top-level bounds capture. Install
158
+ `gnome-screenshot` / `grim` for display-server fallback capture.
159
+
160
+ Fallback: use CDP for Electron/browser targets or CUA screenshot fallback.
161
+
162
+ ## desktop-atspi.invalid_input
163
+
164
+ Cause: a Linux AT-SPI action received a `ref` or `stable` token that is not a
165
+ `desktop-atspi:pid-<pid>:Window[<n>]` top-level window token.
166
+
167
+ Remedy: run `unicli compute snapshot --format compact` or
168
+ `unicli compute find --first` on Linux, then retry with the fresh ref emitted by
169
+ the AT-SPI transport.
170
+
171
+ Fallback: omit the ref to use the global helper path for text, scroll, or
172
+ screenshot actions when targeting the active desktop surface is acceptable.
173
+
174
+ ## desktop-atspi.no_element
175
+
176
+ Cause: the saved ref no longer points at a live element.
177
+
178
+ Remedy: run `unicli compute snapshot` again, then retry with a fresh ref.
179
+
180
+ Fallback: target by app/window and take a new snapshot.
181
+
182
+ ## Linux AT-SPI Native Scope
183
+
184
+ Current Linux AT-SPI support has two layers:
185
+
186
+ - Top-level app/window inventory, snapshot, find, wait, observe, assert, focus,
187
+ invoke, type, scroll, screenshot, and direct launch helpers use `wmctrl` when
188
+ available, and AT-SPI-only synthetic windows when `wmctrl` is missing or
189
+ empty. Synthetic windows use native AT-SPI focus rather than `wmctrl`.
190
+ - Descendant AT-SPI traversal populates role/name/value/state/bounds refs where
191
+ the app exposes an accessibility tree. Descendant invoke, type, and focus
192
+ prefer native Action/Value/EditableText/Component proxies, then fall back to
193
+ bounded display-server helpers. Descendant scroll prefers native
194
+ `Component.scroll_to(...)`, then falls back to display-server wheel helpers.
195
+ - Screenshot uses `import -window <id>` for real X11 top-level window refs,
196
+ `grim -g` for known Wayland/top-level bounds, and region capture for bounded
197
+ descendant refs.
198
+
199
+ Stable top-level refs look like `desktop-atspi:pid-1234:Window[0]`. When passed
200
+ to type, scroll, or screenshot actions, Uni-CLI uses native operations when
201
+ available and activates the top-level window only for helper fallbacks. On X11
202
+ with ImageMagick `import`, screenshot uses the resolved top-level window id
203
+ directly. On Wayland with `grim` and known bounds, screenshot captures the
204
+ reported rectangle. Assert checks top-level and descendant text/value/state
205
+ where the tree exposes them. Observe reports `action: "scroll"` for scroll
206
+ roles or scrollable states.
207
+
208
+ ## desktop-atspi.sidecar_crashed
209
+
210
+ Cause: the AT-SPI sidecar process exited or closed its pipe while a request was
211
+ in flight.
212
+
213
+ Remedy: retry once. If it repeats, run
214
+ `UNICLI_TRACE=1 unicli doctor compute`.
215
+
216
+ Fallback: use CDP for Electron/browser targets while inspecting sidecar logs.
217
+
218
+ ## desktop-ax.permission
219
+
220
+ Cause: macOS Accessibility is not granted to the app or terminal that launches
221
+ Uni-CLI.
222
+
223
+ Remedy: grant Accessibility in System Settings, then retry. Deeplink:
224
+ `x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility`.
225
+
226
+ Fallback: CDP can still control browser/Electron renderers that expose a debug
227
+ port.
228
+
229
+ ## desktop-ax.screen-recording
230
+
231
+ Cause: macOS Screen Recording is not granted. This is only needed for screenshot
232
+ fallback.
233
+
234
+ Remedy: grant Screen Recording in System Settings. Deeplink:
235
+ `x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture`.
236
+
237
+ Fallback: prefer AX snapshots when the target exposes a structured tree.
238
+
239
+ ## desktop-ax.binary_missing
240
+
241
+ Cause: the Swift runtime required by the macOS AX helper is not available.
242
+
243
+ Remedy: run `xcode-select --install`.
244
+
245
+ Fallback: use CDP for browser/Electron targets.
246
+
247
+ ## cdp-browser.attach_failed
248
+
249
+ Cause: the requested CDP port is not reachable.
250
+
251
+ Remedy: check the port, or start the browser transport with
252
+ `unicli browser start`.
253
+
254
+ Fallback: use native AX/UIA/AT-SPI snapshots for non-browser app control.
255
+
256
+ ## cdp-browser.electron_running_without_debug_port
257
+
258
+ Cause: the Electron app is running, but no remote debugging port is available.
259
+
260
+ Remedy: relaunch the app with a debug port, for example
261
+ `unicli compute launch <app> --debug-port 9229`.
262
+
263
+ Fallback: use native AX/UIA/AT-SPI controls when the app exposes enough
264
+ accessibility structure.
265
+
266
+ ## subprocess.launcher
267
+
268
+ Cause: the host launcher required by `compute launch` is unavailable. Uni-CLI
269
+ uses `/usr/bin/open` on macOS, PowerShell `Start-Process` on Windows, and
270
+ `gtk-launch` on Linux.
271
+
272
+ Remedy: restore the platform launcher. On Linux install GTK desktop utilities,
273
+ for example `sudo apt-get install libgtk-3-bin`.
274
+
275
+ Fallback: start the app manually, then use `compute attach`, `compute snapshot`,
276
+ or the native desktop transport for follow-up actions.
277
+
278
+ ## cua.no_backend
279
+
280
+ Cause: screenshot/VLM fallback is enabled in the cascade, but no backend API key
281
+ is configured.
282
+
283
+ Remedy: set a supported backend environment variable such as
284
+ `ANTHROPIC_API_KEY`, `TRYCUA_API_KEY`, or `OPENAI_API_KEY`.
285
+
286
+ Fallback: use structured AX/UIA/AT-SPI/CDP control where possible.
287
+
288
+ ## compute.compute_find.ref-store
289
+
290
+ Cause: `compute find --first` could not find a matching ref in the current ref
291
+ store.
292
+
293
+ Remedy: run `unicli compute snapshot`, then retry the find with the new refs.
294
+
295
+ Fallback: make the snapshot more specific with `--app`.
296
+
297
+ ## compute.step.element_off_screen
298
+
299
+ Cause: the ref is valid, but the element bounds are outside the visible window
300
+ or screen.
301
+
302
+ Remedy: scroll the containing view into range, then take a fresh
303
+ `unicli compute snapshot`.
304
+
305
+ Fallback: use `--focus` only when the app cannot expose a scrollable structured
306
+ container.
307
+
308
+ ## compute.step.window_minimized
309
+
310
+ Cause: the target window is minimized or hidden, so the transport cannot act in
311
+ background mode.
312
+
313
+ Remedy: restore the window or retry the action with explicit focus.
314
+
315
+ Fallback: use `unicli compute windows --app <name>` to choose a visible window.
316
+
317
+ ## compute.step.element_disabled
318
+
319
+ Cause: the target element exists but is disabled.
320
+
321
+ Remedy: wait for it to become enabled with
322
+ `unicli compute wait --state enabled`.
323
+
324
+ Fallback: snapshot the surrounding UI and act on the prerequisite control.
325
+
326
+ ## compute.step.ref_expired
327
+
328
+ Cause: the saved ref came from an older snapshot and no longer maps to a live
329
+ element.
330
+
331
+ Remedy: run `unicli compute snapshot`, then retry with the new ref.
332
+
333
+ Fallback: use `compute find --first` after the new snapshot to select the ref.
334
+
335
+ ## compute.step.sidecar_crashed
336
+
337
+ Cause: the UIA or AT-SPI sidecar exited while a call was in flight.
338
+
339
+ Remedy: retry once. If it repeats, run
340
+ `UNICLI_TRACE=1 unicli doctor compute`.
341
+
342
+ Fallback: use CDP for Electron/browser targets while inspecting sidecar logs.
343
+
344
+ ## compute.step.sidecar_busy
345
+
346
+ Cause: the sidecar is already processing a request.
347
+
348
+ Remedy: retry after the current call completes. Sidecar calls are serialized to
349
+ keep ref state stable.
350
+
351
+ Fallback: avoid concurrent writes to the same app/window.
352
+
353
+ ## compute.step.app_ambiguous
354
+
355
+ Cause: multiple running apps or windows match the same app name.
356
+
357
+ Remedy: run `unicli compute windows --app <name>` and retry with a more
358
+ specific bundle id, process name, pid, or window id.
359
+
360
+ Fallback: target a CDP port or exact bundle id when controlling Electron apps.
361
+
362
+ ## compute.step.focus_required
363
+
364
+ Cause: the transport cannot complete the action in background mode.
365
+
366
+ Remedy: retry with `--focus` only after confirming focus stealing is acceptable.
367
+
368
+ Fallback: prefer a structured value/action path such as `compute type` or
369
+ `compute press` before enabling focus.
370
+
371
+ ## compute.step.no-transport-available
372
+
373
+ Cause: every transport in the compute cascade failed or was unavailable for the
374
+ requested step.
375
+
376
+ Remedy: run `unicli doctor compute` and fix the first failing host transport.
377
+
378
+ Fallback: choose a narrower transport directly when possible, such as CDP for a
379
+ debuggable Electron renderer.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenalexa/unicli",
3
- "version": "0.217.0",
3
+ "version": "0.217.3",
4
4
  "description": "Agent execution substrate for web, apps, local tools, and system capabilities",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -9,6 +9,9 @@
9
9
  },
10
10
  "files": [
11
11
  "dist/",
12
+ "crates/",
13
+ "docs/operate/",
14
+ "docs/mcp/clients/",
12
15
  "src/adapters/",
13
16
  "src/hub/",
14
17
  "AGENTS.md"
@@ -127,6 +130,9 @@
127
130
  "build:agents": "tsx scripts/build-agents.ts",
128
131
  "test": "vitest run --project unit",
129
132
  "test:adapter": "vitest run --project adapter",
133
+ "test:perf": "vitest run --project perf",
134
+ "compute:smoke": "tsx scripts/compute-live-smoke.ts",
135
+ "coverage:compute-snapshot": "vitest run --project unit tests/unit/refs.test.ts tests/unit/snapshot-encoder.test.ts --coverage --coverage.enabled=true --coverage.provider=v8 --coverage.include=src/transport/refs.ts --coverage.include=src/transport/snapshot-encoder.ts --coverage.reporter=text --coverage.thresholds.lines=100 --coverage.thresholds.functions=100 --coverage.thresholds.branches=100 --coverage.thresholds.statements=100",
130
136
  "coverage:adapter-test": "tsx scripts/check-adapter-test-coverage.ts --threshold 50",
131
137
  "adapter:bootstrap": "tsx scripts/bootstrap-adapter-tests.ts",
132
138
  "adapter:health": "tsx scripts/adapter-health-probe.ts",
@@ -137,17 +143,20 @@
137
143
  "format:check": "prettier --check .",
138
144
  "lint:context": "bash scripts/lint-context.sh",
139
145
  "build:manifest": "tsx scripts/build-manifest.js",
146
+ "sidecars:build": "node scripts/build-sidecars.mjs",
147
+ "sidecars:publish": "node scripts/publish-sidecars.mjs",
140
148
  "changeset": "changeset",
141
149
  "changeset:version": "changeset version",
142
150
  "changeset:status": "changeset status --since=origin/main",
143
151
  "verify:changesets": "tsx scripts/verify-changesets.ts",
152
+ "verify:release-mainline": "tsx scripts/release-mainline-check.ts",
144
153
  "conformance": "tsx scripts/conformance-report.ts",
145
154
  "check:exports": "tsx scripts/check-exports-count.ts",
146
155
  "lint:adapters": "tsx src/main.ts lint src/adapters",
147
156
  "lint:schema-v2": "tsx scripts/lint-schema-v2.ts",
148
157
  "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
149
158
  "validate:agents-size": "tsx scripts/validate-agents-size.ts",
150
- "verify": "npm run format:check && npm run typecheck && npm run lint && npm run lint:context && npm run build:manifest && npm run lint:adapters && npm run lint:schema-v2 && npm run build && npm run test && npm run test:adapter && npm run coverage:adapter-test && npm run validate:agents-size && npm run stats:check && npm run conformance && npm run check:exports && npm run verify:changesets",
159
+ "verify": "npm run format:check && npm run typecheck && npm run lint && npm run lint:context && npm run build:manifest && npm run lint:adapters && npm run lint:schema-v2 && npm run build && npm run test && npm run test:adapter && npm run test:perf && npm run coverage:compute-snapshot && npm run coverage:adapter-test && npm run validate:agents-size && npm run stats:check && npm run conformance && npm run check:exports && npm run verify:changesets",
151
160
  "verify:full": "npm run verify && npm run refs:verify && npm run adapter:health",
152
161
  "verify:clean": "npm run clean && npm run verify",
153
162
  "docs:prepare": "tsx scripts/generate-catalog.ts && tsx scripts/generate-docs-agent-assets.ts",
@@ -157,10 +166,10 @@
157
166
  "docs:preview": "vitepress preview docs",
158
167
  "doctor": "tsx src/doctor.ts",
159
168
  "mcp": "tsx src/mcp/server.ts",
160
- "release": "npm run build && tsx scripts/release.ts",
169
+ "release": "npm run verify:release-mainline && npm run build && tsx scripts/release.ts",
161
170
  "release:check": "tsx scripts/release-check.ts",
162
171
  "prepare": "lefthook install >/dev/null 2>&1 || true",
163
- "preversion": "npm run verify",
172
+ "preversion": "npm run verify:release-mainline && npm run verify",
164
173
  "postversion": "npm run build && tsx scripts/release.ts",
165
174
  "bench": "tsx bench/report.ts",
166
175
  "bench:self-discovery": "tsx bench/self-discovery.ts",
@@ -209,20 +218,36 @@
209
218
  "ws": "^8.20.0",
210
219
  "zod": "^4.3.6"
211
220
  },
221
+ "optionalDependencies": {
222
+ "@zenalexa/unicli-atspi-linux-arm64": "0.218.0",
223
+ "@zenalexa/unicli-atspi-linux-x64": "0.218.0",
224
+ "@zenalexa/unicli-uia-win32-arm64": "0.218.0",
225
+ "@zenalexa/unicli-uia-win32-x64": "0.218.0"
226
+ },
212
227
  "devDependencies": {
213
228
  "@ai-sdk/openai-compatible": "^2.0.41",
229
+ "@base-ui/react": "^1.4.1",
214
230
  "@changesets/cli": "^2.31.0",
215
231
  "@chenglou/pretext": "^0.0.6",
232
+ "@hugeicons/core-free-icons": "^4.1.1",
233
+ "@hugeicons/react": "^1.1.6",
234
+ "@hugeicons/vue": "^1.0.5",
216
235
  "@types/js-yaml": "^4.0.9",
217
236
  "@types/node": "^25.6.0",
237
+ "@types/react": "^19.2.14",
238
+ "@types/react-dom": "^19.2.3",
218
239
  "@types/shell-quote": "^1.7.5",
219
240
  "@types/turndown": "^5.0.6",
220
241
  "@types/ws": "^8.18.1",
242
+ "@vitejs/plugin-react": "^6.0.1",
243
+ "@vitest/coverage-v8": "^3.2.4",
221
244
  "ai": "^6.0.168",
222
245
  "lefthook": "^2.1.6",
223
246
  "markdown-it-mathjax3": "^4.3.2",
224
247
  "oxlint": "^1.61.0",
225
248
  "prettier": "^3.8.3",
249
+ "react": "^19.2.5",
250
+ "react-dom": "^19.2.5",
226
251
  "shell-quote": "^1.8.3",
227
252
  "tsx": "^4.21.0",
228
253
  "typescript": "^6.0.3",
@@ -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
+ });