@mseep/clawdcursor 1.5.5
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/CHANGELOG.md +2264 -0
- package/LICENSE +21 -0
- package/README.md +385 -0
- package/SECURITY.md +44 -0
- package/SKILL.md +503 -0
- package/dist/core/agent-loop/agent.d.ts +42 -0
- package/dist/core/agent-loop/agent.js +1023 -0
- package/dist/core/agent-loop/agent.js.map +1 -0
- package/dist/core/agent-loop/batch-tool.d.ts +25 -0
- package/dist/core/agent-loop/batch-tool.js +218 -0
- package/dist/core/agent-loop/batch-tool.js.map +1 -0
- package/dist/core/agent-loop/coord-scale.d.ts +72 -0
- package/dist/core/agent-loop/coord-scale.js +89 -0
- package/dist/core/agent-loop/coord-scale.js.map +1 -0
- package/dist/core/agent-loop/focus-guard.d.ts +24 -0
- package/dist/core/agent-loop/focus-guard.js +29 -0
- package/dist/core/agent-loop/focus-guard.js.map +1 -0
- package/dist/core/agent-loop/project-mcp.d.ts +97 -0
- package/dist/core/agent-loop/project-mcp.js +253 -0
- package/dist/core/agent-loop/project-mcp.js.map +1 -0
- package/dist/core/agent-loop/prompt.d.ts +45 -0
- package/dist/core/agent-loop/prompt.js +426 -0
- package/dist/core/agent-loop/prompt.js.map +1 -0
- package/dist/core/agent-loop/tool-meta.d.ts +93 -0
- package/dist/core/agent-loop/tool-meta.js +651 -0
- package/dist/core/agent-loop/tool-meta.js.map +1 -0
- package/dist/core/agent-loop/tools.d.ts +38 -0
- package/dist/core/agent-loop/tools.js +2134 -0
- package/dist/core/agent-loop/tools.js.map +1 -0
- package/dist/core/agent-loop/types.d.ts +170 -0
- package/dist/core/agent-loop/types.js +12 -0
- package/dist/core/agent-loop/types.js.map +1 -0
- package/dist/core/agent.d.ts +51 -0
- package/dist/core/agent.js +245 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/app-categories.d.ts +67 -0
- package/dist/core/app-categories.js +108 -0
- package/dist/core/app-categories.js.map +1 -0
- package/dist/core/banner.d.ts +70 -0
- package/dist/core/banner.js +245 -0
- package/dist/core/banner.js.map +1 -0
- package/dist/core/classify/capability.d.ts +45 -0
- package/dist/core/classify/capability.js +78 -0
- package/dist/core/classify/capability.js.map +1 -0
- package/dist/core/decompose/llm-decomposer.d.ts +35 -0
- package/dist/core/decompose/llm-decomposer.js +156 -0
- package/dist/core/decompose/llm-decomposer.js.map +1 -0
- package/dist/core/decompose/parser.d.ts +27 -0
- package/dist/core/decompose/parser.js +101 -0
- package/dist/core/decompose/parser.js.map +1 -0
- package/dist/core/observability/correlation.d.ts +19 -0
- package/dist/core/observability/correlation.js +36 -0
- package/dist/core/observability/correlation.js.map +1 -0
- package/dist/core/observability/cost-meter.d.ts +51 -0
- package/dist/core/observability/cost-meter.js +134 -0
- package/dist/core/observability/cost-meter.js.map +1 -0
- package/dist/core/observability/logger.d.ts +61 -0
- package/dist/core/observability/logger.js +550 -0
- package/dist/core/observability/logger.js.map +1 -0
- package/dist/core/router/aliases.d.ts +50 -0
- package/dist/core/router/aliases.js +104 -0
- package/dist/core/router/aliases.js.map +1 -0
- package/dist/core/router/normalize.d.ts +41 -0
- package/dist/core/router/normalize.js +80 -0
- package/dist/core/router/normalize.js.map +1 -0
- package/dist/core/safety.d.ts +126 -0
- package/dist/core/safety.js +568 -0
- package/dist/core/safety.js.map +1 -0
- package/dist/core/sense/a11y-resolver.d.ts +73 -0
- package/dist/core/sense/a11y-resolver.js +76 -0
- package/dist/core/sense/a11y-resolver.js.map +1 -0
- package/dist/core/sense/fingerprint.d.ts +41 -0
- package/dist/core/sense/fingerprint.js +123 -0
- package/dist/core/sense/fingerprint.js.map +1 -0
- package/dist/core/sense/rank.d.ts +70 -0
- package/dist/core/sense/rank.js +192 -0
- package/dist/core/sense/rank.js.map +1 -0
- package/dist/core/sense/reactive-check.d.ts +40 -0
- package/dist/core/sense/reactive-check.js +48 -0
- package/dist/core/sense/reactive-check.js.map +1 -0
- package/dist/core/sense/snapshot.d.ts +19 -0
- package/dist/core/sense/snapshot.js +100 -0
- package/dist/core/sense/snapshot.js.map +1 -0
- package/dist/core/sense/types.d.ts +66 -0
- package/dist/core/sense/types.js +9 -0
- package/dist/core/sense/types.js.map +1 -0
- package/dist/core/sense/ui-map-anchors.d.ts +7 -0
- package/dist/core/sense/ui-map-anchors.js +24 -0
- package/dist/core/sense/ui-map-anchors.js.map +1 -0
- package/dist/core/sense/ui-map-elements.d.ts +5 -0
- package/dist/core/sense/ui-map-elements.js +33 -0
- package/dist/core/sense/ui-map-elements.js.map +1 -0
- package/dist/core/sense/ui-map-find.d.ts +56 -0
- package/dist/core/sense/ui-map-find.js +153 -0
- package/dist/core/sense/ui-map-find.js.map +1 -0
- package/dist/core/sense/ui-map-fuse.d.ts +4 -0
- package/dist/core/sense/ui-map-fuse.js +44 -0
- package/dist/core/sense/ui-map-fuse.js.map +1 -0
- package/dist/core/sense/ui-map-geom.d.ts +3 -0
- package/dist/core/sense/ui-map-geom.js +16 -0
- package/dist/core/sense/ui-map-geom.js.map +1 -0
- package/dist/core/sense/ui-map-holder.d.ts +58 -0
- package/dist/core/sense/ui-map-holder.js +87 -0
- package/dist/core/sense/ui-map-holder.js.map +1 -0
- package/dist/core/sense/ui-map-normalize.d.ts +19 -0
- package/dist/core/sense/ui-map-normalize.js +65 -0
- package/dist/core/sense/ui-map-normalize.js.map +1 -0
- package/dist/core/sense/ui-map-render.d.ts +4 -0
- package/dist/core/sense/ui-map-render.js +34 -0
- package/dist/core/sense/ui-map-render.js.map +1 -0
- package/dist/core/sense/ui-map-resolve.d.ts +41 -0
- package/dist/core/sense/ui-map-resolve.js +59 -0
- package/dist/core/sense/ui-map-resolve.js.map +1 -0
- package/dist/core/sense/ui-map-types.d.ts +66 -0
- package/dist/core/sense/ui-map-types.js +11 -0
- package/dist/core/sense/ui-map-types.js.map +1 -0
- package/dist/core/sense/ui-map.d.ts +29 -0
- package/dist/core/sense/ui-map.js +113 -0
- package/dist/core/sense/ui-map.js.map +1 -0
- package/dist/core/verify/assertions.d.ts +132 -0
- package/dist/core/verify/assertions.js +284 -0
- package/dist/core/verify/assertions.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/browser-config.d.ts +36 -0
- package/dist/llm/browser-config.js +83 -0
- package/dist/llm/browser-config.js.map +1 -0
- package/dist/llm/client.d.ts +268 -0
- package/dist/llm/client.js +1094 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/config.d.ts +79 -0
- package/dist/llm/config.js +375 -0
- package/dist/llm/config.js.map +1 -0
- package/dist/llm/credentials.d.ts +35 -0
- package/dist/llm/credentials.js +491 -0
- package/dist/llm/credentials.js.map +1 -0
- package/dist/llm/external-creds.d.ts +42 -0
- package/dist/llm/external-creds.js +169 -0
- package/dist/llm/external-creds.js.map +1 -0
- package/dist/llm/providers.d.ts +123 -0
- package/dist/llm/providers.js +717 -0
- package/dist/llm/providers.js.map +1 -0
- package/dist/paths.d.ts +31 -0
- package/dist/paths.js +147 -0
- package/dist/paths.js.map +1 -0
- package/dist/platform/accessibility.d.ts +139 -0
- package/dist/platform/accessibility.js +670 -0
- package/dist/platform/accessibility.js.map +1 -0
- package/dist/platform/cdp-driver.d.ts +318 -0
- package/dist/platform/cdp-driver.js +1179 -0
- package/dist/platform/cdp-driver.js.map +1 -0
- package/dist/platform/index.d.ts +11 -0
- package/dist/platform/index.js +69 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/keys.d.ts +17 -0
- package/dist/platform/keys.js +129 -0
- package/dist/platform/keys.js.map +1 -0
- package/dist/platform/launch-poll.d.ts +101 -0
- package/dist/platform/launch-poll.js +177 -0
- package/dist/platform/launch-poll.js.map +1 -0
- package/dist/platform/linux.d.ts +173 -0
- package/dist/platform/linux.js +1253 -0
- package/dist/platform/linux.js.map +1 -0
- package/dist/platform/macos.d.ts +136 -0
- package/dist/platform/macos.js +976 -0
- package/dist/platform/macos.js.map +1 -0
- package/dist/platform/native-desktop.d.ts +145 -0
- package/dist/platform/native-desktop.js +936 -0
- package/dist/platform/native-desktop.js.map +1 -0
- package/dist/platform/native-helper.d.ts +130 -0
- package/dist/platform/native-helper.js +592 -0
- package/dist/platform/native-helper.js.map +1 -0
- package/dist/platform/ocr-engine.d.ts +78 -0
- package/dist/platform/ocr-engine.js +363 -0
- package/dist/platform/ocr-engine.js.map +1 -0
- package/dist/platform/ps-runner.d.ts +28 -0
- package/dist/platform/ps-runner.js +228 -0
- package/dist/platform/ps-runner.js.map +1 -0
- package/dist/platform/types.d.ts +397 -0
- package/dist/platform/types.js +15 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/platform/uri-handler.d.ts +75 -0
- package/dist/platform/uri-handler.js +273 -0
- package/dist/platform/uri-handler.js.map +1 -0
- package/dist/platform/wayland-backend.d.ts +53 -0
- package/dist/platform/wayland-backend.js +348 -0
- package/dist/platform/wayland-backend.js.map +1 -0
- package/dist/platform/windows.d.ts +232 -0
- package/dist/platform/windows.js +1210 -0
- package/dist/platform/windows.js.map +1 -0
- package/dist/postbuild.d.ts +10 -0
- package/dist/postbuild.js +98 -0
- package/dist/postbuild.js.map +1 -0
- package/dist/schema/snapshot.d.ts +33 -0
- package/dist/schema/snapshot.js +90 -0
- package/dist/schema/snapshot.js.map +1 -0
- package/dist/shortcuts.d.ts +30 -0
- package/dist/shortcuts.js +261 -0
- package/dist/shortcuts.js.map +1 -0
- package/dist/surface/cli.d.ts +7 -0
- package/dist/surface/cli.js +1556 -0
- package/dist/surface/cli.js.map +1 -0
- package/dist/surface/dashboard.d.ts +8 -0
- package/dist/surface/dashboard.js +1193 -0
- package/dist/surface/dashboard.js.map +1 -0
- package/dist/surface/doctor.d.ts +29 -0
- package/dist/surface/doctor.js +1514 -0
- package/dist/surface/doctor.js.map +1 -0
- package/dist/surface/format.d.ts +10 -0
- package/dist/surface/format.js +37 -0
- package/dist/surface/format.js.map +1 -0
- package/dist/surface/http-utility.d.ts +65 -0
- package/dist/surface/http-utility.js +336 -0
- package/dist/surface/http-utility.js.map +1 -0
- package/dist/surface/mcp-server.d.ts +91 -0
- package/dist/surface/mcp-server.js +280 -0
- package/dist/surface/mcp-server.js.map +1 -0
- package/dist/surface/onboarding.d.ts +15 -0
- package/dist/surface/onboarding.js +184 -0
- package/dist/surface/onboarding.js.map +1 -0
- package/dist/surface/pidfile.d.ts +79 -0
- package/dist/surface/pidfile.js +263 -0
- package/dist/surface/pidfile.js.map +1 -0
- package/dist/surface/readiness.d.ts +45 -0
- package/dist/surface/readiness.js +230 -0
- package/dist/surface/readiness.js.map +1 -0
- package/dist/surface/report.d.ts +68 -0
- package/dist/surface/report.js +341 -0
- package/dist/surface/report.js.map +1 -0
- package/dist/surface/skill-register.d.ts +14 -0
- package/dist/surface/skill-register.js +150 -0
- package/dist/surface/skill-register.js.map +1 -0
- package/dist/surface/version.d.ts +6 -0
- package/dist/surface/version.js +27 -0
- package/dist/surface/version.js.map +1 -0
- package/dist/tools/a11y.d.ts +8 -0
- package/dist/tools/a11y.js +545 -0
- package/dist/tools/a11y.js.map +1 -0
- package/dist/tools/a11y_depth.d.ts +19 -0
- package/dist/tools/a11y_depth.js +455 -0
- package/dist/tools/a11y_depth.js.map +1 -0
- package/dist/tools/agent.d.ts +15 -0
- package/dist/tools/agent.js +248 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/batch.d.ts +46 -0
- package/dist/tools/batch.js +230 -0
- package/dist/tools/batch.js.map +1 -0
- package/dist/tools/cdp.d.ts +8 -0
- package/dist/tools/cdp.js +233 -0
- package/dist/tools/cdp.js.map +1 -0
- package/dist/tools/compact.d.ts +63 -0
- package/dist/tools/compact.js +418 -0
- package/dist/tools/compact.js.map +1 -0
- package/dist/tools/cost-class.d.ts +38 -0
- package/dist/tools/cost-class.js +117 -0
- package/dist/tools/cost-class.js.map +1 -0
- package/dist/tools/desktop.d.ts +9 -0
- package/dist/tools/desktop.js +346 -0
- package/dist/tools/desktop.js.map +1 -0
- package/dist/tools/electron_bridge.d.ts +41 -0
- package/dist/tools/electron_bridge.js +261 -0
- package/dist/tools/electron_bridge.js.map +1 -0
- package/dist/tools/extras.d.ts +22 -0
- package/dist/tools/extras.js +942 -0
- package/dist/tools/extras.js.map +1 -0
- package/dist/tools/favorites.d.ts +13 -0
- package/dist/tools/favorites.js +137 -0
- package/dist/tools/favorites.js.map +1 -0
- package/dist/tools/introspection.d.ts +13 -0
- package/dist/tools/introspection.js +55 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/tools/ocr.d.ts +8 -0
- package/dist/tools/ocr.js +66 -0
- package/dist/tools/ocr.js.map +1 -0
- package/dist/tools/orchestration.d.ts +7 -0
- package/dist/tools/orchestration.js +377 -0
- package/dist/tools/orchestration.js.map +1 -0
- package/dist/tools/playbooks/extract-compose.d.ts +22 -0
- package/dist/tools/playbooks/extract-compose.js +85 -0
- package/dist/tools/playbooks/extract-compose.js.map +1 -0
- package/dist/tools/playbooks/find-replace.d.ts +11 -0
- package/dist/tools/playbooks/find-replace.js +56 -0
- package/dist/tools/playbooks/find-replace.js.map +1 -0
- package/dist/tools/playbooks/index.d.ts +63 -0
- package/dist/tools/playbooks/index.js +70 -0
- package/dist/tools/playbooks/index.js.map +1 -0
- package/dist/tools/playbooks/keys-blocklist.d.ts +24 -0
- package/dist/tools/playbooks/keys-blocklist.js +89 -0
- package/dist/tools/playbooks/keys-blocklist.js.map +1 -0
- package/dist/tools/registry.d.ts +40 -0
- package/dist/tools/registry.js +560 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/safety-gate.d.ts +16 -0
- package/dist/tools/safety-gate.js +70 -0
- package/dist/tools/safety-gate.js.map +1 -0
- package/dist/tools/scheduler.d.ts +76 -0
- package/dist/tools/scheduler.js +413 -0
- package/dist/tools/scheduler.js.map +1 -0
- package/dist/tools/shortcuts.d.ts +13 -0
- package/dist/tools/shortcuts.js +205 -0
- package/dist/tools/shortcuts.js.map +1 -0
- package/dist/tools/smart.d.ts +15 -0
- package/dist/tools/smart.js +785 -0
- package/dist/tools/smart.js.map +1 -0
- package/dist/tools/types.d.ts +174 -0
- package/dist/tools/types.js +67 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/window-text.d.ts +15 -0
- package/dist/tools/window-text.js +39 -0
- package/dist/tools/window-text.js.map +1 -0
- package/dist/types.d.ts +122 -0
- package/dist/types.js +41 -0
- package/dist/types.js.map +1 -0
- package/native/Package.swift +38 -0
- package/native/README.md +113 -0
- package/native/Sources/ClawdCursorHelper/main.swift +602 -0
- package/native/Sources/ClawdCursorHost/main.swift +182 -0
- package/native/Sources/PermissionCheck/main.swift +53 -0
- package/native/Sources/ScreenshotHelper/main.swift +219 -0
- package/native/build.sh +139 -0
- package/native/entitlements.plist +12 -0
- package/package.json +115 -0
- package/scripts/banner.ps1 +112 -0
- package/scripts/coord-accuracy.ps1 +140 -0
- package/scripts/coord-uwp.ps1 +80 -0
- package/scripts/edge-glow.ps1 +180 -0
- package/scripts/find-element.ps1 +198 -0
- package/scripts/get-foreground-window.ps1 +71 -0
- package/scripts/get-screen-context.ps1 +183 -0
- package/scripts/get-windows.ps1 +66 -0
- package/scripts/install-panic-hotkey.ps1 +46 -0
- package/scripts/interact-element.ps1 +431 -0
- package/scripts/invoke-element.ps1 +314 -0
- package/scripts/linux/atspi-bridge.py +356 -0
- package/scripts/linux/ocr-recognize.py +154 -0
- package/scripts/mac/_window-picker.jxa +163 -0
- package/scripts/mac/find-element.jxa +0 -0
- package/scripts/mac/find-element.sh +161 -0
- package/scripts/mac/focus-window.jxa +284 -0
- package/scripts/mac/get-focused-element.jxa +102 -0
- package/scripts/mac/get-foreground-window.jxa +173 -0
- package/scripts/mac/get-screen-context.jxa +197 -0
- package/scripts/mac/get-ui-tree.sh +141 -0
- package/scripts/mac/get-windows.jxa +117 -0
- package/scripts/mac/interact-element.sh +235 -0
- package/scripts/mac/invoke-element.jxa +408 -0
- package/scripts/mac/ocr-recognize.swift +124 -0
- package/scripts/ocr-recognize.ps1 +102 -0
- package/scripts/postinstall-native.js +48 -0
- package/scripts/ps-bridge.ps1 +830 -0
- package/scripts/smoke-mcp.ps1 +119 -0
- package/scripts/sync-version.ts +178 -0
- package/scripts/verify-install.js +81 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compileUIMap = compileUIMap;
|
|
4
|
+
exports.defaultCompileDeps = defaultCompileDeps;
|
|
5
|
+
const ui_map_elements_1 = require("./ui-map-elements");
|
|
6
|
+
const ui_map_fuse_1 = require("./ui-map-fuse");
|
|
7
|
+
const ui_map_anchors_1 = require("./ui-map-anchors");
|
|
8
|
+
const ui_map_normalize_1 = require("./ui-map-normalize");
|
|
9
|
+
const ui_map_geom_1 = require("./ui-map-geom");
|
|
10
|
+
const snapshot_1 = require("./snapshot");
|
|
11
|
+
const ocr_engine_1 = require("../../platform/ocr-engine");
|
|
12
|
+
const SPARSE_A11Y_MAX = 0; // ≤ this many named a11y elements ⇒ "sparse"
|
|
13
|
+
const LOW_CONFIDENCE = 0.5; // below this on a needed element ⇒ vision-worthy
|
|
14
|
+
function namedCount(snap) {
|
|
15
|
+
return snap.elements.filter(e => (e.name ?? '').trim().length > 0).length;
|
|
16
|
+
}
|
|
17
|
+
async function compileUIMap(deps, hints) {
|
|
18
|
+
const maxCost = hints.max_cost ?? 'ocr_ok';
|
|
19
|
+
const sourcesUsed = ['window'];
|
|
20
|
+
const snap = await deps.captureSnapshot();
|
|
21
|
+
if (snap.sources.includes('a11y'))
|
|
22
|
+
sourcesUsed.push('a11y');
|
|
23
|
+
let elements = snap.elements.map((se, i) => (0, ui_map_elements_1.a11yToUI)(se, `el_${i}`));
|
|
24
|
+
// Lazy OCR: only when a11y is sparse OR a requested target_text isn't present.
|
|
25
|
+
const sparse = namedCount(snap) <= SPARSE_A11Y_MAX;
|
|
26
|
+
const wantText = hints.target_text ? hints.target_text.trim().toLowerCase() : '';
|
|
27
|
+
const a11yHasTarget = wantText
|
|
28
|
+
? elements.some(e => (e.normalized_text ?? '').includes(wantText))
|
|
29
|
+
: true;
|
|
30
|
+
const ocrAllowed = maxCost === 'ocr_ok' || maxCost === 'vision_ok';
|
|
31
|
+
if (ocrAllowed && (sparse || !a11yHasTarget)) {
|
|
32
|
+
const ocrRes = await Promise.resolve(deps.ocr()).catch(() => null);
|
|
33
|
+
if (ocrRes && ocrRes.elements.length > 0) {
|
|
34
|
+
sourcesUsed.push('ocr');
|
|
35
|
+
const base = elements.length;
|
|
36
|
+
elements = (0, ui_map_fuse_1.fuse)([...elements, ...ocrRes.elements.map((oe, i) => (0, ui_map_elements_1.ocrToUI)(oe, `el_${base + i}`))]);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Lazy vision: only when allowed AND nothing usable surfaced from a11y+OCR.
|
|
40
|
+
const visionAllowed = maxCost === 'vision_ok';
|
|
41
|
+
const nothingActionable = !elements.some(e => e.actionable && e.confidence >= LOW_CONFIDENCE);
|
|
42
|
+
if (visionAllowed && nothingActionable) {
|
|
43
|
+
const shot = await Promise.resolve(deps.vision()).catch(() => null);
|
|
44
|
+
if (shot)
|
|
45
|
+
sourcesUsed.push('vision');
|
|
46
|
+
}
|
|
47
|
+
// Re-id ids contiguously after fusion so el_NN is dense within this snapshot.
|
|
48
|
+
elements = elements.map((e, i) => ({ ...e, id: `el_${i}` }));
|
|
49
|
+
// Mark the focused element so the focused anchor resolves. The platform's
|
|
50
|
+
// focused element carries name, role AND bounds — match it into the fused map
|
|
51
|
+
// by name+role, disambiguating ties (and empty-name canvas/editor surfaces)
|
|
52
|
+
// via nearest bounds (spec §5: role + normalized_text + nearest bounds).
|
|
53
|
+
const focused = await deps.getFocusedElement().catch(() => null);
|
|
54
|
+
if (focused) {
|
|
55
|
+
const fname = (0, ui_map_normalize_1.normText)(focused.name);
|
|
56
|
+
const frole = (0, ui_map_normalize_1.normalizeRole)(focused.controlType);
|
|
57
|
+
const fb = focused.bounds;
|
|
58
|
+
const fbounds = fb && fb.width > 0 && fb.height > 0 ? [fb.x, fb.y, fb.width, fb.height] : null;
|
|
59
|
+
const named = fname !== ''
|
|
60
|
+
? elements.filter(e => e.normalized_text === fname && e.role === frole)
|
|
61
|
+
: [];
|
|
62
|
+
const bestByIou = (els, b) => els.length === 0 ? undefined
|
|
63
|
+
: els.reduce((best, e) => ((0, ui_map_geom_1.iou)(e.bounds, b) > (0, ui_map_geom_1.iou)(best.bounds, b) ? e : best), els[0]);
|
|
64
|
+
let hit;
|
|
65
|
+
if (named.length === 1) {
|
|
66
|
+
hit = named[0];
|
|
67
|
+
}
|
|
68
|
+
else if (named.length > 1) {
|
|
69
|
+
hit = fbounds ? bestByIou(named, fbounds) : named[0];
|
|
70
|
+
}
|
|
71
|
+
else if (fbounds) {
|
|
72
|
+
// No name match (or empty name) — fall back to the nearest overlapping
|
|
73
|
+
// element, but only accept a real overlap to avoid false positives.
|
|
74
|
+
const cand = bestByIou(elements, fbounds);
|
|
75
|
+
if (cand && (0, ui_map_geom_1.iou)(cand.bounds, fbounds) > 0)
|
|
76
|
+
hit = cand;
|
|
77
|
+
}
|
|
78
|
+
if (hit)
|
|
79
|
+
hit.state = { ...hit.state, focused: true };
|
|
80
|
+
}
|
|
81
|
+
const screen = await deps.getScreenSize();
|
|
82
|
+
const aw = snap.activeWindow;
|
|
83
|
+
return {
|
|
84
|
+
snapshot_id: deps.snapshotId,
|
|
85
|
+
platform: snap.platform,
|
|
86
|
+
active_app: aw?.processName ?? '',
|
|
87
|
+
process_id: aw ? String(aw.processId) : undefined,
|
|
88
|
+
window_title: aw?.title ?? '',
|
|
89
|
+
window_bounds: aw ? [aw.bounds.x, aw.bounds.y, aw.bounds.width, aw.bounds.height] : [0, 0, 0, 0],
|
|
90
|
+
coordinate_space: 'screen',
|
|
91
|
+
scale_factor: screen.dpiRatio,
|
|
92
|
+
compiled_at: String(deps.now),
|
|
93
|
+
sources_used: sourcesUsed,
|
|
94
|
+
elements,
|
|
95
|
+
anchors: (0, ui_map_anchors_1.computeAnchors)(elements, deps.prevAnchors),
|
|
96
|
+
truncation: { total_elements: elements.length, returned_elements: elements.length },
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
let _ocr = null;
|
|
100
|
+
function ocrEngine() { return (_ocr ??= new ocr_engine_1.OcrEngine()); }
|
|
101
|
+
/** Production deps wired to a real adapter. now/snapshotId are caller-passed
|
|
102
|
+
* (the agent loop owns the clock + the obs_N counter). */
|
|
103
|
+
function defaultCompileDeps(adapter, now, snapshotId, prevAnchors) {
|
|
104
|
+
return {
|
|
105
|
+
captureSnapshot: () => (0, snapshot_1.captureSnapshot)(adapter),
|
|
106
|
+
ocr: () => ocrEngine().recognizeScreen(),
|
|
107
|
+
vision: () => adapter.screenshot({ maxWidth: 1280 }),
|
|
108
|
+
getScreenSize: () => adapter.getScreenSize(),
|
|
109
|
+
getFocusedElement: () => adapter.getFocusedElement(),
|
|
110
|
+
now, snapshotId, prevAnchors,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=ui-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-map.js","sourceRoot":"","sources":["../../../src/core/sense/ui-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assertion engine — harness-executed task verification.
|
|
3
|
+
*
|
|
4
|
+
* THE PROBLEM THIS SOLVES
|
|
5
|
+
* -----------------------
|
|
6
|
+
* Task verification used to be model-claimed: `done(evidence)` took a prose
|
|
7
|
+
* string and the guards only checked it for length/hedging — nothing
|
|
8
|
+
* re-checked reality. In the 2026-06-06 live Outlook run the model looked at
|
|
9
|
+
* a real screenshot, "verified" a recipient that was never committed, and the
|
|
10
|
+
* task died 12 turns later at send time.
|
|
11
|
+
*
|
|
12
|
+
* THE DESIGN
|
|
13
|
+
* ----------
|
|
14
|
+
* The model PROPOSES machine-checkable proofs; the harness EXECUTES them
|
|
15
|
+
* against ground truth. No LLM judgment, no screenshot tokens. The checks
|
|
16
|
+
* mirror the perception cost ladder — strongest/cheapest first:
|
|
17
|
+
*
|
|
18
|
+
* out-of-band artifacts file_exists / file_contains / clipboard_contains
|
|
19
|
+
* OS window facts window_title_contains / app_running
|
|
20
|
+
* UIA element facts element_exists / element_value_contains
|
|
21
|
+
* pixel-derived text ocr_contains (the only check that touches pixels)
|
|
22
|
+
*
|
|
23
|
+
* LAYERING
|
|
24
|
+
* --------
|
|
25
|
+
* This module is pure core: it depends on PlatformAdapter (reads only) and
|
|
26
|
+
* node:fs — never on tools, the agent loop, or the MCP surface. It is mounted
|
|
27
|
+
* twice: by the System B `verify` tool (which projects to the MCP surface for
|
|
28
|
+
* external agents) and by the `done(assertions)` completion gate.
|
|
29
|
+
*/
|
|
30
|
+
import type { PlatformAdapter } from '../../platform/types';
|
|
31
|
+
export type Assertion = {
|
|
32
|
+
type: 'window_title_contains';
|
|
33
|
+
value: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'app_running';
|
|
36
|
+
name: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: 'element_exists';
|
|
39
|
+
name: string;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'element_value_contains';
|
|
42
|
+
name: string;
|
|
43
|
+
value: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: 'clipboard_contains';
|
|
46
|
+
value: string;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'file_exists';
|
|
49
|
+
path: string;
|
|
50
|
+
} | {
|
|
51
|
+
type: 'file_contains';
|
|
52
|
+
path: string;
|
|
53
|
+
value: string;
|
|
54
|
+
} | {
|
|
55
|
+
type: 'ocr_contains';
|
|
56
|
+
value: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'file_changed_since_start';
|
|
59
|
+
path: string;
|
|
60
|
+
};
|
|
61
|
+
export interface AssertionDeps {
|
|
62
|
+
adapter: PlatformAdapter;
|
|
63
|
+
/** Lazy OCR reader — only invoked for `ocr_contains` (the one pixel-derived
|
|
64
|
+
* check). Left unwired in contexts without an OCR engine; the assertion
|
|
65
|
+
* then fails with an explanatory detail instead of throwing. */
|
|
66
|
+
ocrText?: () => Promise<string>;
|
|
67
|
+
/** Epoch-ms timestamp of task start. Required by `file_changed_since_start`
|
|
68
|
+
* (the proof that a mutating task actually wrote the file it claims to). */
|
|
69
|
+
taskStartedAt?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface AssertionOutcome {
|
|
72
|
+
index: number;
|
|
73
|
+
/** Compact human/LLM-readable restatement, e.g. `element_value_contains("To", "a@b.com")`. */
|
|
74
|
+
summary: string;
|
|
75
|
+
ok: boolean;
|
|
76
|
+
/** Why it failed (or what matched) — includes the ACTUAL observed value so
|
|
77
|
+
* a failing model can correct course instead of retrying blind. */
|
|
78
|
+
detail: string;
|
|
79
|
+
}
|
|
80
|
+
export interface VerifyReport {
|
|
81
|
+
ok: boolean;
|
|
82
|
+
passed: number;
|
|
83
|
+
failed: number;
|
|
84
|
+
outcomes: AssertionOutcome[];
|
|
85
|
+
}
|
|
86
|
+
/** Hard cap — verification is a proof, not a checklist dump. */
|
|
87
|
+
export declare const MAX_ASSERTIONS = 8;
|
|
88
|
+
/**
|
|
89
|
+
* Validate raw model input into a typed assertion list. Returns `{error}`
|
|
90
|
+
* (never throws) so tool handlers can reject with a corrective message.
|
|
91
|
+
*/
|
|
92
|
+
export declare function parseAssertions(raw: unknown): {
|
|
93
|
+
assertions: Assertion[];
|
|
94
|
+
} | {
|
|
95
|
+
error: string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Execute every assertion against current ground truth. Per-assertion errors
|
|
99
|
+
* (UIA down, fs error) fail THAT assertion with the error text — the function
|
|
100
|
+
* itself never throws.
|
|
101
|
+
*/
|
|
102
|
+
export declare function checkAssertions(assertions: Assertion[], deps: AssertionDeps): Promise<VerifyReport>;
|
|
103
|
+
/** Compact ✓/✗ report — readable by humans and cheap for LLM context. */
|
|
104
|
+
export declare function renderReport(report: VerifyReport): string;
|
|
105
|
+
export interface TaskBaseline {
|
|
106
|
+
startedAt: number;
|
|
107
|
+
/** Lower-cased OCR text of the screen at task start. */
|
|
108
|
+
ocrText: string;
|
|
109
|
+
/** Lower-cased window titles present at task start. */
|
|
110
|
+
windowTitles: string[];
|
|
111
|
+
/** Lower-cased process names with a window at task start. */
|
|
112
|
+
processNames: string[];
|
|
113
|
+
/** Lower-cased clipboard contents at task start. */
|
|
114
|
+
clipboard: string;
|
|
115
|
+
}
|
|
116
|
+
/** Capture the cheap baseline artifacts at task start. Best-effort: any source
|
|
117
|
+
* that fails contributes an empty value rather than throwing. */
|
|
118
|
+
export declare function captureTaskBaseline(adapter: PlatformAdapter, ocrText?: () => Promise<string>): Promise<TaskBaseline>;
|
|
119
|
+
/**
|
|
120
|
+
* Was this assertion ALREADY satisfied at task start?
|
|
121
|
+
* true — provably true at baseline (non-discriminating: proves nothing changed)
|
|
122
|
+
* false — provably NOT true at baseline (discriminating: the task made it true)
|
|
123
|
+
* null — undeterminable from the cheap baseline (element/file checks) → trusted
|
|
124
|
+
*/
|
|
125
|
+
export declare function wasTrueAtBaseline(a: Assertion, b: TaskBaseline): boolean | null;
|
|
126
|
+
/**
|
|
127
|
+
* Given a PASSING report, is at least one passing assertion discriminating
|
|
128
|
+
* (not provably true at baseline)? Returns true when the evidence genuinely
|
|
129
|
+
* reflects a change, false when EVERY passing proof was already true before
|
|
130
|
+
* the task acted.
|
|
131
|
+
*/
|
|
132
|
+
export declare function hasDiscriminatingEvidence(assertions: Assertion[], report: VerifyReport, baseline: TaskBaseline): boolean;
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Assertion engine — harness-executed task verification.
|
|
4
|
+
*
|
|
5
|
+
* THE PROBLEM THIS SOLVES
|
|
6
|
+
* -----------------------
|
|
7
|
+
* Task verification used to be model-claimed: `done(evidence)` took a prose
|
|
8
|
+
* string and the guards only checked it for length/hedging — nothing
|
|
9
|
+
* re-checked reality. In the 2026-06-06 live Outlook run the model looked at
|
|
10
|
+
* a real screenshot, "verified" a recipient that was never committed, and the
|
|
11
|
+
* task died 12 turns later at send time.
|
|
12
|
+
*
|
|
13
|
+
* THE DESIGN
|
|
14
|
+
* ----------
|
|
15
|
+
* The model PROPOSES machine-checkable proofs; the harness EXECUTES them
|
|
16
|
+
* against ground truth. No LLM judgment, no screenshot tokens. The checks
|
|
17
|
+
* mirror the perception cost ladder — strongest/cheapest first:
|
|
18
|
+
*
|
|
19
|
+
* out-of-band artifacts file_exists / file_contains / clipboard_contains
|
|
20
|
+
* OS window facts window_title_contains / app_running
|
|
21
|
+
* UIA element facts element_exists / element_value_contains
|
|
22
|
+
* pixel-derived text ocr_contains (the only check that touches pixels)
|
|
23
|
+
*
|
|
24
|
+
* LAYERING
|
|
25
|
+
* --------
|
|
26
|
+
* This module is pure core: it depends on PlatformAdapter (reads only) and
|
|
27
|
+
* node:fs — never on tools, the agent loop, or the MCP surface. It is mounted
|
|
28
|
+
* twice: by the System B `verify` tool (which projects to the MCP surface for
|
|
29
|
+
* external agents) and by the `done(assertions)` completion gate.
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.MAX_ASSERTIONS = void 0;
|
|
33
|
+
exports.parseAssertions = parseAssertions;
|
|
34
|
+
exports.checkAssertions = checkAssertions;
|
|
35
|
+
exports.renderReport = renderReport;
|
|
36
|
+
exports.captureTaskBaseline = captureTaskBaseline;
|
|
37
|
+
exports.wasTrueAtBaseline = wasTrueAtBaseline;
|
|
38
|
+
exports.hasDiscriminatingEvidence = hasDiscriminatingEvidence;
|
|
39
|
+
const node_fs_1 = require("node:fs");
|
|
40
|
+
const node_os_1 = require("node:os");
|
|
41
|
+
/** Hard cap — verification is a proof, not a checklist dump. */
|
|
42
|
+
exports.MAX_ASSERTIONS = 8;
|
|
43
|
+
/** Required string fields per assertion type. Single source of truth for
|
|
44
|
+
* parse validation AND the error message listing valid types. */
|
|
45
|
+
const FIELDS_BY_TYPE = {
|
|
46
|
+
window_title_contains: ['value'],
|
|
47
|
+
app_running: ['name'],
|
|
48
|
+
element_exists: ['name'],
|
|
49
|
+
element_value_contains: ['name', 'value'],
|
|
50
|
+
clipboard_contains: ['value'],
|
|
51
|
+
file_exists: ['path'],
|
|
52
|
+
file_contains: ['path', 'value'],
|
|
53
|
+
ocr_contains: ['value'],
|
|
54
|
+
file_changed_since_start: ['path'],
|
|
55
|
+
};
|
|
56
|
+
// ─── Parsing / validation ────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Validate raw model input into a typed assertion list. Returns `{error}`
|
|
59
|
+
* (never throws) so tool handlers can reject with a corrective message.
|
|
60
|
+
*/
|
|
61
|
+
function parseAssertions(raw) {
|
|
62
|
+
if (!Array.isArray(raw)) {
|
|
63
|
+
return { error: `assertions must be an array of {type, ...} objects (got ${typeof raw}). Valid types: ${Object.keys(FIELDS_BY_TYPE).join(', ')}.` };
|
|
64
|
+
}
|
|
65
|
+
if (raw.length === 0) {
|
|
66
|
+
return { error: 'assertions array is empty — provide at least one machine-checkable proof.' };
|
|
67
|
+
}
|
|
68
|
+
if (raw.length > exports.MAX_ASSERTIONS) {
|
|
69
|
+
return { error: `too many assertions (${raw.length} > ${exports.MAX_ASSERTIONS}) — verify the few facts that actually prove the task.` };
|
|
70
|
+
}
|
|
71
|
+
const assertions = [];
|
|
72
|
+
for (let i = 0; i < raw.length; i++) {
|
|
73
|
+
const a = raw[i];
|
|
74
|
+
if (!a || typeof a !== 'object') {
|
|
75
|
+
return { error: `assertion ${i} is not an object.` };
|
|
76
|
+
}
|
|
77
|
+
const type = String(a.type ?? '');
|
|
78
|
+
const fields = FIELDS_BY_TYPE[type];
|
|
79
|
+
if (!fields) {
|
|
80
|
+
return { error: `assertion ${i} has unknown type "${type}". Valid types: ${Object.keys(FIELDS_BY_TYPE).join(', ')}.` };
|
|
81
|
+
}
|
|
82
|
+
for (const f of fields) {
|
|
83
|
+
if (typeof a[f] !== 'string' || a[f].length === 0) {
|
|
84
|
+
return { error: `assertion ${i} (${type}) is missing required string field "${f}".` };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
assertions.push(a);
|
|
88
|
+
}
|
|
89
|
+
return { assertions };
|
|
90
|
+
}
|
|
91
|
+
// ─── Execution ───────────────────────────────────────────────────────────────
|
|
92
|
+
const norm = (s) => s.toLowerCase();
|
|
93
|
+
const containsCI = (haystack, needle) => norm(haystack).includes(norm(needle));
|
|
94
|
+
const truncate = (s, n) => (s.length > n ? `${s.slice(0, n - 1)}…` : s);
|
|
95
|
+
/** Expand a leading `~` so model-supplied paths like `~/Documents/x.txt` work. */
|
|
96
|
+
function expandHome(p) {
|
|
97
|
+
return p.startsWith('~') ? (0, node_os_1.homedir)() + p.slice(1) : p;
|
|
98
|
+
}
|
|
99
|
+
/** Cap file_contains reads — verification targets are documents, not dumps. */
|
|
100
|
+
const MAX_FILE_BYTES = 1024 * 1024;
|
|
101
|
+
async function checkOne(a, deps) {
|
|
102
|
+
const { adapter } = deps;
|
|
103
|
+
switch (a.type) {
|
|
104
|
+
case 'window_title_contains': {
|
|
105
|
+
const wins = await adapter.listWindows();
|
|
106
|
+
const hit = wins.find(w => containsCI(w.title ?? '', a.value));
|
|
107
|
+
if (hit)
|
|
108
|
+
return { ok: true, detail: `matched "${truncate(hit.title, 60)}"` };
|
|
109
|
+
const titles = wins.slice(0, 5).map(w => `"${truncate(w.title, 40)}"`).join(', ');
|
|
110
|
+
return { ok: false, detail: `no open window title contains "${a.value}" (open: ${titles || 'none'})` };
|
|
111
|
+
}
|
|
112
|
+
case 'app_running': {
|
|
113
|
+
const wins = await adapter.listWindows();
|
|
114
|
+
const hit = wins.find(w => containsCI(w.processName ?? '', a.name));
|
|
115
|
+
return hit
|
|
116
|
+
? { ok: true, detail: `process "${hit.processName}" has a window` }
|
|
117
|
+
: { ok: false, detail: `no window belongs to a process matching "${a.name}"` };
|
|
118
|
+
}
|
|
119
|
+
case 'element_exists': {
|
|
120
|
+
const hits = await adapter.findElements({ name: a.name });
|
|
121
|
+
return hits.length > 0
|
|
122
|
+
? { ok: true, detail: `${hits.length} element(s) named "${a.name}"` }
|
|
123
|
+
: { ok: false, detail: `no accessibility element named "${a.name}" (sparse-tree app? try ocr_contains)` };
|
|
124
|
+
}
|
|
125
|
+
case 'element_value_contains': {
|
|
126
|
+
const res = await adapter.invokeElement({ name: a.name, action: 'get-value' });
|
|
127
|
+
if (!res.success)
|
|
128
|
+
return { ok: false, detail: `"${a.name}" has no readable value` };
|
|
129
|
+
const value = String(res.data?.value ?? '');
|
|
130
|
+
return containsCI(value, a.value)
|
|
131
|
+
? { ok: true, detail: `"${a.name}" = "${truncate(value, 80)}"` }
|
|
132
|
+
: { ok: false, detail: `"${a.name}" = "${truncate(value, 80)}" — does not contain "${a.value}"` };
|
|
133
|
+
}
|
|
134
|
+
case 'clipboard_contains': {
|
|
135
|
+
const clip = await adapter.readClipboard();
|
|
136
|
+
return containsCI(clip ?? '', a.value)
|
|
137
|
+
? { ok: true, detail: 'clipboard matches' }
|
|
138
|
+
: { ok: false, detail: `clipboard is "${truncate(clip ?? '', 60)}" — does not contain "${a.value}"` };
|
|
139
|
+
}
|
|
140
|
+
case 'file_exists': {
|
|
141
|
+
try {
|
|
142
|
+
const st = await node_fs_1.promises.stat(expandHome(a.path));
|
|
143
|
+
return { ok: true, detail: `exists (${st.size} bytes)` };
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return { ok: false, detail: `no file at "${a.path}"` };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
case 'file_contains': {
|
|
150
|
+
let content;
|
|
151
|
+
try {
|
|
152
|
+
const fh = await node_fs_1.promises.open(expandHome(a.path), 'r');
|
|
153
|
+
try {
|
|
154
|
+
const buf = Buffer.alloc(MAX_FILE_BYTES);
|
|
155
|
+
const { bytesRead } = await fh.read(buf, 0, MAX_FILE_BYTES, 0);
|
|
156
|
+
content = buf.subarray(0, bytesRead).toString('utf8');
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
await fh.close();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return { ok: false, detail: `cannot read "${a.path}"` };
|
|
164
|
+
}
|
|
165
|
+
return containsCI(content, a.value)
|
|
166
|
+
? { ok: true, detail: 'file content matches' }
|
|
167
|
+
: { ok: false, detail: `file does not contain "${a.value}" (read ${Math.min(content.length, MAX_FILE_BYTES)} chars)` };
|
|
168
|
+
}
|
|
169
|
+
case 'ocr_contains': {
|
|
170
|
+
if (!deps.ocrText)
|
|
171
|
+
return { ok: false, detail: 'OCR is not wired in this context — use element/window assertions instead' };
|
|
172
|
+
const text = await deps.ocrText();
|
|
173
|
+
return containsCI(text, a.value)
|
|
174
|
+
? { ok: true, detail: 'visible on screen (OCR)' }
|
|
175
|
+
: { ok: false, detail: `OCR text does not contain "${a.value}"` };
|
|
176
|
+
}
|
|
177
|
+
case 'file_changed_since_start': {
|
|
178
|
+
// The proof that a mutating task actually WROTE the file it claims to —
|
|
179
|
+
// catches "claimed success, nothing happened" for file effects (a live
|
|
180
|
+
// wallpaper task 'verified' via the clock while the wallpaper file went
|
|
181
|
+
// untouched). Discriminating by construction: at task start nothing has
|
|
182
|
+
// been modified-since-start yet.
|
|
183
|
+
if (deps.taskStartedAt === undefined) {
|
|
184
|
+
return { ok: false, detail: 'no task-start timestamp in this context — file_changed_since_start only works inside a task run' };
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const st = await node_fs_1.promises.stat(expandHome(a.path));
|
|
188
|
+
const delta = Math.round((st.mtimeMs - deps.taskStartedAt) / 1000);
|
|
189
|
+
return st.mtimeMs > deps.taskStartedAt
|
|
190
|
+
? { ok: true, detail: `modified ${delta}s into the task` }
|
|
191
|
+
: { ok: false, detail: `NOT modified since the task started (mtime is ${Math.abs(delta)}s older than task start) — your action did not change this file` };
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return { ok: false, detail: `no file at "${a.path}"` };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function summarize(a) {
|
|
200
|
+
const args = FIELDS_BY_TYPE[a.type]
|
|
201
|
+
.map(f => `"${truncate(String(a[f]), 40)}"`)
|
|
202
|
+
.join(', ');
|
|
203
|
+
return `${a.type}(${args})`;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Execute every assertion against current ground truth. Per-assertion errors
|
|
207
|
+
* (UIA down, fs error) fail THAT assertion with the error text — the function
|
|
208
|
+
* itself never throws.
|
|
209
|
+
*/
|
|
210
|
+
async function checkAssertions(assertions, deps) {
|
|
211
|
+
const outcomes = [];
|
|
212
|
+
for (let i = 0; i < assertions.length; i++) {
|
|
213
|
+
const a = assertions[i];
|
|
214
|
+
let ok;
|
|
215
|
+
let detail;
|
|
216
|
+
try {
|
|
217
|
+
({ ok, detail } = await checkOne(a, deps));
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
ok = false;
|
|
221
|
+
detail = `check failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
222
|
+
}
|
|
223
|
+
outcomes.push({ index: i, summary: summarize(a), ok, detail });
|
|
224
|
+
}
|
|
225
|
+
const passed = outcomes.filter(o => o.ok).length;
|
|
226
|
+
return { ok: passed === outcomes.length, passed, failed: outcomes.length - passed, outcomes };
|
|
227
|
+
}
|
|
228
|
+
/** Compact ✓/✗ report — readable by humans and cheap for LLM context. */
|
|
229
|
+
function renderReport(report) {
|
|
230
|
+
return report.outcomes
|
|
231
|
+
.map(o => `${o.ok ? '✓' : '✗'} ${o.summary} — ${o.detail}`)
|
|
232
|
+
.join('\n');
|
|
233
|
+
}
|
|
234
|
+
/** Capture the cheap baseline artifacts at task start. Best-effort: any source
|
|
235
|
+
* that fails contributes an empty value rather than throwing. */
|
|
236
|
+
async function captureTaskBaseline(adapter, ocrText) {
|
|
237
|
+
const startedAt = Date.now();
|
|
238
|
+
let windowTitles = [];
|
|
239
|
+
let processNames = [];
|
|
240
|
+
try {
|
|
241
|
+
const wins = await adapter.listWindows();
|
|
242
|
+
windowTitles = wins.map(w => (w.title ?? '').toLowerCase());
|
|
243
|
+
processNames = wins.map(w => (w.processName ?? '').toLowerCase());
|
|
244
|
+
}
|
|
245
|
+
catch { /* empty */ }
|
|
246
|
+
let clipboard = '';
|
|
247
|
+
try {
|
|
248
|
+
clipboard = ((await adapter.readClipboard()) ?? '').toLowerCase();
|
|
249
|
+
}
|
|
250
|
+
catch { /* empty */ }
|
|
251
|
+
let ocr = '';
|
|
252
|
+
try {
|
|
253
|
+
ocr = ocrText ? (await ocrText()).toLowerCase() : '';
|
|
254
|
+
}
|
|
255
|
+
catch { /* empty */ }
|
|
256
|
+
return { startedAt, ocrText: ocr, windowTitles, processNames, clipboard };
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Was this assertion ALREADY satisfied at task start?
|
|
260
|
+
* true — provably true at baseline (non-discriminating: proves nothing changed)
|
|
261
|
+
* false — provably NOT true at baseline (discriminating: the task made it true)
|
|
262
|
+
* null — undeterminable from the cheap baseline (element/file checks) → trusted
|
|
263
|
+
*/
|
|
264
|
+
function wasTrueAtBaseline(a, b) {
|
|
265
|
+
const has = (h, n) => h.includes(n.toLowerCase());
|
|
266
|
+
switch (a.type) {
|
|
267
|
+
case 'ocr_contains': return has(b.ocrText, a.value);
|
|
268
|
+
case 'clipboard_contains': return has(b.clipboard, a.value);
|
|
269
|
+
case 'window_title_contains': return b.windowTitles.some(t => has(t, a.value));
|
|
270
|
+
case 'app_running': return b.processNames.some(p => has(p, a.name));
|
|
271
|
+
case 'file_changed_since_start': return false; // by construction: nothing is changed-since-start at start
|
|
272
|
+
default: return null; // element_*, file_exists, file_contains — trust
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Given a PASSING report, is at least one passing assertion discriminating
|
|
277
|
+
* (not provably true at baseline)? Returns true when the evidence genuinely
|
|
278
|
+
* reflects a change, false when EVERY passing proof was already true before
|
|
279
|
+
* the task acted.
|
|
280
|
+
*/
|
|
281
|
+
function hasDiscriminatingEvidence(assertions, report, baseline) {
|
|
282
|
+
return assertions.some((a, i) => report.outcomes[i]?.ok === true && wasTrueAtBaseline(a, baseline) !== true);
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=assertions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../../src/core/verify/assertions.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Back-compat entry point — DO NOT add logic here.
|
|
4
|
+
*
|
|
5
|
+
* v0.x published the CLI at `dist/index.js`. v1.0 moved the real entry to
|
|
6
|
+
* `dist/surface/cli.js` (see package.json "bin"). Some users had hard-pinned
|
|
7
|
+
* `node <pkg>/dist/index.js <args>` into an MCP host config — e.g. Claude
|
|
8
|
+
* Code's `.claude.json` — and a routine `npm i -g clawdcursor` upgrade then
|
|
9
|
+
* silently broke their launch, because the file they pointed at no longer
|
|
10
|
+
* existed. The MCP server simply failed to start with no obvious cause.
|
|
11
|
+
*
|
|
12
|
+
* This shim re-runs the real CLI so those pinned paths keep working across the
|
|
13
|
+
* move. `surface/cli` calls `program.parse()` on load, so importing it here is
|
|
14
|
+
* enough — the original `process.argv` flows straight through.
|
|
15
|
+
*
|
|
16
|
+
* New configs should launch the `clawdcursor` bin directly
|
|
17
|
+
* (`"command": "clawdcursor", "args": ["mcp", "--compact"]`) or install the
|
|
18
|
+
* Claude Code plugin, both of which resolve through npm and never pin a deep
|
|
19
|
+
* dist path. See README.md / SKILL.md.
|
|
20
|
+
*/
|
|
21
|
+
import './surface/cli';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
/**
|
|
5
|
+
* Back-compat entry point — DO NOT add logic here.
|
|
6
|
+
*
|
|
7
|
+
* v0.x published the CLI at `dist/index.js`. v1.0 moved the real entry to
|
|
8
|
+
* `dist/surface/cli.js` (see package.json "bin"). Some users had hard-pinned
|
|
9
|
+
* `node <pkg>/dist/index.js <args>` into an MCP host config — e.g. Claude
|
|
10
|
+
* Code's `.claude.json` — and a routine `npm i -g clawdcursor` upgrade then
|
|
11
|
+
* silently broke their launch, because the file they pointed at no longer
|
|
12
|
+
* existed. The MCP server simply failed to start with no obvious cause.
|
|
13
|
+
*
|
|
14
|
+
* This shim re-runs the real CLI so those pinned paths keep working across the
|
|
15
|
+
* move. `surface/cli` calls `program.parse()` on load, so importing it here is
|
|
16
|
+
* enough — the original `process.argv` flows straight through.
|
|
17
|
+
*
|
|
18
|
+
* New configs should launch the `clawdcursor` bin directly
|
|
19
|
+
* (`"command": "clawdcursor", "args": ["mcp", "--compact"]`) or install the
|
|
20
|
+
* Claude Code plugin, both of which resolve through npm and never pin a deep
|
|
21
|
+
* dist path. See README.md / SKILL.md.
|
|
22
|
+
*/
|
|
23
|
+
require("./surface/cli");
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA;;;;;;;;;;;;;;;;;;GAkBG;AACH,yBAAuB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Configuration — centralised helpers for browser detection and CDP port.
|
|
3
|
+
*
|
|
4
|
+
* All files that need to know which browser processes to match, what CDP port
|
|
5
|
+
* to connect to, or where the browser executable lives should import from here
|
|
6
|
+
* instead of hardcoding values.
|
|
7
|
+
*/
|
|
8
|
+
import type { ClawdConfig } from '../types';
|
|
9
|
+
export declare const DEFAULT_CDP_PORT = 9223;
|
|
10
|
+
/**
|
|
11
|
+
* Port for the AGENT-OWNED dedicated browser instance (the one CDPDriver
|
|
12
|
+
* launches itself with `--user-data-dir=~/.clawdcursor/cdp-profile`).
|
|
13
|
+
*
|
|
14
|
+
* Deliberately DIFFERENT from DEFAULT_CDP_PORT (9223): ownership is encoded in
|
|
15
|
+
* the port. 9223 is reserved for browsers the USER put on the wire (their own
|
|
16
|
+
* launch flags, `relaunch_with_cdp`, the browser relay) — attaching there means
|
|
17
|
+
* "driving the user's session" and gets new-tab discipline. Sharing one port
|
|
18
|
+
* for both meant the driver could not tell its own instance from the user's:
|
|
19
|
+
* whoever squatted 9223 won, and a lingering agent instance the user adopted
|
|
20
|
+
* (music, browsing) got its tabs hijacked (root-cause fix 2026-06-11).
|
|
21
|
+
*/
|
|
22
|
+
export declare const AGENT_CDP_PORT: number;
|
|
23
|
+
/** Get configured browser executable path, or null for auto-detection */
|
|
24
|
+
export declare function getBrowserExePath(config?: ClawdConfig): string | null;
|
|
25
|
+
/** Get list of browser process names to match against */
|
|
26
|
+
export declare function getBrowserProcessNames(config?: ClawdConfig): string[];
|
|
27
|
+
/** Get CDP debugging port */
|
|
28
|
+
export declare function getCDPPort(config?: ClawdConfig): number;
|
|
29
|
+
/** Build a regex matching browser process names */
|
|
30
|
+
export declare function getBrowserProcessRegex(config?: ClawdConfig): RegExp;
|
|
31
|
+
/** Get default Chrome executable paths for the current platform */
|
|
32
|
+
export declare function getChromePaths(): string[];
|
|
33
|
+
/** Get default Edge executable paths for the current platform */
|
|
34
|
+
export declare function getEdgePaths(): string[];
|
|
35
|
+
/** Get browser executable paths, respecting config overrides. Tries custom path first, then defaults. */
|
|
36
|
+
export declare function getBrowserPaths(browser: 'chrome' | 'edge', config?: ClawdConfig): string[];
|