@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,153 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ # 04b — Credential Broker
5
+
6
+ > The host-side process that holds **real** cloud credentials so the sandbox guest never sees them. Follows the industry-observed FUSE-filestore-over-loopback broker pattern.
7
+ >
8
+ > **Phase placement.** Foundations in Phase 4 (secret broker section of [07-security.md](./07-security.md)); deployment-topology decisions referenced here. Final shape locked when Phase 4 ships.
9
+
10
+ ## Why a broker (not credential injection)
11
+
12
+ The guest must reach S3, GCS, and the Anthropic API. The naive choices both fail:
13
+
14
+ - **Inject real keys into the guest env.** Any RCE in the guest exfils them. Violates the "no secrets in the sandbox" invariant.
15
+ - **Egress proxy that re-signs the request.** Works for HTTP headers (`x-api-key`); breaks for SigV4 because the signature covers the body the proxy cannot legally rewrite. AND it conflates the **network** plane with the **authorization** plane (see [§ Two planes, two mechanisms](#two-planes-two-mechanisms)).
16
+
17
+ The broker pattern: a trusted daemon outside the guest holds the real keys, accepts a **scoped JWT** from the guest over a host-controlled channel (vsock or loopback), and signs the outbound request itself.
18
+
19
+ ```text
20
+ [ guest (untrusted) ] [ trust boundary ]
21
+ FUSE filestore ── HTTP/localhost:9112 ───► broker (host-side)
22
+ client (real GCS/S3/API creds,
23
+ (scoped JWT, SigV4 / x-api-key signing,
24
+ filesystem_id, TLS origination outbound)
25
+ NO secrets)
26
+
27
+
28
+ GCS / S3 / model API
29
+ ```
30
+
31
+ ## Two planes, two mechanisms
32
+
33
+ **Network identity** (egress to the public internet): grounded in the **path itself** — the guest has no route out other than via the egress proxy. The HTTPS request carries no token. The proxy and broker know it's a sandbox because nothing else can reach them.
34
+
35
+ **Resource authorization** (per-session data access): grounded in a **scoped JWT** that encodes `session_id`, `filesystem_id`, scope (which bucket/prefix), and TTL. The broker validates the JWT and enforces scope.
36
+
37
+ These two planes are **orthogonal**. JWT does not authenticate egress; the network path does. JWT does not authenticate the network; it authorizes a specific resource operation. Conflating them produces either "secrets in the guest" (network-bound only) or a fake security perimeter (JWT for egress that the guest could leak anyway). Phase 4 + Phase 8 design must keep them separate.
38
+
39
+ ## Broker contract
40
+
41
+ ### Authentication / authorization
42
+ - Accept a per-session **Ed25519 JWT** from the guest. Validate signature, expiry, scope claims.
43
+ - Claims minimum set: `session_id`, `filesystem_id`, `tenant_id`, `ops` (e.g. `read`, `write`), `exp`.
44
+ - Reject anything outside the JWT's stated scope (no cross-session reads, no cross-tenant access).
45
+ - Support short TTLs (≤ 15 min target) and explicit revocation (broker-side blocklist by `session_id`).
46
+
47
+ ### Upstream signing
48
+ - Hold the real GCS service-account key / S3 access keys / `x-api-key`, on disk via the host secret store (Vault, AWS Secrets Manager, k8s Secret with appropriate KMS) — never inside the guest.
49
+ - Sign each outbound call:
50
+ - **S3 / S3-compatible** → SigV4 with broker's keys after scope check (guest never signs).
51
+ - **Anthropic API** → inject `x-api-key` + `anthropic-version` after scope check.
52
+ - **GCS** → service-account token exchange.
53
+ - **Terminate TLS outbound** (TLS origination): guest speaks plaintext to broker over a host-controlled channel; broker speaks valid HTTPS to upstream with strict cert validation (fail-closed).
54
+
55
+ ### Filestore semantics
56
+ - CRUD: `list`, `stat`, `get`, `put`, `delete`, `move`.
57
+ - Logical paths (`/inputs`, `/outputs`, `/tool-results`) map to the physical backend (`bucket/prefix`) keyed on `filesystem_id`.
58
+ - Streaming for large objects — never buffer a whole file in broker memory.
59
+ - ro vs rw enforcement per mount point, derived from JWT `ops` claim.
60
+
61
+ ### Operational
62
+ - Listen on loopback / vsock only — **never** on a public host interface.
63
+ - Audit log of every operation with `session_id`, `filesystem_id`, operation, decision, `trace_id` ([10-observability.md](./10-observability.md)).
64
+ - Per-token rate limiting; per-tenant aggregate quotas (cross-link [gaps.md § A](../gaps.md#a-multi-tenancy-beyond-per-session)).
65
+ - Domain allowlist (broker refuses to call upstreams outside the configured set).
66
+ - Health endpoint, Prometheus metrics (requests, auth errors, upstream latency).
67
+
68
+ ## Deployment topology by runtime tier
69
+
70
+ The broker's home depends on the L2 runtime. The choice is **not** a single design but a per-tier matrix.
71
+
72
+ ### Docker / runc / sysbox (shared kernel)
73
+
74
+ The broker is a sidecar process. Three options, in increasing isolation:
75
+
76
+ | Variant | Channel | Isolation | Verdict |
77
+ |---|---|---|---|
78
+ | Shared network namespace (`--network container:broker`) | `localhost:9112` | Weakest — shared network stack with the guest | **Anti-pattern for untrusted guests.** Use only for trusted-dev tiers. |
79
+ | Per-network user-defined Docker net | `broker:9112` via DNS | Separate netns; routing controlled by Docker | Acceptable for sysbox-class tenants. |
80
+ | Unix domain socket bind-mounted in | `/run/broker.sock` (ro mount in guest) | No shared netns at all | Strongest in this tier. |
81
+
82
+ ### Firecracker / Cloud Hypervisor (microVM, own kernel)
83
+
84
+ Sidecar patterns do not apply — the guest has its own kernel, the boundary is the hypervisor (KVM). The broker **must** live host-side and the guest reaches it through an explicit host↔guest channel:
85
+
86
+ | Channel | Notes |
87
+ |---|---|
88
+ | **virtio-vsock** | Preferred. Native Firecracker/CH primitive, no TCP/IP needed in the guest. Guest can run with no network at all, just vsock → broker. |
89
+ | TAP + IP | Use only when the guest needs a routed network for other reasons. Broker listens on a host address; host-side firewall blocks anything else from the guest. |
90
+
91
+ The microVM tiers **strengthen** the broker pattern: guest kernel escape (the most common shared-kernel failure mode) does not reach the broker — KVM is in the way.
92
+
93
+ ### Localhost ergonomics over a non-local channel: the vsock shim
94
+
95
+ Application code (FUSE filestore client, custom backends) assumes `localhost:9112`. To preserve that ergonomics on a microVM tier without baking vsock awareness into every caller:
96
+
97
+ ```text
98
+ GUEST (Firecracker):
99
+ FUSE filestore client → 127.0.0.1:9112 ← caller thinks it's local
100
+ └── vsock-shim: listens on 127.0.0.1:9112,
101
+ forwards to vsock(host CID, port 9112) ← dumb bridge, NO secrets
102
+
103
+ ══════════════════ KVM hypervisor ══════════════════
104
+
105
+ HOST:
106
+ vsock-listener :9112
107
+ └── broker (real creds) → S3 / model API / GCS
108
+ ```
109
+
110
+ The shim is a **dumb forwarder** — it holds no keys, runs no policy, knows no JWTs. Implementations: `socat VSOCK-CONNECT ... TCP-LISTEN:9112` for prototyping, or a tiny static Rust/Go binary in the L1 image for production. The illusion of "localhost broker" is independent of whether the host runs one shared broker or broker-per-VM — pick the multi-tenancy posture separately.
111
+
112
+ ## Multi-tenancy: shared broker vs broker-per-VM
113
+
114
+ A single process serving every guest's traffic = **shared fate** (one broker bug or RCE leaks credentials across tenants). The anchor for safe multi-tenancy is the **vsock CID** assigned by the hypervisor: it is set on the host side, the guest cannot spoof it, and the broker sees it on every connection.
115
+
116
+ | Posture | Mechanic | Blast radius | Recommendation |
117
+ |---|---|---|---|
118
+ | **Single multiplexing broker** | One process, partitions state by CID + JWT scope | All tenants share one process — compromise = total exposure | Only for trusted-tier deployments |
119
+ | **Broker-per-VM** | One lightweight broker process per VM, started at VM boot, holds only that VM's short-lived creds | Per-tenant — broker dies with the VM | **Recommended** for untrusted tiers |
120
+ | **Per-VM + delegated STS** | Per-VM broker, but the broker itself does not hold a master key — pulls scoped temp credentials from L4 at boot | Per-session — even broker compromise leaks only that session's scoped STS | **Target** for compliance-bearing tiers (cross-link [gaps.md § C](../gaps.md#c-compliance-and-audit-immutability)) |
121
+
122
+ Localhost ergonomics (the vsock shim) and strong isolation (broker-per-VM + per-VM STS) are **not** mutually exclusive. Phase 4 ships the per-VM model; Phase 6 adds delegated STS.
123
+
124
+ ## Filesystem-scope as a first-class secret-scope dimension
125
+
126
+ The `filesystem_id` JWT claim is what makes one session's filestore invisible to another, **architecturally** rather than via file permissions:
127
+
128
+ - The broker maps `(tenant_id, filesystem_id) → bucket/prefix` server-side.
129
+ - The JWT names the `filesystem_id` it's authorized for; the broker refuses any path outside that prefix.
130
+ - Cross-session reads are not "guarded" — they're impossible to express because the JWT cannot name another session's `filesystem_id`.
131
+
132
+ This is the design lever that lets per-session FUSE mounts (`filestore:session_<SESSION_ID>:/path` style) work without per-session credentials in the guest.
133
+
134
+ ## Open questions (resolve before Phase 4 ships)
135
+
136
+ - **Issuer of the scoped JWT.** L4? Per-session minting? Where the signing key lives and rotates. **This is the gating decision** — the JWT is the only barrier between "the guest asked" and "the broker spent a real key." Resolve first.
137
+ - **JWT binding to vsock CID.** Either embed CID in claims (broker verifies channel CID == claim CID — defense in depth) or rely purely on the unforgeable CID (simpler).
138
+ - **FUSE mount vs HTTP API only.** The FUSE client path uses a mount; some workloads only need the HTTP CRUD. Phase 4 ships HTTP first; FUSE-in-guest behind a feature flag.
139
+ - **Upstream set on day one.** S3 only? Plus Anthropic Files API? Plus GCS? Start minimal — each upstream is a new attack surface.
140
+ - **Physical backend.** MinIO (PoC), AWS S3, OVH Object Storage. Path-style vs virtual-hosted for S3-compatible — broker normalizes.
141
+
142
+ ## Related
143
+
144
+ - [04-layer2-runtimes.md](./04-layer2-runtimes.md) — runtime tiers and per-tier isolation mechanics.
145
+ - [05-layer1-guest-agent.md](./05-layer1-guest-agent.md) — L1's `Configure` RPC delivers the scoped JWT into the guest.
146
+ - [06-storage.md](./06-storage.md) — Tier 4 (user data) mounts that the broker serves.
147
+ - [07-security.md](./07-security.md) — secret broker phase placement, image signing, audit log.
148
+ - [08-networking.md](./08-networking.md) — egress proxy (the other half of "no secrets in the guest").
149
+ - [10-observability.md](./10-observability.md) — audit-event schema, secret-scrubbing rules.
150
+
151
+ ## Source
152
+
153
+ - Internal design notes — credential-broker spec, the two-planes-of-identity argument, and the no-S3-keys-in-the-guest rule.
@@ -0,0 +1,138 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ # 05 — Layer 1: Guest Agent
5
+
6
+ > The PID 1 process inside every sandbox. Today: Python entrypoint + in-image MCP server. Future: small **Rust** static binary (Phase 7).
7
+ > Language decision: **Rust** ([ADR-0002](../adr/0002-guest-agent-language-go.md)). Follows the established agent-in-microVM runtime pattern.
8
+
9
+ ## Contract (target)
10
+
11
+ The agent exposes **two ports**:
12
+
13
+ 1. **Data plane — WebSocket.** Bidirectional, JSON frames (serde-tagged enums), zstd compression optional via capabilities negotiation. Carries every per-session interaction: exec, streaming I/O, signal forwarding, CDP/ttyd passthrough. Transport is **auto-detected**, not build-tag-gated:
14
+ - `vsock` if `/dev/vsock` is present (microVM tiers `kata-ch`, `kata-fc`).
15
+ - `TCP` otherwise (runc, sysbox, gVisor, dev).
16
+ - Same `handle_ws` accept loop drives both. Transport is operational, not architectural.
17
+ 2. **Control plane — HTTP.** Stateless POSTs for actions that should not flow through the user-facing data plane. Separate listener, same binary:
18
+ - `GET /healthz`, `GET /readyz` — liveness / readiness probes for L3.
19
+ - `POST /shutdown` — graceful shutdown signal.
20
+ - `POST /mount_root` — snapstart restore handshake. **Phase 10 only**, feature-gated until then.
21
+ - `POST /fs_freeze`, `POST /fs_thaw` — `FIFREEZE` / `FITHAW` ioctl bridge for snapshot consistency. **Phase 10 only.**
22
+ - `POST /auth_public_key` — hot-reload of the Ed25519 verification key. Optional, Phase 7+.
23
+
24
+ The L1 agent is **never** publicly reachable — only L3 (provider) talks to it. See [ADR-0008](../adr/0008-internal-grpc-external-rest-mcp.md) for transport positioning across tiers (and the Phase 7 gate on connect-rust vs. WS-frame protocol).
25
+
26
+ ## RPC surface (data plane)
27
+
28
+ The methods below map to message variants on the WebSocket. The shape is sketched as a `.proto` for clarity, but the wire is **JSON frames + capabilities-negotiated V1/V2 variants**, not gRPC.
29
+
30
+ ```proto
31
+ service Agent {
32
+ rpc Health (HealthRequest) returns (HealthResponse);
33
+ rpc Configure (ConfigureRequest) returns (ConfigureResponse); // inject session ctx, env, egress JWT
34
+ rpc Exec (ExecRequest) returns (stream ExecChunk); // streaming stdout/stderr/exit
35
+ rpc Upload (stream UploadChunk) returns (UploadResponse);
36
+ rpc Download (DownloadRequest) returns (stream DownloadChunk);
37
+ rpc Signal (SignalRequest) returns (SignalResponse); // SIGINT / SIGTERM / SIGKILL
38
+ rpc Shutdown (ShutdownRequest) returns (ShutdownResponse); // drop caches → SIGTERM → wait → SIGKILL
39
+ rpc ToolCall (ToolCallRequest) returns (stream ToolChunk); // MCP-tool semantics translated by L4
40
+ }
41
+ ```
42
+
43
+ **WebSocket passthroughs** are routed through a **sibling port by default** (one passthrough socket per stream), so the data-plane WS does not have to multiplex CDP / ttyd binary frames alongside `Agent.*` RPC frames. The same-port variant ("one socket per sandbox") stays available as an option if a future deployment needs to minimize listener count, but Phase 7 ships the sibling-port shape.
44
+
45
+ - `WS /v1/cdp` — bidirectional CDP proxy to local Chromium; L4 shovels frames opaquely.
46
+ - `WS /v1/tty` — ttyd-equivalent terminal stream.
47
+
48
+ The agent **does not** speak MCP. MCP semantics live in L4's gateway. L4 receives `tools/call` from the user, decides which sandbox owns the session, and calls `Agent.ToolCall`. This keeps the user-facing wire (MCP) decoupled from internal RPC evolution.
49
+
50
+ ## Capabilities negotiation (V1/V2)
51
+
52
+ The server's first frame on each connection advertises capabilities via a `ConnectionCapabilities` message:
53
+
54
+ ```json
55
+ {
56
+ "type": "ConnectionCapabilities",
57
+ "supports_traces": true,
58
+ "supports_zstd": true,
59
+ "protocol_version": 2
60
+ }
61
+ ```
62
+
63
+ Old clients ignore unknown fields and stay on V1 message variants. New clients opt into V2, zstd compression on server-to-client frames, and trace events. This lets the agent protocol evolve without breaking older sandboxes still in flight.
64
+
65
+ ## PID 1 hygiene (Phase 7 mandatory)
66
+
67
+ The agent is the init process inside the sandbox. These primitives are mandatory together — none of them works alone:
68
+
69
+ - **`SIGCHLD` reaping.** Wait on the signalfd or libc `signal()` and reap zombies. Without this, fork-heavy workloads (sub-agent CLIs, shell scripts) leak PIDs until cgroup limits trip.
70
+ - **`SIGTERM` propagation.** L3's `/shutdown` POST or a connect-side `Shutdown` RPC drains via: page-cache drop → SIGTERM to the workload process group → grace-period wait → SIGKILL escalation. The two-phase shape is the standard OOM-killer pattern.
71
+ - **`PR_SET_DUMPABLE=0` post-init.** Disables core dumps and blocks `/proc/<pid>/mem` reads from other processes — even from inside the same UID. Cheap, prevents an entire class of "ptrace the agent to steal session JWT" attacks.
72
+ - **`agent-killed` audit flag.** A per-child boolean that distinguishes "agent killed this" (timeout, OOM, signal RPC) from "kernel killed this" (cgroup OOM, external SIGKILL). Removes ambiguity from the audit log without parsing exit codes.
73
+ - **Env-var scrub before fork.** Strip names matching `_TOKEN`, `_SECRET`, `_PASSWORD`, `API_KEY` from the child env unless the configure-time policy explicitly passes them through. Cross-link to [antipattern A1].
74
+
75
+ ## What L1 does NOT do
76
+
77
+ - **Authenticate users.** L4 does. L1 trusts whoever can reach its port — network policy ensures only L3 can.
78
+ - **Authenticate L3 — for now.** Phase 7+ may add **Ed25519 JWT bound to `container_name`** read from `/container_info.json`. Pre-Phase-7+ the network boundary alone is the trust boundary. **Document this loudly; do NOT add a fake bearer token that lulls operators.**
79
+ - **Persist state across sessions.** L3 owns the sandbox lifecycle and any volume binding.
80
+ - **Manage its own lifecycle.** It runs until killed; L3 decides when.
81
+ - **Hold long-lived secrets.** Secrets arrive via `Configure` (per-session, short-lived). Rotated by L4's secret broker. See [07-security.md](./07-security.md).
82
+
83
+ ## Today's transitional L1 (Python entrypoint + MCP server in image)
84
+
85
+ The current image's entrypoint:
86
+ - Reads env vars.
87
+ - Dynamically generates an MCP config.
88
+ - Starts the MCP server (FastMCP) that the orchestrator talks to via `docker exec` and Docker streams.
89
+
90
+ This works for the PoC and stays through Phases 1–6. It blocks two things:
91
+ - **microVM runtimes** — no vsock transport in the current setup.
92
+ - **Smaller, harder-to-RCE surface** — Python + Playwright + skills is a big attack surface inside the sandbox.
93
+
94
+ Phase 7 replaces this with the Rust agent.
95
+
96
+ ## Future Rust agent — design notes
97
+
98
+ - **Static-PIE binary**, `musl` target, x86-64 + arm64. Target size ~4–6 MB (comparable microVM agents land around 4 MB).
99
+ - **Crate footprint** ([ADR-0002](../adr/0002-guest-agent-language-go.md)): `tokio`, `hyper`, `tokio-tungstenite`, `tokio-vsock`, `ring`, `jsonwebtoken`, `clap`, `nix`, `serde_json`. Optional `zstd` if capabilities negotiation enables it. No `chromedp` equivalent — see CDP note below.
100
+ - **PID 1 hygiene** as above (`SIGCHLD`, `SIGTERM`/`SIGKILL` chain, `PR_SET_DUMPABLE=0`, env-scrub).
101
+ - **Process model:** spawn workloads as child process groups; stream stdout/stderr as `ExpectStdOut`/`ExpectStdErr` frames; track exit code; emit `ProcessExited` / `ProcessTimedOut` / `ProcessOutOfMemory` terminal states (mutually exclusive).
102
+ - **Cgroup-aware OOM monitor.** Per-container OOM watchdog polls cgroup memory at 100 ms; adopts orphans before scanning; two-phase kill (signal → wait → escalate). Replaces our current reliance on Docker's default OOM policy.
103
+ - **CDP proxy.** Two options for Phase 7 research:
104
+ - Use [`chromiumoxide`](https://github.com/mattsse/chromiumoxide) (Rust-native CDP client) and let L1 drive Chromium.
105
+ - **Raw WebSocket pass-through** to Chromium's `/devtools/browser` endpoint — L4 (and L1) never parse CDP frames. Simpler, smaller agent. Aligns with ADR-0008's "L4 shovels frames opaquely" stance.
106
+ - **MCP tool execution.** A small dispatch layer above the data-plane WS — see "MCP tool execution inside L1" below.
107
+ - **No HTTP bearer auth on the data plane** until Phase 7+ Ed25519 JWT lands. Network policy is the trust boundary in the meantime.
108
+
109
+ ## MCP tool execution inside L1
110
+
111
+ Today's tools (`mcp_tools.py`):
112
+ - `bash_tool` — exec in a shell.
113
+ - `python_tool` — exec under python3.
114
+ - `create_file` / `str_replace` / `view` — file ops.
115
+ - `view_image` — return base64.
116
+ - `sub_agent` — dispatch to claude / codex / opencode CLI.
117
+
118
+ Phase 7 maps each to a Rust handler reachable via `Agent.ToolCall`. Sub-agent dispatch (`cli_runtime.dispatch()`) is the heaviest port — its current Python adapter layer per CLI must be re-implemented. Acceptable cost: this is where most "sandbox business logic" lives, and the new home is auditable.
119
+
120
+ The agent itself does not need to know what's in `skills/`. Skills are mounted as a Tier-2 squashfs and discovered at runtime by the workload, not by L1 ([06-storage.md](./06-storage.md)).
121
+
122
+ ## Open questions (Phase 7 research must answer)
123
+
124
+ - `chromiumoxide` vs raw CDP WebSocket passthrough — pick one, justify, document.
125
+ - ttyd replacement (Rust-native) vs wrap-in-place (run ttyd as a subprocess and proxy its WS).
126
+ - Transport auto-detect details: presence of `/dev/vsock` plus configure-time hint, or a CLI flag with a sensible default — Phase 7 picks the rule.
127
+ - Connect-rust vs a WS-frame protocol on vsock ([ADR-0008](../adr/0008-internal-grpc-external-rest-mcp.md) Phase 7 gate). Driven by tooling maturity and binary-size measurement on real artefacts.
128
+ - Whether Phase 7 ships JWT auth on day one, or starts network-only and adds JWT in Phase 7.1. Default leans toward the latter — small surfaces first.
129
+
130
+ ## Related
131
+
132
+ - ADR: [ADR-0002](../adr/0002-guest-agent-language-go.md) (Rust for L1), [ADR-0008](../adr/0008-internal-grpc-external-rest-mcp.md) (transport choice + Phase 7 gate), [ADR-0010](../adr/0010-lambda-as-inspiration-not-runtime.md) (Lambda framing).
133
+ - Research: [`research/02-e2b-infra.md`](../research/02-e2b-infra.md) (`envd` comparison).
134
+ - Antipatterns: A1 (secret leakage in env), and the deny-paths list (`.git/hooks/*`, `.bashrc`, `.mcp.json`, `.claude/`) enforced via [`07-security.md`](./07-security.md).
135
+
136
+ ## Source
137
+
138
+ - Internal design notes — Layer 1 architecture and the agent protocol contract.
@@ -0,0 +1,134 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ # 06 — Storage
5
+
6
+ > Four-tier model (carried over from the old `docs/requirements/k8s-architecture.md` and elevated to a layer-agnostic spec).
7
+ > Applies regardless of L2 runtime or L3 provider.
8
+
9
+ ## The four tiers
10
+
11
+ | Tier | What | Mode | Lifetime | Backend |
12
+ |---|---|---|---|---|
13
+ | **1. Image layers** | OS, runtimes, guest agent | RO | per release | OCI registry (cached on host); sealed `squashfs` block disks for the binaries / skills split once Phase 9 lands |
14
+ | **2. Skills** | AI capability bundles (`skills/`) | RO | per release, immutable | Object store (S3) as squashfs blobs; **materialized at provisioning, not runtime** (no hot-reload) |
15
+ | **3. Workspace home** | `/home/assistant` per session | RW | per session, ephemeral | **CoW snapshot of golden rootfs** (qcow2 backing / dm-thin / ZFS clone) on Kata/CH; tmpfs / overlayfs on sysbox/runc. **Never PVC** (see [A37](../antipatterns.md#a37--pvc-for-sandbox-session-workspace)) |
16
+ | **4. User data** | uploads, outputs, tool results | RW | per tenant | S3-compatible object storage, reached via a FUSE client speaking file-ops to a host-side storage broker; **no S3 credentials inside the guest** (session-token auth) |
17
+
18
+ ## Tier 1 — Image
19
+
20
+ - Standard OCI image. Built once per release. Pulled to nodes via image cache.
21
+ - Includes the guest agent binary (today: Python entrypoint; Phase 7+: Go binary).
22
+ - **Signed with cosign** ([07-security.md](./07-security.md)); admission controller verifies signature.
23
+ - **Immutable reference by digest, never tag** in production templates.
24
+
25
+ ## Tier 2 — Skills
26
+
27
+ Current state: skills are baked into the image (`/usr/local/share/skills/...`).
28
+
29
+ Target state (Phase 3):
30
+ - Each skill packaged as a `.squashfs` blob at release time, pushed to S3.
31
+ - Sandbox manifests reference skills by content-hash (`SkillRef`).
32
+ - Mounted RO into the sandbox via squashfuse / kernel squashfs (decision deferred to Phase 3 research — needs `CAP_SYS_ADMIN` for kernel mount, doesn't for squashfuse; sandbox cap surface matters).
33
+ - Drops the current ZIP cache; immutability contract guarantees "skill v1.2.3 is bit-identical everywhere".
34
+
35
+ Benefits:
36
+ - Skill updates without rebuilding the sandbox image
37
+ - Multi-version coexistence (template A pins skill v1; template B pins v2)
38
+ - Smaller image (skills move out)
39
+
40
+ ## Tier 3 — Workspace home
41
+
42
+ - `/home/assistant` is the AI agent's working directory. **Always ephemeral.** Vanishes when the sandbox dies.
43
+ - **Compose / k8s today (sysbox, runc):** tmpfs or overlayfs over the image layer.
44
+ - **Phase 9 target (Kata + CH / FC):** **CoW snapshot of a golden rootfs image** at the storage layer — `qcow2` backing files, `dm-thin` snapshots, or ZFS `clone`. This is an industry-observed production-sandbox pattern. Per-session ext4 deltas live on the snapshot; the delta is discarded at session end. The golden image is shared and untouched.
45
+ - **No PVC for the session workspace tier in any template.** RWO PVC is rejected — CoW snapshot is cheaper, faster, and gives stronger reset-on-spawn guarantees with no claim controller, no quota controller, no garbage collection. See [A37](../antipatterns.md#a37--pvc-for-sandbox-session-workspace) for the locked-decision rationale. "Continue yesterday's session" is served by Tier 4 (S3) — the workspace re-binds to the same `filesystem_id` prefix on the next VM, no PVC needed.
46
+ - **Per-VM soft cap.** Phase 9 templates set ext4 `resuid=65534,resgid=65534` so reserved blocks are claimable by no one, yielding a cheap per-VM ENOSPC ceiling without a quota daemon. Phase 3 / 5 can ship with a plain 10 GiB volume.
47
+
48
+ ## Tier 4 — User data
49
+
50
+ - Three logical buckets per tenant: `uploads/` (user → sandbox), `outputs/` (sandbox → user), `tool-results/` (intermediate artifacts surfaced in UI).
51
+ - **Backend:** S3-compatible. Production: AWS S3 / GCS / R2 / Ceph RGW. Local PoC: MinIO in `docker-compose.yml`.
52
+ - **Broker model (the object-store credential is never in the guest).** The guest mounts a FUSE filesystem that speaks a file-operation interface to a host-side storage broker; the broker is the object-store client and signs its own backend requests. The guest never speaks the object-store protocol and never holds an STS token. This is the canonical model in [`02-trust-boundaries.md`](../../architecture/02-trust-boundaries.md) §2 zone 3 / §7.1 and [NFR-SEC-25](../../architecture/manifesto/02-nfrs.md), and matches Daytona's runner-as-S3-client volume model.
53
+ - **Guest-side FUSE client.** A FUSE backend that speaks the broker's file-RPC — either a custom thin backend or a forked FUSE client. Stock `rclone mount` straight to S3 (70+ backends, VFS cache) is the *interim PoC shortcut* only, and only where the guest is trusted; it is not the target, because it puts the object-store credential and protocol in the guest.
54
+ - `mountpoint-s3` — AWS-native, fastest, **sequential-write-only**; usable behind the broker, rejected as a guest-facing primary.
55
+ - `geesefs` — better random-write than mountpoint-s3, smaller backend set.
56
+ - **Backend credential:** held by the broker, never the guest. Short-lived **STS scoped-session** credentials minted per session, locked by inline session policy to the bucket-prefix the `filesystem_id` names ([07-security.md](./07-security.md)). Not static keys. The broker's backend leg traverses the Egress trust-edge allow-list-only (no TLS termination), so the request signature stays intact.
57
+ - **Lifecycle policy** at the S3 layer replaces the current `find /tmp -mtime` cleanup cron.
58
+
59
+ ## Mounts spec on the sandbox
60
+
61
+ The (planned) `SandboxTemplate` will declare its mounts; the provider (L3) materializes them. Target shape (prospective schema — not implemented today):
62
+
63
+ ```yaml
64
+ mounts:
65
+ - type: image # Tier 1 — implicit
66
+ - type: skill
67
+ ref: sha256:abcdef… # Tier 2 — content-addressed
68
+ path: /usr/local/share/skills/pptx
69
+ mode: ro
70
+ - type: workspace
71
+ persistence: ephemeral # only "ephemeral"; PVC rejected (A37)
72
+ backend: cow-snapshot # prospective Phase 9 field, not in schema today: qcow2 | dm-thin | zfs-clone; overlayfs (sysbox/runc)
73
+ path: /home/assistant
74
+ - type: user-data
75
+ backend: s3
76
+ bucket: tenant-{tenant_id}-data
77
+ prefix: sessions/{session_id}/
78
+ path: /mnt/user-data
79
+ mode: rw
80
+ ```
81
+
82
+ ## What changes per phase
83
+
84
+ | Phase | Storage change |
85
+ |---|---|
86
+ | 1 | None — extract provider interface only |
87
+ | 2 | None directly; provider learns mount specs but Docker still binds local fs |
88
+ | 3 | MinIO into Compose; `S3_*` config; FUSE sidecar pattern; squashfs skill blobs |
89
+ | 4 | Storage broker holds the backend credential (per-session STS, not static keys); guest speaks file-RPC to the broker and holds only a `filesystem_id` handle |
90
+ | 5 | K8s provider keeps Tier 3 ephemeral (tmpfs / overlayfs on sysbox); no PVC for sandbox session workspace ([A37](../antipatterns.md#a37--pvc-for-sandbox-session-workspace)); FUSE pattern carried to pods |
91
+ | 8 | virtio-fs replaces FUSE on kata-ch (faster, kernel-level) |
92
+ | 9 | Tier 3 = CoW snapshot of golden rootfs (qcow2 / dm-thin / ZFS) on Kata templates; ext4 `resuid=65534` per-VM ceiling; sealed `squashfs` disks for binaries / system skills |
93
+
94
+ ## Block-device tooling swap (microVM templates, Phase 10)
95
+
96
+ Once the snapshot-pool pattern lands (internal design note), Tier-1 and Tier-2 content stops being "OCI layers pulled at spawn" and becomes **block devices the host swaps at resume**. The L1 agent's job is to remount them when the host signals readiness via `POST /mount_root` on its control server.
97
+
98
+ Layout per session (Firecracker / Cloud Hypervisor microVM):
99
+
100
+ | Device | Content | Mode | Lifetime |
101
+ |---|---|---|---|
102
+ | `vda` | per-tenant root overlay on a shared template base (ext4) | RW | per session |
103
+ | `vdb` | Tier 2 skills (squashfs of `/opt/skills`) | RO | per release |
104
+ | `vdc` | Tier 1 runtime/payload (squashfs of `/opt/<runner>`) | RO | per release |
105
+ | Tier-4 mounts | rclone-FUSE-in-VM (interim PoC) | RW (where applicable) | per tenant |
106
+
107
+ Per-resume sequence on the L1 side (the host does the device swap first, then calls `/mount_root`):
108
+
109
+ 1. `drop_caches` — page cache references files from the frozen rootfs that no longer exist.
110
+ 2. Remount devtmpfs.
111
+ 3. Mount `/dev/vda` as ext4, `pivot_root` into it.
112
+ 4. Mount `/dev/vdb`, `/dev/vdc` squashfs overlays.
113
+ 5. `clock_settime()` (the wall-clock was frozen).
114
+ 6. Trigger CRNG reseed (see [07-security.md](./07-security.md) snapstart-restore hardening).
115
+ 7. Drop `CAP_SYS_RESOURCE`.
116
+ 8. Start accepting WS connections.
117
+
118
+ The pattern is the standard snapshot-pool block-device-swap approach. Tier-2 stays as squashfs in both the OCI-layer world and the block-device world — the format is the same, only the delivery channel changes. **Skills built before Phase 10 are forward-compatible.**
119
+
120
+ Implication for the release pipeline (Phase 10): tooling produces both an OCI image *and* a paired set of `vdb` / `vdc` squashfs blobs from the same source. Both are signed; both are referenced by content hash from templates. Phase 9 templates use only OCI; Phase 10 templates may use either, gated on `snapstart_compatible` ([09-templates.md](./09-templates.md)).
121
+
122
+ ## Explicit non-goals
123
+
124
+ - **No RWX (ReadWriteMany).** Single-writer patterns only. Avoids EFS/Filestore complexity and consistency surprises.
125
+ - **No proprietary CSI drivers.** S3-compatible API only.
126
+ - **No custom storage *transport*.** The mount substrate uses existing FUSE / virtio-fs / CSI building blocks — we do not write a block protocol. The storage *broker* (credential custody + object-store client + per-session scope) is a deliberate component, not a transport; it is the canonical model, not a workaround ([`02-trust-boundaries.md`](../../architecture/02-trust-boundaries.md) §2 zone 3).
127
+ - **No PVC for the sandbox session workspace (Tier 3).** Locked decision — see [A37](../antipatterns.md#a37--pvc-for-sandbox-session-workspace). CoW snapshot at the storage layer replaces it. PVC remains the right primitive for stateful platform services (PostgreSQL, Redis, Prometheus, etcd) — none of which our sandbox runtime hosts.
128
+ - **No S3 credentials inside the sandbox guest.** Tier 4 Phase 4 target end-state: guest carries a `filesystem_id` session token, broker / storage proxy holds S3 keys server-side.
129
+ - **No skill hot-reload.** Skills materialize at provisioning, are immutable for the lifetime of the VM.
130
+
131
+ ## Source
132
+
133
+ - `docs/requirements/k8s-architecture.md` (pre-rename — original 4-tier spec)
134
+ - Internal design notes (storage section)
@@ -0,0 +1,194 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ # 07 — Security
5
+
6
+ > Threat model, secret-rotation strategy, egress controls, image signing, audit.
7
+ > Derived from internal security notes, adapted to our stack.
8
+
9
+ ## Threat model
10
+
11
+ **We protect against:**
12
+ - Curious users probing what's reachable from the sandbox
13
+ - "Confused agent" — LLM hallucinating dangerous commands
14
+ - Prompt injection coercing the agent into exfil / lateral movement
15
+ - Direct adversaries with valid credentials
16
+ - Compromised dependencies (npm, pip) inside the sandbox
17
+
18
+ **We do NOT protect against:**
19
+ - Compromised control plane (L4) — if L4 is owned, game over by design
20
+ - Host kernel CVEs (assume patches applied)
21
+ - Side-channel attacks on shared cores (Spectre / Meltdown — kernel mitigations assumed)
22
+ - Hardware attacks (datacenter-level threat)
23
+ - Determined DoS by exhausting resources (mitigated by quotas, not prevented)
24
+
25
+ ## Isolation responsibility per layer
26
+
27
+ | Layer | Trust posture | Primary control |
28
+ |---|---|---|
29
+ | L1 (agent) | Trusted by L4 (we wrote it); untrusted by host | Small surface, no auth (network-policy-enforced) |
30
+ | L2 (runtime) | **Primary security boundary** | Hypervisor / kernel isolation |
31
+ | L3 (provider) | Trusted infrastructure | NetworkPolicy, ResourceQuota, PSA, RBAC |
32
+ | L4 (control plane) | Most-trusted | Std hardening: mTLS, secrets, RBAC, WAF |
33
+
34
+ L2 carries the load for untrusted workloads. See the runtime matrix in [04-layer2-runtimes.md](./04-layer2-runtimes.md).
35
+
36
+ ## Secret management
37
+
38
+ ### Today (transitional)
39
+ - Anthropic API key, GitLab token, vision API key injected as env vars at container create time.
40
+ - Static for container lifetime; rotation requires container restart.
41
+ - Stored in k8s `Secret` objects (when on Helm) or `.env` files (Compose).
42
+
43
+ ### Target (Phase 4 ships, Phase 6 expands)
44
+
45
+ - **Secret broker** lives in L4. Responsibilities:
46
+ 1. Read static long-lived secrets from the backing store (AWS Secrets Manager / GCP Secret Manager / Vault / k8s `Secret`) — operator concern.
47
+ 2. **Mint short-lived, scoped credentials per session:**
48
+ - Anthropic / vision API keys: same-key issuance (Anthropic doesn't STS) — but rotated on schedule and injected via `/v1/configure` so rotation never requires restart.
49
+ - S3: per-session STS tokens (AWS STS / MinIO STS) scoped to `bucket/sessions/{session_id}/*` only.
50
+ - Egress JWT: signed per-session, encodes allowed destinations + expiry.
51
+ 3. **Rotate** static keys on a schedule (≤ 90 days) without downtime.
52
+ 4. **Revoke** on session end.
53
+
54
+ - **In the sandbox:** secrets arrive via `POST /v1/configure`. Never baked into image. Never logged.
55
+ - **Rotation pattern:** L4 calls `/v1/configure` again with new short-lived creds; sandbox swaps in place.
56
+
57
+ ### Image signing
58
+
59
+ - All sandbox images signed with [cosign](https://github.com/sigstore/cosign).
60
+ - Admission controller (k8s) verifies signature; rejects unsigned or invalid.
61
+ - Templates reference images by **digest** (`sha256:...`), never tag.
62
+
63
+ ## Network egress
64
+
65
+ - **Default-deny.** No direct internet from any sandbox.
66
+ - **Egress proxy** mediates every outbound connection.
67
+ - Sandbox carries a per-session JWT in egress requests.
68
+ - Proxy validates JWT signature, checks destination against the JWT-encoded allowlist, checks expiry.
69
+ - Logs every request (audit).
70
+ - **Reference implementation:** [`Michaelliv/agentbox`](https://github.com/Michaelliv/agentbox) — port to Go for production (Phase 8).
71
+ - **Allowlist sources:** template-level baseline (e.g., `pypi.org`, `registry.npmjs.org`) + session-level additions (the agent's running task scope).
72
+
73
+ ## Network ingress (to sandbox)
74
+
75
+ - Sandboxes are **not** publicly addressable.
76
+ - Only L3 (provider) reaches L1's port — enforced by k8s `NetworkPolicy` or Docker network isolation.
77
+ - The agent itself does **not** authenticate requests — defense is exclusively network-policy-level. Documented loudly to prevent "let's add an extra auth check" cargo-cult that misleads operators.
78
+
79
+ ## Per-runtime residual risks (one-line each)
80
+
81
+ - **runc/sysbox:** shared host kernel → kernel CVE escapes the sandbox.
82
+ - **gVisor:** Sentry bugs (~500K LoC Go); passthrough syscalls.
83
+ - **kata-fc / kata-ch:** Firecracker / CH bugs (Rust, ~50-80K LoC); KVM bugs; side-channels on shared CPUs.
84
+
85
+ See internal security notes for CVE history references.
86
+
87
+ ## Mandatory deny paths inside the workspace
88
+
89
+ Even with full L2 isolation, the agent itself must refuse to write a small set of paths that are vectors for persistent shell takeover or self-exfiltration. The list is **always-on, regardless of template configuration** — following an industry-observed local-sandbox deny-path pattern:
90
+
91
+ | Path / glob | Why blocked |
92
+ |---|---|
93
+ | `.bashrc`, `.bash_profile`, `.zshrc`, `.zprofile`, `.profile` | Persistent shell hijack — survives session, exfils on next user shell |
94
+ | `.gitconfig`, `.gitmodules` | Persistent git hooks via `[core] hooksPath`; submodule URL injection |
95
+ | `.git/hooks/*` | Hook execution on every git operation |
96
+ | `.mcp.json` | Sub-agent MCP server hijack |
97
+ | `.claude/`, `.claude-code/`, `.codex/`, `.opencode/` | Sub-agent CLI config / credential hijack |
98
+ | `.vscode/`, `.idea/` | IDE-driven code execution on user re-open |
99
+ | `.ssh/`, `.aws/`, `.gcp/`, `.kube/` | Credential exfil targets |
100
+ | `$PATH` directories owned by the user (`~/.local/bin/*`, `bin/*`) | Shadow-binary injection |
101
+
102
+ Enforcement: a Rust-side path-canonicalization check on every write in the L1 agent's file-ops handlers. Symlink targets are resolved before the check (standard symlink-attack defense). Phase 7 implements; the antipattern reference is A1 / C-series.
103
+
104
+ ## Graceful-shutdown protocol
105
+
106
+ When L3 needs to stop a sandbox — drain for upgrade, end-of-session, idle TTL — the protocol is **four steps, in order**. Skipping steps causes data loss (atomic-rename caught mid-flight) or audit-log gaps:
107
+
108
+ 1. **Drop the page cache** inside the sandbox (echo 3 → drop_caches via the L1 control endpoint). Forces dirty data to disk; pending writebacks complete or fail visibly.
109
+ 2. **`SIGTERM` to the workload process group.** Give it a grace period (default 10 s, template-tunable).
110
+ 3. **Wait** for child reaper to confirm exit, or timeout.
111
+ 4. **`SIGKILL`** to anything still running. Container teardown follows.
112
+
113
+ The L1 agent exposes this as `POST /shutdown` on the control plane ([05-layer1-guest-agent.md](./05-layer1-guest-agent.md)) and as a connect-side `Shutdown` RPC on the data plane. The two paths share the same state machine; whichever fires first wins.
114
+
115
+ ## Defense-in-depth: `memfd_create` for the agent binary (Phase 9+)
116
+
117
+ Optional hardening for the microVM tiers: the L1 agent binary is loaded into a `memfd` at boot and the on-disk copy is unlinked. An attacker who lands code execution inside the sandbox cannot read the agent binary from disk to study it — `/proc/self/exe` resolves to a memory-only file descriptor.
118
+
119
+ This is purely defense-in-depth (the binary's source-equivalent is public). Cheap to implement once the agent is a static Rust binary; **Phase 9 nice-to-have, not Phase 7 must.**
120
+
121
+ ## Snapstart-restore hardening (Phase 10)
122
+
123
+ When a sandbox resumes from a frozen Firecracker snapshot, the guest is **stale by design** — the kernel knows it forked but userspace does not. Without explicit re-initialization, userspace RNGs reseed from snapshotted state (worst-case identical seeds across restores), wall-clock is wrong by minutes-to-days, and any cached page references point into a rootfs that was just swapped underneath.
124
+
125
+ Mandatory on every restore (standard snapshot-restore hardening):
126
+
127
+ | Action | Why |
128
+ |---|---|
129
+ | `drop_caches` after device hot-swap | Page cache references the frozen rootfs |
130
+ | Devtmpfs remount | Device-node mapping changed |
131
+ | `pivot_root` onto fresh rootfs | The frozen rootfs is stale |
132
+ | `clock_settime()` to current host time | Wall-clock was frozen |
133
+ | **CRNG reseed** (`getrandom`-style force) | Userspace RNGs (OpenSSL, glibc arc4random) don't notice the fork — without reseed, two sandboxes restored from the same snapshot can generate identical "random" values |
134
+ | Drop `CAP_SYS_RESOURCE` | Held only for init |
135
+ | Re-run env-var scrub | Template env may have changed since the template was frozen |
136
+
137
+ Template-build-time hardening:
138
+ - `init_on_free=1` kernel cmdline — zeroes freed pages before reuse so a fresh resume can't read template-VM secrets out of recycled memory.
139
+ - Template image built with **no `CAP_SYS_RESOURCE` retention** logic — the cap is held only during init.
140
+
141
+ Until Phase 10 ships, the L1 agent's `/mount_root` endpoint is **not exposed**. Adding it pre-Phase-10 is a footgun (untested resume path on a sandbox that was never frozen).
142
+
143
+ ## Sandbox hygiene
144
+
145
+ - **No reuse between tenants.** When a session ends, sandbox is destroyed. Never returned to the pool of another tenant.
146
+ - **Per-sandbox ServiceAccount** with empty RBAC (k8s) — sandbox can't enumerate the cluster.
147
+ - **`securityContext`:** `runAsNonRoot` (where the runtime allows — note: sysbox/kata enable safe root-in-sandbox), `allowPrivilegeEscalation: false`, drop ALL capabilities (re-add only needed ones), `seccompProfile: RuntimeDefault`.
148
+ - **`ResourceQuota` + `LimitRange`** per tenant namespace — blast-radius cap.
149
+
150
+ ## Audit log
151
+
152
+ Mandatory events:
153
+ - Session created / configured / terminated
154
+ - Exec call (cmd hash, exit code, duration — **not** stdout/stderr verbatim)
155
+ - Egress request (destination, decision, JWT id — **not** body)
156
+ - Secret rotated
157
+ - Admission decision (template assigned)
158
+ - Runtime error / health-degraded
159
+
160
+ Forbidden in logs:
161
+ - stdout / stderr verbatim (may contain secrets)
162
+ - Env var values
163
+ - File contents
164
+ - HTTP body through proxy
165
+
166
+ Retention: **≥ 90 days**. Append-only sink. See [10-observability.md](./10-observability.md).
167
+
168
+ ## Compliance posture (informational, not committed)
169
+
170
+ | Standard | Posture |
171
+ |---|---|
172
+ | PCI-DSS 2.4 (isolation) | `kata-ch` satisfies "logical separation" in spirit — get auditor sign-off per deployment |
173
+ | HIPAA | Same as above for PHI; encrypt persistent storage with per-session keys; PHI must not appear in audit logs |
174
+ | GDPR | Ephemeral by default; explicit DPA needed if persistence enabled |
175
+ | SOC 2 | Audit logging here aligns with SOC 2 evidence requirements |
176
+
177
+ ## What ships, when
178
+
179
+ | Phase | Security change |
180
+ |---|---|
181
+ | 1–3 | No security change (refactor + storage) |
182
+ | 4 | **Secret broker** + per-session STS + key rotation |
183
+ | 5 | NetworkPolicy default-deny + ResourceQuota + empty-RBAC SA in Helm chart |
184
+ | 6 | mTLS L4 ↔ L3; OIDC for admin UI |
185
+ | 7 | Rust agent shrinks attack surface; signed image enforcement |
186
+ | 8 | Egress proxy + audit-log pipeline + 90 d retention **(prereq for any untrusted tier)** |
187
+ | 9 | `kata-ch` / `kata-fc` raise the isolation ceiling — untrusted tier opens, gated on Phase 8 |
188
+ | 10 | Snapshot/restore + post-restore hardening (CRNG reseed, `init_on_free=1`, `CAP_SYS_RESOURCE` drop); KMS-backed per-session encryption keys for persistent storage |
189
+
190
+ ## Source
191
+
192
+ - Internal security notes
193
+ - [`docs/future-architecture/references.md`](../references.md) (`agentbox`, `cosign`)
194
+ - [ADR-0006](../adr/0006-no-agpl-no-bsl-dependencies.md) (license hygiene)