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.
Files changed (135) hide show
  1. package/.env.example +31 -0
  2. package/CHANGELOG.md +19 -0
  3. package/CONTRIBUTING.md +66 -0
  4. package/LICENSE +21 -0
  5. package/README.md +140 -0
  6. package/SECURITY.md +133 -0
  7. package/artifacts/benchmark-public.json +797 -0
  8. package/assets/readme/hero.svg +53 -0
  9. package/assets/readme/incident-demo.gif +0 -0
  10. package/assets/readme/incident-evidence.json +52 -0
  11. package/dist/actions/compiler.d.ts +5 -0
  12. package/dist/actions/compiler.js +16 -0
  13. package/dist/actions/compiler.js.map +1 -0
  14. package/dist/actions/executor.d.ts +38 -0
  15. package/dist/actions/executor.js +305 -0
  16. package/dist/actions/executor.js.map +1 -0
  17. package/dist/actions/policy.d.ts +4 -0
  18. package/dist/actions/policy.js +18 -0
  19. package/dist/actions/policy.js.map +1 -0
  20. package/dist/actions/schema.d.ts +4149 -0
  21. package/dist/actions/schema.js +59 -0
  22. package/dist/actions/schema.js.map +1 -0
  23. package/dist/adapters/generic.d.ts +14 -0
  24. package/dist/adapters/generic.js +33 -0
  25. package/dist/adapters/generic.js.map +1 -0
  26. package/dist/agent/Agent.d.ts +69 -0
  27. package/dist/agent/Agent.js +375 -0
  28. package/dist/agent/Agent.js.map +1 -0
  29. package/dist/agent/Control.d.ts +23 -0
  30. package/dist/agent/Control.js +51 -0
  31. package/dist/agent/Control.js.map +1 -0
  32. package/dist/agent/TokenBudget.d.ts +52 -0
  33. package/dist/agent/TokenBudget.js +47 -0
  34. package/dist/agent/TokenBudget.js.map +1 -0
  35. package/dist/agent/goalCriteria.d.ts +2 -0
  36. package/dist/agent/goalCriteria.js +13 -0
  37. package/dist/agent/goalCriteria.js.map +1 -0
  38. package/dist/browser/Browser.d.ts +72 -0
  39. package/dist/browser/Browser.js +378 -0
  40. package/dist/browser/Browser.js.map +1 -0
  41. package/dist/browser/DomExtractor.d.ts +6 -0
  42. package/dist/browser/DomExtractor.js +134 -0
  43. package/dist/browser/DomExtractor.js.map +1 -0
  44. package/dist/browser/Interaction.d.ts +43 -0
  45. package/dist/browser/Interaction.js +225 -0
  46. package/dist/browser/Interaction.js.map +1 -0
  47. package/dist/browser/NetworkGuardProxy.d.ts +31 -0
  48. package/dist/browser/NetworkGuardProxy.js +331 -0
  49. package/dist/browser/NetworkGuardProxy.js.map +1 -0
  50. package/dist/browser/Observer.d.ts +12 -0
  51. package/dist/browser/Observer.js +31 -0
  52. package/dist/browser/Observer.js.map +1 -0
  53. package/dist/browser/PageCompressor.d.ts +47 -0
  54. package/dist/browser/PageCompressor.js +62 -0
  55. package/dist/browser/PageCompressor.js.map +1 -0
  56. package/dist/browser/SecurityBoundaryError.d.ts +3 -0
  57. package/dist/browser/SecurityBoundaryError.js +4 -0
  58. package/dist/browser/SecurityBoundaryError.js.map +1 -0
  59. package/dist/browser/SelectorEngine.d.ts +18 -0
  60. package/dist/browser/SelectorEngine.js +72 -0
  61. package/dist/browser/SelectorEngine.js.map +1 -0
  62. package/dist/browser/types.d.ts +38 -0
  63. package/dist/browser/types.js +2 -0
  64. package/dist/browser/types.js.map +1 -0
  65. package/dist/cli/index.d.ts +2 -0
  66. package/dist/cli/index.js +284 -0
  67. package/dist/cli/index.js.map +1 -0
  68. package/dist/config.d.ts +11 -0
  69. package/dist/config.js +77 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/history/TraceStore.d.ts +29 -0
  72. package/dist/history/TraceStore.js +53 -0
  73. package/dist/history/TraceStore.js.map +1 -0
  74. package/dist/index.d.ts +18 -0
  75. package/dist/index.js +16 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/llm/ClaudeSubscriptionProvider.d.ts +26 -0
  78. package/dist/llm/ClaudeSubscriptionProvider.js +182 -0
  79. package/dist/llm/ClaudeSubscriptionProvider.js.map +1 -0
  80. package/dist/llm/CodexSubscriptionProvider.d.ts +26 -0
  81. package/dist/llm/CodexSubscriptionProvider.js +168 -0
  82. package/dist/llm/CodexSubscriptionProvider.js.map +1 -0
  83. package/dist/llm/FlashProvider.d.ts +27 -0
  84. package/dist/llm/FlashProvider.js +103 -0
  85. package/dist/llm/FlashProvider.js.map +1 -0
  86. package/dist/llm/LLMProvider.d.ts +37 -0
  87. package/dist/llm/LLMProvider.js +2 -0
  88. package/dist/llm/LLMProvider.js.map +1 -0
  89. package/dist/llm/cliEnvironment.d.ts +5 -0
  90. package/dist/llm/cliEnvironment.js +21 -0
  91. package/dist/llm/cliEnvironment.js.map +1 -0
  92. package/dist/llm/prompts.d.ts +4 -0
  93. package/dist/llm/prompts.js +12 -0
  94. package/dist/llm/prompts.js.map +1 -0
  95. package/dist/llm/structuredOutput.d.ts +3 -0
  96. package/dist/llm/structuredOutput.js +58 -0
  97. package/dist/llm/structuredOutput.js.map +1 -0
  98. package/dist/mcp/index.d.ts +13 -0
  99. package/dist/mcp/index.js +243 -0
  100. package/dist/mcp/index.js.map +1 -0
  101. package/dist/profile/ProfileStore.d.ts +7 -0
  102. package/dist/profile/ProfileStore.js +52 -0
  103. package/dist/profile/ProfileStore.js.map +1 -0
  104. package/dist/profile/VariableResolver.d.ts +15 -0
  105. package/dist/profile/VariableResolver.js +50 -0
  106. package/dist/profile/VariableResolver.js.map +1 -0
  107. package/dist/server/index.d.ts +14 -0
  108. package/dist/server/index.js +239 -0
  109. package/dist/server/index.js.map +1 -0
  110. package/dist/ui/app.js +132 -0
  111. package/dist/ui/index.html +29 -0
  112. package/dist/ui/logo.svg +5 -0
  113. package/dist/ui/results.js +59 -0
  114. package/dist/ui/style.css +33 -0
  115. package/dist/verification/Verifier.d.ts +72 -0
  116. package/dist/verification/Verifier.js +87 -0
  117. package/dist/verification/Verifier.js.map +1 -0
  118. package/dist/workflows/WorkflowEngine.d.ts +23 -0
  119. package/dist/workflows/WorkflowEngine.js +52 -0
  120. package/dist/workflows/WorkflowEngine.js.map +1 -0
  121. package/docs/ADOPTION.md +61 -0
  122. package/docs/ARCHITECTURE.md +65 -0
  123. package/docs/BENCHMARKS.md +64 -0
  124. package/docs/IMPLEMENTATION.md +93 -0
  125. package/docs/LOCAL_DATA.md +98 -0
  126. package/docs/LOCAL_VALIDATION.md +87 -0
  127. package/docs/MCP.md +81 -0
  128. package/docs/PROVIDERS.md +150 -0
  129. package/docs/RELEASE_CHECKLIST.md +37 -0
  130. package/docs/REQUIREMENTS.md +39 -0
  131. package/docs/SUPPORT_MATRIX.md +193 -0
  132. package/docs/THREAT_MODEL.md +108 -0
  133. package/docs/USEFUL_EXAMPLES.md +151 -0
  134. package/docs/brand-mark.svg +12 -0
  135. 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
+ }