@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,109 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ # 01 — The 4-Layer Model
5
+
6
+ > Target architecture, adapted from internal design notes.
7
+ > Same model. Same separation of concerns. Our concrete component names.
8
+
9
+ ## Diagram
10
+
11
+ ```text
12
+ ┌─────────────────────────────────────────────────────────────────────┐
13
+ │ LAYER 4 — Control Plane (Go service) │
14
+ │ • User-facing API: MCP gateway + REST/GraphQL for admin UI │
15
+ │ • Auth: OIDC / JWT, tenancy, RBAC │
16
+ │ • Session router: session_id → sandbox handle (KV store) │
17
+ │ • Secret broker: short-lived creds, key rotation │
18
+ │ • Quota / rate-limit / audit log │
19
+ │ • Egress proxy management (JWT-allowlist signing) │
20
+ └────────────────────────┬────────────────────────────────────────────┘
21
+ │ HTTP / gRPC (internal, mTLS)
22
+
23
+ ┌─────────────────────────────────────────────────────────────────────┐
24
+ │ LAYER 3 — Orchestrator / Provider (pluggable) │
25
+ │ SandboxProvider interface: │
26
+ │ spawn(template) → handle exec(handle, cmd) → stream │
27
+ │ configure(handle, ctx) stop(handle) │
28
+ │ list() / health(handle) │
29
+ │ │
30
+ │ Implementations: │
31
+ │ • DockerComposeProvider ← PoC, current path (Phases 1–4) │
32
+ │ • KubernetesProvider ← prod, on agent-sandbox CRDs (Phase 5) │
33
+ │ • DirectCHProvider ← bare-metal microVM (Phase 9+, opt) │
34
+ │ │
35
+ │ Owns: scheduling, warm pool, networking, storage binding │
36
+ └────────────────────────┬────────────────────────────────────────────┘
37
+ │ creates / drives
38
+
39
+ ┌─────────────────────────────────────────────────────────────────────┐
40
+ │ LAYER 2 — Sandbox Runtime (pluggable) │
41
+ │ Selected per template via RuntimeClass / direct hypervisor: │
42
+ │ • runc — dev/CI, no isolation │
43
+ │ • sysbox — internal/trusted, fast, kernel-shared │
44
+ │ • gVisor — code-exec only (NOT browser) │
45
+ │ • kata-ch — Cloud Hypervisor microVM, untrusted Computer Use │
46
+ │ • kata-fc — Firecracker microVM, fastest cold start │
47
+ └────────────────────────┬────────────────────────────────────────────┘
48
+ │ provides PID 1 process namespace
49
+
50
+ ┌─────────────────────────────────────────────────────────────────────┐
51
+ │ LAYER 1 — Guest Agent │
52
+ │ Today: Python entrypoint + MCP server inside image (transition) │
53
+ │ Future: small Rust static binary as PID 1 (Phase 7) │
54
+ │ Surface: data-plane WS (vsock on microVM, TCP elsewhere) │
55
+ │ + control-plane HTTP (health/shutdown, fs_freeze Phase 10) │
56
+ │ Duties: exec, file ops, port-forward, CDP proxy, ttyd, MCP tools │
57
+ │ Does NOT: authenticate (L4 does), persist state (L3 does) │
58
+ └─────────────────────────────────────────────────────────────────────┘
59
+ ```
60
+
61
+ ## Why this split
62
+
63
+ - **Independent evolution.** Replace the runtime (L2) without touching the agent (L1) or the orchestrator (L3). Add a new orchestrator (L3) without changing the user-facing protocol (L4).
64
+ - **Threat-model-driven runtime choice.** Same agent, same control plane, different L2 for different tenants. Trusted internal → sysbox. Public Computer Use → Kata + Cloud Hypervisor.
65
+ - **One protocol for users.** L4 exposes **MCP** (already in production with us) plus a thin admin REST/GraphQL. L1–L3 internal contracts stay internal.
66
+
67
+ ## Mapping today's code to this model
68
+
69
+ | Today | Where it lives | Future layer | Migration phase |
70
+ |---|---|---|---|
71
+ | `computer-use-server/app.py` (FastAPI, MCP, uploads, auth) | repo root | **L4** Control Plane (will be Go) | Phase 6 cutover |
72
+ | `computer-use-server/docker_manager.py` (Docker socket, lifecycle, cleanup) | repo root | **L3** Provider (`DockerComposeProvider`) | Phase 1 extract behind interface |
73
+ | `computer-use-server/mcp_tools.py` (bash/python/file tools) | repo root | **L4** (gateway) + **L1** (exec target) | Phase 7 split |
74
+ | `Dockerfile` entrypoint, in-image MCP server | sandbox image | **L1** Guest Agent (Python → Rust per [ADR-0002](../adr/0002-guest-agent-language-go.md)) | Phase 7 |
75
+ | Docker (`runc`) as runtime | host | **L2** Runtime (`runc` tier) | Phase 9 adds Kata tiers |
76
+ | `helm/computer-use-server/` (single Deployment + DinD sidecar) | repo | **L3** + **L4** k8s manifests, split | Phases 5, 6 |
77
+ | `/tmp/computer-use-data` + Docker volumes | host fs | **Storage** ([06-storage.md](./06-storage.md)) — moves to S3 | Phase 3 |
78
+ | Static env-var secrets (Anthropic, GitLab, vision) | container env | **L4** secret broker | Phase 4 |
79
+
80
+ ## What changes for users — nothing (intentionally)
81
+
82
+ - The MCP contract (tools, headers, auth) stays stable across every phase.
83
+ - Docker Compose PoC keeps working through Phase 10.
84
+ - Open WebUI integration is L4-facing — unchanged.
85
+
86
+ ## What does NOT belong to any of these layers
87
+
88
+ - **Skills** (the AI capability bundles under `skills/`) — packaging, not architecture. They mount into L1 sandboxes. See [06-storage.md](./06-storage.md).
89
+ - **Open WebUI** — a downstream consumer of L4's MCP gateway. Not part of this stack.
90
+ - **Sub-agent CLIs** (claude, codex, opencode) — executed *inside* L1. Tooling, not architecture.
91
+
92
+ ## Reference architectures we draw from
93
+
94
+ - **AWS Lambda** ([`references.md`](../references.md) Lambda framing, [ADR-0010](../adr/0010-lambda-as-inspiration-not-runtime.md)) — pattern source for Firecracker tiering, two-tier control split, and snapshot-pool cold-start economics. **Inspiration, not deployment substrate.**
95
+ - **E2B `envd`** ([`research/02`](../research/02-e2b-infra.md)) — Go-language L1 reference and production-shape validation.
96
+ - **Coder** ([`research/03`](../research/03-coder.md)) — workspace-proxy and multi-region patterns for Phase 10.
97
+ - **bubblewrap / seatbelt sandboxing** (industry-observed) — secondary-defense patterns inside the guest that inform hardening within microVMs at Phase 9.
98
+
99
+ ## Source
100
+
101
+ - Internal design notes — the layered model and shared vocabulary.
102
+
103
+ ## See also
104
+
105
+ - [02 — Layer 4: Control Plane](./02-layer4-control-plane.md)
106
+ - [03 — Layer 3: Providers](./03-layer3-providers.md)
107
+ - [04 — Layer 2: Runtimes](./04-layer2-runtimes.md)
108
+ - [05 — Layer 1: Guest Agent](./05-layer1-guest-agent.md)
109
+ - [Roadmap](../roadmap.md)
@@ -0,0 +1,122 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ # 02 — Layer 4: Control Plane
5
+
6
+ > Status: **design** (locked target). Implementation lands in roadmap Phase 6.
7
+ > Language: **Go** ([ADR-0001](../adr/0001-control-plane-language-go.md)).
8
+ > Until Phase 6 ships, today's `computer-use-server/` (FastAPI) **is** the de-facto L4 — Phases 1–5 evolve it in place.
9
+
10
+ ## Responsibilities
11
+
12
+ 1. **User-facing MCP gateway.** Accept MCP JSON-RPC over HTTP/WebSocket (the same surface today's `app.py` exposes at `/mcp`). Authenticate, route to a session's L1 agent, stream results back.
13
+ 2. **Admin REST/GraphQL.** Operator-facing API: list sessions, drain a tenant, rotate keys, push a new `SandboxTemplate`, view audit log. Backs the admin UI.
14
+ 3. **Tenancy & auth.** OIDC (employee + customer), JWT issuance for sandbox-internal use, RBAC.
15
+ 4. **Session router.** `session_id → { sandbox_handle, tenant_id, template_id, created_at }`. Backed by a fast KV (Redis / Valkey / etcd). Single source of truth for "which sandbox serves this chat".
16
+ 5. **Secret broker.** Mint short-lived, scoped credentials (Anthropic, GitLab, S3 STS) on session start; rotate without restarting the sandbox. See [07-security.md](./07-security.md).
17
+ 6. **Egress JWT signer.** Issue per-session JWTs that encode allowed egress destinations; the egress proxy ([09-templates.md](./09-templates.md) + [08-networking.md](./08-networking.md)) validates them.
18
+ 7. **Quota / rate-limit.** Per-tenant concurrent sandboxes, per-tenant request rate.
19
+ 8. **Audit log.** Structured events: session created/destroyed, template assigned, exec called, egress request, secret rotated. Retention ≥ 90 days. See [10-observability.md](./10-observability.md).
20
+
21
+ ## What L4 must NOT do
22
+
23
+ - **Spawn sandboxes directly.** It calls L3 providers — never `docker.run` or `kubectl apply`.
24
+ - **Hold long-lived sandbox credentials in env.** Secret broker mints them per-session.
25
+ - **Trust L1 agents.** L1 is reachable only through L3-managed network paths; L4 ↔ L3 is the only authenticated hop.
26
+
27
+ ## API surface (target)
28
+
29
+ | Endpoint | Purpose | Notes |
30
+ |---|---|---|
31
+ | `POST /mcp` | MCP JSON-RPC (initialize / tools/list / tools/call) | Bearer auth; existing contract preserved |
32
+ | `GET /mcp/sse` or `WS /mcp` | Streaming for long tool calls | Today: synchronous HTTP; future: streaming |
33
+ | `GET /healthz`, `/readyz` | K8s probes | Same as today |
34
+ | `POST /api/uploads` / `GET /api/files/{path}` | Per-tenant user data I/O | Backed by S3 (Phase 3+) |
35
+ | `GET /system-prompt` | Tenant-scoped system prompt rendering | Same as today |
36
+ | `POST /admin/tenants/{id}/keys/rotate` | Force-rotate tenant secrets | Admin-only |
37
+ | `GET /admin/sessions` | List + filter | Admin-only |
38
+ | `POST /admin/sessions/{id}/terminate` | Force kill | Admin-only |
39
+ | `GET /admin/templates` / `POST /admin/templates` | CRUD sandbox templates | Admin-only; see [09-templates.md](./09-templates.md) |
40
+ | `GET /admin/audit` | Query audit log | Read-only, append-only store |
41
+
42
+ The `POST /mcp` contract is **frozen** as the user-facing surface — never break it across phases.
43
+
44
+ ## Internal contracts
45
+
46
+ - **L4 → L3 (provider):** **connect-go** (gRPC + Connect + HTTP/JSON from one `.proto`), mTLS in production. See [ADR-0008](../adr/0008-internal-grpc-external-rest-mcp.md). Operations: `Spawn(template, tenant_ctx)`, `Configure(handle, ctx)`, `Exec(handle, cmd) → stream<Output>`, `Stop(handle)`, `List(filter) → stream<Handle>`, `Health(handle)`, `Events() → stream<Event>`. See [03-layer3-providers.md](./03-layer3-providers.md).
47
+ - **L4 → secret stores:** AWS Secrets Manager / Vault / k8s `Secret` — read at startup + on rotation. Never embedded in container images.
48
+ - **L4 → KV (session store):** Redis / Valkey / etcd. Failure mode: lose recent session routing → sessions reconnect (sessions are short-lived). Snapshot for multi-AZ.
49
+ - **L4 ↔ user UI (CDP / ttyd):** **WebSocket passthrough** — L4 does **not** parse CDP messages; it consistent-hashes by session ID and shovels frames bidirectionally. Same path for ttyd. See [ADR-0008](../adr/0008-internal-grpc-external-rest-mcp.md) for why.
50
+
51
+ ## External surface — protocol map
52
+
53
+ | Caller | Protocol | Reason |
54
+ |---|---|---|
55
+ | User agents / Open WebUI | **MCP** (JSON-RPC over HTTP/WebSocket) | Frozen contract ([ADR-0005](../adr/0005-mcp-as-control-plane-gateway.md)) |
56
+ | Admin UI | **REST** (OpenAPI-described) | Standard for SPAs, browser-debuggable |
57
+ | User UI CDP / ttyd | **WebSocket** passthrough | Long-lived binary streams, opaque to L4 |
58
+ | Internal L3 / pool-manager | **connect-go** mTLS | Schema-first, typed, streaming-native |
59
+
60
+ MCP semantics live **only** in the gateway layer of L4. It translates MCP `tools/call` into typed connect-go calls on the provider. L1 agents do not speak MCP — they speak connect-go.
61
+
62
+ ## Admin UI
63
+
64
+ - **Scope (MVP, Phase 6):** session list with kill button, template editor, audit log viewer, secret rotation trigger.
65
+ - **Stack:** stays unconstrained at the L4 doc level. Likely SPA against the admin REST API. To be designed in a separate `admin-ui.md` once Phase 6 starts (per the per-phase research cadence).
66
+ - **Auth:** OIDC, separate role from end-user.
67
+
68
+ ## Deployment shapes
69
+
70
+ | Shape | When | Notes |
71
+ |---|---|---|
72
+ | Single binary alongside Compose | PoC, dev (Phase 6 development) | Replaces today's `computer-use-server` container 1:1 |
73
+ | `Deployment` in k8s, HPA on RPS | Production single-region (Phase 6 prod) | Stateless; KV holds session state |
74
+ | Multi-AZ + multi-region | Phase 10 | KV replicated cross-AZ; sticky routing via consistent hashing in L4 (see anti-pattern note below) |
75
+
76
+ > **Anti-pattern — never use `Service.spec.sessionAffinity: ClientIP`.** It pins on source IP, which in our deployments is the ingress controller's IP (every client looks the same). The result is a single replica receiving 100% of CDP/ttyd WebSocket traffic. Stickiness for long-lived sessions belongs in L4's session router (consistent-hash by `session_id`), not in the Service. Document this in the Helm chart values; refuse the field in any operator template.
77
+
78
+ ## HA upgrade strategy
79
+
80
+ L4 is stateless at the request level (KV holds session state), but **CDP / ttyd WebSockets are long-lived** and a rolling rollout that kills the replica owning a session terminates that session's UI. The upgrade procedure:
81
+
82
+ 1. **Scale-to-1, migrate, scale-up** is the safe baseline for single-region:
83
+ - Scale the new revision in.
84
+ - Drain the old revision: stop accepting new sessions; existing sessions remain bound until they end naturally or until the drain timeout (default 30 min, capped at the longest active CDP session).
85
+ - Migrate the session router KV (no-op when KV is external; explicit hand-off when KV is co-located).
86
+ - Scale the old revision to zero.
87
+ 2. **Blue-green** (preferred for production):
88
+ - Stand up the new revision behind a sibling Service.
89
+ - Switch the L4-fronting ingress route atomically.
90
+ - Old revision keeps existing sessions; new sessions go to the new revision.
91
+ - Old revision drains and is deleted after the drain window.
92
+ 3. **Never** roll L4 with a vanilla Kubernetes `RollingUpdate` against the same Service while WebSocket sessions are bound. The default kills sessions mid-stream.
93
+
94
+ Phase 6 ships the scale-to-1 procedure as a Helm `pre-upgrade` hook. Phase 10 adds the blue-green topology once multi-region session affinity is in place.
95
+
96
+ ## Prompt-caching position (Anthropic API gateway role)
97
+
98
+ L4 sits between LLM clients and the Anthropic API in deployments that route through us. Prompt caching is part of the Anthropic API contract; **L4 must forward the relevant headers and request blocks transparently, not strip or rewrite them**. Specifically:
99
+
100
+ - The `anthropic-beta: prompt-caching-*` header is set **only** when the client requested it. L4 does not opportunistically add it.
101
+ - `cache_control` blocks inside the request body pass through unchanged.
102
+ - Response headers reporting cache hit/miss metrics pass back unchanged.
103
+ - L4 never inserts or removes `cache_control` markers — that is the client's call. We are a router, not a prompt optimizer.
104
+
105
+ This matters because Open WebUI and other clients increasingly use caching to amortize long system prompts. A naive proxy that rewrites the body breaks the cache and inflates token bills silently. The L4 implementation has integration tests asserting byte-identical round-trip for cached request shapes.
106
+
107
+ Phase 6 research locks the exact list of headers and request fields treated as opaque; Phase 6 implementation enforces it.
108
+
109
+ ## Migration from today's FastAPI
110
+
111
+ - **Phase 1–5:** stay in Python; refactor L3 calls behind a provider interface but `app.py` remains the entrypoint.
112
+ - **Phase 6 (cutover):** new Go service stood up alongside; reverse proxy splits traffic by route; Python service decommissioned once parity is reached and admin UI is migrated.
113
+ - **Compatibility:** Go service MUST accept the exact existing MCP request shape on day 1 — verified by reusing `tests/integration/test_mcp_auth.py` and `test_mcp_tools.py` against the new endpoint.
114
+
115
+ ## Open questions (deferred to Phase 6 research)
116
+
117
+ - **Web framework:** stdlib `net/http` vs `chi` vs `gin` vs `connect-go` (for gRPC+HTTP unified). Decide in `phase-6-research.md`.
118
+ - **KV choice:** Redis (familiar) vs Valkey (Redis-OSS fork) vs etcd (already in k8s). License sensitivity per [ADR-0006](../adr/0006-no-agpl-no-bsl-dependencies.md).
119
+ - **MCP server library:** roll our own JSON-RPC vs adopt an SDK once mature for Go.
120
+ - **Streaming transport:** SSE vs WebSocket vs HTTP/2 streaming.
121
+
122
+ These are not blockers to Phases 1–5.
@@ -0,0 +1,174 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ # 03 — Layer 3: Orchestrator / Providers
5
+
6
+ > Pluggable layer between the control plane (L4) and the sandbox runtime (L2).
7
+ > The interface is **the** key abstraction in this whole roadmap — Phase 1 introduces it.
8
+
9
+ ## The interface
10
+
11
+ Published as a `.proto` schema from Phase 6 onward (see [ADR-0008](../adr/0008-internal-grpc-external-rest-mcp.md) — connect-go on the wire). Before Phase 6 it lives as a Python `Protocol`, in-process; the shape is identical so the migration is mechanical.
12
+
13
+ ```proto
14
+ service SandboxProvider {
15
+ rpc Spawn (SpawnRequest) returns (SpawnResponse);
16
+ rpc Configure (ConfigureRequest) returns (ConfigureResponse);
17
+ rpc Exec (ExecRequest) returns (stream ExecChunk);
18
+ rpc Upload (stream UploadChunk) returns (UploadResponse);
19
+ rpc Download (DownloadRequest) returns (stream DownloadChunk);
20
+ rpc Stop (StopRequest) returns (StopResponse);
21
+ rpc List (ListRequest) returns (stream SandboxHandle);
22
+ rpc Health (HealthRequest) returns (HealthResponse);
23
+ rpc Events (EventsRequest) returns (stream LifecycleEvent); // provider → control plane
24
+ }
25
+ ```
26
+
27
+ - `SandboxHandle` is opaque to L4; internally it carries provider-specific identifiers (Docker container id, k8s pod ref, VM uuid).
28
+ - `SandboxTemplate` is provider-agnostic — see [09-templates.md](./09-templates.md).
29
+ - `TenantContext` carries `tenant_id`, `session_id`, headers (`X-Chat-Id`, `X-User-Email`), short-lived secrets.
30
+
31
+ **Transport per phase:**
32
+ - Phase 1 — in-process Python `Protocol`.
33
+ - Phase 2 — HTTP/JSON over the pool-manager sidecar (still Python).
34
+ - Phase 6+ — **connect-go** (gRPC + Connect + HTTP/JSON from one `.proto`). mTLS in production.
35
+
36
+ The same `.proto` is consumed by L4 (client) and L3 (server). Phase 7 the L1 agent serves a sibling `Agent` service from the same compile, so L3 calls L1 as a typed client.
37
+
38
+ ## Concrete providers
39
+
40
+ ### DockerSocketProvider (PoC, current path)
41
+
42
+ - **Phase:** in-process today (via `docker_manager.py`); extracted behind the interface in Phase 1; talks HTTP to a pool-manager sidecar from Phase 2.
43
+ - **Backend:** Docker socket — but only this provider knows that. L4 never sees it.
44
+ - **Use:** local dev, single-host PoC, integration tests.
45
+ - **Warm pool:** added in Phase 2 (minSize defaults 0 to preserve current behavior).
46
+
47
+ ### KubernetesProvider
48
+
49
+ - **Phase:** 5.
50
+ - **Backend:** `kubernetes-asyncio` (Python) or `client-go` (after Phase 6 Go cutover). Talks to k8s API.
51
+ - **CRD basis:** [`kubernetes-sigs/agent-sandbox`](https://github.com/kubernetes-sigs/agent-sandbox) — `Sandbox`, `SandboxTemplate`, `SandboxClaim`, `SandboxWarmPool`. We adopt them rather than inventing our own; we contribute upstream if gaps appear.
52
+ - **Runtime selection:** per-template `runtimeClassName` (runc / sysbox / kata-fc / kata-ch / gvisor).
53
+ - **Network:** default-deny `NetworkPolicy`, egress only via proxy. See [08-networking.md](./08-networking.md).
54
+ - **Replaces today's:** DinD-in-pod pattern. The current Helm chart's inner `docker:dind` sidecar is **transitional only** — Phase 5 replaces it with real per-pod sandboxes.
55
+
56
+ ### DirectCHProvider (optional, Phase 9+)
57
+
58
+ - **Backend:** drives Cloud Hypervisor directly on a bare-metal host without k8s.
59
+ - **Use:** edge deployments, single-tenant compliance setups, very low-latency requirements.
60
+ - **Trade-off:** no k8s orchestration goodies (HPA, NetworkPolicy, RBAC) — provider implements them itself.
61
+
62
+ ### What we will NOT implement
63
+
64
+ - **Nomad provider** — Nomad is BSL ([ADR-0006](../adr/0006-no-agpl-no-bsl-dependencies.md)).
65
+ - **Generic OCI provider** — too vague; pick the orchestrator.
66
+
67
+ ## Warm pool semantics
68
+
69
+ Five knobs per template:
70
+ - `minSize` — sandboxes always idle and ready.
71
+ - `targetSize` — provider tries to maintain (refills as sessions consume from pool).
72
+ - `maxSize` — hard cap regardless of demand.
73
+ - `refillRate` — max sandboxes the refiller may start per second (smooths bursty refill load; without it, a flood of session-ends triggers a thundering-herd spawn).
74
+ - `maxAge` — TTL at which an idle pool sandbox is destroyed and replaced regardless of demand. Prevents long-lived "warm" sandboxes from accumulating per-template image drift, leaked file handles, or stale skill blobs.
75
+
76
+ Lifecycle:
77
+ 1. Provider pre-starts `minSize` sandboxes per template, runs `Configure` with placeholder context.
78
+ 2. On `Spawn(template, ctx)` request, pop one from pool, re-`Configure` with real `ctx` (injects session id, env, egress JWT).
79
+ 3. Background refill task brings pool back to `targetSize` at no more than `refillRate` per second.
80
+ 4. Idle sandbox older than `maxAge` → destroyed, refiller spawns a replacement.
81
+ 5. Sessions ending → sandbox is destroyed (not returned to pool — tenancy hygiene; see [07-security.md](./07-security.md)).
82
+
83
+ Phase 2 ships the skeleton (`minSize=0` default = no behavior change). Phase 5 makes it real. Phase 10 swaps the "warm sandboxes pool" for a **frozen-snapshot pool** with block-device hot-swap on resume — same knobs, different mechanics (internal design note).
84
+
85
+ ## SandboxClaim CRD semantics (KubernetesProvider)
86
+
87
+ For the `KubernetesProvider`, the wire between L4 and L3 is **typed Kubernetes objects**, not opaque RPC payloads. The CRD shape comes from [`kubernetes-sigs/agent-sandbox`](https://github.com/kubernetes-sigs/agent-sandbox) — we adopt rather than reinvent.
88
+
89
+ ```yaml
90
+ apiVersion: sandbox.kubernetes.io/v1alpha1
91
+ kind: SandboxClaim
92
+ metadata:
93
+ name: claim-<session-id>
94
+ namespace: tenant-<tenant-id>
95
+ spec:
96
+ templateRef:
97
+ name: customer-cu-kata-ch-v3 # SandboxTemplate to allocate from
98
+ envtype: managed-hosted # provider-side dispatch (see below)
99
+ lease:
100
+ ttlSeconds: 7200 # auto-release if the session never returns
101
+ renewDeadlineSeconds: 60 # heartbeat budget
102
+ context: # injected via Agent.Configure
103
+ sessionId: <id>
104
+ tenantId: <id>
105
+ egressJwtSecretRef:
106
+ name: egress-token-<session-id>
107
+ status:
108
+ phase: Bound | Pending | Released | Failed
109
+ sandboxRef: { name, uid } # opaque to L4; cluster-internal handle
110
+ boundAt: <timestamp>
111
+ observedRuntime: kata-ch # actual L2 runtime that landed
112
+ conditions: [...]
113
+ ```
114
+
115
+ L4's `Spawn` becomes "create a `SandboxClaim`, watch `.status.phase`." `Stop` is `delete claim`. Health is the same watch. The CRD is what gives the provider a place to store **lease state** without L4 caring about Kubernetes specifics.
116
+
117
+ Two operational properties we get for free:
118
+ - **TTL-driven cleanup.** Claims past their lease are released by the controller, not by L4. L4 crashing does not strand sandboxes.
119
+ - **kubectl-debuggable.** Operators can `kubectl get sandboxclaims -A` to see pool state without going through L4's admin API.
120
+
121
+ The `DockerSocketProvider` and `DirectCHProvider` implement the same lifecycle in-process; the CRD shape is the k8s realization of a provider-internal concept.
122
+
123
+ ## Environment-type dispatch
124
+
125
+ Templates carry an `envtype` field consumed by the provider to pick the backend mechanism. The pattern follows an industry-observed router/session-agent split and is applied narrowly here:
126
+
127
+ | `envtype` | Provider behaviour | Use case |
128
+ |---|---|---|
129
+ | `dev` | runc on Docker Compose; no isolation; no egress proxy | Local PoC, integration tests |
130
+ | `internal` | sysbox on k8s; egress proxy in monitor mode | Trusted employees |
131
+ | `customer-shared` | sysbox or gVisor (per-template) on k8s; egress proxy enforcing | Customer code-only sandboxes |
132
+ | `customer-cu` | Kata (CH or FC) on bare-metal node pool; egress proxy enforcing | Customer Computer Use sessions |
133
+ | `managed-hosted` | Reserved label for our own managed deployment; same as `customer-cu` today but pinned to a tier | Managed-deployment shape |
134
+ | `byoc` | Customer-supplied cluster; provider holds a lease on a customer namespace | Reserved, not Phase-1 |
135
+
136
+ `envtype` is **not** the same as `runtimeClass`. `runtimeClass` is the L2 isolation primitive; `envtype` is the L3 dispatch key. One `envtype` can map to multiple `runtimeClass`-es depending on template (e.g. `customer-shared` resolves to sysbox for code, gVisor for browserless code-exec).
137
+
138
+ ## Reaper / cleanup
139
+
140
+ - Current implementation: per-container Python thread + cron sidecar.
141
+ - Target: provider-owned background task, idle-timeout per template, reaped synchronously when stopping. Cron sidecar is removed.
142
+
143
+ ## Tenancy & isolation
144
+
145
+ - Per `tenant_id`: dedicated k8s namespace (`KubernetesProvider`) or dedicated network (`DockerSocketProvider`).
146
+ - `NetworkPolicy`: deny workspace→workspace, deny workspace→control-plane (except via the egress proxy and the L4-managed exec path).
147
+ - `ResourceQuota` + `LimitRange` per namespace (k8s only) — blast-radius containment.
148
+ - Per-sandbox `ServiceAccount` with **empty** RBAC (no cluster enumeration possible).
149
+
150
+ ## Events
151
+
152
+ Provider emits structured events the control plane consumes for audit + UI:
153
+ - `sandbox.spawned`, `sandbox.configured`, `sandbox.exec.started/completed`, `sandbox.stopped`, `sandbox.health.degraded`, `sandbox.evicted`.
154
+
155
+ Transport: same channel as L4 ↔ L3 (HTTP stream or gRPC server-side stream).
156
+
157
+ ## Phase-by-phase progression for L3
158
+
159
+ | Phase | What changes |
160
+ |---|---|
161
+ | 1 | Interface extracted; `DockerSocketProvider` is the only impl; still in-process |
162
+ | 2 | HTTP transport; pool-manager sidecar owns Docker socket; warm pool skeleton |
163
+ | 3 | Storage (S3) plumbed via provider (mount specs in template) |
164
+ | 4 | Secret broker integration — provider receives short-lived creds in `configure` |
165
+ | 5 | `KubernetesProvider` ships; Helm chart real per-pod sandboxes |
166
+ | 7 | Provider learns to pass new Go-agent endpoints (vsock-ready spec) |
167
+ | 9 | `DirectCHProvider` ships; templates gain `runtimeClass` selection |
168
+ | 10 | Snapshot / restore + multi-region session routing |
169
+
170
+ ## Source
171
+
172
+ - Internal design notes (Layer 3 sections)
173
+ - [`docs/future-architecture/architecture/01-layers.md`](./01-layers.md)
174
+ - [`docs/future-architecture/references.md`](../references.md) (`kubernetes-sigs/agent-sandbox`, `e2b-dev/infra`)
@@ -0,0 +1,114 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ # 04 — Layer 2: Sandbox Runtimes
5
+
6
+ > The actual isolation primitive that wraps Layer 1 (the agent + workload).
7
+ > Selected **per template**, not globally. Same agent, same orchestrator, different runtime → different threat-model fit.
8
+
9
+ ## Runtime matrix
10
+
11
+ | Runtime | Cold start | RAM overhead | Isolation | Use case | Status in our stack |
12
+ |---|---|---|---|---|---|
13
+ | **runc** | ~30 ms | ~2 MB | Namespaces only — none for untrusted code | Dev / CI | Today via Docker Compose |
14
+ | **sysbox** | ~50 ms | ~5 MB | + user-ns remap, procfs emulation; shares host kernel | Internal trusted users; DinD; systemd | Today via Helm (current default) |
15
+ | **gVisor** | ~50 ms | ~15-25 MB | Userspace kernel intercepts syscalls | Code-execution sandboxes (no browser) | Experimental, Phase 7+ |
16
+ | **Kata + Firecracker** (`kata-fc`) | ~125 ms | ~5-10 MB | KVM hypervisor, minimal device model | Public untrusted, fastest cold start | Phase 9 |
17
+ | **Kata + Cloud Hypervisor** (`kata-ch`) | ~150 ms | ~10-20 MB | KVM hypervisor + virtio-fs + GPU passthrough | **Computer Use (browser)** untrusted | Phase 9 (primary target) |
18
+ | **Kata + QEMU** | ~500 ms | ~50 MB | KVM hypervisor, full device model | Compatibility fallback | Not planned |
19
+
20
+ Numbers from internal design notes. Validate during Phase 9 research on actual hardware.
21
+
22
+ ## Why Cloud Hypervisor is the lead untrusted runtime (not Firecracker)
23
+
24
+ - **virtio-fs** — fast shared mounts; Firecracker omits this. Important for skill blobs and user-data overlays (see [06-storage.md](./06-storage.md)).
25
+ - **GPU passthrough** — relevant if Computer Use workloads ever need accelerated rendering.
26
+ - **Hot-plug** — easier resource adjustments.
27
+ - Trade-off: ~80K LoC vs Firecracker's ~50K (larger attack surface, still small).
28
+
29
+ Firecracker stays available via `kata-fc` for the fastest-cold-start tier (e.g., free-tier anonymous trials). Note that Firecracker is the microVM that AWS Lambda and Fargate are built on — its scale-pattern lineage informs the Phase 10 snapshot-pool design without making us a Lambda deployment. See the Lambda framing in [`references.md`](../references.md) and [ADR-0010](../adr/0010-lambda-as-inspiration-not-runtime.md).
30
+
31
+ ## virtio-fs vs 9p — the CH/FC asymmetry
32
+
33
+ CH and FC do not agree on shared-filesystem story, and the difference is load-bearing for Tier-2 (skills) and Tier-4 (user data) mounts:
34
+
35
+ | | virtio-fs | 9p |
36
+ |---|---|---|
37
+ | Cloud Hypervisor | First-class (default) | Possible but not the natural path |
38
+ | Firecracker upstream | **Not supported** in stock Firecracker | The historical option; out-of-tree patches and Kata wrappers exist |
39
+ | Performance | Native-ish (FUSE protocol, shared page cache) | Slower; protocol overhead dominates |
40
+ | Posix coverage | High | Lower (the legacy choice) |
41
+
42
+ Implication: `kata-ch` is the only tier where Tier-2 / Tier-4 mounts are "free." On `kata-fc` we either accept 9p's performance/POSIX trade-offs, lean on a FUSE client inside the VM, or block-device-mount squashfs. Phase 9 research locks the choice per tier.
43
+
44
+ ## nydus snapshotter for lazy image-layer load
45
+
46
+ For the microVM tiers (`kata-fc`, `kata-ch`), pulling the full container image at sandbox spawn is the single biggest cold-start cost. **nydus** ([nydus-snapshotter](https://github.com/containerd/nydus-snapshotter), Apache 2.0) reformats OCI images into a chunk-addressable layout that the VM can lazy-load on demand — pages are fetched as files are touched, not upfront.
47
+
48
+ - **Relevance.** Phase 9 cold-start budget for `kata-ch` is in the 100–200 ms range with full image pull. Lazy-load with nydus gets that closer to template-snapshot territory without the snapshot-pool engineering bill.
49
+ - **Trade-off.** Adds a new component to the runtime path; failure modes (registry hiccups mid-execution) need their own playbook.
50
+ - **Decision.** Phase 9 research evaluates whether nydus or a snapshot pool (or both, layered) hits the cold-start target.
51
+
52
+ ## VMM Lambda lineage (one paragraph, by reference)
53
+
54
+ Firecracker exists because AWS needed a VMM small enough to scale Lambda/Fargate. Our Phase-9 `kata-fc` tier inherits from that lineage. The architectural takeaway is the **VMM design** (minimal device model, small attack surface, fast init) — not the deployment substrate. See [`references.md`](../references.md) Lambda framing, [`research/05`](../research/05-firecracker.md), and [ADR-0010](../adr/0010-lambda-as-inspiration-not-runtime.md) for the closed answer to "are we going to run on Lambda?" (no).
55
+
56
+ ## Why NOT gVisor for browsers
57
+
58
+ Already a locked decision from the pre-existing `docs/requirements/k8s-architecture.md`:
59
+
60
+ > compatibility envelope too narrow for Chromium with sandbox flags, Playwright, browser downloads
61
+
62
+ gVisor remains viable for non-browser code-execution sandboxes (e.g., a "run this Python snippet" tier). Phase 7 validates this as an optional experimental tier.
63
+
64
+ ## Selection mechanism
65
+
66
+ - **In k8s:** `Pod.spec.runtimeClassName` — installed via `kata-deploy` DaemonSet (for kata-*) and `gvisor` runtimeclass.
67
+ - **Direct (DirectCHProvider):** hypervisor invocation, no k8s.
68
+ - **In Docker Compose:** runc only (the PoC); sysbox optional if the host has it. Compose is not the prod runtime story.
69
+
70
+ `SandboxTemplate.runtime_class` carries the choice; the provider plumbs it. See [09-templates.md](./09-templates.md).
71
+
72
+ ## Threat-model matrix (target tiering)
73
+
74
+ | Tenant tier | Workload | Runtime |
75
+ |---|---|---|
76
+ | Internal employees + trusted scripts | Code only | sysbox (or runc in dev) |
77
+ | Internal employees + Computer Use | Browser, file ops | sysbox |
78
+ | External customer + code only | Code only | gVisor or `kata-ch` |
79
+ | External customer + Computer Use | Browser | `kata-ch` |
80
+ | Anonymous trial | Anything | `kata-fc` |
81
+
82
+ The control plane (L4) picks the template (and thereby the runtime) based on tenant tier at session-spawn time.
83
+
84
+ ## Hardware / cluster requirements
85
+
86
+ - **runc, sysbox, gVisor:** any Linux kernel ≥ 5.x. Run on any cloud VM, including managed k8s (EKS, GKE on standard nodes).
87
+ - **kata-fc, kata-ch:** require **bare-metal** k8s nodes — KVM is needed and nested-virt won't reliably work in most cloud VMs.
88
+ - On AWS: `m6i.metal` / `c6i.metal` etc.
89
+ - On-prem RKE2: any host with `/dev/kvm`.
90
+ - Use a **dedicated node pool with taints** to keep regular workloads off the bare-metal nodes (they're expensive).
91
+
92
+ ## What ships, when
93
+
94
+ - **Phase 1–4:** runc only (via Docker Compose) and sysbox (via existing Helm chart). No L2 change.
95
+ - **Phase 5:** real `KubernetesProvider` ships with sysbox as default; the Helm chart switches from DinD-in-pod to real per-pod sandboxes on sysbox.
96
+ - **Phase 7:** gVisor added as experimental tier for non-browser sandboxes; runtime selection becomes per-template.
97
+ - **Phase 9:** `kata-ch` and `kata-fc` added; bare-metal node pool required; multi-tier templates land.
98
+
99
+ ## Security boundary per runtime (one-liner)
100
+
101
+ | Runtime | Primary boundary | Boundary fails if… |
102
+ |---|---|---|
103
+ | runc | Linux namespaces | …kernel CVE (Dirty Pipe, nf_tables) — assume escapable |
104
+ | sysbox | Above + user-ns + emulation | …kernel CVE; sysbox bugs |
105
+ | gVisor | Sentry userspace kernel (Go) | …Sentry bug; passthrough syscall path |
106
+ | kata-fc | KVM + Firecracker VMM | …Firecracker CVE; KVM CVE; side-channel |
107
+ | kata-ch | KVM + Cloud Hypervisor VMM | …CH CVE; KVM CVE; side-channel |
108
+
109
+ See [07-security.md](./07-security.md) for the full threat model.
110
+
111
+ ## Source
112
+
113
+ - Internal security and architecture notes
114
+ - [`docs/future-architecture/references.md`](../references.md) (every runtime URL listed there)