@mseep/open-computer-use 1.0.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 (769) hide show
  1. package/.coderabbit.yaml +25 -0
  2. package/.dockerignore +95 -0
  3. package/.env.example +137 -0
  4. package/.githooks/pre-commit +68 -0
  5. package/.github/CODEOWNERS +125 -0
  6. package/.github/ISSUE_TEMPLATE/adr-proposal.md +41 -0
  7. package/.github/ISSUE_TEMPLATE/bug-report.md +49 -0
  8. package/.github/ISSUE_TEMPLATE/component-proposal.md +38 -0
  9. package/.github/ISSUE_TEMPLATE/config.yml +15 -0
  10. package/.github/ISSUE_TEMPLATE/dependency-proposal.md +59 -0
  11. package/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
  12. package/.github/ISSUE_TEMPLATE/nfr-proposal.md +44 -0
  13. package/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  14. package/.github/codeql/codeql-config.yml +11 -0
  15. package/.github/codeql/extensions/security-models/python-sanitizers.model.yml +17 -0
  16. package/.github/codeql/extensions/security-models/qlpack.yml +7 -0
  17. package/.github/dependabot.yml +23 -0
  18. package/.github/security-exceptions.yml +23 -0
  19. package/.github/workflows/build.yml +420 -0
  20. package/.github/workflows/codeql.yml +33 -0
  21. package/.github/workflows/contracts-lint.yml +90 -0
  22. package/.github/workflows/docs-lint.yml +151 -0
  23. package/.github/workflows/helm.yml +131 -0
  24. package/.github/workflows/identity-lint.yml +30 -0
  25. package/.github/workflows/release-chart.yml +177 -0
  26. package/.github/workflows/release.yml +95 -0
  27. package/.github/workflows/security.yml +332 -0
  28. package/.github/workflows/stale.yml +31 -0
  29. package/.github/workflows/supply-chain.yml +242 -0
  30. package/.gitleaks.toml +53 -0
  31. package/.markdownlint.yaml +51 -0
  32. package/.semgrepignore +85 -0
  33. package/.vale/styles/Architecture/ap13-data-class-substrate.yml +12 -0
  34. package/.vale/styles/Architecture/banned-phrases.yml +23 -0
  35. package/.vale/styles/Architecture/banned-vocab.yml +23 -0
  36. package/.vale/styles/Architecture/marketing-tone.yml +19 -0
  37. package/.vale.ini +18 -0
  38. package/CHANGELOG.md +411 -0
  39. package/CLAUDE.md +218 -0
  40. package/CONTRIBUTING.md +82 -0
  41. package/Dockerfile +676 -0
  42. package/LICENSE +98 -0
  43. package/LICENSE-APACHE +202 -0
  44. package/LICENSE-MIT +21 -0
  45. package/NOTICE +36 -0
  46. package/README.md +516 -0
  47. package/SECURITY.md +45 -0
  48. package/THIRD-PARTY-LICENSES.md +14 -0
  49. package/apt-packages.txt +108 -0
  50. package/computer-use-server/.dockerignore +13 -0
  51. package/computer-use-server/Dockerfile +44 -0
  52. package/computer-use-server/README.md +84 -0
  53. package/computer-use-server/app.py +1544 -0
  54. package/computer-use-server/bin/list-subagent-models +449 -0
  55. package/computer-use-server/cli-defaults/README.md +31 -0
  56. package/computer-use-server/cli-defaults/codex.json +7 -0
  57. package/computer-use-server/cli-defaults/opencode.json +18 -0
  58. package/computer-use-server/cli_adapters/__init__.py +46 -0
  59. package/computer-use-server/cli_adapters/claude.py +163 -0
  60. package/computer-use-server/cli_adapters/codex.py +163 -0
  61. package/computer-use-server/cli_adapters/opencode.py +169 -0
  62. package/computer-use-server/cli_adapters/result.py +34 -0
  63. package/computer-use-server/cli_runtime.py +316 -0
  64. package/computer-use-server/context_vars.py +24 -0
  65. package/computer-use-server/docker_manager.py +1100 -0
  66. package/computer-use-server/docs_html.py +12 -0
  67. package/computer-use-server/mcp_resources.py +170 -0
  68. package/computer-use-server/mcp_tools.py +1430 -0
  69. package/computer-use-server/requirements.txt +17 -0
  70. package/computer-use-server/security.py +50 -0
  71. package/computer-use-server/skill_manager.py +664 -0
  72. package/computer-use-server/static/browser-viewer.js +445 -0
  73. package/computer-use-server/static/chart.umd.js +14 -0
  74. package/computer-use-server/static/docs.html +203 -0
  75. package/computer-use-server/static/github-dark.min.css +10 -0
  76. package/computer-use-server/static/github.min.css +10 -0
  77. package/computer-use-server/static/highlight.min.js +1213 -0
  78. package/computer-use-server/static/highlightjs-line-numbers.min.js +1 -0
  79. package/computer-use-server/static/icons.js +74 -0
  80. package/computer-use-server/static/jszip.min.js +13 -0
  81. package/computer-use-server/static/katex/auto-render.min.js +1 -0
  82. package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.ttf +0 -0
  83. package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
  84. package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  85. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  86. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  87. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  88. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  89. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  90. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  91. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  92. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  93. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  94. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  95. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  96. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  97. package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.ttf +0 -0
  98. package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff +0 -0
  99. package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  100. package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  101. package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  102. package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  103. package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.ttf +0 -0
  104. package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff +0 -0
  105. package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  106. package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.ttf +0 -0
  107. package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff +0 -0
  108. package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  109. package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  110. package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  111. package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  112. package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.ttf +0 -0
  113. package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff +0 -0
  114. package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  115. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  116. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  117. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  118. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  119. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  120. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  121. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  122. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  123. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  124. package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.ttf +0 -0
  125. package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff +0 -0
  126. package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  127. package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.ttf +0 -0
  128. package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
  129. package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  130. package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.ttf +0 -0
  131. package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
  132. package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  133. package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.ttf +0 -0
  134. package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
  135. package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  136. package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.ttf +0 -0
  137. package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
  138. package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  139. package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  140. package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  141. package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  142. package/computer-use-server/static/katex/katex.min.css +1 -0
  143. package/computer-use-server/static/katex/katex.min.js +1 -0
  144. package/computer-use-server/static/locale.js +242 -0
  145. package/computer-use-server/static/mammoth.browser.min.js +21 -0
  146. package/computer-use-server/static/marked.min.js +6 -0
  147. package/computer-use-server/static/mermaid.min.js +2811 -0
  148. package/computer-use-server/static/pdf.min.js +22 -0
  149. package/computer-use-server/static/pdf.worker.min.js +22 -0
  150. package/computer-use-server/static/pptxviewjs.min.js +1 -0
  151. package/computer-use-server/static/preact-htm.min.js +1 -0
  152. package/computer-use-server/static/preview.css +1030 -0
  153. package/computer-use-server/static/preview.js +1522 -0
  154. package/computer-use-server/static/xlsx.full.min.js +22 -0
  155. package/computer-use-server/static/xterm-addon-fit.min.js +2 -0
  156. package/computer-use-server/static/xterm-addon-web-links.min.js +2 -0
  157. package/computer-use-server/static/xterm.css +218 -0
  158. package/computer-use-server/static/xterm.min.js +2 -0
  159. package/computer-use-server/system_prompt.py +761 -0
  160. package/computer-use-server/uploads.py +82 -0
  161. package/contracts/README.md +53 -0
  162. package/contracts/audit/audit-fanin.asyncapi.yaml +407 -0
  163. package/contracts/exec/exec-channel.schema.json +240 -0
  164. package/contracts/mcp/2025-06-18/ocu-constraints.schema.json +178 -0
  165. package/contracts/storage/file-artifact-api.schema.json +390 -0
  166. package/contracts/storage/file-ops.schema.json +217 -0
  167. package/contracts/storage/mount-config.schema.json +197 -0
  168. package/cron/Dockerfile +15 -0
  169. package/cron/cleanup-quick.sh +21 -0
  170. package/cron/cleanup.sh +127 -0
  171. package/data/outputs/.gitkeep +0 -0
  172. package/data/uploads/.gitkeep +0 -0
  173. package/docker-compose.test.yml +54 -0
  174. package/docker-compose.webui.yml +77 -0
  175. package/docker-compose.yml +96 -0
  176. package/docs/CLOUD.md +29 -0
  177. package/docs/COMPARISON.md +128 -0
  178. package/docs/DOCKER.md +469 -0
  179. package/docs/DYNAMIC-SKILLS.md +77 -0
  180. package/docs/FEATURES.md +100 -0
  181. package/docs/INSTALL.md +111 -0
  182. package/docs/KNOWN-BUGS.md +86 -0
  183. package/docs/MCP.md +320 -0
  184. package/docs/SCREENSHOTS.md +39 -0
  185. package/docs/SKILLS-USER-GUIDE.md +86 -0
  186. package/docs/SKILLS.md +483 -0
  187. package/docs/TERMINAL-TAB.md +56 -0
  188. package/docs/architecture/02-trust-boundaries.md +224 -0
  189. package/docs/architecture/03-c4-context.md +61 -0
  190. package/docs/architecture/04-bounded-contexts.md +119 -0
  191. package/docs/architecture/05-c4-container.md +88 -0
  192. package/docs/architecture/06-threat-model.md +172 -0
  193. package/docs/architecture/08-contracts.md +105 -0
  194. package/docs/architecture/MANIFESTO.md +38 -0
  195. package/docs/architecture/PROCESS.md +64 -0
  196. package/docs/architecture/README.md +37 -0
  197. package/docs/architecture/adr/0000-template.md +65 -0
  198. package/docs/architecture/adr/0001-layer-0-gate-legacy-exclusion.md +75 -0
  199. package/docs/architecture/adr/0002-session-view-descriptor.md +57 -0
  200. package/docs/architecture/adr/0003-sandbox-runtime-tier-ladder.md +63 -0
  201. package/docs/architecture/adr/0004-operator-authentication-substrate.md +63 -0
  202. package/docs/architecture/adr/0005-egress-credential-delivery-envoy-sds.md +62 -0
  203. package/docs/architecture/adr/0006-egress-forward-proxy-substrate.md +65 -0
  204. package/docs/architecture/adr/0007-egress-auth-mechanism.md +72 -0
  205. package/docs/architecture/adr/0008-session-egress-attribution.md +59 -0
  206. package/docs/architecture/adr/0009-audit-pipeline-pluggable-by-contract.md +76 -0
  207. package/docs/architecture/adr/0010-storage-backend-pluggable-adapter.md +60 -0
  208. package/docs/architecture/adr/0011-storage-egress-lane.md +67 -0
  209. package/docs/architecture/adr/0012-implementation-language.md +67 -0
  210. package/docs/architecture/adr/0020-sandbox-image-provisioning.md +82 -0
  211. package/docs/architecture/adr/README.md +53 -0
  212. package/docs/architecture/compliance/.gitkeep +0 -0
  213. package/docs/architecture/components/00-overview.md +42 -0
  214. package/docs/architecture/components/0000-template.md +50 -0
  215. package/docs/architecture/components/01-mcp-gateway.md +80 -0
  216. package/docs/architecture/components/02-control-operator-api.md +80 -0
  217. package/docs/architecture/components/04-storage-broker.md +104 -0
  218. package/docs/architecture/components/05-session-sandbox.md +93 -0
  219. package/docs/architecture/components/06-egress-trust-edge.md +95 -0
  220. package/docs/architecture/components/07-audit-pipeline.md +110 -0
  221. package/docs/architecture/diagrams/.gitkeep +0 -0
  222. package/docs/architecture/diagrams/02-trust-boundaries.mmd +111 -0
  223. package/docs/architecture/diagrams/06-threat-model.mmd +41 -0
  224. package/docs/architecture/diagrams/08-contracts.mmd +47 -0
  225. package/docs/architecture/diagrams/c4-container.mmd +59 -0
  226. package/docs/architecture/diagrams/c4-context.mmd +46 -0
  227. package/docs/architecture/glossary.md +172 -0
  228. package/docs/architecture/manifesto/.gitkeep +0 -0
  229. package/docs/architecture/manifesto/01-audience-and-buyer.md +57 -0
  230. package/docs/architecture/manifesto/02-nfrs.md +325 -0
  231. package/docs/architecture/manifesto/03-non-negotiables.md +35 -0
  232. package/docs/architecture/manifesto/04-non-goals.md +23 -0
  233. package/docs/architecture/manifesto/05-licensing-posture.md +61 -0
  234. package/docs/architecture/manifesto/06-starter-mode-policy.md +49 -0
  235. package/docs/architecture/manifesto/07-governance.md +60 -0
  236. package/docs/architecture/primitives-backlog.md +51 -0
  237. package/docs/architecture.svg +117 -0
  238. package/docs/claude-code-gateway.md +173 -0
  239. package/docs/cli-config-templates.md +240 -0
  240. package/docs/data-flow.svg +72 -0
  241. package/docs/demo-landing-page.gif +0 -0
  242. package/docs/demo-qwen-trending.gif +0 -0
  243. package/docs/dynamic-skills.svg +77 -0
  244. package/docs/file-flow.svg +126 -0
  245. package/docs/future-architecture/README.md +152 -0
  246. package/docs/future-architecture/adr/0001-control-plane-language-go.md +80 -0
  247. package/docs/future-architecture/adr/0002-guest-agent-language-go.md +84 -0
  248. package/docs/future-architecture/adr/0003-docker-poc-first-then-k8s.md +37 -0
  249. package/docs/future-architecture/adr/0004-pluggable-runtime-via-runtimeclass.md +34 -0
  250. package/docs/future-architecture/adr/0005-mcp-as-control-plane-gateway.md +34 -0
  251. package/docs/future-architecture/adr/0006-no-agpl-no-bsl-dependencies.md +41 -0
  252. package/docs/future-architecture/adr/0007-superseded-by-future-architecture.md +37 -0
  253. package/docs/future-architecture/adr/0008-internal-grpc-external-rest-mcp.md +106 -0
  254. package/docs/future-architecture/adr/0009-external-protocol-dialects.md +94 -0
  255. package/docs/future-architecture/adr/0010-lambda-as-inspiration-not-runtime.md +86 -0
  256. package/docs/future-architecture/adr/0011-kata-as-first-class-dind-runtime.md +84 -0
  257. package/docs/future-architecture/antipatterns.md +552 -0
  258. package/docs/future-architecture/architecture/01-layers.md +109 -0
  259. package/docs/future-architecture/architecture/02-layer4-control-plane.md +122 -0
  260. package/docs/future-architecture/architecture/03-layer3-providers.md +174 -0
  261. package/docs/future-architecture/architecture/04-layer2-runtimes.md +114 -0
  262. package/docs/future-architecture/architecture/04b-credential-broker.md +153 -0
  263. package/docs/future-architecture/architecture/05-layer1-guest-agent.md +138 -0
  264. package/docs/future-architecture/architecture/06-storage.md +134 -0
  265. package/docs/future-architecture/architecture/07-security.md +194 -0
  266. package/docs/future-architecture/architecture/08-networking.md +149 -0
  267. package/docs/future-architecture/architecture/09-templates.md +122 -0
  268. package/docs/future-architecture/architecture/10-observability.md +121 -0
  269. package/docs/future-architecture/design-notes.md +72 -0
  270. package/docs/future-architecture/gaps.md +281 -0
  271. package/docs/future-architecture/phase-template.md +123 -0
  272. package/docs/future-architecture/references.md +225 -0
  273. package/docs/future-architecture/research/01-kata-containers.md +100 -0
  274. package/docs/future-architecture/research/02-e2b-infra.md +133 -0
  275. package/docs/future-architecture/research/03-coder.md +115 -0
  276. package/docs/future-architecture/research/04-cloud-hypervisor.md +99 -0
  277. package/docs/future-architecture/research/05-firecracker.md +114 -0
  278. package/docs/future-architecture/research/06-agent-sandbox.md +142 -0
  279. package/docs/future-architecture/research/07-chromedp.md +78 -0
  280. package/docs/future-architecture/research/08-microsandbox.md +78 -0
  281. package/docs/future-architecture/research/09-agentbox.md +135 -0
  282. package/docs/future-architecture/research/10-sysbox.md +100 -0
  283. package/docs/future-architecture/research/11-firecracker-containerd.md +93 -0
  284. package/docs/future-architecture/research/12-docker-socket-proxy.md +59 -0
  285. package/docs/future-architecture/research/14-e2b-desktop-and-surf.md +107 -0
  286. package/docs/future-architecture/research/18-open-webui-terminals-observed.md +135 -0
  287. package/docs/future-architecture/research/bank-buyer.md +96 -0
  288. package/docs/future-architecture/research/enthusiast-audience.md +106 -0
  289. package/docs/future-architecture/research/proof-uipath-anthropic-2026-05.md +76 -0
  290. package/docs/future-architecture/research/widemoat-thesis-advisor.md +124 -0
  291. package/docs/future-architecture/roadmap.md +438 -0
  292. package/docs/kata-runtime.md +267 -0
  293. package/docs/kubernetes.md +86 -0
  294. package/docs/logo.png +0 -0
  295. package/docs/multi-cli.md +161 -0
  296. package/docs/openwebui-filter.md +134 -0
  297. package/docs/roadmap/implementation-roadmap.md +104 -0
  298. package/docs/sandbox-contents.svg +229 -0
  299. package/docs/screenshots/01-create-document.png +0 -0
  300. package/docs/screenshots/02-file-preview.png +0 -0
  301. package/docs/screenshots/03-browser-viewer.png +0 -0
  302. package/docs/screenshots/04-sub-agent-terminal.png +0 -0
  303. package/docs/screenshots/05-chat-overview.png +0 -0
  304. package/docs/screenshots/06-sub-agent-dashboard.png +0 -0
  305. package/docs/screenshots/07-frontend-design-skill.png +0 -0
  306. package/docs/screenshots/08-pptx-skill.png +0 -0
  307. package/docs/screenshots/09-skill-creator.png +0 -0
  308. package/docs/screenshots/10-data-chart.png +0 -0
  309. package/docs/shared-browser.svg +102 -0
  310. package/docs/system-prompt.md +113 -0
  311. package/docs/terminal-flow.svg +69 -0
  312. package/examples/helm/README.md +20 -0
  313. package/examples/helm/standalone/values.yaml +49 -0
  314. package/examples/helm/with-open-webui/README.md +99 -0
  315. package/examples/helm/with-open-webui/values-computer-use.yaml +32 -0
  316. package/examples/helm/with-open-webui/values-open-webui.yaml +67 -0
  317. package/fonts/NotoEmoji-Regular.ttf +0 -0
  318. package/helm/computer-use-server/.helmignore +17 -0
  319. package/helm/computer-use-server/Chart.yaml +32 -0
  320. package/helm/computer-use-server/README.md +211 -0
  321. package/helm/computer-use-server/templates/NOTES.txt +66 -0
  322. package/helm/computer-use-server/templates/_helpers.tpl +115 -0
  323. package/helm/computer-use-server/templates/configmap-dind-init.yaml +82 -0
  324. package/helm/computer-use-server/templates/configmap.yaml +18 -0
  325. package/helm/computer-use-server/templates/deployment.yaml +248 -0
  326. package/helm/computer-use-server/templates/ingress.yaml +38 -0
  327. package/helm/computer-use-server/templates/networkpolicy.yaml +50 -0
  328. package/helm/computer-use-server/templates/pdb.yaml +16 -0
  329. package/helm/computer-use-server/templates/pvc-data.yaml +20 -0
  330. package/helm/computer-use-server/templates/pvc-skills-cache.yaml +20 -0
  331. package/helm/computer-use-server/templates/pvc-user-data.yaml +20 -0
  332. package/helm/computer-use-server/templates/pvc-var-lib-docker.yaml +27 -0
  333. package/helm/computer-use-server/templates/secret.yaml +23 -0
  334. package/helm/computer-use-server/templates/service.yaml +22 -0
  335. package/helm/computer-use-server/templates/serviceaccount.yaml +15 -0
  336. package/helm/computer-use-server/templates/tests/test-health.yaml +23 -0
  337. package/helm/computer-use-server/values.schema.json +183 -0
  338. package/helm/computer-use-server/values.yaml +297 -0
  339. package/lychee.toml +36 -0
  340. package/openwebui/Dockerfile +52 -0
  341. package/openwebui/README.md +38 -0
  342. package/openwebui/functions/README.md +48 -0
  343. package/openwebui/functions/computer_link_filter.py +487 -0
  344. package/openwebui/init.sh +305 -0
  345. package/openwebui/patches/README.md +44 -0
  346. package/openwebui/patches/fix_artifacts_auto_show.py +441 -0
  347. package/openwebui/patches/fix_attached_files_position.py +87 -0
  348. package/openwebui/patches/fix_large_tool_args.py +156 -0
  349. package/openwebui/patches/fix_large_tool_results.py +289 -0
  350. package/openwebui/patches/fix_preview_url_detection.py +230 -0
  351. package/openwebui/patches/fix_skip_embedding_chat_files.py +229 -0
  352. package/openwebui/patches/fix_skip_rag_files_native_fc.py +100 -0
  353. package/openwebui/patches/fix_tool_loop_errors.py +510 -0
  354. package/package.json +39 -0
  355. package/requirements.txt +112 -0
  356. package/scripts/check-config.sh +141 -0
  357. package/scripts/docs-lint/ai-slop-detector.sh +202 -0
  358. package/scripts/docs-lint/architecture-tree-whitelist.sh +131 -0
  359. package/scripts/docs-lint/ascii-diagram-detector.sh +58 -0
  360. package/scripts/docs-lint/front-matter-validator.sh +97 -0
  361. package/scripts/docs-lint/gitignored-ref-detector.sh +122 -0
  362. package/scripts/docs-lint/identity-email-detector.sh +48 -0
  363. package/scripts/docs-lint/test-linters.sh +354 -0
  364. package/scripts/docs-lint/wc-budget.sh +61 -0
  365. package/scripts/githooks/pre-push +75 -0
  366. package/server.json +13 -0
  367. package/settings-wrapper/Dockerfile +9 -0
  368. package/settings-wrapper/README.md +119 -0
  369. package/settings-wrapper/app.py +113 -0
  370. package/settings-wrapper/requirements.txt +2 -0
  371. package/settings-wrapper/skills.json +25 -0
  372. package/skills/README.md +46 -0
  373. package/skills/examples/algorithmic-art/SKILL.md +405 -0
  374. package/skills/examples/algorithmic-art/templates/generator_template.js +223 -0
  375. package/skills/examples/algorithmic-art/templates/viewer.html +601 -0
  376. package/skills/examples/artifacts-builder/SKILL.md +74 -0
  377. package/skills/examples/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  378. package/skills/examples/artifacts-builder/scripts/init-artifact.sh +322 -0
  379. package/skills/examples/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  380. package/skills/examples/canvas-design/LICENSE.txt +202 -0
  381. package/skills/examples/canvas-design/SKILL.md +130 -0
  382. package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  383. package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  384. package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  385. package/skills/examples/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  386. package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  387. package/skills/examples/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  388. package/skills/examples/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  389. package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  390. package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  391. package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  392. package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  393. package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  394. package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  395. package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  396. package/skills/examples/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  397. package/skills/examples/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  398. package/skills/examples/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  399. package/skills/examples/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  400. package/skills/examples/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  401. package/skills/examples/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  402. package/skills/examples/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  403. package/skills/examples/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  404. package/skills/examples/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  405. package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  406. package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  407. package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  408. package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  409. package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  410. package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  411. package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  412. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  413. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  414. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  415. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  416. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  417. package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  418. package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  419. package/skills/examples/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  420. package/skills/examples/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  421. package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  422. package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  423. package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  424. package/skills/examples/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  425. package/skills/examples/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  426. package/skills/examples/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  427. package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  428. package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  429. package/skills/examples/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  430. package/skills/examples/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  431. package/skills/examples/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  432. package/skills/examples/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  433. package/skills/examples/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  434. package/skills/examples/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  435. package/skills/examples/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  436. package/skills/examples/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  437. package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  438. package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  439. package/skills/examples/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  440. package/skills/examples/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  441. package/skills/examples/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  442. package/skills/examples/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  443. package/skills/examples/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  444. package/skills/examples/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  445. package/skills/examples/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  446. package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  447. package/skills/examples/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  448. package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  449. package/skills/examples/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  450. package/skills/examples/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  451. package/skills/examples/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  452. package/skills/examples/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  453. package/skills/examples/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  454. package/skills/examples/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  455. package/skills/examples/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  456. package/skills/examples/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  457. package/skills/examples/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  458. package/skills/examples/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  459. package/skills/examples/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  460. package/skills/examples/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  461. package/skills/examples/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  462. package/skills/examples/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  463. package/skills/examples/copy-editing/SKILL.md +447 -0
  464. package/skills/examples/copy-editing/evals/evals.json +89 -0
  465. package/skills/examples/copy-editing/references/plain-english-alternatives.md +394 -0
  466. package/skills/examples/internal-comms/LICENSE.txt +202 -0
  467. package/skills/examples/internal-comms/SKILL.md +32 -0
  468. package/skills/examples/internal-comms/examples/3p-updates.md +47 -0
  469. package/skills/examples/internal-comms/examples/company-newsletter.md +65 -0
  470. package/skills/examples/internal-comms/examples/faq-answers.md +30 -0
  471. package/skills/examples/internal-comms/examples/general-comms.md +16 -0
  472. package/skills/examples/mcp-builder/SKILL.md +328 -0
  473. package/skills/examples/mcp-builder/reference/evaluation.md +602 -0
  474. package/skills/examples/mcp-builder/reference/mcp_best_practices.md +915 -0
  475. package/skills/examples/mcp-builder/reference/node_mcp_server.md +916 -0
  476. package/skills/examples/mcp-builder/reference/python_mcp_server.md +752 -0
  477. package/skills/examples/mcp-builder/scripts/connections.py +151 -0
  478. package/skills/examples/mcp-builder/scripts/evaluation.py +373 -0
  479. package/skills/examples/mcp-builder/scripts/example_evaluation.xml +22 -0
  480. package/skills/examples/mcp-builder/scripts/requirements.txt +2 -0
  481. package/skills/examples/product-marketing-context/SKILL.md +241 -0
  482. package/skills/examples/product-marketing-context/evals/evals.json +85 -0
  483. package/skills/examples/single-cell-rna-qc/SKILL.md +175 -0
  484. package/skills/examples/single-cell-rna-qc/references/scverse_qc_guidelines.md +186 -0
  485. package/skills/examples/single-cell-rna-qc/scripts/qc_analysis.py +232 -0
  486. package/skills/examples/single-cell-rna-qc/scripts/qc_core.py +233 -0
  487. package/skills/examples/single-cell-rna-qc/scripts/qc_plotting.py +235 -0
  488. package/skills/examples/skill-creator/SKILL.md +355 -0
  489. package/skills/examples/skill-creator/references/output-patterns.md +82 -0
  490. package/skills/examples/skill-creator/references/workflows.md +28 -0
  491. package/skills/examples/skill-creator/scripts/init_skill.py +303 -0
  492. package/skills/examples/skill-creator/scripts/package_skill.py +110 -0
  493. package/skills/examples/skill-creator/scripts/quick_validate.py +95 -0
  494. package/skills/examples/slack-gif-creator/SKILL.md +254 -0
  495. package/skills/examples/slack-gif-creator/core/easing.py +234 -0
  496. package/skills/examples/slack-gif-creator/core/frame_composer.py +176 -0
  497. package/skills/examples/slack-gif-creator/core/gif_builder.py +269 -0
  498. package/skills/examples/slack-gif-creator/core/validators.py +136 -0
  499. package/skills/examples/slack-gif-creator/requirements.txt +4 -0
  500. package/skills/examples/social-content/SKILL.md +278 -0
  501. package/skills/examples/social-content/evals/evals.json +92 -0
  502. package/skills/examples/social-content/references/platforms.md +170 -0
  503. package/skills/examples/social-content/references/post-templates.md +177 -0
  504. package/skills/examples/social-content/references/reverse-engineering.md +195 -0
  505. package/skills/examples/theme-factory/SKILL.md +59 -0
  506. package/skills/examples/theme-factory/theme-showcase.pdf +0 -0
  507. package/skills/examples/theme-factory/themes/arctic-frost.md +19 -0
  508. package/skills/examples/theme-factory/themes/botanical-garden.md +19 -0
  509. package/skills/examples/theme-factory/themes/desert-rose.md +19 -0
  510. package/skills/examples/theme-factory/themes/forest-canopy.md +19 -0
  511. package/skills/examples/theme-factory/themes/golden-hour.md +19 -0
  512. package/skills/examples/theme-factory/themes/midnight-galaxy.md +19 -0
  513. package/skills/examples/theme-factory/themes/modern-minimalist.md +19 -0
  514. package/skills/examples/theme-factory/themes/ocean-depths.md +19 -0
  515. package/skills/examples/theme-factory/themes/sunset-boulevard.md +19 -0
  516. package/skills/examples/theme-factory/themes/tech-innovation.md +19 -0
  517. package/skills/examples/web-artifacts-builder/LICENSE.txt +202 -0
  518. package/skills/examples/web-artifacts-builder/SKILL.md +74 -0
  519. package/skills/examples/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  520. package/skills/examples/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  521. package/skills/examples/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  522. package/skills/examples/writing-skills/SKILL.md +655 -0
  523. package/skills/examples/writing-skills/anthropic-best-practices.md +1150 -0
  524. package/skills/examples/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  525. package/skills/examples/writing-skills/graphviz-conventions.dot +172 -0
  526. package/skills/examples/writing-skills/persuasion-principles.md +187 -0
  527. package/skills/examples/writing-skills/render-graphs.js +168 -0
  528. package/skills/examples/writing-skills/testing-skills-with-subagents.md +384 -0
  529. package/skills/public/describe-image/SKILL.md +105 -0
  530. package/skills/public/describe-image/scripts/describe.py +389 -0
  531. package/skills/public/doc-coauthoring/SKILL.md +375 -0
  532. package/skills/public/docx/LICENSE.txt +30 -0
  533. package/skills/public/docx/SKILL.md +199 -0
  534. package/skills/public/docx/docx-js.md +350 -0
  535. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  536. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  537. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  538. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  539. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  540. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  541. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  542. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  543. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  544. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  545. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  546. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  547. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  548. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  549. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  550. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  551. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  552. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  553. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  554. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  555. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  556. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  557. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  558. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  559. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  560. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  561. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  562. package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  563. package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  564. package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  565. package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  566. package/skills/public/docx/ooxml/schemas/mce/mc.xsd +75 -0
  567. package/skills/public/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  568. package/skills/public/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  569. package/skills/public/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  570. package/skills/public/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  571. package/skills/public/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  572. package/skills/public/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  573. package/skills/public/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  574. package/skills/public/docx/ooxml/scripts/pack.py +159 -0
  575. package/skills/public/docx/ooxml/scripts/unpack.py +29 -0
  576. package/skills/public/docx/ooxml/scripts/validate.py +69 -0
  577. package/skills/public/docx/ooxml/scripts/validation/__init__.py +15 -0
  578. package/skills/public/docx/ooxml/scripts/validation/base.py +951 -0
  579. package/skills/public/docx/ooxml/scripts/validation/docx.py +274 -0
  580. package/skills/public/docx/ooxml/scripts/validation/pptx.py +315 -0
  581. package/skills/public/docx/ooxml/scripts/validation/redlining.py +279 -0
  582. package/skills/public/docx/ooxml.md +632 -0
  583. package/skills/public/docx/scripts/__init__.py +1 -0
  584. package/skills/public/docx/scripts/document.py +1292 -0
  585. package/skills/public/docx/scripts/templates/comments.xml +3 -0
  586. package/skills/public/docx/scripts/templates/commentsExtended.xml +3 -0
  587. package/skills/public/docx/scripts/templates/commentsExtensible.xml +3 -0
  588. package/skills/public/docx/scripts/templates/commentsIds.xml +3 -0
  589. package/skills/public/docx/scripts/templates/people.xml +3 -0
  590. package/skills/public/docx/scripts/utilities.py +374 -0
  591. package/skills/public/file-reading/LICENSE.txt +30 -0
  592. package/skills/public/file-reading/SKILL.md +350 -0
  593. package/skills/public/frontend-design/LICENSE.txt +177 -0
  594. package/skills/public/frontend-design/SKILL.md +42 -0
  595. package/skills/public/gitlab-explorer/SKILL.md +174 -0
  596. package/skills/public/gitlab-explorer/references/git-commands.md +323 -0
  597. package/skills/public/gitlab-explorer/references/glab-commands.md +282 -0
  598. package/skills/public/gitlab-explorer/scripts/check_gitlab_auth.sh +109 -0
  599. package/skills/public/pdf/FORMS.md +205 -0
  600. package/skills/public/pdf/REFERENCE.md +612 -0
  601. package/skills/public/pdf/SKILL.md +364 -0
  602. package/skills/public/pdf/scripts/check_bounding_boxes.py +70 -0
  603. package/skills/public/pdf/scripts/check_bounding_boxes_test.py +226 -0
  604. package/skills/public/pdf/scripts/check_fillable_fields.py +12 -0
  605. package/skills/public/pdf/scripts/convert_pdf_to_images.py +35 -0
  606. package/skills/public/pdf/scripts/create_validation_image.py +41 -0
  607. package/skills/public/pdf/scripts/extract_form_field_info.py +152 -0
  608. package/skills/public/pdf/scripts/fill_fillable_fields.py +114 -0
  609. package/skills/public/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  610. package/skills/public/pdf-reading/LICENSE.txt +30 -0
  611. package/skills/public/pdf-reading/REFERENCE.md +196 -0
  612. package/skills/public/pdf-reading/SKILL.md +305 -0
  613. package/skills/public/playwright-cli/SKILL.md +278 -0
  614. package/skills/public/playwright-cli/references/request-mocking.md +87 -0
  615. package/skills/public/playwright-cli/references/running-code.md +232 -0
  616. package/skills/public/playwright-cli/references/session-management.md +169 -0
  617. package/skills/public/playwright-cli/references/storage-state.md +275 -0
  618. package/skills/public/playwright-cli/references/test-generation.md +88 -0
  619. package/skills/public/playwright-cli/references/tracing.md +139 -0
  620. package/skills/public/playwright-cli/references/video-recording.md +43 -0
  621. package/skills/public/pptx/LICENSE.txt +30 -0
  622. package/skills/public/pptx/SKILL.md +484 -0
  623. package/skills/public/pptx/css.md +335 -0
  624. package/skills/public/pptx/html2pptx.md +893 -0
  625. package/skills/public/pptx/html2pptx.tgz +0 -0
  626. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  627. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  628. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  629. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  630. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  631. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  632. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  633. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  634. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  635. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  636. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  637. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  638. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  639. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  640. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  641. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  642. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  643. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  644. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  645. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  646. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  647. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  648. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  649. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  650. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  651. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  652. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  653. package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  654. package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  655. package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  656. package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  657. package/skills/public/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  658. package/skills/public/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  659. package/skills/public/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  660. package/skills/public/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  661. package/skills/public/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  662. package/skills/public/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  663. package/skills/public/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  664. package/skills/public/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  665. package/skills/public/pptx/ooxml/scripts/pack.py +159 -0
  666. package/skills/public/pptx/ooxml/scripts/unpack.py +29 -0
  667. package/skills/public/pptx/ooxml/scripts/validate.py +69 -0
  668. package/skills/public/pptx/ooxml/scripts/validation/__init__.py +15 -0
  669. package/skills/public/pptx/ooxml/scripts/validation/base.py +951 -0
  670. package/skills/public/pptx/ooxml/scripts/validation/docx.py +274 -0
  671. package/skills/public/pptx/ooxml/scripts/validation/pptx.py +315 -0
  672. package/skills/public/pptx/ooxml/scripts/validation/redlining.py +279 -0
  673. package/skills/public/pptx/ooxml.md +427 -0
  674. package/skills/public/pptx/scripts/inventory.py +1020 -0
  675. package/skills/public/pptx/scripts/rearrange.py +231 -0
  676. package/skills/public/pptx/scripts/replace.py +385 -0
  677. package/skills/public/pptx/scripts/thumbnail.py +450 -0
  678. package/skills/public/skill-creator/SKILL.md +356 -0
  679. package/skills/public/skill-creator/references/output-patterns.md +82 -0
  680. package/skills/public/skill-creator/references/workflows.md +28 -0
  681. package/skills/public/skill-creator/scripts/init_skill.py +303 -0
  682. package/skills/public/skill-creator/scripts/package_skill.py +110 -0
  683. package/skills/public/skill-creator/scripts/quick_validate.py +95 -0
  684. package/skills/public/sub-agent/SKILL.md +186 -0
  685. package/skills/public/sub-agent/references/security-review.md +153 -0
  686. package/skills/public/sub-agent/references/usage.md +207 -0
  687. package/skills/public/sub-agent/scripts/list_subagent_models.sh +22 -0
  688. package/skills/public/test-driven-development/SKILL.md +371 -0
  689. package/skills/public/test-driven-development/testing-anti-patterns.md +299 -0
  690. package/skills/public/webapp-testing/LICENSE.txt +202 -0
  691. package/skills/public/webapp-testing/SKILL.md +96 -0
  692. package/skills/public/webapp-testing/examples/console_logging.py +35 -0
  693. package/skills/public/webapp-testing/examples/element_discovery.py +40 -0
  694. package/skills/public/webapp-testing/examples/static_html_automation.py +33 -0
  695. package/skills/public/webapp-testing/scripts/with_server.py +106 -0
  696. package/skills/public/xlsx/LICENSE.txt +30 -0
  697. package/skills/public/xlsx/SKILL.md +316 -0
  698. package/skills/public/xlsx/preview_data.py +93 -0
  699. package/skills/public/xlsx/recalc.py +178 -0
  700. package/tests/README.md +42 -0
  701. package/tests/fixtures/cli/claude_v0.9.2.0_argv.json +46 -0
  702. package/tests/fixtures/cli/claude_v0.9.2.0_stdout.json +32 -0
  703. package/tests/fixtures/cli/codex_run.jsonl +4 -0
  704. package/tests/fixtures/cli/opencode_run.jsonl +6 -0
  705. package/tests/integration/README.md +56 -0
  706. package/tests/integration/conftest.py +280 -0
  707. package/tests/integration/pytest.ini +13 -0
  708. package/tests/integration/test_mcp_auth.py +85 -0
  709. package/tests/integration/test_mcp_tools.py +101 -0
  710. package/tests/integration/test_workspace_lifecycle.py +125 -0
  711. package/tests/orchestrator/mock_llm_server.py +343 -0
  712. package/tests/orchestrator/test_cli_adapters.py +566 -0
  713. package/tests/orchestrator/test_cli_adapters_live.py +527 -0
  714. package/tests/orchestrator/test_cli_runtime.py +451 -0
  715. package/tests/orchestrator/test_docker_manager.py +302 -0
  716. package/tests/orchestrator/test_dynamic_instructions.py +69 -0
  717. package/tests/orchestrator/test_mcp_resources.py +140 -0
  718. package/tests/orchestrator/test_mcp_tools.py +224 -0
  719. package/tests/orchestrator/test_passthrough_isolation.py +201 -0
  720. package/tests/orchestrator/test_readme_in_container.py +76 -0
  721. package/tests/orchestrator/test_render_cache.py +84 -0
  722. package/tests/orchestrator/test_runtime_cli_endpoint.py +108 -0
  723. package/tests/orchestrator/test_single_user_mode.py +212 -0
  724. package/tests/orchestrator/test_startup_warnings.py +123 -0
  725. package/tests/orchestrator/test_sub_agent_dispatch.py +327 -0
  726. package/tests/orchestrator/test_subagent_claude_compat.py +367 -0
  727. package/tests/orchestrator/test_system_prompt_endpoint.py +191 -0
  728. package/tests/orchestrator/test_tool_descriptions.py +52 -0
  729. package/tests/orchestrator/test_view_image.py +201 -0
  730. package/tests/patches/conftest.py +30 -0
  731. package/tests/patches/fixtures/__init__.py +10 -0
  732. package/tests/patches/fixtures/middleware_v0.9.1.py +5057 -0
  733. package/tests/patches/fixtures/middleware_v0.9.2.py +5120 -0
  734. package/tests/patches/fixtures/retrieval_v0.9.1.py +2684 -0
  735. package/tests/patches/fixtures/retrieval_v0.9.2.py +2700 -0
  736. package/tests/patches/test_fix_attached_files_position.py +118 -0
  737. package/tests/patches/test_fix_large_tool_args.py +130 -0
  738. package/tests/patches/test_fix_large_tool_results.py +531 -0
  739. package/tests/patches/test_fix_skip_embedding_chat_files.py +160 -0
  740. package/tests/patches/test_fix_skip_rag_files_native_fc.py +120 -0
  741. package/tests/patches/test_fix_tool_loop_errors.py +128 -0
  742. package/tests/security/test_path_traversal_app.py +132 -0
  743. package/tests/security/test_path_traversal_docker.py +36 -0
  744. package/tests/security/test_path_traversal_settings.py +87 -0
  745. package/tests/security/test_safe_path_util.py +166 -0
  746. package/tests/security/test_xss_preview.py +46 -0
  747. package/tests/test-default-model-resolution.py +136 -0
  748. package/tests/test-docker-image.sh +358 -0
  749. package/tests/test-list-subagent-models.sh +421 -0
  750. package/tests/test-mcp-endpoint-live.sh +92 -0
  751. package/tests/test-mcp-native-surface.sh +213 -0
  752. package/tests/test-no-cyrillic.sh +135 -0
  753. package/tests/test-opencode-error-mapping.py +130 -0
  754. package/tests/test-pr88-skills.sh +305 -0
  755. package/tests/test-project-structure.sh +202 -0
  756. package/tests/test-single-user-mode.sh +269 -0
  757. package/tests/test-skill-no-hardcoded-models.sh +65 -0
  758. package/tests/test-subagent-cli-surface.py +137 -0
  759. package/tests/test-subagent-runtime.sh +109 -0
  760. package/tests/test_codex_toml_converter.py +204 -0
  761. package/tests/test_default_resolver_no_legacy_global.py +159 -0
  762. package/tests/test_filter.py +648 -0
  763. package/tests/test_init_sh_unchanged.sh +49 -0
  764. package/tests/test_opencode_alias_map_drop.py +144 -0
  765. package/tests/test_requirements.py +91 -0
  766. package/tests/test_subagent_docstring.py +193 -0
  767. package/tests/test_tools.py +34 -0
  768. package/vendor/extract-text/README.md +46 -0
  769. package/vendor/extract-text/extract-text +0 -0
@@ -0,0 +1,75 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: accepted
6
+ last-reviewed: 2026-05-24
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ supersedes: []
10
+ superseded-by: null
11
+ compliance-impact: []
12
+ license-impact: none
13
+ threat-mitigation-link: null
14
+ ---
15
+
16
+ The Layer 0 CI gates run against every PR on `next/v1`, but `main`-line legacy code on this branch fails them. This ADR records how we keep the gates on without rewriting code that v1 GA does not ship.
17
+
18
+ # ADR-0001: Layer 0 gate legacy exclusion policy
19
+
20
+ ## Status
21
+
22
+ `accepted`
23
+
24
+ ## Context
25
+
26
+ `next/v1` was branched from `main` to carry the existing PoC (sandbox `Dockerfile`, `computer-use-server/` FastAPI, `openwebui/`, `settings-wrapper/`, `cron/`, bundled skills) so the branch stays runnable while the enterprise architecture is designed. The Layer 0 SAST gate (`p/security-audit`, `p/owasp-top-ten`, `p/python`, `p/javascript`, `p/dockerfile`, `p/github-actions`) found 37 blocking issues in that legacy code on its first run: root containers, wildcard CORS, md5 hash use, stdlib XML parsing, dynamic urllib, etc.
27
+
28
+ None of that code ships in v1 GA. Every legacy area is replaced from scratch by a new component under `docs/architecture/components/` in Layer 6+ (Sandbox Runtime, Control Plane, Audit Pipeline, Egress Proxy, …). Rewriting the legacy now means polishing code we are about to delete.
29
+
30
+ The gate itself is correct and must remain blocking. The question is which paths it covers.
31
+
32
+ ## Decision
33
+
34
+ The Layer 0 SAST gate runs against every path in the repository except those listed in `.semgrepignore`. That file enumerates the `main`-line legacy paths slated for replacement, with a header that names the responsible new-architecture component for each entry. Every new-architecture PR that introduces a component covering one of those areas removes the corresponding `.semgrepignore` line in the same commit. CI must pass without the exclusion before the PR can merge.
35
+
36
+ ## Consequences
37
+
38
+ - Positive: Layer 0 gates stay green on `next/v1` HEAD; the verifier's "CI green" criterion is satisfied without dead-code refactoring.
39
+ - Positive: every new component inherits the full SAST gate by default. The exclusion list shrinks monotonically — additions require this ADR's amendment.
40
+ - Positive: the legacy debt is auditable in one file rather than scattered across `# nosemgrep` comments.
41
+ - Negative: a legacy finding could mask a related issue in new code that imports the legacy path. Mitigated by the rule that new components never import legacy modules (enforced by component-boundary review).
42
+ - Negative: `.semgrepignore` is a coarse tool — excluding `computer-use-server/` excludes every rule, not just the failing ones. Acceptable because the directory dies in Layer 6+.
43
+
44
+ ## Alternatives considered
45
+
46
+ - **Baseline cleanup PR.** Fix the 37 findings in legacy code before continuing. Rejected: the code is scheduled for full rewrite in Layer 6+ per the architecture plan; fixing it now spends review time on artifacts we throw away.
47
+ - **Per-rule exception file** (`.semgrep-exceptions.yaml` with finding hashes). Rejected: gives the illusion of per-finding scrutiny while in practice rubber-stamping every legacy hit. The directory-level exclusion is more honest about what we are doing.
48
+ - **Lower the gate to `WARN`.** Rejected: removes the gate for new code too. The whole point of Layer 0 is that new components must pass on creation.
49
+ - **Delete the legacy code from `next/v1` now.** Rejected: the branch must stay runnable for early-stage demos and contract-shape experiments until Layer 6+ components land.
50
+
51
+ ## Compliance impact
52
+
53
+ None for now. When the first compliance-mapping ADR lands (Layer 12), this exclusion list is referenced as the scope-boundary statement: SOC 2 / ISO 27001 controls apply to non-excluded paths.
54
+
55
+ ## License impact
56
+
57
+ None.
58
+
59
+ ## Threat mitigation
60
+
61
+ None directly. The legacy code's threats (root containers, XXE, SSRF via `urllib`) are addressed by replacement, not by SAST suppression. The new-component-must-remove-its-path rule keeps that promise auditable.
62
+
63
+ ## Amendments
64
+
65
+ Each amendment names the discovery commit and the affected exclusion entries.
66
+
67
+ ### 2026-05-24 — initial exclusion-list completion
68
+
69
+ The first version of `.semgrepignore` shipped in commit `709db53` missed three legacy areas that the SAST gate scans:
70
+
71
+ - `.github/workflows/release-chart.yml` — `main`-line Helm release workflow with a pre-existing `run-shell-injection` finding on the `gh release create` step. Replaced when the supply-chain.yml pattern is extended to chart artifacts in Layer 6+.
72
+ - `skills/examples/` — bundled skill examples carrying the same `defusedxml` gaps as `skills/public/`. v1 GA ships zero skills per `manifesto/04-non-goals.md`; both directories die together.
73
+ - `tests/` — top-level PoC test tree using stdlib `xml.etree`. New components ship their own tests under each component's directory; this tree dies with the code it tests.
74
+
75
+ Discovered by the third verifier pass on commit `709db53`. The amendment adds them under the same policy with no change to the decision or alternatives.
@@ -0,0 +1,57 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: proposed
6
+ last-reviewed: 2026-06-01
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ supersedes: []
10
+ superseded-by: null
11
+ compliance-impact: [EU-AI-Act-Art.12, SOC2-CC6.1]
12
+ license-impact: none
13
+ threat-mitigation-link: 06-threat-model.md
14
+ ---
15
+
16
+ Fixes how OCU's data-plane UI discovers its views, so adding the deferred live-session views (browser, terminal) is additive, not a breaking change.
17
+
18
+ # ADR-0002: Session view is descriptor-driven
19
+
20
+ ## Status
21
+
22
+ `proposed`
23
+
24
+ ## Context
25
+
26
+ The PoC ships a working preview panel with three tabs — files, a live browser (CDP screencast), and a live terminal (ttyd). v1 ships only the files tab; the two live-session tabs are deferred to [#210](https://github.com/Wide-Moat/open-computer-use/issues/210) pending a security pass on the human channel into the guest. The two later tabs read from a different source than files (ephemeral CDP/PTY streams off the Session sandbox host edge, not the durable object store behind the Storage broker), authenticate separately, and have their own lifecycle. The risk: if the UI hardcodes its tab set or folds all three behind one file API and one credential, adding the live-session tabs later breaks the embedding contract and collapses two trust domains into one.
27
+
28
+ ## Decision
29
+
30
+ We will have the data-plane UI discover its available surfaces at runtime from a session-scoped descriptor list, rendering one tab per descriptor and ignoring kinds it does not recognize, because this makes the file tab and the later live-session tabs additive entries in one list rather than a hardcoded set. The discovery endpoint lands as an addition to the north-face contract inventory ([`08-contracts.md`](../08-contracts.md) §1) in the same change set that ships it.
31
+
32
+ ## Consequences
33
+
34
+ - Positive: v1 returns one descriptor (`files`); the endpoint returns three once [#210](https://github.com/Wide-Moat/open-computer-use/issues/210) lands. Adding the browser and terminal tabs is appending two descriptors; an old shell renders the subset it recognizes and never errors on a new kind.
35
+ - Positive: the files surface is served by the **Storage broker** north face as a component inside that container ([`05-c4-container.md`](../05-c4-container.md) §3); the shell that renders the descriptor list is a thin data-plane-UI component over per-surface sources, not owned by any one container — the deferred live-view tabs read off the **Session sandbox** host edge, a different container.
36
+ - Positive: each surface authenticates to its own source with its own token — the files tab uses the embed-token → first-party-session path ([NFR-SEC-82](../manifesto/02-nfrs.md), [NFR-SEC-84](../manifesto/02-nfrs.md)); a future live-view tab gets a separate session-scoped token. The shell carries and forwards no credential, closing the PoC's single-`chat_id`-gates-everything weakness.
37
+ - Positive: the descriptor's `entry.url` is host-side only — a structural invariant (schema + property test) that forbids a guest container IP/port, enforcing host-dials-guest ([NFR-SEC-43](../manifesto/02-nfrs.md)) before any live-view kind exists.
38
+ - Negative: a capability-discovery endpoint plus a versioned descriptor schema is more than a single hardcoded tab needs today; mitigated by shipping the minimum (a length-1 list, open `kind` enum, `transport` discriminator, `contract_ref`) and deferring the host↔surface message protocol until a sandboxed surface needs it.
39
+ - Neutral: the descriptor is one cross-surface contract; each surface keeps its own per-surface contract (the file-artifact data plane stays `file-artifact-api.schema.json`), not absorbed into a mega-API.
40
+
41
+ ## Alternatives considered
42
+
43
+ - **Hardcoded tab set in the UI** — rejected because adding the browser/terminal tabs would change the shell and break any embedder pinned to the v1 tab set; offers no forward-compatibility seam.
44
+ - **One mega data-plane API with capability flags** (`/dataplane` toggling files/browser/terminal under one credential) — rejected because it folds the durable file-artifact data plane and the ephemeral live-view plane behind one credential and one lifecycle, collapsing two trust domains (NFR-SEC-25) and re-creating the PoC exfil surface.
45
+ - **Customer builds its own UI over our APIs, OCU ships no SPA** — rejected for v1 because OCU's authenticated file-preview SPA is in-scope per `03-c4-context.md` §4; kept available as a path (the descriptor + per-surface contracts are public), but not the default.
46
+
47
+ ## Compliance impact
48
+
49
+ `EU-AI-Act-Art.12` (per-surface audit of file activity, NFR-SEC-79), `SOC2-CC6.1` (per-surface authentication, no panel-wide credential).
50
+
51
+ ## License impact
52
+
53
+ None.
54
+
55
+ ## Threat mitigation
56
+
57
+ Structurally bars a guest-reachable `entry.url` ([NFR-SEC-43](../manifesto/02-nfrs.md)) and keeps per-surface authentication, closing the PoC's single-`chat_id` and direct-guest-reachability weaknesses; the north-face F11 rows P4-S3/T3/I3 in [`06-threat-model.md`](../06-threat-model.md) §3.2 cover the embed-token and single-credential vectors. Live-view STRIDE rows land with [#210](https://github.com/Wide-Moat/open-computer-use/issues/210).
@@ -0,0 +1,63 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: proposed
6
+ last-reviewed: 2026-06-01
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ supersedes: []
10
+ superseded-by: null
11
+ compliance-impact: [EU-AI-Act-Art.15, DORA-Art.28, NIST-SP-800-190]
12
+ license-impact: none
13
+ threat-mitigation-link: ../02-trust-boundaries.md#4-per-tenant-isolation-menu
14
+ ---
15
+
16
+ Fixes the axis that selects the sandbox runtime tier, and which tiers v1 GA ships. Audience: anyone touching the Session sandbox substrate or its admission rules.
17
+
18
+ # ADR-0003: Sandbox runtime tier ladder
19
+
20
+ ## Status
21
+
22
+ `proposed`
23
+
24
+ ## Context
25
+
26
+ The Session sandbox ([component 05](../components/05-session-sandbox.md)) runs agent-issued actions inside an isolation boundary. The strength of that boundary — bare namespaces, a user-space kernel, or hardware virtualization — sets escape resistance, host footprint, and whether a deployment runs from a single `docker-compose up`.
27
+
28
+ Two axes compete to drive the choice: data classification (stronger tier for more sensitive data) versus workload trust (the tier follows who supplies the prompts the agent executes). §02 and AP-13 already record the split — data classification governs retention, custody, and residency; workload trust governs the tier. The remaining question is the product-level one this ADR closes: which tiers v1 GA ships and which it defers.
29
+
30
+ The one-click solo install is an NFR-shaping invariant: the default deployment runs single-operator, no IdP, no KVM, and must not pay for a regulated enterprise's isolation or audit machinery to start.
31
+
32
+ ## Decision
33
+
34
+ The sandbox runtime tier is selected by the deployment-wide workload-trust profile — `runc` for `trusted_operator`, gVisor/`runsc` for `internal_workforce`, with microVM as the `untrusted` tier deferred post-v1 — and never by data classification (AP-13).
35
+
36
+ ## Consequences
37
+
38
+ - v1 GA bundles two runtimes and ships three deployable cells; the profile/tier matrix, allowed pairings, and rejected cells live in NFR-SEC-38, enforced at deploy time by the Control / operator API ([component 02](../components/02-control-operator-api.md)). This ADR does not restate them.
39
+ - The `trusted_operator` × `runc` cell preserves the one-click solo install — no KVM, no IdP, zero-config. gVisor is the hardened default for `internal_workforce`.
40
+ - Enterprise audit machinery stays opt-in for the solo default: the local audit-event emit is mandatory in code for every tier (NFR-SEC-45, fail-closed), but the external sinks and alarms that consume it — SIEM-bridge, SOAR webhook, the NFR-SEC-39 tier-downgrade alarm — are off when no such sink is configured. A solo operator reconfiguring their own tier raises a local event and nothing external fires.
41
+ - Per-tier escape resistance and the per-release red-team gate stay governed by NFR-SEC-02; the tier-downgrade alarm by NFR-SEC-39, emitted as `config.trust_profile.downgraded` through the Audit pipeline ([component 07](../components/07-audit-pipeline.md)). This ADR adds no requirement to either.
42
+ - The Session sandbox records this ADR in its `adr:` front-matter; its host-side exec-supervisor and runtime-supervisor model is unchanged, so the tier choice forces no Layer-6 container split.
43
+ - microVM packaging (Firecracker vs Kata, [#161](https://github.com/Wide-Moat/open-computer-use/issues/161)), per-session trust profile ([#162](https://github.com/Wide-Moat/open-computer-use/issues/162)), and the sandbox sub-split ([#174](https://github.com/Wide-Moat/open-computer-use/issues/174)) are downstream seams this ADR names but does not design.
44
+
45
+ ## Alternatives considered
46
+
47
+ - **microVM-default (E2B-style)** — hardware virtualization for every deployment. Rejected because it requires KVM on the `trusted_operator` path that needs no hardware boundary, breaking the one-click solo invariant.
48
+ - **gVisor-only floor** — drop `runc`, run `runsc` everywhere. Rejected because it removes zero-config `runc` from the `trusted_operator` path and pays user-space-kernel overhead where the workload-trust profile does not call for it.
49
+ - **Tier by data classification** — pick the tier from the data the agent touches. Rejected by AP-13: the container-escape surface for adversarial agent-issued code is identical regardless of data class.
50
+
51
+ ## Compliance impact
52
+
53
+ - `EU-AI-Act-Art.15` (4)/(5): the tier ladder is the agent-execution boundary's cybersecurity measure under the Article's accuracy-and-cybersecurity requirement for high-risk systems; per-tier red-team evidence lands via NFR-SEC-02.
54
+ - `DORA-Art.28` (4): the active runtime substrate per deployment is declared at deploy and auditable, so it is recordable in the ITS register of information.
55
+ - `NIST-SP-800-190` §3: workload separation is realized through each tier's isolation primitives (`runc` namespaces, gVisor user-space kernel, microVM hardware boundary) — cited for the primitives, not for the selection axis.
56
+
57
+ ## License impact
58
+
59
+ This is the adopting ADR for `runc` and gVisor, so both enter the Bill of Materials in [`manifesto/05-licensing-posture.md`](../manifesto/05-licensing-posture.md) as bundled (Apache-2.0; gVisor carries per-file MIT/BSD). Both clear the licence gate. Firecracker and Kata clear the same gate but are not bundled in v1; they enter the Bill of Materials when the microVM tier lands ([#161](https://github.com/Wide-Moat/open-computer-use/issues/161)).
60
+
61
+ ## Threat mitigation
62
+
63
+ The multi-tenant agent-execution invariant in [`02-trust-boundaries.md`](../02-trust-boundaries.md#4-per-tenant-isolation-menu) §4 forbids bare `runc` for multi-tenant execution and requires a user-space kernel or hardware virtualization; the tier ladder is how a deployment satisfies it. Per-tier escape resistance — seccomp BPF, Landlock, cap-drop ALL, read-only rootfs, and the zero-pass red-team gate — is held by NFR-SEC-02.
@@ -0,0 +1,63 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: proposed
6
+ last-reviewed: 2026-06-01
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ supersedes: []
10
+ superseded-by: null
11
+ compliance-impact: [SOC2-CC6.1, ISO27001-A.8.2, DORA-Art.9, NYDFS-500.7, EU-AI-Act-Art.14]
12
+ license-impact: none
13
+ threat-mitigation-link: ../components/02-control-operator-api.md
14
+ ---
15
+
16
+ Fixes how a human operator and an automated SOAR caller authenticate to the Control / operator API, and what that costs on the solo path. Audience: anyone touching operator auth, the kill switch, or SOAR integration.
17
+
18
+ # ADR-0004: Operator authentication substrate
19
+
20
+ ## Status
21
+
22
+ `proposed`
23
+
24
+ ## Context
25
+
26
+ The Control / operator API ([component 02](../components/02-control-operator-api.md)) is the privileged plane: it reaches the kill switch, the denylist authority, and tier admission. Two principals call it — a human operator and an automated SOAR responder — and the component marks operator-auth as `needs ADR` in its Boundaries, Operational concerns, and Open question #5 (tracked [#225](https://github.com/Wide-Moat/open-computer-use/issues/225)). This ADR closes that question.
27
+
28
+ The one-click solo install is an NFR-shaping invariant: the default deployment runs single-operator, no IdP, no KVM, and must not pay for a regulated enterprise's identity machinery to start. The substrate has to scale from that floor up to a customer with a federated identity provider and a PAM tool, without forking the contract.
29
+
30
+ Dual-control and break-glass stay out of scope. The kill switch is itself the single-operator emergency path, and accountability is already carried by the chain-linked audit emit before acknowledgement. The solo shelf has one operator, so two-person control cannot be a baseline.
31
+
32
+ ## Decision
33
+
34
+ The Control / operator API authenticates a human operator and an automated SOAR caller against a two-shelf substrate — minimal shelf is a host-rooted local operator credential plus a signature-verified signed-webhook, full shelf makes OCU a relying-party to the customer IdP (OIDC + SCIM, PAM-JIT via OIDC-asserted claims) and a SPIFFE SVID workload identity for SOAR — with multi-party approval left as a post-v1 policy seam over the same audit set, and no break-glass or dual-control fixture added.
35
+
36
+ ## Consequences
37
+
38
+ - Human identity, minimal shelf: a single host-rooted local operator credential, no IdP. Satisfies NFR-SEC-09 and NFR-COMP-29; preserves the zero-config solo path.
39
+ - Human identity, full shelf: OCU is a relying-party to the customer IdP — Keycloak/OIDC reference RP plus SCIM provisioning — with PAM just-in-time access driven by OIDC-asserted claims that integrate the customer PAM tool (a SAML-only IdP or PAM federates in through Dex or Keycloak, never an OCU SAML surface). The IdP and PAM tool are customer-provided, never bundled (NFR-COMP-29).
40
+ - SOAR machine identity, minimal shelf: signed-webhook plus admin API, the signature verified before any action per [component 02](../components/02-control-operator-api.md) (P2-R2), satisfying NFR-COMP-27.
41
+ - SOAR machine identity, full shelf: a SPIFFE SVID over mTLS, reusing the NFR-SEC-09 workload-identity floor. The per-boundary signer assignment and PKI tool pick are decided upstream by the PKI ADR tracked at [#152](https://github.com/Wide-Moat/open-computer-use/issues/152) ([`02-trust-boundaries.md`](../02-trust-boundaries.md) §8.1 names signer identity per boundary; the per-boundary signer table lands with that ADR); this ADR depends on it for the full-shelf signer and does not pick the PKI tool.
42
+ - A privileged call touches the Egress trust-edge ([component 06](../components/06-egress-trust-edge.md)) as denylist authority and emits to the Audit pipeline ([component 07](../components/07-audit-pipeline.md)); the emit-before-acknowledge ordering and fail-closed posture are governed by NFR-SEC-45, the kill-switch latency by NFR-SEC-01 and its under-saturation bound NFR-SEC-55.
43
+ - Multi-party approval is a named post-v1 policy seam layered over the NFR-SEC-45 audit set; a customer whose NIST SP 800-53 AC-3(2) baseline requires it selects it then. Nothing is built for it now.
44
+ - [Component 02](../components/02-control-operator-api.md) moves its `adr` reference from `[]` to `[0004]`.
45
+
46
+ ## Alternatives considered
47
+
48
+ - Bundle Teleport as the access plane — rejected: AGPLv3 plus commercial-only binaries fail the license gate (05-licensing-posture.md reject-table).
49
+ - Bundle HashiCorp Boundary as the access plane — rejected: BUSL fails the license gate (05-licensing-posture.md reject-table).
50
+ - Add a break-glass credential alongside the operator credential — rejected: the kill switch is already the single-operator emergency path and the audit emit already carries accountability, so a third fixture is ceremony.
51
+ - Assert two-person dual-control as the v1 baseline — rejected: the solo shelf has one operator, so it cannot be a baseline; it lands as the post-v1 multi-party seam instead.
52
+
53
+ ## Compliance impact
54
+
55
+ SOC2-CC6.1 and ISO 27001 A.8.2 (privileged-access control), DORA Art. 9 (protection and prevention), NYDFS 500.7 (access privileges), EU AI Act Art. 14 (human oversight — the kill switch is the oversight control).
56
+
57
+ ## License impact
58
+
59
+ None. OCU stays a relying-party; Keycloak/OIDC and SPIRE on the full shelf are integrated, not bundled by this ADR; the customer PAM tool is never bundled.
60
+
61
+ ## Threat mitigation
62
+
63
+ Mitigates the P2 attack-path rows in [component 02](../components/02-control-operator-api.md): unauthenticated or spoofed access to the privileged plane, and an unverified SOAR caller acting on the denylist or kill switch.
@@ -0,0 +1,62 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: proposed
6
+ last-reviewed: 2026-06-01
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ supersedes: []
10
+ superseded-by: null
11
+ compliance-impact: [SOC2-CC6.1, ISO27001-A.8.24, NYDFS-500.15, PCI-DSS-Req.3]
12
+ license-impact: none
13
+ threat-mitigation-link: ../02-trust-boundaries.md
14
+ ---
15
+
16
+ Egress credential delivery uses off-the-shelf Envoy SDS; OCU stores, mints, and rotates no secrets.
17
+
18
+ # ADR-0005: Egress credential delivery is off-the-shelf Envoy SDS
19
+
20
+ ## Status
21
+
22
+ `proposed`
23
+
24
+ ## Context
25
+
26
+ The Egress trust-edge (zone 4, [02-trust-boundaries.md](../02-trust-boundaries.md)) attaches upstream authorization on the outbound leg so the guest never holds the real credential (NFR-SEC-23 invariant). Behind that injection sits a source question: where the credential rests, what API the edge calls to fetch it, and who owns the unseal, rotation, lease, and key-escrow lifecycle of that source.
27
+
28
+ Envoy's Secret Discovery Service (SDS, gRPC xDS) is a standard protocol for runtime secret delivery to a proxy, with hot-swap on push. Envoy's native `credential_injector` filter attaches an Authorization header on the outbound leg. Both are off-the-shelf and require no OCU code for credential delivery, minting, or rotation. A solo operator points SDS at a static file; a regulated enterprise points it at a customer-provided SDS-compatible store over the same protocol.
29
+
30
+ ## Decision
31
+
32
+ The Egress trust-edge receives the upstream credential over Envoy SDS; the SDS source is a static file (solo deployments) or a customer-provided SDS-compatible store (enterprise deployments). Envoy's `credential_injector` filter attaches the Authorization header on the outbound leg. OCU stores, mints, and rotates nothing. Credential minting, rotation, revocation, and per-issuance audit are the SDS source's responsibility: the customer's store on the enterprise shelf, an operator-managed artifact on the solo shelf.
33
+
34
+ ## Consequences
35
+
36
+ - Zone count is five (was six). Credential custody is no longer a separate zone or container; credential attachment is a capability of the Egress trust-edge. Threat-model rows in [`06-threat-model.md`](../06-threat-model.md) and token-taxonomy rows in [`02-trust-boundaries.md`](../02-trust-boundaries.md) §8 that named Credential custody re-anchor to the Egress trust-edge and the SDS source.
37
+ - The solo path stays zero-config. A static file source has no stateful service, no unseal step, and no key infrastructure: the operator places the credential file on the host and points Envoy SDS at it. The minimal-shelf long-lived key is admissible only under NFR-SEC-60; the edge process memory is not a secret store against host-root.
38
+ - The enterprise path delegates lifecycle to the customer store. The customer provides an SDS endpoint (a gRPC address) that Envoy queries; that store owns unseal, dynamic-secret issuance, rotation, revocation, and audit. OCU documents the SDS contract — the Secret resource shape, TTL and refresh behavior, error behavior — and the customer operates the store.
39
+ - Upstream authorization is attached at the boundary, never in the guest. The guest carries no long-lived upstream secret on the egress leg (it may hold a short-lived session-scoped handle, which is not the upstream credential); Envoy's `credential_injector` attaches the credential on the edge-originated upstream leg before forwarding. The NFR-SEC-23 invariant (the real upstream secret never enters the guest) holds. The mechanism that attaches it — edge-inject here, or a protocol broker for a high-value scoped credential — is selected per upstream in [ADR-0007](0007-egress-auth-mechanism.md).
40
+ - The bespoke `F8` lease-pull gRPC protocol (issue [#205](https://github.com/Wide-Moat/open-computer-use/issues/205)), the STS delegator, the per-session lease-issue audit event, and the OCU-enforced TTL and revoke bounds are removed: they governed an OCU minting service that does not exist when Envoy SDS is the delivery path.
41
+ - The Egress trust-edge ([component 06](../components/06-egress-trust-edge.md)) records `0005` in its `adr:` front-matter. The SDS source binding (static file or customer endpoint) is a component-spec wiring detail.
42
+ - Envoy (Apache-2.0) is the egress edge and a bundled dependency. See the Bill of Materials in [`manifesto/05-licensing-posture.md`](../manifesto/05-licensing-posture.md).
43
+
44
+ ## Alternatives considered
45
+
46
+ - **Bespoke `F8` lease-pull protocol plus an OCU STS delegator.** Rejected: Envoy SDS is an open, implemented standard. A proprietary lease-pull wire protocol and minting service add code, audit surface, CVE liability, and operational cost for a property SDS already delivers, and grant no security property SDS lacks.
47
+ - **An OCU-bundled secret store (OpenBao, or a thin SDS server OCU runs).** Rejected: the store's governance — unseal, rotation policy, audit sink, key custody — is the customer's. Bundling a store breaks the solo one-click path with stateful infrastructure and duplicates machinery the customer already operates. OCU stays a consumer of the SDS API.
48
+ - **Inject the credential inside the guest (sandbox mount, env var, or guest-side config).** Rejected: violates NFR-SEC-23. A guest with in-sandbox root extracts the secret from memory, `/proc`, or the filesystem. The edge boundary holds the secret outside the guest, where injection keys on a presented scoped credential, never on network origin ([ADR-0007](0007-egress-auth-mechanism.md), the P6-E2 anti-pattern).
49
+
50
+ ## Compliance impact
51
+
52
+ - `SOC2-CC6.1` / `ISO27001-A.8.24`: secret confidentiality is realized by the SDS source — a customer store (enterprise) or a static file (solo). No OCU key-management policy is present to audit.
53
+ - `NYDFS-500.15`: encryption of nonpublic information in transit (the upstream authorization header) holds on the edge-originated TLS leg and on the customer store's TLS to its SDS endpoint.
54
+ - `PCI-DSS-Req.3`: stored-credential protection is the customer store's on the enterprise shelf; the solo shelf rests the credential in a static file under authenticated encryption (the file primitive is a component-spec choice, not this decision).
55
+
56
+ ## License impact
57
+
58
+ Envoy is Apache-2.0 and is bundled. No stateful secret store is bundled by this decision.
59
+
60
+ ## Threat mitigation
61
+
62
+ Addresses Information Disclosure and credential-compromise paths at the Egress trust-edge (the credential is attached only on the edge-originated upstream leg, where the request's network identity is known) and on the guest→upstream path (the upstream secret never enters the guest, per NFR-SEC-23). The deferred maturity question on Envoy's `credential_injector` / OAuth2 filter for untrusted upstreams is tracked in [component 06](../components/06-egress-trust-edge.md) Open questions.
@@ -0,0 +1,65 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: proposed
6
+ last-reviewed: 2026-06-01
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ supersedes: []
10
+ superseded-by: null
11
+ compliance-impact: [SOC2-CC6.6, SOC2-CC6.7, NYDFS-500.15, DORA-Art.9, EU-AI-Act-Art.12]
12
+ license-impact: Envoy Apache-2.0; clears the allow-list, bundled by this ADR
13
+ threat-mitigation-link: ../components/06-egress-trust-edge.md
14
+ ---
15
+
16
+ Picks the forward-proxy substrate for the Egress trust-edge and scopes it to the v1 deny-by-default floor. Audience: anyone wiring or auditing the sandbox's outbound path.
17
+
18
+ # ADR-0006: Egress forward-proxy substrate
19
+
20
+ ## Status
21
+
22
+ `proposed`
23
+
24
+ ## Context
25
+
26
+ The Egress trust-edge ([component 06](../components/06-egress-trust-edge.md)) is the sandbox's sole outbound network path. v1 ships one capability there: a deny-by-default destination allow-list applied at connect time on resolved-IP and SNI, with a machine-parseable reason on every block. That floor must run from a single `docker-compose up` with no certificate authority, no IdP, and no policy engine — the one-click solo install is an NFR-shaping invariant.
27
+
28
+ The component spec carries no substrate decision (`adr: []`) and an open question on which proxy provides it (open-Q#2). A purpose-built forward proxy supplies connect-time allow-listing, a controllable resolver, and an external-authorization seam. The risk is over-buying: pulling in TLS termination, dynamic config distribution, or an inline content-inspection path that the v1 floor does not need and that would tax the solo default.
29
+
30
+ MITM termination — per-SNI on-the-fly leaf certificates — was a separate decision deferred at the time of this ADR (component 06 open question #2, the MITM-termination half); it is now decided in [ADR-0007](0007-egress-auth-mechanism.md) on the same Envoy substrate plus a self-hosted SDS minting service. This ADR fixes only the forward-proxy substrate and the deny-by-default floor.
31
+
32
+ ## Decision
33
+
34
+ The Egress trust-edge runs an Apache-2.0/MIT/BSD forward proxy — Envoy is the lead candidate (Apache-2.0, native connect-time SNI/resolved-IP filtering and an `ext_authz`/`ext_proc` seam), with the final binary left to the component spec — configured to the v1 floor only: a deny-by-default allow-list at connect time on resolved-IP + SNI, a proxy-owned resolver carrying the mandatory deny-set, a machine-parseable `x-deny-reason` on block, one external-authorization seam whose default backend is a static allow-list, and a per-upstream-leg credential-origination hook.
35
+
36
+ ## Consequences
37
+
38
+ - Component 06 records this ADR in its `adr:` front-matter (`[]` → `[0006]`). The allow-list at connect time satisfies NFR-SEC-08 and NFR-SEC-17; the proxy-owned resolver enforces NFR-SEC-12's mandatory deny-set; the structured block carries the `x-deny-reason` vocabulary the spec already defines. This ADR does not restate those NFRs.
39
+ - The `ext_authz`/`ext_proc` seam ships with a static allow-list as its default backend — the solo path configures no policy engine. OPA as a full-shelf backend behind the same seam is deferred, not v1.
40
+ - The credential-origination hook is the seam where the edge attaches the upstream authorization received over Envoy SDS ([ADR-0005](0005-egress-credential-delivery-envoy-sds.md)); it fires only on a leg that needs it, never on the transparent default route. No CA, cert-issuer, ICAP, or credential wiring lands on the transparent path.
41
+ - The broker backend leg ([component 04](../components/04-storage-broker.md), F9) traverses the proxy on a storage-dedicated lane, distinct from the guest egress lane ([NFR-SEC-85](../manifesto/02-nfrs.md), [ADR-0011](0011-storage-egress-lane.md)), with no TLS termination, so the broker-signed request is forwarded byte-intact per NFR-SEC-25.
42
+ - Every allow and every deny is emitted as an OCSF event through the Audit pipeline ([component 07](../components/07-audit-pipeline.md)); the payload-independent exfil tripwire (NFR-SEC-57) runs on this path with no CA. This ADR adds no requirement to either.
43
+ - The egress posture is the NFR-FLEX-15 ladder (deny-all / transparent pass-through / egress-wide bump / external SDS): this ADR fixes the forward-proxy substrate and the deny-by-default floor that every rung shares; egress-wide-bump origination (NFR-SEC-30, NFR-SEC-37, NFR-SEC-50) and DLP/ICAP as a bump-rung config (NFR-COMP-28) ride the same substrate and are decided in [ADR-0007](0007-egress-auth-mechanism.md) (which resolves component 06 open question #2).
44
+ - xDS dynamic config and per-node sharding ([#175](https://github.com/Wide-Moat/open-computer-use/issues/175)) are deferred seams this ADR names but does not design.
45
+
46
+ ## Alternatives considered
47
+
48
+ - **Squid (GPL-2.0+)** — mature forward proxy with SslBump for the later egress-wide-bump leg; clears the allow-list, but a bundled GPL binary triggers the distribution review noted in [`manifesto/05-licensing-posture.md`](../manifesto/05-licensing-posture.md), and its config model fits the deny-by-default floor less directly than Envoy's filter chain.
49
+ - **HAProxy (GPL-2.0+ / LGPL)** — passes the allow-list and handles SNI routing, but bundling carries the same GPL distribution review and it lacks a first-class external-authorization seam equivalent to `ext_authz`.
50
+ - **Hand-rolled CONNECT proxy** — a minimal Go/Rust proxy owned end to end. Rejected: re-implementing resolver pinning, filter chains, and an `ext_authz` seam is net-new attack surface a regulated-enterprise InfoSec review would not credit against a vendor-backed proxy.
51
+
52
+ ## Compliance impact
53
+
54
+ - `SOC2-CC6.6` / `SOC2-CC6.7`: the deny-by-default allow-list and structured deny reason are the boundary-protection and transmission controls for outbound flows.
55
+ - `NYDFS-500.15`: outbound destinations are gated and logged, supporting the access-and-monitoring controls.
56
+ - `DORA-Art.9`: the edge is the network-segmentation and traffic-control measure for the sandbox's outbound leg, recordable per deployment.
57
+ - `EU-AI-Act-Art.12`: allow/deny events emitted to the Audit pipeline contribute to the automatic record-keeping required of high-risk systems.
58
+
59
+ ## License impact
60
+
61
+ This is the adopting ADR for the forward proxy: Envoy enters the Bill of Materials in [`manifesto/05-licensing-posture.md`](../manifesto/05-licensing-posture.md) as bundled (Apache-2.0), clearing the licence gate. The Squid and HAProxy alternatives clear the same gate, but a bundled GPL binary triggers the distribution review that file records; neither is bundled by this ADR.
62
+
63
+ ## Threat mitigation
64
+
65
+ The deny-by-default floor is the v1 realization of the egress controls in [`06-egress-trust-edge.md`](../components/06-egress-trust-edge.md) (P6 rows): connect-time allow-listing on resolved-IP + SNI, the proxy-owned resolver's mandatory deny-set, and the payload-independent exfil tripwire (NFR-SEC-57) that runs in both postures without a CA. The credential-origination hook keeps the upstream authorization off the guest, attached over Envoy SDS ([ADR-0005](0005-egress-credential-delivery-envoy-sds.md)) only on the leg that needs it.
@@ -0,0 +1,72 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: proposed
6
+ last-reviewed: 2026-06-01
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ supersedes: []
10
+ superseded-by: null
11
+ compliance-impact: [SOC2-CC6.1, SOC2-CC6.6, NYDFS-500.15, DORA-Art.28, EU-AI-Act-Art.15]
12
+ license-impact: TLS-termination substrate is the same Envoy already bundled by ADR-0006; a per-SNI cert-minting sidecar is the added build surface
13
+ threat-mitigation-link: ../components/06-egress-trust-edge.md
14
+ ---
15
+
16
+ Selects how the Egress trust-edge attaches upstream authorization — by edge injection or by a protocol broker — and scopes v1 to edge injection only. Audience: anyone wiring or auditing how the sandbox reaches an authenticated upstream.
17
+
18
+ # ADR-0007: Egress auth mechanism — edge-inject vs protocol-broker
19
+
20
+ ## Status
21
+
22
+ `proposed`
23
+
24
+ ## Context
25
+
26
+ The guest holds no long-lived upstream secret ([NFR-SEC-23](../manifesto/02-nfrs.md)); the credential is attached outside the guest. Two mechanisms can do that, and they suit different upstreams. The Egress trust-edge can originate the connection and inject an `Authorization` header (edge-inject), or a host-side broker can hold the credential, speak the upstream protocol itself, and expose only a local handle to the guest (protocol-broker). [ADR-0005](0005-egress-credential-delivery-envoy-sds.md) fixed where the credential comes from (Envoy SDS); [ADR-0006](0006-egress-forward-proxy-substrate.md) fixed the forward-proxy substrate (Envoy, deny-by-default floor). Neither decided which mechanism attaches the credential, nor how the edge terminates TLS to do it — left open as component-06 open question #2. The forcing constraint is the one-click solo install ([NFR-FLEX-15](../manifesto/02-nfrs.md)): the default path must run from one `docker-compose up` with no certificate authority an operator has to manage.
27
+
28
+ ## Decision
29
+
30
+ We will select the egress auth mechanism by the upstream's properties — edge-inject for a fixed-client, low-granularity bearer credential; protocol-broker for a high-value credential scoped by per-operation rights — and ship only edge-inject in v1, because the v1 upstream is an LLM API and a broker is unneeded surface until a scoped-credential upstream exists.
31
+
32
+ The selection axis:
33
+
34
+ | Upstream property | Mechanism |
35
+ |---|---|
36
+ | Client is a fixed binary that hardcodes the endpoint; credential is one bearer token; protocol is HTTP + `Authorization`; no per-operation authorization needed | **edge-inject (egress-wide bump)** |
37
+ | Credential is high-value and scoped by rights (repo / object / tenant); protocol is multi-operation (git-smart-http, S3/SigV4, REST with per-object authz); the credential holder must authorize each operation | **protocol-broker** |
38
+
39
+ v1 implements edge-inject. Protocol-broker is named, abstraction-ready, and deferred: the pattern is already canonical as the Storage broker zone ([02-trust-boundaries.md](../02-trust-boundaries.md) §2), which holds the object-store backend credential and exposes a session-scoped handle. A future scoped-credential upstream reuses that zone; v1 builds no new broker.
40
+
41
+ **edge-inject mechanism (v1).** The edge runs egress-wide bump: it terminates every outbound TLS connection by presenting a leaf certificate minted on demand for the requested SNI, signed by a per-deployment CA whose public certificate is in the sandbox trust store and whose private key never enters the guest. It injects the upstream credential on the re-originated leg and re-establishes TLS to the genuine upstream, validating the upstream's real certificate against the public CA set. Injection is gated on a presented, scoped credential carried by the request — never on the request's network origin (a guest process that presents no credential receives none, which is why a bare `curl` from the sandbox reaches an allowed host but is unauthenticated). The substrate is the Envoy already bundled by ADR-0006 as the data plane, plus a self-hosted SDS minting service (a gRPC `SecretDiscoveryService` that stamps a leaf for the requested SNI from the CA key); Envoy alone does not mint leaves on the fly.
42
+
43
+ ## Consequences
44
+
45
+ - Component 06 records this ADR in its `adr:` front-matter (`[0005, 0006]` → `[0005, 0006, 0007]`); open question #2 (the MITM-termination half) is resolved here.
46
+ - Egress posture follows need, not a fixed default ([02-trust-boundaries.md](../02-trust-boundaries.md) §7): a deployment that needs no egress runs deny-all; one that needs only unauthenticated internet runs transparent pass-through; one that needs an authenticated upstream runs egress-wide bump. Bump is the default *only when an upstream credential is configured* — it is not imposed on a deployment that needs no outbound credential, so the one-click solo path stays intact. [NFR-FLEX-15](../manifesto/02-nfrs.md) is reframed from a two-mode switch to this ladder.
47
+ - The bump CA is generated per deployment and its public certificate is injected into the sandbox trust store automatically at start; "one-click" is preserved by automating the CA, not by omitting it. The private key sits only on the minting service.
48
+ - Egress-wide bump holds plaintext for every inspected destination at the edge, a larger blast radius than the broker pattern. The credential-holding minter and the plaintext-inspection path are distinct trust surfaces: the rule the substrate must not blur is that the injected credential does not share a blast radius with the plaintext of all egress. A single Envoy-plus-minter process is admissible on the solo shelf only because the injected credential there is itself scoped and short-lived; a high-value long-lived credential separates the minter from the inspection plane.
49
+ - The leaf source is static or dynamic by the allow-list's shape, not its size: a config-time-enumerable allow-list that changes slower than the deploy cadence is served by pre-minted leaves over a file SDS source (Envoy holds thousands of certificates without issue — the limit is enumerability, sub-domain depth, and churn, not a certificate count). A non-enumerable allow-list (CDN shards, per-tenant sub-domains, deep multi-label hosts a wildcard cannot compress, or third-party-controlled naming) requires the dynamic per-SNI minter. v1's single LLM apex is the trivial static case; the minter is specified so the dynamic case needs no re-decision.
50
+ - mTLS / cert-pin / proof-of-possession upstreams cannot be served by header injection and stay tracked at [#176](https://github.com/Wide-Moat/open-computer-use/issues/176); they are a protocol-broker or out-of-scope case, not an edge-inject one.
51
+ - This ADR adds no requirement to the Audit pipeline, the resolver, or the allow-list that ADR-0006 already fixed; it sits above them.
52
+
53
+ ## Alternatives considered
54
+
55
+ - **Protocol-broker for v1's LLM upstream** — rejected: the LLM credential is a single low-granularity bearer to a fixed endpoint, so a broker that speaks the protocol and authorizes per operation buys nothing the edge does not, and adds a stateful service to the solo path.
56
+ - **mitmproxy / Squid ssl-bump as the bump substrate** — both mint per-SNI leaves natively with less code than a custom SDS minter. Rejected as the default: adopting either as the bump engine drops the Envoy data plane (the allow-list, OCSF audit emit, and `ext_authz` seam ADR-0006 already placed there) or runs two proxies in series. The Envoy-plus-minter path keeps one data plane; mitmproxy (BSD, clears the licence gate) is recorded as the fallback for a deployment that does not need the Envoy data plane.
57
+ - **GCP Secure Web Proxy (managed Envoy + minter)** — supplies exactly this shape as a managed service. Rejected: not self-hostable inside a customer perimeter, which is the deployment target; it informs the architecture but cannot be the substrate.
58
+ - **Inject user personal access tokens through the egress edge** — proposed as a way to let the agent reach a user's third-party account by storing each user's PAT outside the guest and injecting it like the LLM key. Rejected: a PAT is a high-value credential scoped by rights, so by this ADR's own axis it is a protocol-broker case, not edge-inject. Edge injection cannot authorize per operation (it staples the token to every request to that host) and would make OCU a store of users' personal third-party access — the broad blast radius an InfoSec review rejects. The correct path is the broker pattern with short-lived, per-resource tokens (e.g. a GitHub App installation token), deferred with the rest of the broker mechanism.
59
+
60
+ ## Compliance impact
61
+
62
+ - `SOC2-CC6.1` / `SOC2-CC6.6`: the credential is attached outside the guest on the edge-originated leg, and the bump segment is a single named inspection point — the access-control and boundary-protection story for authenticated egress.
63
+ - `NYDFS-500.15`: the upstream authorization is encrypted in transit on both legs; the re-originated leg validates the genuine upstream certificate.
64
+ - `DORA-Art.28` / `EU-AI-Act-Art.15`: the selection axis records, per upstream, where a credential is held and how each authenticated outbound flow is mediated — the third-party-arrangement and robustness evidence for the outbound path.
65
+
66
+ ## License impact
67
+
68
+ The TLS-termination substrate is the Envoy already bundled by [ADR-0006](0006-egress-forward-proxy-substrate.md); no new bundled proxy. The added build surface is a self-hosted SDS minting service (OCU code). mitmproxy, if later adopted as the fallback engine, is BSD and clears the licence gate; it is recorded in [`manifesto/05-licensing-posture.md`](../manifesto/05-licensing-posture.md) as rejected-as-default for dropping the Envoy data plane.
69
+
70
+ ## Threat mitigation
71
+
72
+ Resolves the MITM-termination half of [component 06](../components/06-egress-trust-edge.md) open question #2 and tightens P6-E2: injection keyed on a presented scoped credential, never on network origin, bounds a cross-scope or compromised-in-guest process to the credentials it can present rather than to whatever the sandbox can reach. The anti-pattern this forbids — "inject because traffic came from sandbox X" — is named so it is not re-introduced.
@@ -0,0 +1,59 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: proposed
6
+ last-reviewed: 2026-06-02
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ supersedes: []
10
+ superseded-by: null
11
+ compliance-impact: [SOC2-CC6.1, NYDFS-500.15, DORA-Art.28]
12
+ license-impact: none
13
+ threat-mitigation-link: ../06-threat-model.md
14
+ ---
15
+
16
+ Fixes how the Egress trust-edge attributes an outbound request to the session that owns it, and scopes that attribution to deny decisions only. Audience: anyone wiring or auditing how per-session egress policy reaches the edge.
17
+
18
+ # ADR-0008: Session-to-egress attribution by presented token
19
+
20
+ ## Status
21
+
22
+ `proposed`
23
+
24
+ ## Context
25
+
26
+ [ADR-0007](0007-egress-auth-mechanism.md) gates credential injection on a credential the request *presents*, never on its network origin — the forbidden P6-E2 pattern is "inject because traffic came from sandbox X". Per-session deny policy still has to reach the edge: the kill-switch denylist ([component 02](../components/02-control-operator-api.md)), downloadable-deny ([NFR-SEC-73](../manifesto/02-nfrs.md)), and per-session rate limits all need the edge to know *which session* a request belongs to. Nothing decided how the edge derives that session identity. Because the edge bump-terminates TLS on the egress-wide-bump rung ([NFR-FLEX-15](../manifesto/02-nfrs.md), [02-trust-boundaries.md](../02-trust-boundaries.md) §7, [ADR-0006](0006-egress-forward-proxy-substrate.md), [ADR-0007](0007-egress-auth-mechanism.md)) — the guest trusts the per-deployment CA whose public certificate is in its trust store, so the edge can terminate and read — it holds the plaintext request and the session token the guest carries. The open question is whether attribution reads that L7 token or instead needs a network-layer fact (source IP, mTLS peer, the host↔guest connection identity).
27
+
28
+ ## Decision
29
+
30
+ We will attribute an outbound request to its owning session by the **session-scoped token the request presents at L7**, read after bump-termination, and key every per-session deny and rate decision on the verified token's claims — not on any network-layer fact. The edge runs the off-the-shelf Envoy filter chain `jwt_authn → ext_authz → rbac → ratelimit → credential_injector → router`: `jwt_authn` reads and verifies the token and writes its session claim to dynamic metadata; `ext_authz` consults the denylist and `ratelimit` applies the per-session limit on that claim; `credential_injector` attaches the SDS-delivered upstream credential. Injection stays gated on the presented token by filter order — auth and denylist filters terminate a disallowed request before it reaches the injector, which carries no per-request predicate of its own — so a request that presents no valid session token is rejected and never injected, satisfying the [ADR-0007](0007-egress-auth-mechanism.md) gate. The session token is the presented scoped credential that ADR-0007 gates injection on: one L7 read of the same artifact serves both the deny/rate decision here and the injection gate there.
31
+
32
+ Network-layer identity is **not** the egress attribution key. The host-attested network fact (per-session netns, host kernel peer-credentials, or the hypervisor vsock context id by runtime tier) attributes a connection to a *guest* on the host↔guest channel and isolates one sandbox from another — guest isolation, owned by [02-trust-boundaries.md](../02-trust-boundaries.md) §4 and [NFR-SEC-43](../manifesto/02-nfrs.md). It is a different boundary from egress session attribution and is not restated as one here.
33
+
34
+ ## Consequences
35
+
36
+ - The session claim drives **deny** at the Egress trust-edge ([component 06](../components/06-egress-trust-edge.md)): `ext_authz` refuses a revoked session against the denylist, downloadable-deny ([NFR-SEC-73](../manifesto/02-nfrs.md)) drops an egress-eligible artifact, and `ratelimit` bounds the session. It is never the injection trigger on its own — that is the [ADR-0007](0007-egress-auth-mechanism.md) line; here it is enforced by filter order, not a flag.
37
+ - Component 06 records this ADR in its `adr:` front-matter (`[0005, 0006, 0007]` → `[0005, 0006, 0007, 0008]`); the sandbox-listener face now has a named session key — the L7 token — and the denylist-at-edge invariant reads it through `ext_authz`.
38
+ - Positive: attribution needs no per-session network plumbing, so it holds identically across every runtime tier ([ADR-0003](0003-sandbox-runtime-tier-ladder.md)) — `runc` shared-kernel with no context id, gVisor, and microVM all present the same L7 token. The chain is native Envoy ([ADR-0006](0006-egress-forward-proxy-substrate.md)); no custom data-plane code.
39
+ - Negative: the token must be a verifiable JWT for `jwt_authn` to validate it standalone; an opaque token moves validation to an `ext_authz` introspection call-out to the session authority (still native Envoy, one more dependency on the call path). `credential_injector` is the youngest filter in the chain — pin its version and smoke-test the SDS-rotation path.
40
+ - Neutral: a downstream filter trusts the token only after `jwt_authn` records a verified status, never a copied claim header alone, so a forged claim header cannot pass; claims reach `ext_authz` as metadata, not a trusted header.
41
+
42
+ ## Alternatives considered
43
+
44
+ - **Host-attested network fact (netns / peer-credentials / vsock context id) as the egress key** — rejected: that fact attributes a connection to a guest and isolates sandboxes (the host↔guest concern, [NFR-SEC-43](../manifesto/02-nfrs.md)); it is absent or weak exactly where the edge bumps (shared-kernel `runc` has no context id), and the edge already holds the session token in plaintext after bump, so a network fact adds nothing the L7 read does not give. Carrying it onto the egress edge conflates isolation with attribution.
45
+ - **Source IP as the session key** — rejected: a guest-settable network fact; keying any decision on it re-introduces the P6-E2 network-origin pattern.
46
+ - **A custom Envoy filter or `ext_proc` for the read/validate/inject path** — rejected: the native `jwt_authn` / `ext_authz` / `ratelimit` / `credential_injector` chain covers it; custom data-plane code is only needed for value-varying per-session credential selection, which v1's single upstream does not require.
47
+
48
+ ## Compliance impact
49
+
50
+ - `SOC2-CC6.1`: per-session deny reaches the boundary on a verified token claim, so a revoked or rate-limited session is enforced at the egress point — the access-control story for outbound traffic.
51
+ - `NYDFS-500.15` / `DORA-Art.28`: the outbound leg's session identity is the verified token, audited per request, recording which session each authenticated outbound flow belongs to.
52
+
53
+ ## License impact
54
+
55
+ None. The chain is native Envoy filters already bundled by [ADR-0006](0006-egress-forward-proxy-substrate.md); no new dependency.
56
+
57
+ ## Threat mitigation
58
+
59
+ Tightens the deny side behind P6-E2 in [the threat model](../06-threat-model.md): a request presenting no valid session token is rejected before the injector, and a forged claim is caught by the verified-status check, so a compromised guest cannot borrow a co-tenant's egress policy by forging a header. Per-action authorization on the attributed session — what that session may do to which object — is separate and tracked at [#187](https://github.com/Wide-Moat/open-computer-use/issues/187); whether the session token is a JWT or an opaque token validated by introspection is the open sub-question at [#160](https://github.com/Wide-Moat/open-computer-use/issues/160).