free-computer-use 0.1.0
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/.env.example +31 -0
- package/CHANGELOG.md +19 -0
- package/CONTRIBUTING.md +66 -0
- package/LICENSE +21 -0
- package/README.md +140 -0
- package/SECURITY.md +133 -0
- package/artifacts/benchmark-public.json +797 -0
- package/assets/readme/hero.svg +53 -0
- package/assets/readme/incident-demo.gif +0 -0
- package/assets/readme/incident-evidence.json +52 -0
- package/dist/actions/compiler.d.ts +5 -0
- package/dist/actions/compiler.js +16 -0
- package/dist/actions/compiler.js.map +1 -0
- package/dist/actions/executor.d.ts +38 -0
- package/dist/actions/executor.js +305 -0
- package/dist/actions/executor.js.map +1 -0
- package/dist/actions/policy.d.ts +4 -0
- package/dist/actions/policy.js +18 -0
- package/dist/actions/policy.js.map +1 -0
- package/dist/actions/schema.d.ts +4149 -0
- package/dist/actions/schema.js +59 -0
- package/dist/actions/schema.js.map +1 -0
- package/dist/adapters/generic.d.ts +14 -0
- package/dist/adapters/generic.js +33 -0
- package/dist/adapters/generic.js.map +1 -0
- package/dist/agent/Agent.d.ts +69 -0
- package/dist/agent/Agent.js +375 -0
- package/dist/agent/Agent.js.map +1 -0
- package/dist/agent/Control.d.ts +23 -0
- package/dist/agent/Control.js +51 -0
- package/dist/agent/Control.js.map +1 -0
- package/dist/agent/TokenBudget.d.ts +52 -0
- package/dist/agent/TokenBudget.js +47 -0
- package/dist/agent/TokenBudget.js.map +1 -0
- package/dist/agent/goalCriteria.d.ts +2 -0
- package/dist/agent/goalCriteria.js +13 -0
- package/dist/agent/goalCriteria.js.map +1 -0
- package/dist/browser/Browser.d.ts +72 -0
- package/dist/browser/Browser.js +378 -0
- package/dist/browser/Browser.js.map +1 -0
- package/dist/browser/DomExtractor.d.ts +6 -0
- package/dist/browser/DomExtractor.js +134 -0
- package/dist/browser/DomExtractor.js.map +1 -0
- package/dist/browser/Interaction.d.ts +43 -0
- package/dist/browser/Interaction.js +225 -0
- package/dist/browser/Interaction.js.map +1 -0
- package/dist/browser/NetworkGuardProxy.d.ts +31 -0
- package/dist/browser/NetworkGuardProxy.js +331 -0
- package/dist/browser/NetworkGuardProxy.js.map +1 -0
- package/dist/browser/Observer.d.ts +12 -0
- package/dist/browser/Observer.js +31 -0
- package/dist/browser/Observer.js.map +1 -0
- package/dist/browser/PageCompressor.d.ts +47 -0
- package/dist/browser/PageCompressor.js +62 -0
- package/dist/browser/PageCompressor.js.map +1 -0
- package/dist/browser/SecurityBoundaryError.d.ts +3 -0
- package/dist/browser/SecurityBoundaryError.js +4 -0
- package/dist/browser/SecurityBoundaryError.js.map +1 -0
- package/dist/browser/SelectorEngine.d.ts +18 -0
- package/dist/browser/SelectorEngine.js +72 -0
- package/dist/browser/SelectorEngine.js.map +1 -0
- package/dist/browser/types.d.ts +38 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +284 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js +77 -0
- package/dist/config.js.map +1 -0
- package/dist/history/TraceStore.d.ts +29 -0
- package/dist/history/TraceStore.js +53 -0
- package/dist/history/TraceStore.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/ClaudeSubscriptionProvider.d.ts +26 -0
- package/dist/llm/ClaudeSubscriptionProvider.js +182 -0
- package/dist/llm/ClaudeSubscriptionProvider.js.map +1 -0
- package/dist/llm/CodexSubscriptionProvider.d.ts +26 -0
- package/dist/llm/CodexSubscriptionProvider.js +168 -0
- package/dist/llm/CodexSubscriptionProvider.js.map +1 -0
- package/dist/llm/FlashProvider.d.ts +27 -0
- package/dist/llm/FlashProvider.js +103 -0
- package/dist/llm/FlashProvider.js.map +1 -0
- package/dist/llm/LLMProvider.d.ts +37 -0
- package/dist/llm/LLMProvider.js +2 -0
- package/dist/llm/LLMProvider.js.map +1 -0
- package/dist/llm/cliEnvironment.d.ts +5 -0
- package/dist/llm/cliEnvironment.js +21 -0
- package/dist/llm/cliEnvironment.js.map +1 -0
- package/dist/llm/prompts.d.ts +4 -0
- package/dist/llm/prompts.js +12 -0
- package/dist/llm/prompts.js.map +1 -0
- package/dist/llm/structuredOutput.d.ts +3 -0
- package/dist/llm/structuredOutput.js +58 -0
- package/dist/llm/structuredOutput.js.map +1 -0
- package/dist/mcp/index.d.ts +13 -0
- package/dist/mcp/index.js +243 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/profile/ProfileStore.d.ts +7 -0
- package/dist/profile/ProfileStore.js +52 -0
- package/dist/profile/ProfileStore.js.map +1 -0
- package/dist/profile/VariableResolver.d.ts +15 -0
- package/dist/profile/VariableResolver.js +50 -0
- package/dist/profile/VariableResolver.js.map +1 -0
- package/dist/server/index.d.ts +14 -0
- package/dist/server/index.js +239 -0
- package/dist/server/index.js.map +1 -0
- package/dist/ui/app.js +132 -0
- package/dist/ui/index.html +29 -0
- package/dist/ui/logo.svg +5 -0
- package/dist/ui/results.js +59 -0
- package/dist/ui/style.css +33 -0
- package/dist/verification/Verifier.d.ts +72 -0
- package/dist/verification/Verifier.js +87 -0
- package/dist/verification/Verifier.js.map +1 -0
- package/dist/workflows/WorkflowEngine.d.ts +23 -0
- package/dist/workflows/WorkflowEngine.js +52 -0
- package/dist/workflows/WorkflowEngine.js.map +1 -0
- package/docs/ADOPTION.md +61 -0
- package/docs/ARCHITECTURE.md +65 -0
- package/docs/BENCHMARKS.md +64 -0
- package/docs/IMPLEMENTATION.md +93 -0
- package/docs/LOCAL_DATA.md +98 -0
- package/docs/LOCAL_VALIDATION.md +87 -0
- package/docs/MCP.md +81 -0
- package/docs/PROVIDERS.md +150 -0
- package/docs/RELEASE_CHECKLIST.md +37 -0
- package/docs/REQUIREMENTS.md +39 -0
- package/docs/SUPPORT_MATRIX.md +193 -0
- package/docs/THREAT_MODEL.md +108 -0
- package/docs/USEFUL_EXAMPLES.md +151 -0
- package/docs/brand-mark.svg +12 -0
- package/package.json +90 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Support matrix
|
|
2
|
+
|
|
3
|
+
Updated 24 September 2026. This matrix separates code that exists, automated
|
|
4
|
+
contract coverage, and evidence from a real provider. An OpenAI-compatible URL
|
|
5
|
+
does not prove that every service using that label accepts the same request.
|
|
6
|
+
|
|
7
|
+
## Model connections
|
|
8
|
+
|
|
9
|
+
| Connection | Implemented route | Automated evidence in this repository | Live evidence and current status |
|
|
10
|
+
| --- | --- | --- | --- |
|
|
11
|
+
| OpenAI-compatible API | `openai-compatible`; bearer key; configurable base URL; `/chat/completions`; JSON object or schema request | Seven local HTTP/mock contract cases cover request format, schema validation, usage, context trimming, HTTPS, bounded correction, safe HTTP errors and OpenAI's completion-limit parameter. | One live DeepSeek Flash completion passed on 23 September 2026 using synthetic content: one request, one parsed action, 1,517 input and 73 output tokens. OpenAI, xAI/Grok, Gemini, Mistral and OpenRouter remain individually unverified here. |
|
|
12
|
+
| Anthropic API | `anthropic`; `x-api-key`; Messages endpoint; prompted JSON object, locally validated | One local HTTP contract test covers the native request, headers, usage parsing, escaped page content and unsupported JSON-schema rejection. | Not live-tested in the recorded project evidence. Unverified. |
|
|
13
|
+
| ChatGPT subscription | Local Codex CLI; detects semantic CLI version, checks `codex login status`; runs an ephemeral, read-only `codex exec` request with tools disabled | Three local fake-CLI tests cover version parsing, output parsing, strict-schema conversion, records-selector restoration, required flags, environment isolation and actionable missing/unsigned errors. | One synthetic plan completion passed on 23 September 2026 using Codex CLI `0.156.1` and an authenticated ChatGPT login. One request; local budget estimates 7,022 input / 97 output tokens; model ID and actual provider usage were not reported. No browser action ran. |
|
|
14
|
+
| Claude Pro/Max subscription | Local Claude Code CLI; requires version `2.1.248+`, checks first-party subscription authentication; runs a restricted, non-persistent prompt with tools disabled | Three local fake-CLI tests cover version threshold, output parsing, required flags, environment isolation and actionable missing/unsigned errors. | Not verified against an authenticated Claude subscription. The local package manifest reports `0.2.69`; its `claude --version` command currently throws a Node `TypeError`, so update the CLI before live verification. |
|
|
15
|
+
|
|
16
|
+
### OpenAI-compatible configuration examples
|
|
17
|
+
|
|
18
|
+
These are endpoint examples in the README, not individually verified vendor
|
|
19
|
+
certifications. Check each provider's current model name, JSON support, token
|
|
20
|
+
parameters, endpoint and terms before use.
|
|
21
|
+
|
|
22
|
+
| Service named in project docs | Implemented route | Live model/date/result | Still unverified |
|
|
23
|
+
| --- | --- | --- | --- |
|
|
24
|
+
| DeepSeek | OpenAI-compatible | `deepseek-flash`; 23 September 2026; one synthetic plan completed in one request. | Browser task behavior, other model aliases and live `json_schema` behavior. |
|
|
25
|
+
| OpenAI | OpenAI-compatible | No live model request recorded. | Model access, request acceptance, output/usage shape and browser task behavior. |
|
|
26
|
+
| xAI / Grok | OpenAI-compatible | No live model request recorded. | Model access, request acceptance, output/usage shape and browser task behavior. |
|
|
27
|
+
| Google Gemini | OpenAI-compatible endpoint | No live model request recorded. | Model access, request acceptance, output/usage shape and browser task behavior. |
|
|
28
|
+
| Mistral | OpenAI-compatible | No live model request recorded. | Model access, request acceptance, output/usage shape and browser task behavior. |
|
|
29
|
+
| OpenRouter | OpenAI-compatible endpoint | No live model request recorded. | Account/model routing, request acceptance, output/usage shape and browser task behavior. |
|
|
30
|
+
|
|
31
|
+
## Browser, runtime and distribution
|
|
32
|
+
|
|
33
|
+
| Area | Declared or implemented | Verified evidence | Limit |
|
|
34
|
+
| --- | --- | --- | --- |
|
|
35
|
+
| MCP host integration | Local `stdio` server, MCP TypeScript SDK `2.0.0`; tools start, inspect, follow/verify and stop a browser task. | On 24 September 2026, four focused tests passed with the official TypeScript MCP client. MCP Inspector 2.8.0 also connected to the built CLI over `stdio`, displayed site approval and declined it; the task failed with zero model calls and zero requests to the local fixture. | Only the reference Inspector client is verified; other desktop agent hosts remain unverified. Host must support form elicitation for approvals. No public npm install exists yet. |
|
|
36
|
+
| Node.js | `package.json` declares an install floor of Node `>=22.13.0`; this does not certify that whole range. | A clean checkout installed with `npm ci --offline --no-audit --no-fund`, then passed `npm run validate` on Node `25.9.0`, macOS `26.6`, Apple Silicon and system Chrome `154.0.8037.57` on 24 September 2026. | Node `22.13.0`, other Node releases and Windows/Linux have not been validated. |
|
|
37
|
+
| Browser engine | Playwright `1.63.0`; defaults to its matching Chromium. Optional `FCU_BROWSER_CHANNEL` selects installed Chrome/Edge to avoid a browser download. | System Chrome `154.0.8037.57` passed 102/102 serial tests and the full validation on 24 September 2026 (commit `d978b06`). `FCU_BROWSER_CHANNEL=chrome npm run demo -- --headed --contact` also completed seven local actions with zero model calls and exited cleanly. | Matching Playwright Chromium is absent. Playwright warns that non-bundled browsers may be incompatible. Other browser builds and operating systems remain unverified. No browser was downloaded. |
|
|
38
|
+
| Browser task behavior | DOM observation, bounded action plans, origin/action approvals, result checks and compatible workflow replay are implemented. A loopback-only Chromium DevTools Protocol connection attaches to page targets before navigation and checks redirect hops. A second loopback proxy enforces origin policy for HTTP(S)/WebSocket traffic, blocks private/reserved DNS answers and checks private IPv4 embedded in prefixes learned through `ipv4only.arpa`. The persistent Chromium profile disables WebRTC UDP that the proxy cannot carry. Explicit IP literals need exact origin approval. Ultra/`allowExternal` opts out of origin and private-address checks. Closing the active page cancels its run and pending approval. | On 24 September, the dashboard was changed to reuse one `Agent` and Chromium context between tasks, opening a fresh tab for each task. Regression checks confirm dashboard replay keeps the same context, all eight lab workflows replay in that context, and the persistent network proxy reapplies private-address policy when the mode changes. The clean serial full suite passed 101/101 on system Chrome `154.0.8037.57`, macOS `26.6`, Node `25.9.0`. Security cases include popup redirects, simulated DNS rebinding, reserved ranges, normal/Ultra behavior and approved/blocked WebSockets. A Chrome-originated WSS fixture returns a frame through the proxy; its generated local certificate is ignored. A separate opt-in `security:wss` smoke connected to Postman Echo with Chrome’s normal TLS validation and received its synthetic message. Synthetic DNS64 fixtures cover all six RFC 6052 prefix lengths; actual NAT64 discovery remains unverified. A local STUN receiver got no WebRTC UDP packets. | Before context reuse, relaunching Chrome `154.0.8037.57` with the same persistent profile caused a `SIGSEGV` on 23 September; the `.ips` report identifies `CrBrowserMain` and `EXC_BAD_ACCESS`. The dashboard now avoids this process boundary, and its full local regression suite passes. Reopening the same profile through a standalone Playwright process remains unverified. Matching Playwright Chromium is absent; no browser was downloaded. Live NAT64 discovery, other trusted WSS endpoints, non-HTTP traffic beyond the WebRTC STUN fixture, other browser builds, Windows/Linux and universal website success remain unverified. WebRTC services needing direct UDP may fail. |
|
|
39
|
+
| Vision and canvas | Local screenshots/preview exist. | Screenshot paths are documented as local. | Images are not sent to the model; model vision and visual-only/canvas control are not implemented. |
|
|
40
|
+
| npm package | Package metadata declares a CLI, ESM library entry point and global `agent` command; package name is `free-computer-use`. | A clean source archive passed offline install/build/pack. Its 130-file, approximately 1.14 MB candidate installed offline in a separate temporary project; CLI version/help/doctor passed. The interactive CLI and installed dashboard each completed the read-only table workflow with one action and zero model calls. Dashboard checks passed HTTP 200, keyboard focus, 320/390/768/1440 px without horizontal overflow, and zero console errors. | `npm view free-computer-use@0.1.0 version` returns 404. The package is not published, so registry installation and public integrity are unverified. `0.1.0` remains manifest metadata, not a published release. |
|
|
41
|
+
| GitHub release / binary | No release tag or GitHub release was present at audit time. | None. | No downloadable release binary or archive is currently offered. |
|
|
42
|
+
| GitHub Actions | No workflow files are tracked in the checkout. | `git ls-files '.github/workflows/*'` returned no workflow; no workflow was activated or dispatched. `docs/LOCAL_VALIDATION.md` records the owner instruction. | Local checks remain the validation route unless the owner changes that instruction. |
|
|
43
|
+
|
|
44
|
+
## Validation snapshot for this implementation session
|
|
45
|
+
|
|
46
|
+
- Fresh-export onboarding: `git archive` of commit `eca3f17`, offline `npm ci`,
|
|
47
|
+
copied `.env.example` with Chrome selected, `chmod 600`, `agent doctor`,
|
|
48
|
+
keyboard-only no-key `ui:smoke`, and `npm run dev -- --port 0` all passed on
|
|
49
|
+
macOS `26.6` / Node `25.9.0` / system Chrome `154.0.8037.57`. Dashboard
|
|
50
|
+
returned HTTP `200`; export was removed.
|
|
51
|
+
- `npm run check`: passed on Node `25.9.0` on 24 September 2026.
|
|
52
|
+
- `npm run build`: passed.
|
|
53
|
+
- Previous recorded `npm run security` pass covered 6,005 tracked file versions.
|
|
54
|
+
On 24 September 2026, the checkout-only scan passed 245 tracked file versions;
|
|
55
|
+
the full history rescan was stopped after 2 minutes 30 seconds without a
|
|
56
|
+
result. This pattern scan is not a complete security audit.
|
|
57
|
+
- `npm audit --omit=dev --audit-level=high`: passed; zero production dependency
|
|
58
|
+
advisories reported.
|
|
59
|
+
- `FCU_BROWSER_CHANNEL=chrome LLM_API_KEY= npm run agent -- doctor`: passed the
|
|
60
|
+
Node/runtime and browser-launch checks with no model configured.
|
|
61
|
+
- Public-lab build regression test: passed; it ran the build twice and confirmed
|
|
62
|
+
`docs/index.html` stayed byte-for-byte unchanged and `docs/lab/index.html` was
|
|
63
|
+
stable across both runs.
|
|
64
|
+
- Provider contract tests: eleven passed against local HTTP/fake-CLI fixtures.
|
|
65
|
+
- Provider doctor CLI: one local test passed for offline mode, a successful
|
|
66
|
+
loopback `/models` response, missing API configuration and a simulated HTTP
|
|
67
|
+
503; the configured API key and response body stayed out of CLI output.
|
|
68
|
+
- Local environment file: a subprocess test passed on macOS; a permissive `.env`
|
|
69
|
+
became owner-only before loading, a symlink was rejected without changing its
|
|
70
|
+
target, and the test key stayed out of standard output/error.
|
|
71
|
+
- Focused security-file run: 26/26 tests passed on system Chrome
|
|
72
|
+
`154.0.8037.57`, including popup redirect denial/approval, simulated DNS
|
|
73
|
+
rebinding blocked before HTTP/TLS-tunnel target receipt, hostname-to-loopback
|
|
74
|
+
denial, Ultra access to a local fixture, and approved/blocked WebSockets.
|
|
75
|
+
- WebRTC egress: Chrome `154.0.8037.57` generated an ICE offer while a local UDP
|
|
76
|
+
STUN fixture observed no direct packets; an unrelated browser preference was
|
|
77
|
+
preserved. This verifies the local STUN scenario only.
|
|
78
|
+
- Focused action and results runs: 8/8 and 1/1 tests passed on system Chrome
|
|
79
|
+
`154.0.8037.57`; upload/download/navigation, saved-download confinement and
|
|
80
|
+
result reporting remained functional. Download directory/file modes `0700`/
|
|
81
|
+
`0600` were verified on macOS.
|
|
82
|
+
- Credentialed initial URL: two focused tests passed. The library agent rejects
|
|
83
|
+
credentials before persisting a trace; the dashboard rejects credentials in
|
|
84
|
+
the starting URL or allowed-origin list before creating an agent.
|
|
85
|
+
- Cross-origin WebSocket: Chrome `154.0.8037.57` tests passed for denied and
|
|
86
|
+
approved plain WS endpoints; the denied fixture received no upgrade. A
|
|
87
|
+
browser-originated WSS test passed for an approved origin and returned a frame;
|
|
88
|
+
an unapproved WSS origin was blocked before the target received a TCP
|
|
89
|
+
connection. The test ignores its generated local certificate, so public trust
|
|
90
|
+
validation and other browser builds remain unverified.
|
|
91
|
+
- Profile and local-data lifecycle: 4/4 tests passed on macOS. Unknown fields are
|
|
92
|
+
rejected without replacing the existing vault; symbolic-link reads and writes
|
|
93
|
+
are refused; profile mode is `0600`; data directory/history modes are `0700`/
|
|
94
|
+
`0600`; deleting a stopped data directory and restarting creates a fresh empty
|
|
95
|
+
history. A forced filesystem write failure leaves the existing profile bytes
|
|
96
|
+
unchanged. Forty saved runs remain stored; the history limit only affects
|
|
97
|
+
displayed summaries. Retention is manual with no expiry. Windows/Linux
|
|
98
|
+
permissions remain unverified.
|
|
99
|
+
- IPv6 allowlist matching: focused test passed; expanded and compressed loopback
|
|
100
|
+
spellings normalize to one origin, while a different port and path-scoped
|
|
101
|
+
allowlist are denied.
|
|
102
|
+
- DNS private-address guard: a simulated first lookup to `8.8.8.8` followed by a
|
|
103
|
+
connection-time lookup to loopback was rejected before the target received an
|
|
104
|
+
HTTP request or TCP tunnel. Another test confirms a successful connection uses
|
|
105
|
+
its first vetted IP without resolving again. These run with the local proxy and
|
|
106
|
+
do not validate network-specific NAT64 or other browser builds.
|
|
107
|
+
- DNS64/NAT64: synthetic DNS64 answers for RFC 6052 prefixes `/32`, `/40`, `/48`,
|
|
108
|
+
`/56`, `/64` and `/96` reject private embedded IPv4 and allow `8.8.8.8`. The
|
|
109
|
+
current system resolver returned only IPv4 A records for `ipv4only.arpa`; live
|
|
110
|
+
network-prefix discovery remains unverified.
|
|
111
|
+
- First-run dashboard smoke: `FCU_BROWSER_CHANNEL=chrome npm run ui:smoke` passed
|
|
112
|
+
on 23 September 2026 from a clean export of commit `eca3f17` with Node `25.9.0`,
|
|
113
|
+
macOS `26.6`/Apple Silicon and system Chrome `154.0.8037.57`. Offline `npm ci`,
|
|
114
|
+
`.env.example` copy, `FCU_BROWSER_CHANNEL=chrome`, `chmod 600`, doctor, UI smoke
|
|
115
|
+
and CLI server startup all passed without a provider or browser download. The
|
|
116
|
+
smoke used keyboard input, Enter to start/approve/open the result, and Escape to
|
|
117
|
+
close it; the approved synthetic task completed with one browser action and
|
|
118
|
+
zero model calls. Output, preview, console and 1600/390 px overflow checks
|
|
119
|
+
passed. This verifies one clean-checkout onboarding path, not other OS, Node or
|
|
120
|
+
browser combinations.
|
|
121
|
+
- Results UI smoke: `FCU_BROWSER_CHANNEL=chrome npm run ui:results` passed on
|
|
122
|
+
23 September 2026 with its authored local planning fixture. The independent
|
|
123
|
+
journey oracle, result facts, fullscreen view, viewer scrolling and browser
|
|
124
|
+
console checks passed. This validates result presentation, not model planning.
|
|
125
|
+
- Dashboard UI tests: `FCU_BROWSER_CHANNEL=chrome ./node_modules/.bin/tsx --test
|
|
126
|
+
tests/ui.test.ts` passed 11/11 on 24 September 2026. Cases cover rejecting
|
|
127
|
+
site access before a visit, stopping while approval is pending, a synthetic
|
|
128
|
+
provider timeout shown as failed, a false extraction criterion shown as a
|
|
129
|
+
partial result, revoking an approved origin and blocking a fetch before the
|
|
130
|
+
local fixture receives it, and the distinct `BLOCKED` state for a
|
|
131
|
+
private-network DNS refusal. The
|
|
132
|
+
timeout used an in-process fake provider; this is not a live provider timeout
|
|
133
|
+
test. The dashboard run still reports its historical trace status as `failed`
|
|
134
|
+
with `failureKind: security` for policy blocks.
|
|
135
|
+
- Agent and security tests: `FCU_BROWSER_CHANNEL=chrome ./node_modules/.bin/tsx
|
|
136
|
+
--test tests/agent.test.ts tests/security.test.ts` passed 35/35 on 24 September
|
|
137
|
+
2026 after the permission and security-state changes. This remains local test
|
|
138
|
+
evidence, not a cross-platform or full-suite result.
|
|
139
|
+
- Lab/site smoke: `FCU_BROWSER_CHANNEL=chrome npm run lab:smoke` passed on
|
|
140
|
+
23 September 2026. It rendered 24 lab pages and eight task cards, played the
|
|
141
|
+
local 1600x900 demo clip, loaded the brand asset, and reported no browser
|
|
142
|
+
console errors. Horizontal overflow checks passed at 320, 390, 768 and 1440 px
|
|
143
|
+
for the lab pages/workflow library. It refreshed 50 lab and two dashboard PNG
|
|
144
|
+
captures. The dashboard and lab keyboard paths, accessible names, contrast,
|
|
145
|
+
and responsive widths are verified as recorded in `ROADMAP.md`. Spoken
|
|
146
|
+
VoiceOver/NVDA output remains unverified and is not claimed.
|
|
147
|
+
- DeepSeek live smoke: one completion passed on 23 September 2026 using the
|
|
148
|
+
synthetic title `Sandbox title`; one request, one parsed action, 1,517 input
|
|
149
|
+
and 73 output tokens. This did not run a browser workflow or test other
|
|
150
|
+
vendors.
|
|
151
|
+
- Full serial `FCU_BROWSER_CHANNEL=chrome npm test`: passed 100/100 on 24 September
|
|
152
|
+
2026 in 148.8 seconds before the history-scan regression test was added. The
|
|
153
|
+
latest suite passes 102/102 in 156.44 seconds at commit `d978b06` with system
|
|
154
|
+
Chrome `154.0.8037.57`, macOS `26.6`, and Node `25.9.0`. `npm test` pins test-file
|
|
155
|
+
concurrency to one. This does not validate standalone same-profile Chrome
|
|
156
|
+
relaunches, bundled Playwright Chromium, Windows, or Linux. No browser was
|
|
157
|
+
downloaded.
|
|
158
|
+
- **Clean full validation (24 September 2026, commit `1ca1006`):**
|
|
159
|
+
`npm ci --offline --no-audit --no-fund` added the locked dependencies without
|
|
160
|
+
a browser download. `FCU_BROWSER_CHANNEL=chrome npm run validate` then passed
|
|
161
|
+
in 157.19 seconds: 101/101 tests, build, history scan (248 worktree files,
|
|
162
|
+
250 unique paths, 948 unique blobs) and `npm audit` with zero vulnerabilities.
|
|
163
|
+
The run needs npm registry access only for the final audit.
|
|
164
|
+
- **Latest full validation (24 September 2026, commit `d978b06`):**
|
|
165
|
+
`env LLM_API_KEY= FCU_BROWSER_CHANNEL=chrome npm run validate` passed with
|
|
166
|
+
102/102 tests, build, history scan (255 worktree files, 257 unique paths,
|
|
167
|
+
980 unique blobs) and `npm audit` with zero vulnerabilities. No provider key
|
|
168
|
+
was configured and no GitHub workflow was triggered.
|
|
169
|
+
- One preceding clean full run passed 100/101 because a dashboard test saw a
|
|
170
|
+
local HTTP `502`; the isolated test and the next two full suites passed. The
|
|
171
|
+
test now reports captured HTTP 5xx paths before generic console errors, but
|
|
172
|
+
the original request path and root cause were not captured. Keep this
|
|
173
|
+
intermittent result visible; the passing reruns do not prove it impossible.
|
|
174
|
+
- Headed browser smoke: `FCU_BROWSER_CHANNEL=chrome npm run demo -- --headed
|
|
175
|
+
--contact` passed on 24 September 2026 with the scripted local fixture. It
|
|
176
|
+
performed seven browser actions, used zero model calls, completed the local
|
|
177
|
+
contact workflow and exited `0`. The synthetic `.fcu/demo` data was removed.
|
|
178
|
+
The full Chrome suite verifies the headless path. Both tests used Node
|
|
179
|
+
`25.9.0`, macOS `26.6`, and Chrome `154.0.8037.57`.
|
|
180
|
+
- `FCU_BROWSER_CHANNEL=chrome npm run security:wss`: passed on 24 September 2026; system Chrome `154.0.8037.57` used default TLS validation to connect to `wss://ws.postman-echo.com/raw` and received the fixed synthetic payload. This is one external endpoint check, not proof for every WSS service. Postman documents this endpoint in its [Echo API guide](https://learning.postman.com/docs/developer/echo-api).
|
|
181
|
+
- An earlier `FCU_BROWSER_CHANNEL=chrome npm run validate` had been stopped
|
|
182
|
+
during its per-file Git-history scan after 2 minutes 30 seconds; that scan
|
|
183
|
+
checked only the checkout at the time. The batched historical-object scan now
|
|
184
|
+
completes as part of the clean full validation above.
|
|
185
|
+
- ChatGPT subscription smoke: one synthetic plan completed on 23 September 2026
|
|
186
|
+
using Codex CLI `0.156.1`; local budget estimates 7,022 input / 97 output
|
|
187
|
+
tokens. The model ID and actual provider usage were not reported. No browser
|
|
188
|
+
action ran. Claude subscription remains unverified because its local
|
|
189
|
+
`claude --version` command fails with a Node `TypeError`.
|
|
190
|
+
|
|
191
|
+
Update this page only when a specific local test, dated live run, supported
|
|
192
|
+
runtime check, or public release provides new evidence. Keep failures and
|
|
193
|
+
untested combinations visible.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Threat model
|
|
2
|
+
|
|
3
|
+
**Reviewed 24 September 2026.** This describes controls visible in this checkout;
|
|
4
|
+
it is not a penetration-test report or a guarantee that a task is safe.
|
|
5
|
+
|
|
6
|
+
## Scope and assumptions
|
|
7
|
+
|
|
8
|
+
FreeComputerUse runs a Playwright browser and local dashboard under the current
|
|
9
|
+
OS account. The user chooses the starting website, provider, profile values,
|
|
10
|
+
downloads and whether to enable Ultra mode. The project does not defend against
|
|
11
|
+
malware or a person who already controls that OS account. It does not bypass
|
|
12
|
+
CAPTCHAs or website access controls.
|
|
13
|
+
|
|
14
|
+
The main assets are API credentials, provider CLI sessions, browser cookies and
|
|
15
|
+
local storage, profile values and file paths, downloaded files, SQLite run
|
|
16
|
+
history, extracted website content, and the integrity of actions and reported
|
|
17
|
+
results.
|
|
18
|
+
|
|
19
|
+
## Trust boundaries
|
|
20
|
+
|
|
21
|
+
1. **Web page to planner.** Page text is untrusted input. The provider returns a
|
|
22
|
+
typed plan; Zod validation admits only the fixed action schema. No action
|
|
23
|
+
executes arbitrary JavaScript or a shell command.
|
|
24
|
+
2. **Application to website.** `Agent` asks before its first document request to
|
|
25
|
+
an origin. Playwright checks HTTP(S) requests, frames and WebSockets against
|
|
26
|
+
the exact origin allowlist. A loopback-only Chromium DevTools Protocol
|
|
27
|
+
connection attaches to each page target before navigation and checks
|
|
28
|
+
redirect hops. Redirected documents ask for approval; redirected
|
|
29
|
+
subresources require an approved origin. Non-HTTP(S) protocols and URLs with
|
|
30
|
+
embedded user credentials are rejected before an agent trace is stored. A
|
|
31
|
+
local Chrome 154 test verifies that a fast popup redirect is blocked before
|
|
32
|
+
the unapproved target receives a request. Other browser builds are not yet
|
|
33
|
+
verified.
|
|
34
|
+
The exported low-level `Browser` denies network requests unless its caller
|
|
35
|
+
provides an allowlist or explicitly sets `allowExternal`; Ultra mode opts into
|
|
36
|
+
that unrestricted HTTP(S) policy and skips the private-address check too. In
|
|
37
|
+
normal mode, a loopback-only proxy resolves named destinations and connects
|
|
38
|
+
to the resulting numeric address for HTTP, HTTPS tunnels and WebSockets.
|
|
39
|
+
Private/reserved answers and IPv4-embedded private NAT64 addresses are
|
|
40
|
+
blocked. Explicit IP literals still require an exact allowlisted origin.
|
|
41
|
+
Network-specific NAT64 prefixes and non-HTTP browser traffic are outside this
|
|
42
|
+
address check.
|
|
43
|
+
3. **Planner to action.** By default, sensitive actions use a separate human
|
|
44
|
+
confirmation path. The executor checks that an approved target remains
|
|
45
|
+
connected and unchanged before the effect. The original goal's completion
|
|
46
|
+
criteria cannot be weakened by a repair plan. `--confirmation never` opts
|
|
47
|
+
out; Ultra mode also skips these prompts.
|
|
48
|
+
4. **Local dashboard to server.** The server binds to `127.0.0.1`; it checks the
|
|
49
|
+
Host header, a random session cookie, exact Origin and a CSRF token on
|
|
50
|
+
mutations. CSP limits scripts and connections to the local app origin.
|
|
51
|
+
5. **Application to local files.** Profile values and file paths are stored in
|
|
52
|
+
the local vault. Upload actions require an explicit file alias. Downloads are
|
|
53
|
+
resolved and confined to the configured download directory before serving.
|
|
54
|
+
6. **Application to provider.** Browser execution is local, but selected page
|
|
55
|
+
content and task context are sent to the configured API or subscription CLI
|
|
56
|
+
for planning. The provider can retain or process that content under its own
|
|
57
|
+
terms. Provider choice is a data-sharing choice, not an offline mode.
|
|
58
|
+
|
|
59
|
+
## Threat register
|
|
60
|
+
|
|
61
|
+
| Threat | Current controls in this checkout | Evidence | Residual risk and follow-up |
|
|
62
|
+
| --- | --- | --- | --- |
|
|
63
|
+
| A page uses prompt injection to redirect the task, reveal profile data or request an unsafe action. | Page content is marked untrusted; action plans use a fixed schema; profile values are resolved locally; default sensitive-action checks require confirmation; completion checks are independently verified. | Provider boundary tests; `tests/security.test.ts` covers approval, post-approval target replacement and trusted completion criteria. | A model can still misunderstand a task and page content can deceive a person. Avoid Ultra mode; in normal mode use `--confirmation always` for high-impact work. |
|
|
64
|
+
| A page, redirect, frame, fetch or WebSocket reaches an unapproved origin. | Playwright routing checks HTTP requests; a loopback-only Chromium DevTools Protocol connection intercepts page-target requests and redirect hops. A second loopback proxy applies origin policy to HTTP, HTTPS tunnels and WebSockets, resolves hostnames and dials the vetted numeric address. Normal mode approves document origins; redirected subresources need an approved origin. Private/reserved DNS answers and private IPv4 embedded in the NAT64 prefix discovered through `ipv4only.arpa` are blocked. The persistent profile sets `webrtc.ip_handling_policy=disable_non_proxied_udp`. Ultra/`allowExternal` opts out of origin and private-address checks. Unsupported protocols and embedded URL credentials are rejected at the dashboard and agent boundaries before a trace is stored. IPv6 literals are canonicalized for allowlist comparison while preserving exact ports. | `tests/security.test.ts` covers credentialed initial URLs, simulated public-to-loopback DNS rebinding before HTTP and TLS-tunnel connection, private IPv4/IPv6 DNS rejection before target receipt, synthetic DNS64 private/public IPv4 classification for each RFC 6052 prefix length, normal/Ultra separation, exact-port IPv6 origin matching, cross-origin fetch and plain WebSocket denial before server receipt, approved WebSocket forwarding, browser-originated approved WSS frame delivery and unapproved WSS denial before the target receives TCP, cleartext SSH-style CONNECT denial before dialing, WebRTC STUN UDP blocked before a local receiver, preservation of an unrelated browser preference, frame-grant cancellation, main-page redirect rejection/approval, default-deny behavior for a bare `Browser`, and popup redirect denial/approval. The local WSS fixture ignores errors from its generated certificate. Separately, `FCU_BROWSER_CHANNEL=chrome npm run security:wss` passed on 24 September: Chrome used default TLS validation with Postman Echo and received a fixed synthetic payload. This validates one endpoint/runtime only. The dashboard test confirms credentialed starting URLs and allowlist entries are rejected before an agent is created. Browser cases pass against installed Chrome `154.0.8037.57`. | Live NAT64 discovery is unverified: the current system resolver returned only IPv4 A records for `ipv4only.arpa`. Other non-HTTP traffic beyond the WebRTC STUN fixture and other browser builds remain unverified. Sites that need unproxied WebRTC UDP may fail. Explicit IP literals in normal mode still rely on exact origin approval. HTTP is also permitted. |
|
|
65
|
+
| A click or form submission causes a purchase, message, deletion or other irreversible change. | Under the default `sensitive` policy, explicit `sensitive` flags and submit actions are gated; common risky labels and form semantics are heuristically detected; the approved target is fingerprinted; uncertain effects stop automated repair. | `sensitiveReason` and executor tests cover changed targets and approval/rejection behavior. | Text heuristics cannot recognize every deceptive or ambiguous control. Prefer normal mode with `--confirmation always`; visually review the action before approval. |
|
|
66
|
+
| A remote site or another browser origin takes over the local dashboard. | Loopback binding, exact Host and Origin checks, random HttpOnly SameSite cookie, CSRF header, no CORS, restrictive CSP and bounded JSON request bodies. | Local UI tests cover missing session, cross-origin mutation rejection and successful same-origin control. | A process running as the same OS user can inspect or control local state. The dashboard is not a multi-user service; do not expose it through a tunnel or reverse proxy. |
|
|
67
|
+
| A profile path, upload alias or download receipt escapes its allowed directory. | Vault schemas reject prototype keys and unknown top-level settings; profile imports reject symlink files and save through a same-directory temporary file plus rename; upload values must be explicit `files.*` aliases; downloaded paths are checked with `realpath` and a directory boundary before serving. On macOS, profile/download files use POSIX `0600` and their directories use `0700`. | `tests/profile.test.ts` covers invalid import preservation, failed filesystem replacement preserving old bytes, symlink refusal and POSIX modes; `tests/actions.test.ts` covers upload alias confinement, download symlink rejection and download modes. | Files are not encrypted and a user can intentionally choose sensitive files. Windows/Linux permission behavior remains unverified. Keep profiles and downloads in an OS-protected account. |
|
|
68
|
+
| Secrets or session data appear in provider prompts, traces, errors or screenshots. | Known vault values and `sk-`-shaped strings are redacted; environment credentials are stripped before subscription CLIs; traces and profiles are owner-only on supported filesystems; password/payment values are omitted from record extraction. | Provider key-error tests, CLI environment tests and security tests. | Redaction patterns cannot find every secret. Provider API requests intentionally contain task/page context. Local browser profiles, backups and history are plaintext; inspect before sharing and follow retention work in Phase 2.3. |
|
|
69
|
+
| A replay repeats an obsolete action or falsely reports success. | Replay has no model, checks current page/workflow compatibility, retains normal permission gates and verifies independent completion criteria. The dashboard reuses its browser context across tasks but starts each task in a fresh tab. | Workflow and completion-oracle tests in `tests/agent.test.ts`, `tests/security.test.ts`, `tests/lab.test.ts` and `tests/ui.test.ts`; the serial suite passed 100/100 on system Chrome `154.0.8037.57` on 24 September 2026. | Similar page structure does not prove identical intent. Review learned workflows and final results. Standalone relaunch of Chrome with the same profile and bundled Playwright Chromium remain unverified. |
|
|
70
|
+
| A dependency, CLI or release artifact changes behavior or contains a vulnerability. | Lockfile, local production `npm audit`, pattern-based tracked-secret scan and explicit support matrix. GitHub Actions is intentionally disabled by owner instruction. | Local checks recorded in `docs/SUPPORT_MATRIX.md`; no remote workflow is claimed. | Scanners are incomplete; manual releases need repeatable local gates and artifact verification. Address in Phase 4.3 and Phase 6. |
|
|
71
|
+
|
|
72
|
+
## Response guidance
|
|
73
|
+
|
|
74
|
+
- Stop a run when the requested action, domain or expected result is unclear.
|
|
75
|
+
- In normal mode, use `--confirmation always` for workflows that can change
|
|
76
|
+
accounts, publish, submit, transfer, delete, purchase or send messages.
|
|
77
|
+
- Do not put real credentials, private account content or real browser profiles
|
|
78
|
+
into issue reports, screenshots or benchmark fixtures.
|
|
79
|
+
- Report a suspected vulnerability privately through GitHub's private
|
|
80
|
+
vulnerability reporting when the feature is available.
|
|
81
|
+
- Treat any claim of local execution as distinct from local-only model
|
|
82
|
+
processing: API mode sends context to the selected provider.
|
|
83
|
+
|
|
84
|
+
## Open security work
|
|
85
|
+
|
|
86
|
+
- Phase 2.2 boundary tests passed 39/39 on the verified target: macOS `26.6`,
|
|
87
|
+
Node `25.9.0` and system Chrome `154.0.8037.57`; `npm run check` passed.
|
|
88
|
+
The checked cases include redirects, DNS rebinding, private IPv4/IPv6,
|
|
89
|
+
WebSockets, a rejected cleartext CONNECT tunnel, WebRTC STUN blocking,
|
|
90
|
+
download confinement and profile symlink rejection. A separate trusted-TLS
|
|
91
|
+
WSS smoke passed against one Postman Echo endpoint. Actual NAT64 discovery,
|
|
92
|
+
other browser/OS builds, bundled Playwright Chromium and non-HTTP traffic
|
|
93
|
+
beyond the tested WSS/STUN cases remain unverified. Do not infer compatibility
|
|
94
|
+
for those targets from the local fixtures.
|
|
95
|
+
- Phase 2.3 local-data handling is validated on macOS `26.6`, Node `25.9.0`
|
|
96
|
+
and system Chrome `154.0.8037.57`: the local-data guide covers inspection,
|
|
97
|
+
export, deletion and manual retention; targeted profile/CLI/agent/results
|
|
98
|
+
tests passed 22/22, the full dashboard suite passed 11/11 in isolation, and
|
|
99
|
+
synthetic export/deletion recreated an empty mode-`0700` directory. OCR of
|
|
100
|
+
62 still images and all 290 frames in the two README GIFs found no `sk-` or
|
|
101
|
+
Bearer-shaped strings. OCR is heuristic. Storage remains unencrypted and has
|
|
102
|
+
no automatic expiry; Windows/Linux permissions remain unverified.
|
|
103
|
+
- The 24 September serial regression suite covers cancellation, synthetic
|
|
104
|
+
provider timeout, malformed responses, interrupted profile writes, rejected
|
|
105
|
+
incompatible replays, last-tab closure and all eight lab workflow replays.
|
|
106
|
+
It passed 100/100 on system Chrome `154.0.8037.57`; this does not establish
|
|
107
|
+
support for other OS/browser combinations or standalone same-profile Chrome
|
|
108
|
+
relaunches.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Useful browser examples
|
|
2
|
+
|
|
3
|
+
Open the [task library](https://othmaneblial.github.io/FreeComputerUse/lab/index.html),
|
|
4
|
+
choose **Real websites** or **Practice workflows**, expand a card, and copy its
|
|
5
|
+
goal. Paste its starting URL and goal into <http://127.0.0.1:4318>. Normal mode
|
|
6
|
+
waits for your website approval before navigating. Watch the actual browser
|
|
7
|
+
pointer, progressive typing and clicks; **Full screen** enlarges the browser and
|
|
8
|
+
keeps approvals and controls visible. **Execution log** opens the event stream.
|
|
9
|
+
**View result** presents facts and tables instead of raw JSON. Copy its summary
|
|
10
|
+
or save a standalone HTML report. Original site exports remain available under
|
|
11
|
+
Saved files only after a successful download. A stopped/failed task shows a
|
|
12
|
+
partial result. Toolbar arrows let you scroll the real page while idle or paused;
|
|
13
|
+
the agent brings action targets fully into view before clicking.
|
|
14
|
+
|
|
15
|
+
The practice site is a fictional Northstar workspace. Its filters, dialogs, file
|
|
16
|
+
exports and saved state operate in the browser. No messages, bookings, purchases,
|
|
17
|
+
real account creation or remote account changes occur.
|
|
18
|
+
|
|
19
|
+
## Three actual multi-page practice flows
|
|
20
|
+
|
|
21
|
+
These are separate HTML documents and browser navigations, rather than hidden
|
|
22
|
+
panels with a changed URL. Filters and shortlists survive navigation within the
|
|
23
|
+
flow. Starting pages use `workspace.html?view=…` under the lab URL.
|
|
24
|
+
|
|
25
|
+
| Flow | Document sequence | Result checked independently |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| Product research | Catalogue → `product-details.html?id=trail` → catalogue → `product-comparison.html` | Wireless, in-stock keyboards under EUR 100; Trail K2 and Summit Air; battery, weight, prices and exported CSV bytes |
|
|
28
|
+
| Journey planning | Search → `journey-results.html` → route details dialog → `itinerary.html` | Paris–Lyon, 2026-10-15, two adults, step-free/refundable, at most one change; Flex Regional EUR 90; local saved itinerary and downloaded file |
|
|
29
|
+
| Invoice retrieval | Filtered invoices → `invoice-details.html?id=INV-2609-04` → download | Atlas Studio, September, overdue, Maya Chen; exactly one matching invoice; EUR 180 + EUR 60 = EUR 240 and the actual downloaded contents |
|
|
30
|
+
|
|
31
|
+
Three further practice cases exercise scoped analytics, dependent preferences
|
|
32
|
+
with review/save/reload, and finding the newest finance document before download.
|
|
33
|
+
They test realistic interactions within one page and dialogs.
|
|
34
|
+
|
|
35
|
+
## Quarter-close audit: six documents, one defensible decision
|
|
36
|
+
|
|
37
|
+
The new Northstar quarter-close case starts at
|
|
38
|
+
`workspace.html?view=close`. It moves through **six actual HTML documents**:
|
|
39
|
+
|
|
40
|
+
`scope → revenue → booked ledger → pending adjustment → policy → review`.
|
|
41
|
+
|
|
42
|
+
Choose **Q3 2026 / Direct**. The revenue report shows EUR 9,400, while the
|
|
43
|
+
posted ledger contains EUR 9,300. The EUR 100 difference matches ADJ-042, but
|
|
44
|
+
that adjustment is still pending. The policy says every non-zero difference
|
|
45
|
+
needs human review, even at EUR 100. A correct review draft must therefore use
|
|
46
|
+
**Needs review**, keep the adjustment separate from booked totals, and download
|
|
47
|
+
`northstar-close-review.txt`. Incorrect figures or a premature "Ready to close"
|
|
48
|
+
decision are rejected by the practice site.
|
|
49
|
+
|
|
50
|
+
The [authored-plan run](../artifacts/benchmark-complex-authored-close.json)
|
|
51
|
+
checks the selected scope, extracted source values, every document visit,
|
|
52
|
+
saved review state and actual downloaded file bytes. It also replays the
|
|
53
|
+
compatible workflow with no model provider. This validates execution and reuse.
|
|
54
|
+
The [separate live Flash trial](../artifacts/benchmark-complex-live-close.json)
|
|
55
|
+
completed with 24 successful actions, two repaired failures, 11 model calls,
|
|
56
|
+
30,841 tokens and a configured-price estimate of $0.00650. Its compatible
|
|
57
|
+
repeat passed with zero model calls. Earlier failures with tighter budgets and
|
|
58
|
+
the pre-fix export handling are preserved as separate reports; one controlled
|
|
59
|
+
success is not a general website success rate.
|
|
60
|
+
|
|
61
|
+
Model-call and token caps are optional. New installs have no total model budget
|
|
62
|
+
cap; an older local `.env` may still set `FCU_MAX_INPUT_TOKENS` or
|
|
63
|
+
`FCU_MAX_LLM_CALLS`. Remove those lines if long tasks stop on a budget limit.
|
|
64
|
+
The dashboard shows actual usage and configured-price cost estimates.
|
|
65
|
+
|
|
66
|
+
## Incident desk: compare the signal before writing a brief
|
|
67
|
+
|
|
68
|
+
Start at `workspace.html?view=incident`. The six-document sequence is
|
|
69
|
+
`alert queue → incident timeline → request metrics → deployments → runbook → local brief`.
|
|
70
|
+
Filter to **API Gateway / High / Last 24 hours** so INC-204 is isolated. The
|
|
71
|
+
timeline places deployment `dep-7c3` at 09:58 UTC and the alert at 10:04.
|
|
72
|
+
For `/v1/search`, the 429 rate rises from **0.4% to 12.4%**. The prior stable
|
|
73
|
+
deployment used `burst_limit=100`; `dep-7c3` uses `20`. The runbook asks for
|
|
74
|
+
**Needs engineer review**, not an automatic rollback or a claim of proven
|
|
75
|
+
causality. The final page rejects the wrong endpoint, figures, deployment or
|
|
76
|
+
decision. A valid local draft downloads as `northstar-incident-brief.txt`.
|
|
77
|
+
|
|
78
|
+
The [authored-plan report](../artifacts/benchmark-complex-authored-incident.json)
|
|
79
|
+
verifies filtered state, source extracts, all document visits, the saved draft
|
|
80
|
+
and actual file bytes, then repeats without a provider. The
|
|
81
|
+
[separate live Flash trial](../artifacts/benchmark-complex-live-incident.json)
|
|
82
|
+
passed with 23 successful actions, two repaired failures, 12 model calls,
|
|
83
|
+
35,968 tokens and a configured-price estimate of $0.00818. Its compatible
|
|
84
|
+
repeat used zero model calls. One controlled trial does not establish a
|
|
85
|
+
general success rate or prove that a real deployment caused a real incident.
|
|
86
|
+
|
|
87
|
+
For a harder test, use the same starting page with this prompt. It leaves the
|
|
88
|
+
rates and configuration change for the agent to discover:
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
Investigate synthetic incident INC-204. Filter the alert queue to API Gateway, High severity, and Last 24 hours. Open the incident, inspect its timeline, request metrics, deployment comparison, and runbook. Use the evidence you find to complete the incident brief: affected endpoint, before/after 429 rates, relevant deployment, configuration change, and the appropriate review decision. Save the brief locally and download it. Do not roll back a service, contact customers, or claim the cause is proven.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
After the navigation and evidence-context fixes, this exact prompt passed in
|
|
95
|
+
[one live Flash trial](../artifacts/benchmark-complex-live-incident-challenge.json):
|
|
96
|
+
21 successful browser actions, one repaired failure, 10 model calls, 31,973
|
|
97
|
+
tokens and an estimated $0.00635 at the configured prices. Its compatible
|
|
98
|
+
repeat passed with zero model calls. This is one controlled run on synthetic
|
|
99
|
+
pages, not a reliability estimate for other websites.
|
|
100
|
+
|
|
101
|
+
## Ten researched tasks on real free websites
|
|
102
|
+
|
|
103
|
+
Research checks public sources and the task design. It does not by itself prove
|
|
104
|
+
that our agent completes a task. Trial results are recorded separately in the
|
|
105
|
+
[real-world report](../artifacts/benchmark-real-world.json). Untested cards say so.
|
|
106
|
+
|
|
107
|
+
| Need | Starting website and source | Why it is useful |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| Audit a software dependency | [GitHub / Playwright](https://github.com/microsoft/playwright) | Inspect latest stable release, licence and security policy across documents |
|
|
110
|
+
| Shortlist a small local model | [Hugging Face / Qwen3](https://huggingface.co/Qwen/Qwen3-0.6B) | Compare cards, configs and sharded weight listings; distinguish weight size from total repository size |
|
|
111
|
+
| Check free hosting quotas | [Cloudflare Workers limits](https://developers.cloudflare.com/workers/platform/limits/) | Collect Workers, static-assets and D1 limits for a concrete prototype workload |
|
|
112
|
+
| Check browser compatibility | [MDN / structuredClone](https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone) | Compare three reference tables and follow a fallback guide; hydrated tables remain a stretch case |
|
|
113
|
+
| Compare laptops for two monitors | [Apple Mac comparison](https://www.apple.com/mac/compare/) | Change three model selectors and verify display limitations in support articles |
|
|
114
|
+
| Find a usable EV dataset | [Data.gov](https://catalog.data.gov/) | Search, filter and collect publisher/licence/resource metadata and the exact CSV URL |
|
|
115
|
+
| Prepare a statistics brief | [GOV.UK / National Travel Survey 2024](https://www.gov.uk/government/statistics/national-travel-survey-2024) | Navigate to the factsheet, extract measures and scope, return and collect its PDF URL |
|
|
116
|
+
| Compare accessible London routes | [TfL journey planner](https://tfl.gov.uk/plan-a-journey/) | Autocomplete, departure time, accessibility preferences and route legs; complete route generation remains untested |
|
|
117
|
+
| Find a suitable reading edition | [Wikisource / Jane Austen](https://en.wikisource.org/wiki/Author:Jane_Austen) | Follow the bibliography, compare editions, count chapter links and verify destinations |
|
|
118
|
+
| Inventory city-service data | [Data.gov / Philadelphia 311](https://catalog.data.gov/dataset/311-service-and-information-requests) | Compare two catalogue records, coverage, update fields and downloadable-resource URLs |
|
|
119
|
+
|
|
120
|
+
These external goals are for public reading/research. They do not authorize
|
|
121
|
+
messaging, buying, signing in or modifying real accounts. Large datasets and model
|
|
122
|
+
weights are inspected as links/listings, without downloads. Inline PDFs are
|
|
123
|
+
returned as URLs: clicking them is not advertised as a guaranteed download.
|
|
124
|
+
Sites that block automation are excluded; challenges are not bypassed.
|
|
125
|
+
|
|
126
|
+
Detailed source evidence: [consumer research](../research_useful_browser_tasks/findings_consumer.md)
|
|
127
|
+
and [professional research](../research_useful_browser_tasks/findings_professional.md).
|
|
128
|
+
|
|
129
|
+
## Run checks locally
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npm run lab:build
|
|
133
|
+
npm run lab:serve # http://127.0.0.1:4319/lab/
|
|
134
|
+
npm run lab:smoke # 24 screens, desktop/mobile, console and overflow
|
|
135
|
+
npm run ui:results # authored local journey: cards, cursor, visible controls
|
|
136
|
+
npm run benchmark:complex # supplied action plans; no model-planning claim
|
|
137
|
+
npm run benchmark:complex -- --live # real Flash planning; spends API tokens
|
|
138
|
+
npm run benchmark:real # real GitHub/GOV.UK trials; spends API tokens
|
|
139
|
+
npm run validate # local checks only; GitHub CI is disabled
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Each complex execution test checks state, extracted rows and file bytes, then
|
|
143
|
+
repeats a compatible learned workflow with no provider installed. Each live trial
|
|
144
|
+
reports correctness, model calls, tokens, cost estimates, repairs and repeat
|
|
145
|
+
outcomes. Historical failed trials remain visible; individual passes are not a
|
|
146
|
+
general success-rate claim.
|
|
147
|
+
|
|
148
|
+
The [aggregate authored report](../artifacts/benchmark-complex-authored.json)
|
|
149
|
+
covers all eight practice workflows. The two long cases also have separate
|
|
150
|
+
real-Flash reports linked above. Supplied action plans and real model plans are
|
|
151
|
+
not interchangeable evidence.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">FreeComputerUse mark</title>
|
|
3
|
+
<desc id="desc">A cursor acting inside a browser window.</desc>
|
|
4
|
+
<rect x="1" y="1" width="62" height="62" rx="19" fill="#101712"/>
|
|
5
|
+
<rect x="9" y="10" width="46" height="44" rx="7" fill="#18231a" stroke="#eaf0e4" stroke-width="3"/>
|
|
6
|
+
<path d="M12 21h40" stroke="#c9ed72" stroke-width="7"/>
|
|
7
|
+
<circle cx="17" cy="16" r="1.6" fill="#101712"/>
|
|
8
|
+
<circle cx="22.5" cy="16" r="1.6" fill="#101712"/>
|
|
9
|
+
<circle cx="28" cy="16" r="1.6" fill="#101712"/>
|
|
10
|
+
<path d="M16 29h7M16 35h6" stroke="#9aaa91" stroke-linecap="round" stroke-width="2.5"/>
|
|
11
|
+
<path d="M25 25v25l7.4-7.1 6.2 12.2 5.4-2.8-6.2-12.2 11-.4z" fill="#c9ed72" stroke="#18231a" stroke-linejoin="round" stroke-width="2.4"/>
|
|
12
|
+
</svg>
|
package/package.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "free-computer-use",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-first AI browser automation with Playwright and user-approved actions.",
|
|
5
|
+
"homepage": "https://othmaneblial.github.io/FreeComputerUse/",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/OthmaneBlial/FreeComputerUse.git"
|
|
9
|
+
},
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/OthmaneBlial/FreeComputerUse/issues"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"ai-agent",
|
|
15
|
+
"browser-automation",
|
|
16
|
+
"browser-use",
|
|
17
|
+
"computer-use",
|
|
18
|
+
"playwright",
|
|
19
|
+
"local-first",
|
|
20
|
+
"multi-model",
|
|
21
|
+
"openai-compatible",
|
|
22
|
+
"openai",
|
|
23
|
+
"anthropic",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"chatgpt",
|
|
26
|
+
"deepseek",
|
|
27
|
+
"grok",
|
|
28
|
+
"openrouter"
|
|
29
|
+
],
|
|
30
|
+
"type": "module",
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=22.13.0"
|
|
33
|
+
},
|
|
34
|
+
"bin": {
|
|
35
|
+
"agent": "dist/cli/index.js"
|
|
36
|
+
},
|
|
37
|
+
"exports": {
|
|
38
|
+
".": "./dist/index.js"
|
|
39
|
+
},
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc && node scripts/copy-ui.mjs",
|
|
43
|
+
"check": "tsc --noEmit && tsc -p tsconfig.tests.json",
|
|
44
|
+
"test": "tsx --test --test-concurrency=1 tests/*.test.ts",
|
|
45
|
+
"validate": "npm run lab:build && npm run check && npm test && npm run build && npm run security && npm audit --omit=dev --audit-level=high",
|
|
46
|
+
"agent": "tsx src/cli/index.ts",
|
|
47
|
+
"dev": "tsx src/cli/index.ts ui",
|
|
48
|
+
"demo": "tsx scripts/demo.ts",
|
|
49
|
+
"fixtures": "tsx fixtures/server.ts",
|
|
50
|
+
"benchmark": "tsx scripts/benchmark.ts",
|
|
51
|
+
"security": "node scripts/security-check.mjs --history",
|
|
52
|
+
"security:wss": "tsx scripts/wss-smoke.ts",
|
|
53
|
+
"benchmark:public": "tsx scripts/public-benchmark.ts",
|
|
54
|
+
"lab:build": "tsx scripts/build-lab.ts",
|
|
55
|
+
"lab:serve": "tsx scripts/lab-server.ts",
|
|
56
|
+
"lab:smoke": "tsx scripts/lab-smoke.ts",
|
|
57
|
+
"benchmark:complex": "tsx scripts/complex-benchmark.ts",
|
|
58
|
+
"benchmark:real": "tsx scripts/real-world-benchmark.ts",
|
|
59
|
+
"ui:smoke": "tsx scripts/ui-smoke.ts",
|
|
60
|
+
"ui:results": "tsx scripts/results-smoke.ts"
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"dist",
|
|
64
|
+
"README.md",
|
|
65
|
+
"LICENSE",
|
|
66
|
+
".env.example",
|
|
67
|
+
"SECURITY.md",
|
|
68
|
+
"CONTRIBUTING.md",
|
|
69
|
+
"CHANGELOG.md",
|
|
70
|
+
"docs/*.md",
|
|
71
|
+
"docs/brand-mark.svg",
|
|
72
|
+
"assets/readme/hero.svg",
|
|
73
|
+
"assets/readme/incident-demo.gif",
|
|
74
|
+
"assets/readme/incident-evidence.json",
|
|
75
|
+
"artifacts/benchmark-public.json"
|
|
76
|
+
],
|
|
77
|
+
"license": "MIT",
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"@modelcontextprotocol/server": "2.0.0",
|
|
80
|
+
"commander": "15.0.0",
|
|
81
|
+
"playwright": "1.63.0",
|
|
82
|
+
"zod": "4.6.5"
|
|
83
|
+
},
|
|
84
|
+
"devDependencies": {
|
|
85
|
+
"@modelcontextprotocol/client": "2.0.0",
|
|
86
|
+
"@types/node": "26.6.1",
|
|
87
|
+
"tsx": "4.23.13",
|
|
88
|
+
"typescript": "7.0.2"
|
|
89
|
+
}
|
|
90
|
+
}
|