@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,114 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { open, readFile, rm, stat } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { userHome } from "../user-home.js";
|
|
5
|
+
export class BrowserSessionLeaseLockError extends Error {
|
|
6
|
+
lease;
|
|
7
|
+
code = "browser_lease_locked";
|
|
8
|
+
suggestion = "Another command is using the same browser workspace. Retry after it finishes, use --isolated, or choose a different --workspace.";
|
|
9
|
+
constructor(lease) {
|
|
10
|
+
super(`Browser workspace is locked: ${lease.browser_workspace_id}`);
|
|
11
|
+
this.lease = lease;
|
|
12
|
+
this.name = "BrowserSessionLeaseLockError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function withBrowserSessionLeaseLock(lease, action, options = {}) {
|
|
16
|
+
const retryMs = Math.max(0, options.retryMs ?? 0);
|
|
17
|
+
const staleMs = options.staleMs ?? 120_000;
|
|
18
|
+
const now = options.now ?? Date.now;
|
|
19
|
+
const sleep = options.sleep ??
|
|
20
|
+
(async (ms) => {
|
|
21
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
22
|
+
});
|
|
23
|
+
const startedAt = now();
|
|
24
|
+
const lockPath = browserSessionLeaseLockPath(lease, options.rootDir);
|
|
25
|
+
while (true) {
|
|
26
|
+
try {
|
|
27
|
+
const handle = await open(lockPath, "wx", 0o600);
|
|
28
|
+
try {
|
|
29
|
+
await handle.writeFile(JSON.stringify({
|
|
30
|
+
...lease,
|
|
31
|
+
pid: process.pid,
|
|
32
|
+
locked_at: new Date().toISOString(),
|
|
33
|
+
}, null, 2));
|
|
34
|
+
return await action();
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
await handle.close();
|
|
38
|
+
await rm(lockPath, { force: true });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (!isAlreadyExistsError(err))
|
|
43
|
+
throw err;
|
|
44
|
+
if (await removeStaleLock(lockPath, staleMs, now))
|
|
45
|
+
continue;
|
|
46
|
+
if (now() - startedAt >= retryMs) {
|
|
47
|
+
throw new BrowserSessionLeaseLockError(lease);
|
|
48
|
+
}
|
|
49
|
+
await sleep(Math.min(50, retryMs));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function browserSessionLeaseLockPath(lease, rootDir = join(userHome(), ".unicli", "browser-locks")) {
|
|
54
|
+
mkdirSync(rootDir, { recursive: true, mode: 0o700 });
|
|
55
|
+
return join(rootDir, `${safeLockName(lease.browser_session_id)}.lock`);
|
|
56
|
+
}
|
|
57
|
+
async function removeStaleLock(lockPath, staleMs, now) {
|
|
58
|
+
try {
|
|
59
|
+
const info = await stat(lockPath);
|
|
60
|
+
if (staleMs >= 0 && now() - info.mtimeMs <= staleMs)
|
|
61
|
+
return false;
|
|
62
|
+
if (await lockHolderIsAlive(lockPath))
|
|
63
|
+
return false;
|
|
64
|
+
await rm(lockPath, { force: true });
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
return isNotFoundError(err);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function isAlreadyExistsError(err) {
|
|
72
|
+
return (typeof err === "object" &&
|
|
73
|
+
err !== null &&
|
|
74
|
+
"code" in err &&
|
|
75
|
+
err.code === "EEXIST");
|
|
76
|
+
}
|
|
77
|
+
async function lockHolderIsAlive(lockPath) {
|
|
78
|
+
try {
|
|
79
|
+
const payload = JSON.parse(await readFile(lockPath, "utf-8"));
|
|
80
|
+
return typeof payload.pid === "number" && processIsAlive(payload.pid);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function processIsAlive(pid) {
|
|
87
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
88
|
+
return false;
|
|
89
|
+
try {
|
|
90
|
+
process.kill(pid, 0);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
if (isNoSuchProcessError(err))
|
|
95
|
+
return false;
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function isNoSuchProcessError(err) {
|
|
100
|
+
return (typeof err === "object" &&
|
|
101
|
+
err !== null &&
|
|
102
|
+
"code" in err &&
|
|
103
|
+
err.code === "ESRCH");
|
|
104
|
+
}
|
|
105
|
+
function isNotFoundError(err) {
|
|
106
|
+
return (typeof err === "object" &&
|
|
107
|
+
err !== null &&
|
|
108
|
+
"code" in err &&
|
|
109
|
+
err.code === "ENOENT");
|
|
110
|
+
}
|
|
111
|
+
function safeLockName(value) {
|
|
112
|
+
return value.replace(/[^A-Za-z0-9._-]+/g, "_");
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=session-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lock.js","sourceRoot":"","sources":["../../../src/engine/browser/session-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IPage } from "../../types.js";
|
|
2
|
+
import { type BrowserSessionLease, type BrowserSessionLeaseAuthPosture, type BrowserSessionLeaseTarget } from "./session-lease.js";
|
|
3
|
+
export declare function enrichBrowserSessionLease(lease: BrowserSessionLease, page: IPage, options?: {
|
|
4
|
+
now?: () => Date;
|
|
5
|
+
}): Promise<BrowserSessionLease>;
|
|
6
|
+
export declare function assertBrowserSessionLeaseTargetCurrent(lease: BrowserSessionLease, page: IPage): Promise<void>;
|
|
7
|
+
export declare function captureBrowserSessionTarget(page: IPage, now?: () => Date): Promise<BrowserSessionLeaseTarget | undefined>;
|
|
8
|
+
export declare function captureBrowserSessionAuthPosture(page: IPage, now?: () => Date): Promise<BrowserSessionLeaseAuthPosture>;
|
|
9
|
+
export declare function browserSessionTargetKey(target?: BrowserSessionLeaseTarget | null): string | undefined;
|
|
10
|
+
//# sourceMappingURL=session-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-runtime.d.ts","sourceRoot":"","sources":["../../../src/engine/browser/session-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,oBAAoB,CAAC;AAe5B,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,KAAK,EACX,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CAAO,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAY9B;AAED,wBAAsB,sCAAsC,CAC1D,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,KAAK,EACX,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAqBhD;AAED,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,KAAK,EACX,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,8BAA8B,CAAC,CAezC;AAED,wBAAgB,uBAAuB,CACrC,MAAM,CAAC,EAAE,yBAAyB,GAAG,IAAI,GACxC,MAAM,GAAG,SAAS,CASpB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { BrowserSessionLeaseGuardError, } from "./session-lease.js";
|
|
2
|
+
export async function enrichBrowserSessionLease(lease, page, options = {}) {
|
|
3
|
+
const now = options.now ?? (() => new Date());
|
|
4
|
+
const [target, auth] = await Promise.all([
|
|
5
|
+
captureBrowserSessionTarget(page, now),
|
|
6
|
+
captureBrowserSessionAuthPosture(page, now),
|
|
7
|
+
]);
|
|
8
|
+
return {
|
|
9
|
+
...lease,
|
|
10
|
+
...(target ? { target } : {}),
|
|
11
|
+
auth,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export async function assertBrowserSessionLeaseTargetCurrent(lease, page) {
|
|
15
|
+
const expected = browserSessionTargetKey(lease.target);
|
|
16
|
+
if (!expected)
|
|
17
|
+
return;
|
|
18
|
+
const current = await captureBrowserSessionTarget(page);
|
|
19
|
+
const actual = browserSessionTargetKey(current);
|
|
20
|
+
if (!actual || actual === expected)
|
|
21
|
+
return;
|
|
22
|
+
throw new BrowserSessionLeaseGuardError("browser_target_mismatch", lease, expected, actual);
|
|
23
|
+
}
|
|
24
|
+
export async function captureBrowserSessionTarget(page, now = () => new Date()) {
|
|
25
|
+
const provided = await captureProvidedBrowserTarget(page, now);
|
|
26
|
+
if (provided)
|
|
27
|
+
return provided;
|
|
28
|
+
try {
|
|
29
|
+
const raw = (await page.sendCDP("Target.getTargetInfo"));
|
|
30
|
+
const info = raw?.targetInfo;
|
|
31
|
+
if (!info)
|
|
32
|
+
return undefined;
|
|
33
|
+
return {
|
|
34
|
+
kind: "cdp-target",
|
|
35
|
+
captured_at: now().toISOString(),
|
|
36
|
+
...(info.targetId ? { target_id: info.targetId } : {}),
|
|
37
|
+
...(info.type ? { target_type: info.type } : {}),
|
|
38
|
+
...(info.url ? { url: info.url } : {}),
|
|
39
|
+
...(info.title ? { title: info.title } : {}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function captureBrowserSessionAuthPosture(page, now = () => new Date()) {
|
|
47
|
+
try {
|
|
48
|
+
const cookies = await page.cookies();
|
|
49
|
+
const cookieCount = Object.keys(cookies).length;
|
|
50
|
+
return {
|
|
51
|
+
state: cookieCount > 0 ? "cookies_present" : "no_cookies",
|
|
52
|
+
cookie_count: cookieCount,
|
|
53
|
+
captured_at: now().toISOString(),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return {
|
|
58
|
+
state: "unavailable",
|
|
59
|
+
captured_at: now().toISOString(),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function browserSessionTargetKey(target) {
|
|
64
|
+
if (!target)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (typeof target.tab_id === "number") {
|
|
67
|
+
return typeof target.window_id === "number"
|
|
68
|
+
? `window:${String(target.window_id)}:tab:${String(target.tab_id)}`
|
|
69
|
+
: `tab:${String(target.tab_id)}`;
|
|
70
|
+
}
|
|
71
|
+
if (target.target_id)
|
|
72
|
+
return `target:${target.target_id}`;
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
async function captureProvidedBrowserTarget(page, now) {
|
|
76
|
+
const provider = page;
|
|
77
|
+
if (typeof provider.browserTargetInfo !== "function")
|
|
78
|
+
return undefined;
|
|
79
|
+
const target = await provider.browserTargetInfo().catch(() => null);
|
|
80
|
+
if (!target)
|
|
81
|
+
return undefined;
|
|
82
|
+
return {
|
|
83
|
+
...target,
|
|
84
|
+
captured_at: target.captured_at ?? now().toISOString(),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=session-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-runtime.js","sourceRoot":"","sources":["../../../src/engine/browser/session-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-scoped permission classification.
|
|
3
|
+
*
|
|
4
|
+
* This is deliberately deterministic and metadata-only: it classifies the
|
|
5
|
+
* command contract, not user-provided runtime values.
|
|
6
|
+
*/
|
|
7
|
+
import type { OperationEffect, OperationPolicyInput, PermissionProfile } from "./operation-policy.js";
|
|
8
|
+
export type CapabilityAccess = "none" | "read" | "write";
|
|
9
|
+
export type CapabilityDimensionName = "network" | "browser" | "desktop" | "file" | "process" | "account";
|
|
10
|
+
export interface CapabilityDimension {
|
|
11
|
+
access: CapabilityAccess;
|
|
12
|
+
reason?: string;
|
|
13
|
+
}
|
|
14
|
+
export type CapabilityDimensionMap = Record<CapabilityDimensionName, CapabilityDimension>;
|
|
15
|
+
export interface CapabilityResourceScope {
|
|
16
|
+
domains: string[];
|
|
17
|
+
paths: string[];
|
|
18
|
+
executables: string[];
|
|
19
|
+
apps: string[];
|
|
20
|
+
accounts: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface CapabilityScope {
|
|
23
|
+
schema_version: "1";
|
|
24
|
+
dimensions: CapabilityDimensionMap;
|
|
25
|
+
summary: string[];
|
|
26
|
+
resources: CapabilityResourceScope;
|
|
27
|
+
resource_summary: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface CapabilityApprovalMemory {
|
|
30
|
+
schema_version: "1";
|
|
31
|
+
key: string;
|
|
32
|
+
persistence: "not_persisted" | "persisted";
|
|
33
|
+
profile: PermissionProfile;
|
|
34
|
+
decision: "not_approved" | "approved_for_invocation" | "approved_by_memory";
|
|
35
|
+
scope: {
|
|
36
|
+
dimensions: Record<CapabilityDimensionName, CapabilityAccess>;
|
|
37
|
+
resources: CapabilityResourceScope;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare function deriveCapabilityScope(input: OperationPolicyInput, effect: OperationEffect): CapabilityScope;
|
|
41
|
+
export declare function buildCapabilityApprovalMemory(input: {
|
|
42
|
+
site: string;
|
|
43
|
+
command: string;
|
|
44
|
+
profile: PermissionProfile;
|
|
45
|
+
effect: OperationEffect;
|
|
46
|
+
approved: boolean;
|
|
47
|
+
approvalSource?: "none" | "invocation" | "env" | "memory";
|
|
48
|
+
scope: CapabilityScope;
|
|
49
|
+
}): CapabilityApprovalMemory;
|
|
50
|
+
//# sourceMappingURL=capability-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-policy.d.ts","sourceRoot":"","sources":["../../src/engine/capability-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACzD,MAAM,MAAM,uBAAuB,GAC/B,SAAS,GACT,SAAS,GACT,SAAS,GACT,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,CACzC,uBAAuB,EACvB,mBAAmB,CACpB,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,GAAG,CAAC;IACpB,UAAU,EAAE,sBAAsB,CAAC;IACnC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,uBAAuB,CAAC;IACnC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,GAAG,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,eAAe,GAAG,WAAW,CAAC;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,cAAc,GAAG,yBAAyB,GAAG,oBAAoB,CAAC;IAC5E,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;QAC9D,SAAS,EAAE,uBAAuB,CAAC;KACpC,CAAC;CACH;AAmPD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,eAAe,GACtB,eAAe,CAoLjB;AAiBD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1D,KAAK,EAAE,eAAe,CAAC;CACxB,GAAG,wBAAwB,CAyB3B"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-scoped permission classification.
|
|
3
|
+
*
|
|
4
|
+
* This is deliberately deterministic and metadata-only: it classifies the
|
|
5
|
+
* command contract, not user-provided runtime values.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { AdapterType } from "../types.js";
|
|
9
|
+
const DIMENSION_ORDER = [
|
|
10
|
+
"network",
|
|
11
|
+
"browser",
|
|
12
|
+
"desktop",
|
|
13
|
+
"file",
|
|
14
|
+
"process",
|
|
15
|
+
"account",
|
|
16
|
+
];
|
|
17
|
+
const WEB_STRATEGIES = new Set([
|
|
18
|
+
"public",
|
|
19
|
+
"cookie",
|
|
20
|
+
"header",
|
|
21
|
+
"intercept",
|
|
22
|
+
"ui",
|
|
23
|
+
]);
|
|
24
|
+
const PATH_ARG_NAMES = new Set([
|
|
25
|
+
"dir",
|
|
26
|
+
"directory",
|
|
27
|
+
"file",
|
|
28
|
+
"filename",
|
|
29
|
+
"folder",
|
|
30
|
+
"input",
|
|
31
|
+
"out",
|
|
32
|
+
"output",
|
|
33
|
+
"path",
|
|
34
|
+
"source",
|
|
35
|
+
"destination",
|
|
36
|
+
]);
|
|
37
|
+
function emptyDimensions() {
|
|
38
|
+
return {
|
|
39
|
+
network: { access: "none" },
|
|
40
|
+
browser: { access: "none" },
|
|
41
|
+
desktop: { access: "none" },
|
|
42
|
+
file: { access: "none" },
|
|
43
|
+
process: { access: "none" },
|
|
44
|
+
account: { access: "none" },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function emptyResources() {
|
|
48
|
+
return {
|
|
49
|
+
domains: [],
|
|
50
|
+
paths: [],
|
|
51
|
+
executables: [],
|
|
52
|
+
apps: [],
|
|
53
|
+
accounts: [],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function accessRank(access) {
|
|
57
|
+
switch (access) {
|
|
58
|
+
case "write":
|
|
59
|
+
return 2;
|
|
60
|
+
case "read":
|
|
61
|
+
return 1;
|
|
62
|
+
case "none":
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function promoteAccess(dimensions, name, access, reason) {
|
|
67
|
+
const current = dimensions[name];
|
|
68
|
+
if (accessRank(access) >= accessRank(current.access)) {
|
|
69
|
+
dimensions[name] = { access, reason };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function normalizedUnique(values) {
|
|
73
|
+
return Array.from(new Set(values
|
|
74
|
+
.map((value) => value.trim().toLowerCase())
|
|
75
|
+
.filter((value) => value.length > 0))).sort();
|
|
76
|
+
}
|
|
77
|
+
function normalizeDomain(value) {
|
|
78
|
+
if (!value)
|
|
79
|
+
return undefined;
|
|
80
|
+
const raw = value.trim();
|
|
81
|
+
if (raw.length === 0)
|
|
82
|
+
return undefined;
|
|
83
|
+
try {
|
|
84
|
+
const url = new URL(raw.includes("://") ? raw : `https://${raw}`);
|
|
85
|
+
return url.host.toLowerCase();
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return raw
|
|
89
|
+
.replace(/^https?:\/\//i, "")
|
|
90
|
+
.split("/")[0]
|
|
91
|
+
?.trim()
|
|
92
|
+
.toLowerCase();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function pathArgSlots(input) {
|
|
96
|
+
return normalizedUnique((input.args ?? []).flatMap((arg) => {
|
|
97
|
+
const name = arg.name.trim().toLowerCase();
|
|
98
|
+
return PATH_ARG_NAMES.has(name) ? [`arg:${name}`] : [];
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
function deriveResourceScope(input, dimensions) {
|
|
102
|
+
const resources = emptyResources();
|
|
103
|
+
if (dimensions.network.access !== "none" ||
|
|
104
|
+
dimensions.browser.access !== "none") {
|
|
105
|
+
const domain = normalizeDomain(input.domain ?? input.base);
|
|
106
|
+
resources.domains = domain ? [domain] : [];
|
|
107
|
+
}
|
|
108
|
+
if (dimensions.account.access !== "none") {
|
|
109
|
+
resources.accounts = [input.site];
|
|
110
|
+
}
|
|
111
|
+
if (dimensions.desktop.access !== "none") {
|
|
112
|
+
resources.apps = [input.site];
|
|
113
|
+
}
|
|
114
|
+
if (dimensions.process.access !== "none") {
|
|
115
|
+
resources.executables = [input.site];
|
|
116
|
+
}
|
|
117
|
+
if (dimensions.file.access !== "none") {
|
|
118
|
+
resources.paths = pathArgSlots(input);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
domains: normalizedUnique(resources.domains),
|
|
122
|
+
paths: normalizedUnique(resources.paths),
|
|
123
|
+
executables: normalizedUnique(resources.executables),
|
|
124
|
+
apps: normalizedUnique(resources.apps),
|
|
125
|
+
accounts: normalizedUnique(resources.accounts),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function effectAccess(effect) {
|
|
129
|
+
return effect === "read" ? "read" : "write";
|
|
130
|
+
}
|
|
131
|
+
function isExplicitLocalSurface(surface) {
|
|
132
|
+
return surface === "desktop" || surface === "system";
|
|
133
|
+
}
|
|
134
|
+
function isNetworkCapable(input) {
|
|
135
|
+
if (input.adapterType === AdapterType.SERVICE)
|
|
136
|
+
return true;
|
|
137
|
+
if (isExplicitLocalSurface(input.targetSurface))
|
|
138
|
+
return false;
|
|
139
|
+
return ((input.targetSurface === undefined && input.adapterType === undefined) ||
|
|
140
|
+
input.targetSurface === "web" ||
|
|
141
|
+
input.targetSurface === "mobile" ||
|
|
142
|
+
input.adapterType === AdapterType.WEB_API ||
|
|
143
|
+
input.adapterType === AdapterType.BROWSER ||
|
|
144
|
+
(input.strategy !== undefined && WEB_STRATEGIES.has(input.strategy)));
|
|
145
|
+
}
|
|
146
|
+
function isBrowserCapable(input) {
|
|
147
|
+
return (input.browser === true ||
|
|
148
|
+
input.adapterType === AdapterType.BROWSER ||
|
|
149
|
+
input.strategy === "intercept" ||
|
|
150
|
+
input.strategy === "ui");
|
|
151
|
+
}
|
|
152
|
+
function isDesktopCapable(input) {
|
|
153
|
+
return (input.targetSurface === "desktop" ||
|
|
154
|
+
input.adapterType === AdapterType.DESKTOP);
|
|
155
|
+
}
|
|
156
|
+
function isProcessCapable(input) {
|
|
157
|
+
if (input.adapterType === AdapterType.SERVICE)
|
|
158
|
+
return false;
|
|
159
|
+
return (input.adapterType === AdapterType.BRIDGE ||
|
|
160
|
+
input.adapterType === AdapterType.DESKTOP ||
|
|
161
|
+
input.targetSurface === "desktop" ||
|
|
162
|
+
input.targetSurface === "system");
|
|
163
|
+
}
|
|
164
|
+
function isRemoteAccountSurface(input) {
|
|
165
|
+
if (input.adapterType === AdapterType.BRIDGE ||
|
|
166
|
+
input.adapterType === AdapterType.DESKTOP ||
|
|
167
|
+
input.adapterType === AdapterType.SERVICE ||
|
|
168
|
+
isExplicitLocalSurface(input.targetSurface)) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
return isNetworkCapable(input) || isBrowserCapable(input);
|
|
172
|
+
}
|
|
173
|
+
function summaryFor(dimensions) {
|
|
174
|
+
return DIMENSION_ORDER.flatMap((name) => {
|
|
175
|
+
const access = dimensions[name].access;
|
|
176
|
+
return access === "none" ? [] : [`${name}:${access}`];
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function resourceSummaryFor(resources) {
|
|
180
|
+
return [
|
|
181
|
+
...resources.domains.map((value) => `domain:${value}`),
|
|
182
|
+
...resources.accounts.map((value) => `account:${value}`),
|
|
183
|
+
...resources.apps.map((value) => `app:${value}`),
|
|
184
|
+
...resources.executables.map((value) => `process:${value}`),
|
|
185
|
+
...resources.paths.map((value) => `path:${value}`),
|
|
186
|
+
];
|
|
187
|
+
}
|
|
188
|
+
function accessMapFor(dimensions) {
|
|
189
|
+
return {
|
|
190
|
+
network: dimensions.network.access,
|
|
191
|
+
browser: dimensions.browser.access,
|
|
192
|
+
desktop: dimensions.desktop.access,
|
|
193
|
+
file: dimensions.file.access,
|
|
194
|
+
process: dimensions.process.access,
|
|
195
|
+
account: dimensions.account.access,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
export function deriveCapabilityScope(input, effect) {
|
|
199
|
+
const dimensions = emptyDimensions();
|
|
200
|
+
const access = effectAccess(effect);
|
|
201
|
+
const networkCapable = isNetworkCapable(input);
|
|
202
|
+
const browserCapable = isBrowserCapable(input);
|
|
203
|
+
const desktopCapable = isDesktopCapable(input);
|
|
204
|
+
const processCapable = isProcessCapable(input);
|
|
205
|
+
if (networkCapable) {
|
|
206
|
+
promoteAccess(dimensions, "network", access, access === "read"
|
|
207
|
+
? "reads remote web or API data"
|
|
208
|
+
: "may write through a remote web or API surface");
|
|
209
|
+
}
|
|
210
|
+
if (browserCapable) {
|
|
211
|
+
promoteAccess(dimensions, "browser", access, access === "read"
|
|
212
|
+
? "reads through browser automation"
|
|
213
|
+
: "may interact with browser automation");
|
|
214
|
+
}
|
|
215
|
+
if (effect === "send_message" || effect === "publish_content") {
|
|
216
|
+
promoteAccess(dimensions, "account", "write", "may send or publish as user");
|
|
217
|
+
promoteAccess(dimensions, "network", "write", "may submit content to a remote account surface");
|
|
218
|
+
}
|
|
219
|
+
if (effect === "account_state" || effect === "remote_resource") {
|
|
220
|
+
promoteAccess(dimensions, "account", "write", effect === "account_state"
|
|
221
|
+
? "may mutate user account state"
|
|
222
|
+
: "may mutate remote account resources");
|
|
223
|
+
promoteAccess(dimensions, "network", "write", effect === "account_state"
|
|
224
|
+
? "may submit account-state changes remotely"
|
|
225
|
+
: "may submit remote resource changes");
|
|
226
|
+
}
|
|
227
|
+
if (effect === "service_state") {
|
|
228
|
+
promoteAccess(dimensions, "network", "write", "may mutate service state through an HTTP API");
|
|
229
|
+
}
|
|
230
|
+
if (effect === "destructive" && isRemoteAccountSurface(input)) {
|
|
231
|
+
promoteAccess(dimensions, "account", "write", "may delete or reset remote account state");
|
|
232
|
+
promoteAccess(dimensions, "network", "write", "may submit destructive changes remotely");
|
|
233
|
+
}
|
|
234
|
+
if (effect === "destructive" && isExplicitLocalSurface(input.targetSurface)) {
|
|
235
|
+
promoteAccess(dimensions, "file", "write", "may delete or reset local files");
|
|
236
|
+
promoteAccess(dimensions, "process", "write", "may run a destructive local process");
|
|
237
|
+
}
|
|
238
|
+
if (effect === "local_app") {
|
|
239
|
+
promoteAccess(dimensions, "desktop", "write", "may control local application state");
|
|
240
|
+
promoteAccess(dimensions, "process", "write", "may drive local automation process");
|
|
241
|
+
}
|
|
242
|
+
if (effect === "local_file") {
|
|
243
|
+
promoteAccess(dimensions, "file", "write", "may create or modify local files");
|
|
244
|
+
promoteAccess(dimensions, "process", "write", "may run a local process that touches files");
|
|
245
|
+
}
|
|
246
|
+
if (desktopCapable && effect === "read") {
|
|
247
|
+
promoteAccess(dimensions, "desktop", "read", "reads local desktop state");
|
|
248
|
+
}
|
|
249
|
+
else if (desktopCapable) {
|
|
250
|
+
promoteAccess(dimensions, "desktop", "write", "may interact with local desktop state");
|
|
251
|
+
}
|
|
252
|
+
if (processCapable && effect === "read") {
|
|
253
|
+
promoteAccess(dimensions, "process", "read", "reads through a local process");
|
|
254
|
+
}
|
|
255
|
+
else if (processCapable) {
|
|
256
|
+
promoteAccess(dimensions, "process", "write", "may run or control a process");
|
|
257
|
+
}
|
|
258
|
+
if (input.adapterType === AdapterType.BRIDGE) {
|
|
259
|
+
promoteAccess(dimensions, "process", access, access === "read"
|
|
260
|
+
? "reads through an external CLI"
|
|
261
|
+
: "may write through an external CLI");
|
|
262
|
+
}
|
|
263
|
+
const resources = deriveResourceScope(input, dimensions);
|
|
264
|
+
return {
|
|
265
|
+
schema_version: "1",
|
|
266
|
+
dimensions,
|
|
267
|
+
summary: summaryFor(dimensions),
|
|
268
|
+
resources,
|
|
269
|
+
resource_summary: resourceSummaryFor(resources),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function resourceFingerprintFor(resources) {
|
|
273
|
+
return createHash("sha256")
|
|
274
|
+
.update(JSON.stringify({
|
|
275
|
+
accounts: normalizedUnique(resources.accounts),
|
|
276
|
+
apps: normalizedUnique(resources.apps),
|
|
277
|
+
domains: normalizedUnique(resources.domains),
|
|
278
|
+
executables: normalizedUnique(resources.executables),
|
|
279
|
+
paths: normalizedUnique(resources.paths),
|
|
280
|
+
}))
|
|
281
|
+
.digest("hex")
|
|
282
|
+
.slice(0, 16);
|
|
283
|
+
}
|
|
284
|
+
export function buildCapabilityApprovalMemory(input) {
|
|
285
|
+
const dimensionAccess = accessMapFor(input.scope.dimensions);
|
|
286
|
+
const dimensionKey = DIMENSION_ORDER.map((name) => `${name}:${dimensionAccess[name]}`).join(",");
|
|
287
|
+
const resourceKey = resourceFingerprintFor(input.scope.resources);
|
|
288
|
+
const approvalSource = input.approvalSource ?? (input.approved ? "invocation" : "none");
|
|
289
|
+
return {
|
|
290
|
+
schema_version: "1",
|
|
291
|
+
key: `cap:1:${input.site}.${input.command}:${input.profile}:${input.effect}:${dimensionKey}:res:${resourceKey}`,
|
|
292
|
+
persistence: approvalSource === "memory" ? "persisted" : "not_persisted",
|
|
293
|
+
profile: input.profile,
|
|
294
|
+
decision: approvalSource === "memory"
|
|
295
|
+
? "approved_by_memory"
|
|
296
|
+
: input.approved
|
|
297
|
+
? "approved_for_invocation"
|
|
298
|
+
: "not_approved",
|
|
299
|
+
scope: {
|
|
300
|
+
dimensions: dimensionAccess,
|
|
301
|
+
resources: input.scope.resources,
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=capability-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-policy.js","sourceRoot":"","sources":["../../src/engine/capability-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ export { assertSafeRequestUrl } from "./ssrf.js";
|
|
|
19
19
|
export { getBus, buildTransportCtx, _resetTransportBusForTests };
|
|
20
20
|
export interface PipelineOptions {
|
|
21
21
|
site?: string;
|
|
22
|
+
command?: string;
|
|
22
23
|
strategy?: string;
|
|
23
24
|
/**
|
|
24
25
|
* Kernel surface that dispatched the pipeline. When provided, becomes
|
|
@@ -48,6 +49,10 @@ export type PipelineContext = {
|
|
|
48
49
|
surface?: "cli" | "mcp" | "acp" | "bench" | "hub";
|
|
49
50
|
/** Kernel trace ID. Mirrors `PipelineOptions.trace_id`. */
|
|
50
51
|
trace_id?: string;
|
|
52
|
+
/** Adapter site that owns this pipeline, when routed through the kernel. */
|
|
53
|
+
site?: string;
|
|
54
|
+
/** Adapter command that owns this pipeline, when routed through the kernel. */
|
|
55
|
+
command?: string;
|
|
51
56
|
};
|
|
52
57
|
/** Structured pipeline error — designed for AI agent consumption. */
|
|
53
58
|
export declare class PipelineError extends Error {
|
|
@@ -55,7 +60,7 @@ export declare class PipelineError extends Error {
|
|
|
55
60
|
step: number;
|
|
56
61
|
action: string;
|
|
57
62
|
config: unknown;
|
|
58
|
-
errorType: "http_error" | "selector_miss" | "empty_result" | "parse_error" | "timeout" | "expression_error" | "assertion_failed" | "stale_ref" | "ambiguous" | "ref_not_found";
|
|
63
|
+
errorType: "http_error" | "selector_miss" | "empty_result" | "parse_error" | "network_error" | "timeout" | "expression_error" | "assertion_failed" | "permission_denied" | "stale_ref" | "ambiguous" | "ref_not_found";
|
|
59
64
|
url?: string;
|
|
60
65
|
statusCode?: number;
|
|
61
66
|
responsePreview?: string;
|
|
@@ -67,7 +72,7 @@ export declare class PipelineError extends Error {
|
|
|
67
72
|
step: number;
|
|
68
73
|
action: string;
|
|
69
74
|
config: unknown;
|
|
70
|
-
errorType: "http_error" | "selector_miss" | "empty_result" | "parse_error" | "timeout" | "expression_error" | "assertion_failed" | "stale_ref" | "ambiguous" | "ref_not_found";
|
|
75
|
+
errorType: "http_error" | "selector_miss" | "empty_result" | "parse_error" | "network_error" | "timeout" | "expression_error" | "assertion_failed" | "permission_denied" | "stale_ref" | "ambiguous" | "ref_not_found";
|
|
71
76
|
url?: string;
|
|
72
77
|
statusCode?: number;
|
|
73
78
|
responsePreview?: string;
|
|
@@ -81,7 +86,7 @@ export declare class PipelineError extends Error {
|
|
|
81
86
|
step: number;
|
|
82
87
|
action: string;
|
|
83
88
|
config: unknown;
|
|
84
|
-
errorType: "http_error" | "selector_miss" | "empty_result" | "parse_error" | "timeout" | "expression_error" | "assertion_failed" | "stale_ref" | "ambiguous" | "ref_not_found";
|
|
89
|
+
errorType: "http_error" | "selector_miss" | "empty_result" | "parse_error" | "network_error" | "timeout" | "expression_error" | "assertion_failed" | "permission_denied" | "stale_ref" | "ambiguous" | "ref_not_found";
|
|
85
90
|
url?: string;
|
|
86
91
|
statusCode?: number;
|
|
87
92
|
responsePreview?: string;
|