@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.
- package/AGENTS.md +7 -6
- package/README.md +67 -19
- package/README.zh-CN.md +44 -16
- package/crates/unicli-atspi/Cargo.toml +47 -0
- package/crates/unicli-atspi/README.md +6 -0
- package/crates/unicli-atspi/src/errors.rs +213 -0
- package/crates/unicli-atspi/src/input.rs +1004 -0
- package/crates/unicli-atspi/src/invoke.rs +1132 -0
- package/crates/unicli-atspi/src/main.rs +130 -0
- package/crates/unicli-atspi/src/refs.rs +24 -0
- package/crates/unicli-atspi/src/screenshot.rs +756 -0
- package/crates/unicli-atspi/src/tree.rs +2319 -0
- package/crates/unicli-shared/Cargo.toml +13 -0
- package/crates/unicli-shared/src/lib.rs +77 -0
- package/crates/unicli-uia/Cargo.toml +29 -0
- package/crates/unicli-uia/README.md +6 -0
- package/crates/unicli-uia/src/errors.rs +179 -0
- package/crates/unicli-uia/src/input.rs +790 -0
- package/crates/unicli-uia/src/invoke.rs +977 -0
- package/crates/unicli-uia/src/main.rs +130 -0
- package/crates/unicli-uia/src/refs.rs +24 -0
- package/crates/unicli-uia/src/screenshot.rs +685 -0
- package/crates/unicli-uia/src/tree.rs +2135 -0
- package/dist/adapters/_electron/desktop-shared.d.ts.map +1 -1
- package/dist/adapters/_electron/desktop-shared.js +13 -0
- package/dist/adapters/_electron/desktop-shared.js.map +1 -1
- package/dist/adapters/_electron/shared.d.ts +1 -0
- package/dist/adapters/_electron/shared.d.ts.map +1 -1
- package/dist/adapters/_electron/shared.js +49 -2
- package/dist/adapters/_electron/shared.js.map +1 -1
- package/dist/adapters/macos/actions.d.ts +9 -0
- package/dist/adapters/macos/actions.d.ts.map +1 -0
- package/dist/adapters/macos/actions.js +55 -0
- package/dist/adapters/macos/actions.js.map +1 -0
- package/dist/browser/bridge.d.ts +5 -1
- package/dist/browser/bridge.d.ts.map +1 -1
- package/dist/browser/bridge.js +86 -23
- package/dist/browser/bridge.js.map +1 -1
- package/dist/browser/cdp-client.d.ts +2 -0
- package/dist/browser/cdp-client.d.ts.map +1 -1
- package/dist/browser/cdp-client.js +7 -0
- package/dist/browser/cdp-client.js.map +1 -1
- package/dist/browser/page.d.ts +2 -0
- package/dist/browser/page.d.ts.map +1 -1
- package/dist/browser/page.js +35 -0
- package/dist/browser/page.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +17 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/approvals.d.ts +3 -0
- package/dist/commands/approvals.d.ts.map +1 -0
- package/dist/commands/approvals.js +123 -0
- package/dist/commands/approvals.js.map +1 -0
- package/dist/commands/browser-operator-runtime.d.ts.map +1 -1
- package/dist/commands/browser-operator-runtime.js +5 -2
- package/dist/commands/browser-operator-runtime.js.map +1 -1
- package/dist/commands/browser-operator.d.ts.map +1 -1
- package/dist/commands/browser-operator.js +182 -38
- package/dist/commands/browser-operator.js.map +1 -1
- package/dist/commands/compute.d.ts +3 -0
- package/dist/commands/compute.d.ts.map +1 -0
- package/dist/commands/compute.js +324 -0
- package/dist/commands/compute.js.map +1 -0
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +20 -1
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/dispatch.d.ts +3 -0
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +76 -4
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/doctor-compute.d.ts +38 -0
- package/dist/commands/doctor-compute.d.ts.map +1 -0
- package/dist/commands/doctor-compute.js +376 -0
- package/dist/commands/doctor-compute.js.map +1 -0
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +69 -1
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +4 -0
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/runs.d.ts +3 -0
- package/dist/commands/runs.d.ts.map +1 -0
- package/dist/commands/runs.js +367 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/core/envelope.d.ts +8 -0
- package/dist/core/envelope.d.ts.map +1 -1
- package/dist/core/envelope.js +1 -0
- package/dist/core/envelope.js.map +1 -1
- package/dist/core/schema-v2.d.ts +2 -2
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +15 -0
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +11 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/discovery/macos-dynamic.d.ts +58 -0
- package/dist/discovery/macos-dynamic.d.ts.map +1 -0
- package/dist/discovery/macos-dynamic.js +429 -0
- package/dist/discovery/macos-dynamic.js.map +1 -0
- package/dist/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +152 -3
- package/dist/discovery/search.js.map +1 -1
- package/dist/electron-apps.d.ts +1 -0
- package/dist/electron-apps.d.ts.map +1 -1
- package/dist/electron-apps.js +1 -0
- package/dist/electron-apps.js.map +1 -1
- package/dist/engine/approval-store.d.ts +43 -0
- package/dist/engine/approval-store.d.ts.map +1 -0
- package/dist/engine/approval-store.js +193 -0
- package/dist/engine/approval-store.js.map +1 -0
- package/dist/engine/browser/action-evidence.d.ts +30 -0
- package/dist/engine/browser/action-evidence.d.ts.map +1 -0
- package/dist/engine/browser/action-evidence.js +354 -0
- package/dist/engine/browser/action-evidence.js.map +1 -0
- package/dist/engine/browser/evidence.d.ts +85 -0
- package/dist/engine/browser/evidence.d.ts.map +1 -0
- package/dist/engine/browser/evidence.js +373 -0
- package/dist/engine/browser/evidence.js.map +1 -0
- package/dist/engine/browser/session-lease.d.ts +53 -0
- package/dist/engine/browser/session-lease.d.ts.map +1 -0
- package/dist/engine/browser/session-lease.js +100 -0
- package/dist/engine/browser/session-lease.js.map +1 -0
- package/dist/engine/browser/session-lock.d.ts +17 -0
- package/dist/engine/browser/session-lock.d.ts.map +1 -0
- package/dist/engine/browser/session-lock.js +114 -0
- package/dist/engine/browser/session-lock.js.map +1 -0
- package/dist/engine/browser/session-runtime.d.ts +10 -0
- package/dist/engine/browser/session-runtime.d.ts.map +1 -0
- package/dist/engine/browser/session-runtime.js +87 -0
- package/dist/engine/browser/session-runtime.js.map +1 -0
- package/dist/engine/capability-policy.d.ts +50 -0
- package/dist/engine/capability-policy.d.ts.map +1 -0
- package/dist/engine/capability-policy.js +305 -0
- package/dist/engine/capability-policy.js.map +1 -0
- package/dist/engine/executor.d.ts +8 -3
- package/dist/engine/executor.d.ts.map +1 -1
- package/dist/engine/executor.js +9 -2
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/kernel/execute.d.ts +5 -1
- package/dist/engine/kernel/execute.d.ts.map +1 -1
- package/dist/engine/kernel/execute.js +215 -11
- package/dist/engine/kernel/execute.js.map +1 -1
- package/dist/engine/kernel/types.d.ts +15 -0
- package/dist/engine/kernel/types.d.ts.map +1 -1
- package/dist/engine/operation-policy.d.ts +60 -0
- package/dist/engine/operation-policy.d.ts.map +1 -0
- package/dist/engine/operation-policy.js +364 -0
- package/dist/engine/operation-policy.js.map +1 -0
- package/dist/engine/permission-rules.d.ts +43 -0
- package/dist/engine/permission-rules.d.ts.map +1 -0
- package/dist/engine/permission-rules.js +401 -0
- package/dist/engine/permission-rules.js.map +1 -0
- package/dist/engine/permission-runtime.d.ts +11 -0
- package/dist/engine/permission-runtime.d.ts.map +1 -0
- package/dist/engine/permission-runtime.js +21 -0
- package/dist/engine/permission-runtime.js.map +1 -0
- package/dist/engine/repair/remedies.d.ts +4 -0
- package/dist/engine/repair/remedies.d.ts.map +1 -0
- package/dist/engine/repair/remedies.js +169 -0
- package/dist/engine/repair/remedies.js.map +1 -0
- package/dist/engine/runtime-resource-guard.d.ts +23 -0
- package/dist/engine/runtime-resource-guard.d.ts.map +1 -0
- package/dist/engine/runtime-resource-guard.js +85 -0
- package/dist/engine/runtime-resource-guard.js.map +1 -0
- package/dist/engine/session/args.d.ts +3 -0
- package/dist/engine/session/args.d.ts.map +1 -0
- package/dist/engine/session/args.js +17 -0
- package/dist/engine/session/args.js.map +1 -0
- package/dist/engine/session/compare.d.ts +92 -0
- package/dist/engine/session/compare.d.ts.map +1 -0
- package/dist/engine/session/compare.js +324 -0
- package/dist/engine/session/compare.js.map +1 -0
- package/dist/engine/session/environment.d.ts +4 -0
- package/dist/engine/session/environment.d.ts.map +1 -0
- package/dist/engine/session/environment.js +25 -0
- package/dist/engine/session/environment.js.map +1 -0
- package/dist/engine/session/events.d.ts +24 -0
- package/dist/engine/session/events.d.ts.map +1 -0
- package/dist/engine/session/events.js +78 -0
- package/dist/engine/session/events.js.map +1 -0
- package/dist/engine/session/query.d.ts +47 -0
- package/dist/engine/session/query.d.ts.map +1 -0
- package/dist/engine/session/query.js +299 -0
- package/dist/engine/session/query.js.map +1 -0
- package/dist/engine/session/replay.d.ts +35 -0
- package/dist/engine/session/replay.d.ts.map +1 -0
- package/dist/engine/session/replay.js +144 -0
- package/dist/engine/session/replay.js.map +1 -0
- package/dist/engine/session/run-loop.d.ts +11 -0
- package/dist/engine/session/run-loop.d.ts.map +1 -0
- package/dist/engine/session/run-loop.js +212 -0
- package/dist/engine/session/run-loop.js.map +1 -0
- package/dist/engine/session/store.d.ts +26 -0
- package/dist/engine/session/store.d.ts.map +1 -0
- package/dist/engine/session/store.js +214 -0
- package/dist/engine/session/store.js.map +1 -0
- package/dist/engine/session/types.d.ts +39 -0
- package/dist/engine/session/types.d.ts.map +1 -0
- package/dist/engine/session/types.js +2 -0
- package/dist/engine/session/types.js.map +1 -0
- package/dist/engine/steps/compute.d.ts +41 -0
- package/dist/engine/steps/compute.d.ts.map +1 -0
- package/dist/engine/steps/compute.js +55 -0
- package/dist/engine/steps/compute.js.map +1 -0
- package/dist/engine/steps/desktop-ax.d.ts +8 -0
- package/dist/engine/steps/desktop-ax.d.ts.map +1 -1
- package/dist/engine/steps/desktop-ax.js +16 -0
- package/dist/engine/steps/desktop-ax.js.map +1 -1
- package/dist/engine/steps/desktop-sidecar.d.ts +49 -0
- package/dist/engine/steps/desktop-sidecar.d.ts.map +1 -0
- package/dist/engine/steps/desktop-sidecar.js +50 -0
- package/dist/engine/steps/desktop-sidecar.js.map +1 -0
- package/dist/engine/steps/download.d.ts +1 -1
- package/dist/engine/steps/download.d.ts.map +1 -1
- package/dist/engine/steps/download.js +24 -2
- package/dist/engine/steps/download.js.map +1 -1
- package/dist/engine/steps/exec.d.ts +1 -1
- package/dist/engine/steps/exec.d.ts.map +1 -1
- package/dist/engine/steps/exec.js +23 -7
- package/dist/engine/steps/exec.js.map +1 -1
- package/dist/engine/steps/fetch-text.d.ts +2 -2
- package/dist/engine/steps/fetch-text.d.ts.map +1 -1
- package/dist/engine/steps/fetch-text.js +61 -19
- package/dist/engine/steps/fetch-text.js.map +1 -1
- package/dist/engine/steps/fetch.d.ts +3 -1
- package/dist/engine/steps/fetch.d.ts.map +1 -1
- package/dist/engine/steps/fetch.js +36 -7
- package/dist/engine/steps/fetch.js.map +1 -1
- package/dist/engine/steps/index.d.ts +2 -0
- package/dist/engine/steps/index.d.ts.map +1 -1
- package/dist/engine/steps/index.js +2 -0
- package/dist/engine/steps/index.js.map +1 -1
- package/dist/engine/steps/navigate.d.ts +1 -1
- package/dist/engine/steps/navigate.d.ts.map +1 -1
- package/dist/engine/steps/navigate.js +29 -2
- package/dist/engine/steps/navigate.js.map +1 -1
- package/dist/engine/steps/parse-rss.d.ts.map +1 -1
- package/dist/engine/steps/parse-rss.js +9 -4
- package/dist/engine/steps/parse-rss.js.map +1 -1
- package/dist/engine/template.d.ts.map +1 -1
- package/dist/engine/template.js +2 -1
- package/dist/engine/template.js.map +1 -1
- package/dist/engine/text-normalize.d.ts +6 -0
- package/dist/engine/text-normalize.d.ts.map +1 -0
- package/dist/engine/text-normalize.js +63 -0
- package/dist/engine/text-normalize.js.map +1 -0
- package/dist/fast-path.d.ts.map +1 -1
- package/dist/fast-path.js +291 -8
- package/dist/fast-path.js.map +1 -1
- package/dist/main.d.ts +1 -1
- package/dist/main.js +1 -1
- package/dist/manifest-compact.txt +2 -2
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +4313 -533
- package/dist/mcp/dispatch.d.ts +3 -3
- package/dist/mcp/dispatch.d.ts.map +1 -1
- package/dist/mcp/dispatch.js +6 -5
- package/dist/mcp/dispatch.js.map +1 -1
- package/dist/mcp/handler.d.ts +2 -2
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +59 -5
- package/dist/mcp/handler.js.map +1 -1
- package/dist/mcp/profiles/computer-use.d.ts +4 -0
- package/dist/mcp/profiles/computer-use.d.ts.map +1 -0
- package/dist/mcp/profiles/computer-use.js +305 -0
- package/dist/mcp/profiles/computer-use.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +30 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +9 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +20 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/envelope.d.ts +6 -0
- package/dist/output/envelope.d.ts.map +1 -1
- package/dist/output/envelope.js.map +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +25 -0
- package/dist/output/error-map.js.map +1 -1
- package/dist/protocol/acp-helpers.d.ts +2 -2
- package/dist/protocol/acp-helpers.d.ts.map +1 -1
- package/dist/protocol/acp-helpers.js +5 -4
- package/dist/protocol/acp-helpers.js.map +1 -1
- package/dist/registry.d.ts +4 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +7 -0
- package/dist/registry.js.map +1 -1
- package/dist/transport/adapters/cdp-browser.d.ts +38 -2
- package/dist/transport/adapters/cdp-browser.d.ts.map +1 -1
- package/dist/transport/adapters/cdp-browser.js +349 -22
- package/dist/transport/adapters/cdp-browser.js.map +1 -1
- package/dist/transport/adapters/desktop-atspi.d.ts +23 -17
- package/dist/transport/adapters/desktop-atspi.d.ts.map +1 -1
- package/dist/transport/adapters/desktop-atspi.js +143 -32
- package/dist/transport/adapters/desktop-atspi.js.map +1 -1
- package/dist/transport/adapters/desktop-ax-helpers.d.ts +24 -0
- package/dist/transport/adapters/desktop-ax-helpers.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-ax-helpers.js +190 -0
- package/dist/transport/adapters/desktop-ax-helpers.js.map +1 -0
- package/dist/transport/adapters/desktop-ax-swift.d.ts +13 -0
- package/dist/transport/adapters/desktop-ax-swift.d.ts.map +1 -1
- package/dist/transport/adapters/desktop-ax-swift.js +176 -2
- package/dist/transport/adapters/desktop-ax-swift.js.map +1 -1
- package/dist/transport/adapters/desktop-ax.d.ts +11 -2
- package/dist/transport/adapters/desktop-ax.d.ts.map +1 -1
- package/dist/transport/adapters/desktop-ax.js +131 -16
- package/dist/transport/adapters/desktop-ax.js.map +1 -1
- package/dist/transport/adapters/desktop-sidecar-errors.d.ts +3 -0
- package/dist/transport/adapters/desktop-sidecar-errors.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-sidecar-errors.js +34 -0
- package/dist/transport/adapters/desktop-sidecar-errors.js.map +1 -0
- package/dist/transport/adapters/desktop-sidecar-snapshot.d.ts +10 -0
- package/dist/transport/adapters/desktop-sidecar-snapshot.d.ts.map +1 -0
- package/dist/transport/adapters/desktop-sidecar-snapshot.js +89 -0
- package/dist/transport/adapters/desktop-sidecar-snapshot.js.map +1 -0
- package/dist/transport/adapters/desktop-uia.d.ts +23 -17
- package/dist/transport/adapters/desktop-uia.d.ts.map +1 -1
- package/dist/transport/adapters/desktop-uia.js +142 -32
- package/dist/transport/adapters/desktop-uia.js.map +1 -1
- package/dist/transport/adapters/subprocess.d.ts +7 -0
- package/dist/transport/adapters/subprocess.d.ts.map +1 -1
- package/dist/transport/adapters/subprocess.js +64 -0
- package/dist/transport/adapters/subprocess.js.map +1 -1
- package/dist/transport/bus.d.ts +2 -0
- package/dist/transport/bus.d.ts.map +1 -1
- package/dist/transport/bus.js +7 -11
- package/dist/transport/bus.js.map +1 -1
- package/dist/transport/capability.d.ts.map +1 -1
- package/dist/transport/capability.js +123 -98
- package/dist/transport/capability.js.map +1 -1
- package/dist/transport/cascade.d.ts +5 -0
- package/dist/transport/cascade.d.ts.map +1 -0
- package/dist/transport/cascade.js +550 -0
- package/dist/transport/cascade.js.map +1 -0
- package/dist/transport/cdp-session.d.ts +11 -0
- package/dist/transport/cdp-session.d.ts.map +1 -0
- package/dist/transport/cdp-session.js +52 -0
- package/dist/transport/cdp-session.js.map +1 -0
- package/dist/transport/refs.d.ts +51 -0
- package/dist/transport/refs.d.ts.map +1 -0
- package/dist/transport/refs.js +135 -0
- package/dist/transport/refs.js.map +1 -0
- package/dist/transport/sidecar-binary.d.ts +18 -0
- package/dist/transport/sidecar-binary.d.ts.map +1 -0
- package/dist/transport/sidecar-binary.js +55 -0
- package/dist/transport/sidecar-binary.js.map +1 -0
- package/dist/transport/sidecar.d.ts +35 -0
- package/dist/transport/sidecar.d.ts.map +1 -0
- package/dist/transport/sidecar.js +134 -0
- package/dist/transport/sidecar.js.map +1 -0
- package/dist/transport/snapshot-encoder.d.ts +34 -0
- package/dist/transport/snapshot-encoder.d.ts.map +1 -0
- package/dist/transport/snapshot-encoder.js +139 -0
- package/dist/transport/snapshot-encoder.js.map +1 -0
- package/dist/transport/types.d.ts +6 -1
- package/dist/transport/types.d.ts.map +1 -1
- package/dist/types.d.ts +11 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/docs/mcp/clients/claude-code.md +29 -0
- package/docs/mcp/clients/claude-desktop.md +47 -0
- package/docs/mcp/clients/codex.md +29 -0
- package/docs/mcp/clients/cursor.md +38 -0
- package/docs/mcp/clients/gemini-cli.md +38 -0
- package/docs/operate/compute.md +172 -0
- package/docs/operate/electron.md +87 -0
- package/docs/operate/focus-behavior.md +40 -0
- package/docs/operate/troubleshooting.md +379 -0
- package/package.json +44 -19
- package/src/adapters/36kr/news.yaml +4 -1
- package/src/adapters/_electron/desktop-shared.ts +14 -0
- package/src/adapters/_electron/shared.ts +54 -2
- package/src/adapters/juejin/hot.test.ts +25 -0
- package/src/adapters/juejin/hot.yaml +52 -0
- package/src/adapters/juejin/search.test.ts +27 -0
- package/src/adapters/juejin/search.yaml +58 -0
- package/src/adapters/leetcode/discuss-search.test.ts +29 -0
- package/src/adapters/leetcode/discuss-search.yaml +56 -0
- package/src/adapters/macos/actions.ts +63 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { execFile, execFileSync } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { getAdapter, registerAdapter } from "../registry.js";
|
|
8
|
+
import { AdapterType } from "../types.js";
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
const DYNAMIC_SHORTCUTS_ADAPTER_PATH = "dynamic:macos-shortcuts";
|
|
11
|
+
const DYNAMIC_APP_ACTIONS_ADAPTER_PATH = "dynamic:macos-app-actions";
|
|
12
|
+
const TOOLKIT_QUERY_TIMEOUT_MS = 3000;
|
|
13
|
+
const SHORTCUTS_QUERY_TIMEOUT_MS = 3000;
|
|
14
|
+
const SHORTCUT_RUN_TIMEOUT_MS = 120_000;
|
|
15
|
+
const MAX_TOOLKIT_OUTPUT_BYTES = 20 * 1024 * 1024;
|
|
16
|
+
function stringValue(value) {
|
|
17
|
+
return typeof value === "string" ? value.trim() : "";
|
|
18
|
+
}
|
|
19
|
+
function parsePositiveInt(value, fallback) {
|
|
20
|
+
const n = Number(value);
|
|
21
|
+
if (Number.isFinite(n) && n > 0)
|
|
22
|
+
return Math.floor(n);
|
|
23
|
+
return fallback;
|
|
24
|
+
}
|
|
25
|
+
function includesNeedle(value, needle) {
|
|
26
|
+
return value.toLowerCase().includes(needle.toLowerCase());
|
|
27
|
+
}
|
|
28
|
+
function hashSuffix(value) {
|
|
29
|
+
return createHash("sha1").update(value).digest("hex").slice(0, 8);
|
|
30
|
+
}
|
|
31
|
+
function slugPart(value) {
|
|
32
|
+
return value
|
|
33
|
+
.normalize("NFKD")
|
|
34
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
35
|
+
.toLowerCase()
|
|
36
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
37
|
+
.replace(/^-+|-+$/g, "");
|
|
38
|
+
}
|
|
39
|
+
function commandName(prefix, parts, fallback) {
|
|
40
|
+
const slug = parts.map(slugPart).filter(Boolean).join("-");
|
|
41
|
+
return `${prefix}-${slug || hashSuffix(fallback)}`;
|
|
42
|
+
}
|
|
43
|
+
function uniqueCommandName(base, used) {
|
|
44
|
+
if (!used.has(base)) {
|
|
45
|
+
used.add(base);
|
|
46
|
+
return base;
|
|
47
|
+
}
|
|
48
|
+
let suffix = 2;
|
|
49
|
+
while (used.has(`${base}-${suffix}`))
|
|
50
|
+
suffix++;
|
|
51
|
+
const name = `${base}-${suffix}`;
|
|
52
|
+
used.add(name);
|
|
53
|
+
return name;
|
|
54
|
+
}
|
|
55
|
+
function escapeSqlString(value) {
|
|
56
|
+
return value.replace(/'/g, "''");
|
|
57
|
+
}
|
|
58
|
+
function normalizeLocale(value) {
|
|
59
|
+
const raw = (value ?? "en").split(".")[0].replace("-", "_");
|
|
60
|
+
return /^[A-Za-z_]+$/.test(raw) ? raw : "en";
|
|
61
|
+
}
|
|
62
|
+
function currentShortcutsLocale() {
|
|
63
|
+
return normalizeLocale(process.env.LC_ALL ||
|
|
64
|
+
process.env.LC_MESSAGES ||
|
|
65
|
+
process.env.LANG ||
|
|
66
|
+
Intl.DateTimeFormat().resolvedOptions().locale);
|
|
67
|
+
}
|
|
68
|
+
export function dynamicMacosDiscoveryEnabled(env = process.env, platform = process.platform) {
|
|
69
|
+
const flag = env.UNICLI_DYNAMIC_MACOS?.toLowerCase();
|
|
70
|
+
if (flag === "0" || flag === "false" || flag === "off")
|
|
71
|
+
return false;
|
|
72
|
+
if (platform !== "darwin")
|
|
73
|
+
return false;
|
|
74
|
+
if (env.NODE_ENV === "test" || env.VITEST)
|
|
75
|
+
return flag === "1";
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
export function parseShortcutsListOutput(stdout) {
|
|
79
|
+
const shortcuts = [];
|
|
80
|
+
for (const rawLine of stdout.split(/\r?\n/)) {
|
|
81
|
+
const line = rawLine.trim();
|
|
82
|
+
if (!line)
|
|
83
|
+
continue;
|
|
84
|
+
const match = /^(.*)\s+\(([0-9a-fA-F-]{36})\)$/.exec(line);
|
|
85
|
+
if (match) {
|
|
86
|
+
shortcuts.push({ name: match[1].trim(), identifier: match[2] });
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
shortcuts.push({ name: line });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return shortcuts;
|
|
93
|
+
}
|
|
94
|
+
export function parseToolKitActionsJson(stdout) {
|
|
95
|
+
if (!stdout.trim())
|
|
96
|
+
return [];
|
|
97
|
+
let parsed;
|
|
98
|
+
try {
|
|
99
|
+
parsed = JSON.parse(stdout);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
if (!Array.isArray(parsed))
|
|
105
|
+
return [];
|
|
106
|
+
const seen = new Set();
|
|
107
|
+
const actions = [];
|
|
108
|
+
for (const row of parsed) {
|
|
109
|
+
if (!row || typeof row !== "object")
|
|
110
|
+
continue;
|
|
111
|
+
const id = stringValue(row.id);
|
|
112
|
+
const app = stringValue(row.app);
|
|
113
|
+
const name = stringValue(row.name);
|
|
114
|
+
if (!id || !name)
|
|
115
|
+
continue;
|
|
116
|
+
const action = {
|
|
117
|
+
id,
|
|
118
|
+
kind: stringValue(row.kind) || "appIntent",
|
|
119
|
+
containerId: stringValue(row.container_id) || stringValue(row.containerId) || app,
|
|
120
|
+
app: app || stringValue(row.container_id) || id,
|
|
121
|
+
name,
|
|
122
|
+
description: stringValue(row.description),
|
|
123
|
+
};
|
|
124
|
+
const key = `${action.id}\0${action.containerId}\0${action.name}`;
|
|
125
|
+
if (seen.has(key))
|
|
126
|
+
continue;
|
|
127
|
+
seen.add(key);
|
|
128
|
+
actions.push(action);
|
|
129
|
+
}
|
|
130
|
+
return actions;
|
|
131
|
+
}
|
|
132
|
+
function findToolKitDatabase(home = homedir()) {
|
|
133
|
+
const dir = join(home, "Library", "Shortcuts", "ToolKit");
|
|
134
|
+
if (!existsSync(dir))
|
|
135
|
+
return undefined;
|
|
136
|
+
const files = readdirSync(dir)
|
|
137
|
+
.filter((file) => /^Tools-.*\.sqlite$/.test(file))
|
|
138
|
+
.map((file) => {
|
|
139
|
+
const path = join(dir, file);
|
|
140
|
+
return { path, mtimeMs: statSync(path).mtimeMs };
|
|
141
|
+
})
|
|
142
|
+
.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
143
|
+
return files[0]?.path;
|
|
144
|
+
}
|
|
145
|
+
function toolKitActionsQuery(locale) {
|
|
146
|
+
const preferred = escapeSqlString(locale);
|
|
147
|
+
return `
|
|
148
|
+
SELECT
|
|
149
|
+
Tools.id AS id,
|
|
150
|
+
Tools.toolType AS kind,
|
|
151
|
+
ContainerMetadata.id AS container_id,
|
|
152
|
+
COALESCE(
|
|
153
|
+
(SELECT name FROM ContainerMetadataLocalizations WHERE containerId = ContainerMetadata.rowId AND locale = '${preferred}' LIMIT 1),
|
|
154
|
+
(SELECT name FROM ContainerMetadataLocalizations WHERE containerId = ContainerMetadata.rowId AND locale = 'en' LIMIT 1),
|
|
155
|
+
(SELECT name FROM ContainerMetadataLocalizations WHERE containerId = ContainerMetadata.rowId LIMIT 1),
|
|
156
|
+
ContainerMetadata.id
|
|
157
|
+
) AS app,
|
|
158
|
+
COALESCE(
|
|
159
|
+
(SELECT name FROM ToolLocalizations WHERE toolId = Tools.rowId AND localizationUsage = 'display' AND locale = '${preferred}' LIMIT 1),
|
|
160
|
+
(SELECT name FROM ToolLocalizations WHERE toolId = Tools.rowId AND localizationUsage = 'display' AND locale = 'en' LIMIT 1),
|
|
161
|
+
(SELECT name FROM ToolLocalizations WHERE toolId = Tools.rowId AND localizationUsage = 'display' LIMIT 1),
|
|
162
|
+
Tools.id
|
|
163
|
+
) AS name,
|
|
164
|
+
COALESCE(
|
|
165
|
+
(SELECT descriptionSummary FROM ToolLocalizations WHERE toolId = Tools.rowId AND localizationUsage = 'display' AND locale = '${preferred}' LIMIT 1),
|
|
166
|
+
(SELECT descriptionSummary FROM ToolLocalizations WHERE toolId = Tools.rowId AND localizationUsage = 'display' AND locale = 'en' LIMIT 1),
|
|
167
|
+
''
|
|
168
|
+
) AS description
|
|
169
|
+
FROM Tools
|
|
170
|
+
JOIN ContainerMetadata ON ContainerMetadata.rowId = Tools.sourceContainerId
|
|
171
|
+
WHERE Tools.deprecationReplacementId IS NULL
|
|
172
|
+
ORDER BY app, name, id;
|
|
173
|
+
`;
|
|
174
|
+
}
|
|
175
|
+
export function discoverMacosShortcuts() {
|
|
176
|
+
try {
|
|
177
|
+
const stdout = execFileSync("/usr/bin/shortcuts", ["list", "--show-identifiers"], {
|
|
178
|
+
encoding: "utf8",
|
|
179
|
+
timeout: SHORTCUTS_QUERY_TIMEOUT_MS,
|
|
180
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
181
|
+
});
|
|
182
|
+
return parseShortcutsListOutput(stdout);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
export function discoverMacosAppActions() {
|
|
189
|
+
const db = findToolKitDatabase();
|
|
190
|
+
if (!db)
|
|
191
|
+
return [];
|
|
192
|
+
try {
|
|
193
|
+
const stdout = execFileSync("sqlite3", ["-json", db, toolKitActionsQuery(currentShortcutsLocale())], {
|
|
194
|
+
encoding: "utf8",
|
|
195
|
+
timeout: TOOLKIT_QUERY_TIMEOUT_MS,
|
|
196
|
+
maxBuffer: MAX_TOOLKIT_OUTPUT_BYTES,
|
|
197
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
198
|
+
});
|
|
199
|
+
return parseToolKitActionsJson(stdout);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
export function filterMacosAppActions(actions, options = {}) {
|
|
206
|
+
const app = options.app?.trim();
|
|
207
|
+
const query = options.query?.trim();
|
|
208
|
+
const limit = parsePositiveInt(options.limit, 200);
|
|
209
|
+
return actions
|
|
210
|
+
.filter((action) => !app || includesNeedle(action.app, app))
|
|
211
|
+
.filter((action) => !query ||
|
|
212
|
+
includesNeedle(action.name, query) ||
|
|
213
|
+
includesNeedle(action.description, query) ||
|
|
214
|
+
includesNeedle(action.id, query))
|
|
215
|
+
.slice(0, limit);
|
|
216
|
+
}
|
|
217
|
+
export function listMacosAppActions(options) {
|
|
218
|
+
return filterMacosAppActions(discoverMacosAppActions(), {
|
|
219
|
+
app: stringValue(options.app),
|
|
220
|
+
query: stringValue(options.query),
|
|
221
|
+
limit: parsePositiveInt(options.limit, 200),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
export function discoverMacosDynamicData() {
|
|
225
|
+
if (!dynamicMacosDiscoveryEnabled()) {
|
|
226
|
+
return { shortcuts: [], appActions: [] };
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
shortcuts: discoverMacosShortcuts(),
|
|
230
|
+
appActions: discoverMacosAppActions(),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function discoverRunningAxApps() {
|
|
234
|
+
if (process.platform !== "darwin")
|
|
235
|
+
return [];
|
|
236
|
+
try {
|
|
237
|
+
const stdout = execFileSync("osascript", [
|
|
238
|
+
"-l",
|
|
239
|
+
"JavaScript",
|
|
240
|
+
"-e",
|
|
241
|
+
[
|
|
242
|
+
"var se = Application('System Events');",
|
|
243
|
+
"var procs = se.applicationProcesses.whose({backgroundOnly: false})();",
|
|
244
|
+
"JSON.stringify(procs.map(function(p) { return p.name(); }));",
|
|
245
|
+
].join("\n"),
|
|
246
|
+
], {
|
|
247
|
+
encoding: "utf8",
|
|
248
|
+
timeout: 3000,
|
|
249
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
250
|
+
});
|
|
251
|
+
const parsed = JSON.parse(stdout);
|
|
252
|
+
return Array.isArray(parsed)
|
|
253
|
+
? parsed.filter((value) => typeof value === "string")
|
|
254
|
+
: [];
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return [];
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
export function buildMacosAutomationSmoke(data, axApps, appNames) {
|
|
261
|
+
const layers = [
|
|
262
|
+
{
|
|
263
|
+
layer: "cli",
|
|
264
|
+
ok: data.shortcuts.length > 0,
|
|
265
|
+
count: data.shortcuts.length,
|
|
266
|
+
sample: data.shortcuts.slice(0, 5).map((shortcut) => shortcut.name),
|
|
267
|
+
message: data.shortcuts.length > 0
|
|
268
|
+
? "shortcuts CLI returned user shortcuts"
|
|
269
|
+
: "shortcuts CLI returned no shortcuts or is unavailable",
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
layer: "api",
|
|
273
|
+
ok: data.appActions.length > 0,
|
|
274
|
+
count: data.appActions.length,
|
|
275
|
+
sample: data.appActions
|
|
276
|
+
.slice(0, 5)
|
|
277
|
+
.map((action) => `${action.app}: ${action.name}`),
|
|
278
|
+
message: data.appActions.length > 0
|
|
279
|
+
? "Shortcuts ToolKit database returned app actions"
|
|
280
|
+
: "Shortcuts ToolKit database returned no actions or is unavailable",
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
layer: "ax",
|
|
284
|
+
ok: axApps.length > 0,
|
|
285
|
+
count: axApps.length,
|
|
286
|
+
sample: axApps.slice(0, 5),
|
|
287
|
+
message: axApps.length > 0
|
|
288
|
+
? "System Events returned foreground application processes"
|
|
289
|
+
: "AX/System Events returned no foreground applications or is unavailable",
|
|
290
|
+
},
|
|
291
|
+
];
|
|
292
|
+
const apps = appNames.map((app) => {
|
|
293
|
+
const matchingActions = data.appActions.filter((action) => includesNeedle(action.app, app));
|
|
294
|
+
return {
|
|
295
|
+
app,
|
|
296
|
+
apiActions: matchingActions.length,
|
|
297
|
+
axRunning: axApps.some((running) => includesNeedle(running, app)),
|
|
298
|
+
sampleActions: matchingActions.slice(0, 5).map((action) => action.name),
|
|
299
|
+
};
|
|
300
|
+
});
|
|
301
|
+
return { layers, apps };
|
|
302
|
+
}
|
|
303
|
+
export function runMacosAutomationSmoke(options) {
|
|
304
|
+
const rawApps = stringValue(options.apps);
|
|
305
|
+
const apps = rawApps
|
|
306
|
+
? rawApps
|
|
307
|
+
.split(",")
|
|
308
|
+
.map((app) => app.trim())
|
|
309
|
+
.filter(Boolean)
|
|
310
|
+
: [
|
|
311
|
+
"Finder",
|
|
312
|
+
"Safari",
|
|
313
|
+
"Mail",
|
|
314
|
+
"Messages",
|
|
315
|
+
"Reminders",
|
|
316
|
+
"Notes",
|
|
317
|
+
"WhatsApp",
|
|
318
|
+
];
|
|
319
|
+
return buildMacosAutomationSmoke(discoverMacosDynamicData(), discoverRunningAxApps(), apps);
|
|
320
|
+
}
|
|
321
|
+
async function runShortcut(shortcut) {
|
|
322
|
+
const target = shortcut.identifier || shortcut.name;
|
|
323
|
+
const { stdout } = await execFileAsync("/usr/bin/shortcuts", ["run", target], {
|
|
324
|
+
encoding: "utf8",
|
|
325
|
+
timeout: SHORTCUT_RUN_TIMEOUT_MS,
|
|
326
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
327
|
+
});
|
|
328
|
+
return {
|
|
329
|
+
shortcut: shortcut.name,
|
|
330
|
+
identifier: shortcut.identifier,
|
|
331
|
+
output: String(stdout ?? "").trim(),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
function shortcutCommandDescription(shortcut) {
|
|
335
|
+
return `Run local Shortcuts.app shortcut "${shortcut.name}"`;
|
|
336
|
+
}
|
|
337
|
+
function appActionCommandDescription(action) {
|
|
338
|
+
const base = `Inspect Shortcuts app action ${action.app} / ${action.name}.`;
|
|
339
|
+
return action.description ? `${base} ${action.description}` : base;
|
|
340
|
+
}
|
|
341
|
+
export function buildMacosDynamicCommands(data) {
|
|
342
|
+
const commands = {};
|
|
343
|
+
const used = new Set();
|
|
344
|
+
for (const shortcut of data.shortcuts) {
|
|
345
|
+
const base = commandName("shortcut", [shortcut.name], shortcut.identifier || shortcut.name);
|
|
346
|
+
const name = uniqueCommandName(base, used);
|
|
347
|
+
commands[name] = {
|
|
348
|
+
name,
|
|
349
|
+
description: shortcutCommandDescription(shortcut),
|
|
350
|
+
adapter_path: DYNAMIC_SHORTCUTS_ADAPTER_PATH,
|
|
351
|
+
target_surface: "system",
|
|
352
|
+
minimum_capability: "subprocess.exec",
|
|
353
|
+
columns: ["shortcut", "identifier", "output"],
|
|
354
|
+
func: async () => runShortcut(shortcut),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
for (const action of data.appActions) {
|
|
358
|
+
const base = commandName("app-action", [action.app, action.name], action.id);
|
|
359
|
+
const name = uniqueCommandName(base, used);
|
|
360
|
+
commands[name] = {
|
|
361
|
+
name,
|
|
362
|
+
description: appActionCommandDescription(action),
|
|
363
|
+
adapter_path: DYNAMIC_APP_ACTIONS_ADAPTER_PATH,
|
|
364
|
+
target_surface: "desktop",
|
|
365
|
+
minimum_capability: "subprocess.exec",
|
|
366
|
+
columns: ["app", "name", "id", "kind", "description", "executable"],
|
|
367
|
+
func: async () => ({
|
|
368
|
+
...action,
|
|
369
|
+
executable: false,
|
|
370
|
+
run_command: "Create a Shortcut containing this action, then run that shortcut with `unicli macos shortcuts-run <name-or-id>`.",
|
|
371
|
+
}),
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
return commands;
|
|
375
|
+
}
|
|
376
|
+
export function buildMacosDynamicSearchDocuments(data) {
|
|
377
|
+
const docs = [];
|
|
378
|
+
const used = new Set();
|
|
379
|
+
docs.push({
|
|
380
|
+
site: "macos",
|
|
381
|
+
command: "app-actions",
|
|
382
|
+
description: "List real-time Shortcuts app actions, App Intents, app commands, action identifiers, and automation actions from installed macOS apps.",
|
|
383
|
+
}, {
|
|
384
|
+
site: "macos",
|
|
385
|
+
command: "automation-smoke",
|
|
386
|
+
description: "Probe macOS automation layers across Shortcuts CLI, Shortcuts ToolKit API, Accessibility AX, System Events, and common apps.",
|
|
387
|
+
});
|
|
388
|
+
for (const shortcut of data.shortcuts) {
|
|
389
|
+
const base = commandName("shortcut", [shortcut.name], shortcut.identifier || shortcut.name);
|
|
390
|
+
const command = uniqueCommandName(base, used);
|
|
391
|
+
docs.push({
|
|
392
|
+
site: "macos",
|
|
393
|
+
command,
|
|
394
|
+
description: `${shortcutCommandDescription(shortcut)} via the macOS shortcuts CLI.`,
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
for (const action of data.appActions) {
|
|
398
|
+
const base = commandName("app-action", [action.app, action.name], action.id);
|
|
399
|
+
const command = uniqueCommandName(base, used);
|
|
400
|
+
docs.push({
|
|
401
|
+
site: "macos",
|
|
402
|
+
command,
|
|
403
|
+
description: `Shortcuts app action from ${action.app}: ${action.name}.${action.description ? ` ${action.description}` : ""}`,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
return docs;
|
|
407
|
+
}
|
|
408
|
+
export function registerMacosDynamicCommands() {
|
|
409
|
+
const data = discoverMacosDynamicData();
|
|
410
|
+
const dynamicCommands = buildMacosDynamicCommands(data);
|
|
411
|
+
let adapter = getAdapter("macos");
|
|
412
|
+
if (!adapter) {
|
|
413
|
+
adapter = {
|
|
414
|
+
name: "macos",
|
|
415
|
+
type: AdapterType.DESKTOP,
|
|
416
|
+
commands: {},
|
|
417
|
+
};
|
|
418
|
+
registerAdapter(adapter);
|
|
419
|
+
}
|
|
420
|
+
for (const [name, command] of Object.entries(adapter.commands)) {
|
|
421
|
+
if (command.adapter_path === DYNAMIC_SHORTCUTS_ADAPTER_PATH ||
|
|
422
|
+
command.adapter_path === DYNAMIC_APP_ACTIONS_ADAPTER_PATH) {
|
|
423
|
+
delete adapter.commands[name];
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
Object.assign(adapter.commands, dynamicCommands);
|
|
427
|
+
return Object.keys(dynamicCommands).length;
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=macos-dynamic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-dynamic.js","sourceRoot":"","sources":["../../src/discovery/macos-dynamic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/discovery/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/discovery/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoBH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAoBD,4EAA4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,wCAAwC;IACxC,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;CACX;AAgND;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,MAAM,CACX,MAAM,EACN;QAAE,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAC3D,CAAC;CACH,GAAG,WAAW,CAsDd;AA0KD;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE,CAkB/D;AA2KD;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
package/dist/discovery/search.js
CHANGED
|
@@ -17,6 +17,7 @@ import { readFileSync, existsSync } from "node:fs";
|
|
|
17
17
|
import { join, dirname } from "node:path";
|
|
18
18
|
import { fileURLToPath } from "node:url";
|
|
19
19
|
import { expandToken, tokenizeQuery, SITE_ALIASES, SITE_CATEGORIES, CATEGORY_ALIASES, } from "./aliases.js";
|
|
20
|
+
import { buildMacosDynamicSearchDocuments, discoverMacosDynamicData, dynamicMacosDiscoveryEnabled, } from "./macos-dynamic.js";
|
|
20
21
|
// ── BM25 Parameters ─────────────────────────────────────────────────────────
|
|
21
22
|
// Standard BM25 tuning. k1 controls term frequency saturation,
|
|
22
23
|
// b controls document length normalization.
|
|
@@ -37,6 +38,79 @@ const BOOST_SITE_ALIAS = 12.0; // Query token's alias matches site name
|
|
|
37
38
|
const BOOST_CMD_EXACT = 8.0; // Query token exactly matches command name
|
|
38
39
|
const BOOST_CMD_PARTIAL = 3.0; // Query token is substring of command name
|
|
39
40
|
const BOOST_CATEGORY = 2.0; // Query token matches site's category
|
|
41
|
+
const BOOST_RUN_TRACE_INTENT = 45.0; // Recorded trace/replay/audit queries
|
|
42
|
+
const CORE_SEARCH_DOCUMENTS = [
|
|
43
|
+
{
|
|
44
|
+
site: "browser",
|
|
45
|
+
command: "evidence",
|
|
46
|
+
description: "Capture browser operator evidence for web automation, website control, agent workflows, MCP/CLI debugging, DOM snapshots, screenshots, network summaries, render-aware observation, session leases, and audit trails.",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
site: "browser",
|
|
50
|
+
command: "extract",
|
|
51
|
+
description: "Extract rendered website text through the browser operator with render-aware waiting, session lease metadata, DOM evidence, and agent-friendly structured output.",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
site: "browser",
|
|
55
|
+
command: "state",
|
|
56
|
+
description: "Read the current browser page state, accessibility tree, refs, URL, and DOM snapshot for website control and agent browser automation.",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
site: "browser",
|
|
60
|
+
command: "click",
|
|
61
|
+
description: "Click a browser page ref with stale-ref checks, session lease ownership, action evidence, watchdog movement checks, and recorded run traces.",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
site: "browser",
|
|
65
|
+
command: "bind",
|
|
66
|
+
description: "Bind the current visible browser tab into a named workspace with domain and path guards for profile reuse and multi-command automation.",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
site: "operate",
|
|
70
|
+
command: "state",
|
|
71
|
+
description: "Inspect the current browser automation workspace for agent operation, website control, page refs, and accessibility tree state.",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
site: "operate",
|
|
75
|
+
command: "click",
|
|
76
|
+
description: "Operate a browser page by clicking refs with recorded evidence and session lease metadata.",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
site: "mcp",
|
|
80
|
+
command: "serve",
|
|
81
|
+
description: "Serve Uni-CLI through MCP for agents, exposing command search, command run, browser/web capabilities, structured envelopes, and protocol integration.",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
site: "agents",
|
|
85
|
+
command: "recommend",
|
|
86
|
+
description: "Recommend the right agent backend or CLI for a task, including Codex, Claude Code, OpenCode, MCP, ACP, browser, desktop, and tool workflows.",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
site: "runs",
|
|
90
|
+
command: "list",
|
|
91
|
+
description: "List recorded Uni-CLI run traces, browser session leases, evidence events, watchdog outcomes, command status, and replay/index metadata.",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
site: "runs",
|
|
95
|
+
command: "show",
|
|
96
|
+
description: "Show recorded run trace events for debugging, replay preparation, browser lease evidence, render stability, and agent audit review.",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
site: "runs",
|
|
100
|
+
command: "probe",
|
|
101
|
+
description: "Probe a recorded run trace for exact replay readiness, private args availability, command metadata, and evidence-backed reproducibility.",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
site: "runs",
|
|
105
|
+
command: "replay",
|
|
106
|
+
description: "Replay a recorded command through the native execution kernel, write a fresh replay trace, and gate behavior, context, or overall scores.",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
site: "runs",
|
|
110
|
+
command: "compare",
|
|
111
|
+
description: "Compare two recorded run traces for behavior drift, context drift, score gates, result envelope differences, repair verification, and reproducible agent audit checks.",
|
|
112
|
+
},
|
|
113
|
+
];
|
|
40
114
|
// ── Index Management ────────────────────────────────────────────────────────
|
|
41
115
|
let cachedIndex = null;
|
|
42
116
|
/**
|
|
@@ -56,13 +130,36 @@ function loadIndex() {
|
|
|
56
130
|
return cachedIndex;
|
|
57
131
|
const indexPath = getIndexPath();
|
|
58
132
|
if (existsSync(indexPath)) {
|
|
59
|
-
cachedIndex = JSON.parse(readFileSync(indexPath, "utf-8"));
|
|
133
|
+
cachedIndex = augmentIndexWithCoreDocs(JSON.parse(readFileSync(indexPath, "utf-8")));
|
|
60
134
|
return cachedIndex;
|
|
61
135
|
}
|
|
62
136
|
// Fallback: build index on-the-fly from manifest.json
|
|
63
|
-
cachedIndex = buildIndexFromManifest();
|
|
137
|
+
cachedIndex = augmentIndexWithCoreDocs(buildIndexFromManifest());
|
|
64
138
|
return cachedIndex;
|
|
65
139
|
}
|
|
140
|
+
function augmentIndexWithCoreDocs(index) {
|
|
141
|
+
const manifest = { sites: {} };
|
|
142
|
+
const seen = new Set();
|
|
143
|
+
for (const doc of index.documents) {
|
|
144
|
+
manifest.sites[doc.site] ??= { commands: [] };
|
|
145
|
+
manifest.sites[doc.site].commands.push({
|
|
146
|
+
name: doc.command,
|
|
147
|
+
description: doc.description,
|
|
148
|
+
});
|
|
149
|
+
seen.add(doc.id);
|
|
150
|
+
}
|
|
151
|
+
for (const doc of CORE_SEARCH_DOCUMENTS) {
|
|
152
|
+
const id = `${doc.site}/${doc.command}`;
|
|
153
|
+
if (seen.has(id))
|
|
154
|
+
continue;
|
|
155
|
+
manifest.sites[doc.site] ??= { commands: [] };
|
|
156
|
+
manifest.sites[doc.site].commands.push({
|
|
157
|
+
name: doc.command,
|
|
158
|
+
description: doc.description,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return buildIndex(manifest);
|
|
162
|
+
}
|
|
66
163
|
/**
|
|
67
164
|
* Build a search index from the manifest.json file.
|
|
68
165
|
* Used when the pre-built search index doesn't exist (dev mode).
|
|
@@ -284,7 +381,38 @@ function tfidfCosine(docTerms, queryTerms, index) {
|
|
|
284
381
|
* @param limit - Maximum results to return (default 5)
|
|
285
382
|
*/
|
|
286
383
|
export function search(query, limit = 5) {
|
|
287
|
-
const
|
|
384
|
+
const staticResults = searchIndex(loadIndex(), query, limit);
|
|
385
|
+
const dynamicResults = searchDynamicMacosIndex(query, limit);
|
|
386
|
+
if (dynamicResults.length === 0)
|
|
387
|
+
return staticResults;
|
|
388
|
+
const byCommand = new Map();
|
|
389
|
+
for (const result of [...staticResults, ...dynamicResults]) {
|
|
390
|
+
const key = `${result.site}/${result.command}`;
|
|
391
|
+
const existing = byCommand.get(key);
|
|
392
|
+
if (!existing || result.score > existing.score) {
|
|
393
|
+
byCommand.set(key, result);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return Array.from(byCommand.values())
|
|
397
|
+
.sort((a, b) => b.score - a.score)
|
|
398
|
+
.slice(0, limit);
|
|
399
|
+
}
|
|
400
|
+
function searchDynamicMacosIndex(query, limit) {
|
|
401
|
+
if (!dynamicMacosDiscoveryEnabled())
|
|
402
|
+
return [];
|
|
403
|
+
const docs = buildMacosDynamicSearchDocuments(discoverMacosDynamicData());
|
|
404
|
+
if (docs.length === 0)
|
|
405
|
+
return [];
|
|
406
|
+
const manifest = { sites: { macos: { commands: [] } } };
|
|
407
|
+
for (const doc of docs) {
|
|
408
|
+
manifest.sites.macos.commands.push({
|
|
409
|
+
name: doc.command,
|
|
410
|
+
description: doc.description,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
return searchIndex(buildIndex(manifest), query, limit);
|
|
414
|
+
}
|
|
415
|
+
function searchIndex(index, query, limit) {
|
|
288
416
|
if (index.N === 0)
|
|
289
417
|
return [];
|
|
290
418
|
// Step 1: Tokenize
|
|
@@ -358,6 +486,7 @@ export function search(query, limit = 5) {
|
|
|
358
486
|
if (docCategory && categoryHints.includes(docCategory)) {
|
|
359
487
|
score += BOOST_CATEGORY;
|
|
360
488
|
}
|
|
489
|
+
score += architectureIntentBoost(doc, queryTerms);
|
|
361
490
|
if (score > 0)
|
|
362
491
|
scored.push({ idx, score });
|
|
363
492
|
}
|
|
@@ -383,6 +512,26 @@ export function search(query, limit = 5) {
|
|
|
383
512
|
function buildUsageExample(site, command) {
|
|
384
513
|
return `unicli ${site} ${command}`;
|
|
385
514
|
}
|
|
515
|
+
function architectureIntentBoost(doc, queryTerms) {
|
|
516
|
+
const terms = new Set(queryTerms);
|
|
517
|
+
const runTraceIntent = (hasAny(terms, ["run", "runs"]) &&
|
|
518
|
+
hasAny(terms, [
|
|
519
|
+
"trace",
|
|
520
|
+
"traces",
|
|
521
|
+
"recorded",
|
|
522
|
+
"record",
|
|
523
|
+
"replay",
|
|
524
|
+
"probe",
|
|
525
|
+
])) ||
|
|
526
|
+
(terms.has("trace") && hasAny(terms, ["evidence", "audit", "lease"]));
|
|
527
|
+
if (runTraceIntent && doc.site === "runs") {
|
|
528
|
+
return BOOST_RUN_TRACE_INTENT;
|
|
529
|
+
}
|
|
530
|
+
return 0;
|
|
531
|
+
}
|
|
532
|
+
function hasAny(terms, values) {
|
|
533
|
+
return values.some((value) => terms.has(value));
|
|
534
|
+
}
|
|
386
535
|
/**
|
|
387
536
|
* Force-reload the search index (useful after index rebuild).
|
|
388
537
|
*/
|