@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,134 @@
1
+ # Open WebUI Computer Use Filter
2
+
3
+ ## Purpose
4
+
5
+ The Computer Use Filter (`openwebui/functions/computer_link_filter.py`) is the only integration point between Open WebUI and the Computer Use Server. Its `inlet()` fetches the server-baked system prompt over HTTP and injects it into the conversation when the `ai_computer_use` tool is active. Its `outlet()` decorates assistant messages that contain sandbox file URLs with a markdown preview link and an archive-download link. On patched Open WebUI builds (see Path B below) the preview link is auto-promoted to an inline artifact by the `fix_preview_url_detection` frontend patch; on stock builds it stays a one-click link — either way, the user reaches the preview SPA without a rebuild.
6
+
7
+ The filter is the single source of truth for the client-side URL shape; the server owns prompt content and preview rendering. Read the file itself for the authoritative Valve defaults and behaviour.
8
+
9
+ > **Heads up on prompt duplication.** The six-tier MCP-native surface (see `docs/system-prompt.md`) also writes the system prompt to `/home/assistant/README.md` and returns it on `InitializeResult.instructions`. In Open WebUI through LiteLLM, `InitializeResult.instructions` is **not** forwarded to the LLM (LiteLLM is a tool-call proxy and drops it), so the real duplication in this deployment is: filter `inlet()` injects the prompt once; the model optionally calls `view /home/assistant/README.md` if it follows the recovery-nudge in the `bash_tool` / `view` tool descriptions — that adds a second ~3–5K token copy. Worst case is two copies, not three. The nudge is kept to help pathological clients that strip the system prompt — alternatives discussed in `docs/system-prompt.md`.
10
+
11
+ ## Installation
12
+
13
+ - Open WebUI → **Admin Panel** → **Functions** → **New Function**.
14
+ - Paste the entire contents of `openwebui/functions/computer_link_filter.py` into the editor.
15
+ - Save, then toggle the function on for the target model(s).
16
+ - Optionally override any Valve from the function's settings panel. Defaults are chosen so a fresh deployment works end-to-end as soon as the Computer Use Server is reachable at `http://localhost:8081`.
17
+ - Upstream reference: [Open WebUI Functions documentation](https://docs.openwebui.com/features/plugin/functions/).
18
+
19
+ ## Preview panel isn't showing — two ways to fix it
20
+
21
+ ![File preview panel when working](screenshots/02-file-preview.png)
22
+
23
+ When the AI generates a file, the preview panel shown above should open on the right. If nothing opens, here's why — and two ways to fix it.
24
+
25
+ ### How the preview gets rendered
26
+
27
+ The filter's `outlet()` appends a markdown link `[🖥️ Open preview]({PUBLIC_BASE_URL}/preview/{chat_id})` to every assistant message that references a sandbox file. The URL comes from the server's `PUBLIC_BASE_URL` env var — delivered to the filter via the `X-Public-Base-URL` response header on `/system-prompt` and cached alongside the prompt, so the filter never needs its own copy of the public URL.
28
+
29
+ On *stock* Open WebUI the link stays a link: user clicks it, preview opens in a new tab. On *patched* Open WebUI (our `docker-compose.webui.yml` build) the `fix_preview_url_detection` patch sees `/preview/{chat_id}` in the message text and pushes a synthetic `<iframe>` artifact into the chat's `htmlGroups`. A second patch, `fix_artifacts_auto_show`, then auto-opens the side panel. No click required.
30
+
31
+ > **v4.1.0 note:** earlier versions also embedded a raw fenced ```html `<iframe>` block straight into the message. That turned out to be a foot-gun — the frontend patch's guard (`!htmlGroups.some(o=>o.html)`) skipped detection when the block was present, and stock Open WebUI rendered it as a visible code fence. v4.1.0 relies solely on the markdown link plus the patch.
32
+
33
+ ### Path A — Stock Open WebUI (zero setup)
34
+
35
+ Do nothing — the filter already emits the markdown link. The user clicks `🖥️ Open preview` and the preview SPA opens in a new tab. Set `PREVIEW_MODE=off` in Valves if you don't want the link at all. See [Valves reference](#valves-reference).
36
+
37
+ ### Path B — Apply our patches to Open WebUI (auto-opening side panel)
38
+
39
+ If you want the preview to pop open automatically inside the artifact panel like in the screenshot above, use our patched Open WebUI build:
40
+
41
+ - **Easiest:** use `docker-compose.webui.yml` from the repo root. It builds Open WebUI with `fix_artifacts_auto_show` and `fix_preview_url_detection` pre-applied.
42
+ - **Custom image:** if you maintain your own Open WebUI image, copy the two patch scripts (`openwebui/patches/fix_artifacts_auto_show.py` and `openwebui/patches/fix_preview_url_detection.py`) and run them against `/app/build/_app/immutable/chunks/*.js` at build time — see [`openwebui/Dockerfile`](../openwebui/Dockerfile) for the exact `RUN python3 /tmp/patches/...` invocations. Both patches are idempotent and tested against Open WebUI 0.9.2 (this build's strict target).
43
+
44
+ ### Also check: `PUBLIC_BASE_URL` must be reachable from the user's browser
45
+
46
+ The iframe/button `src` comes from the server's `PUBLIC_BASE_URL` env var. It must be a hostname the user's browser can resolve — not Docker DNS. Set it in `.env` (`PUBLIC_BASE_URL=https://cu.example.com` for prod, `http://localhost:8081` for local dev). Connection-refused symptoms after that? See [Troubleshooting → connection refused](#preview-shows-connection-refused-or-a-blank-frame).
47
+
48
+ <a id="two-file_server_url-settings--they-must-match"></a>
49
+ ### Two URL-roles — public (server env) and internal (filter+tool Valve)
50
+
51
+ **v4.0.0:** the "two `FILE_SERVER_URL`" problem is gone. There is now **one public URL**, owned by the server. The filter doesn't carry it any more — it's delivered in the `X-Public-Base-URL` response header on `/system-prompt` and cached alongside the prompt. Operator only has one knob for the public URL now.
52
+
53
+ | Role | Where | Default | Notes |
54
+ |------|-------|---------|-------|
55
+ | **Public URL** — baked into /system-prompt, returned to filter in header, model writes it in links | `computer-use-server` env `PUBLIC_BASE_URL` (set in `.env`) | `http://computer-use-server:8081` (internal Docker DNS — *the browser cannot resolve it*; override to a browser-reachable URL such as `http://localhost:8081` for local dev, `https://cu.example.com` in prod) | Single source of truth. The filter reads it from the response header; no filter Valve for it. `fix_preview_url_detection` is host-agnostic — the iframe src is reconstructed at runtime from the matched URL's own origin, so no build-arg is needed. |
56
+ | **Internal URL** — server→server fetch from inside the open-webui container | Filter Valve `ORCHESTRATOR_URL` and Tool Valve `ORCHESTRATOR_URL` (both seeded by `init.sh`) | `http://computer-use-server:8081` (Docker service DNS) | Only reachable inside the compose network. Browsers never see it. `init.sh` seeds both Valves from the `ORCHESTRATOR_URL` env on the open-webui container. |
57
+
58
+ **Custom project/network layouts.** The stock `docker-compose.yml` pins `container_name: computer-use-server`, so `docker compose -p myproject up` by itself does not rename the container — the internal hostname stays `computer-use-server`. If you remove/change that pin, set `ORCHESTRATOR_URL` on the open-webui container to the new hostname and `init.sh` will seed both Valves correctly.
59
+
60
+ For the full embedding checklist see [README.md → Required setup when embedding Open WebUI](../README.md#required-setup-when-embedding-open-webui-into-your-own-stack).
61
+
62
+ ## Valves reference
63
+
64
+ | Name | Type | Default | Purpose |
65
+ |------|------|---------|---------|
66
+ | `ORCHESTRATOR_URL` | str | `"http://computer-use-server:8081"` | **Internal** URL of the Computer Use server. Used for server→server fetch of `/system-prompt` from inside the open-webui container. Never appears in browser-facing URLs — the public URL comes from the server's `PUBLIC_BASE_URL` env var via the `X-Public-Base-URL` response header. Trailing slash tolerated. Non-http(s) schemes are rejected. |
67
+ | `INJECT_SYSTEM_PROMPT` | bool | `True` | If `False`, `inlet()` skips system-prompt injection entirely — useful when another filter owns the prompt. |
68
+ | `PREVIEW_MODE` | Literal `"button" \| "off"` | `"button"` | Whether to emit the markdown preview link. `button` = emit `[🖥️ Open preview]({base}/preview/{chat_id})` (the `fix_preview_url_detection` frontend patch promotes it to an inline artifact on patched builds; stock Open WebUI leaves it as a plain clickable link). `off` = no preview link. |
69
+ | `ARCHIVE_BUTTON` | Literal `"on" \| "off"` | `"on"` | Append `[{ARCHIVE_BUTTON_TEXT}]({base}/files/{chat_id}/archive)` to assistant messages that contain files for the current chat. |
70
+ | `PREVIEW_BUTTON_TEXT` | str | `"🖥️ Open preview"` | Label for the preview-button markdown link (used when `PREVIEW_MODE` is `button`). |
71
+ | `ARCHIVE_BUTTON_TEXT` | str | `"📦 Download all files as archive"` | Label for the archive-download link (used when `ARCHIVE_BUTTON` is `on`). |
72
+
73
+ ## Preview UX: which `PREVIEW_MODE` fits you?
74
+
75
+ - **`PREVIEW_MODE="button"`** (default). Every assistant message containing a sandbox file URL (or a `<details type="tool_calls">` block referencing a browser tool) is decorated with a markdown link `[🖥️ Open preview]({base}/preview/{chat_id})`. On stock Open WebUI the user clicks it to open the preview SPA in a new tab. On patched builds (`fix_preview_url_detection` + `fix_artifacts_auto_show`, shipped by `docker-compose.webui.yml`) the same URL is detected in text and auto-opened as an inline artifact — no click.
76
+ - **`PREVIEW_MODE="off"`**. No preview link. Combine with `ARCHIVE_BUTTON="off"` to make `outlet()` a no-op.
77
+
78
+ If you're upgrading from v4.0.0 / v3.x and saved `"artifact"` or `"both"` in your Valves, Pydantic validation will now reject the saved value — re-seed Valves after upgrade (`rm /app/backend/data/.computer-use-initialized` + restart).
79
+
80
+ ## Archive button
81
+
82
+ `ARCHIVE_BUTTON="on"` (default) preserves the v3.0.x behaviour: when an assistant message contains at least one file URL under `{PUBLIC_BASE_URL}/files/{chat_id}/…`, `outlet()` appends a markdown link to the archive endpoint `/files/{chat_id}/archive`. The endpoint streams a zip of every file the sandbox has written for the chat. The append is idempotent (substring check against the fully-rendered URL) — safe to re-run `outlet()` on the same body as many times as the framework chooses.
83
+
84
+ ## System prompt injection
85
+
86
+ `INJECT_SYSTEM_PROMPT` (default `True`) controls the `inlet()` path. When the `ai_computer_use` tool is active and `chat_id` is present, the filter HTTP-fetches the baked prompt from `{ORCHESTRATOR_URL}/system-prompt` and injects it into the system message, with a 5-minute LRU cache and a stale-cache fallback on transport failure. The response's `X-Public-Base-URL` header is cached alongside the prompt so `outlet()` can build correct browser-facing links without its own Valve. Non-http(s) schemes on `ORCHESTRATOR_URL` are rejected to avoid `file://` / `ftp://` information-disclosure paths. See `docs/system-prompt.md` for the server-side contract, including how `user_email` drives the `<available_skills>` block.
87
+
88
+ ## Troubleshooting
89
+
90
+ ### Preview shows "connection refused" or a blank frame
91
+
92
+ - Check that `PUBLIC_BASE_URL` (server `.env`) is reachable *from the user's browser* — the filter has no Valve for the public URL any more; everything flows from the server env.
93
+ - Confirm the Computer Use Server is running: `docker compose ps` should list the `computer-use-server` container as healthy.
94
+ - Copy the `src=` value out of the iframe and `curl` it directly — the SPA HTML should come back with HTTP 200.
95
+
96
+ ### Preview link or archive button never appears
97
+
98
+ - The assistant message must contain at least one URL matching `{PUBLIC_BASE_URL}/files/{chat_id}/…` (or a `<details type="tool_calls">` block referencing a browser tool — covers pure-navigation sessions). No trigger, no decoration.
99
+ - `chat_id` must reach `outlet()` via `__metadata__`. Restart Open WebUI after toggling Valves if the model didn't re-init.
100
+ - `PREVIEW_MODE` must be `"button"` OR `ARCHIVE_BUTTON` must be `"on"`. When both are `"off"`, `outlet()` returns the body unchanged.
101
+
102
+ ### Preview opens in a new tab instead of inside the artifact panel
103
+
104
+ You are running stock Open WebUI — the markdown link stays a link. Either live with the click (fine on mobile/minimal deploys) or apply Path B (`fix_preview_url_detection` + `fix_artifacts_auto_show`) to get the inline artifact panel.
105
+
106
+ ### Filter cannot reach `computer-use-server` (cross-stack DNS)
107
+
108
+ **Symptom:** Preview iframe never auto-opens even on the patched build, system-prompt injection silently falls back to stale cache, or OWUI container logs show DNS errors / connection-refused on `http://computer-use-server:8081`. Manually editing the `ORCHESTRATOR_URL` Valve to a host IP (e.g. `http://192.168.x.x:8081`) makes the symptom disappear.
109
+
110
+ **Why:** `docker-compose.yml` and `docker-compose.webui.yml` reach each other through the **default Docker Compose network**, which only works when both stacks share a project name. Compose derives the project name from the parent directory (`open-computer-use`). If the two stacks end up with different project names — different parent directory, `-p custom-name` flag, `COMPOSE_PROJECT_NAME` env, `docker compose --project-directory`, or running them from separate clones — they get separate networks and `computer-use-server` no longer resolves from inside the OWUI container.
111
+
112
+ **Fixes (pick one):**
113
+
114
+ - **Restore the shared project name.** Keep both compose files in the same `open-computer-use/` directory and start them without `-p`. Verify with `docker network inspect open-computer-use_default` — both `computer-use-server` and `open-webui` should appear in the `Containers` section.
115
+ - **Override the env before bringing OWUI up:** add `ORCHESTRATOR_URL=http://host.docker.internal:8081` to `.env`. On Linux, also append `extra_hosts: ["host.docker.internal:host-gateway"]` to the `open-webui` service in `docker-compose.webui.yml` (Docker Desktop / macOS / Windows resolve this automatically). Then re-seed the Valves so the new env reaches the persistent OWUI database: `docker exec <owui> rm /app/backend/data/.computer-use-initialized && docker restart <owui>`.
116
+ - **Hard-set the Valve** via OWUI admin → Functions → Computer Use Filter → Valves → `ORCHESTRATOR_URL` to a host IP or hostname the OWUI container can reach. Quickest one-off fix, but it persists in the OWUI database and survives `.env` changes — easy to forget on the next deploy.
117
+
118
+ The same root cause also breaks the matching `ORCHESTRATOR_URL` Valve on the **Tool** (`computer_use_tools.py`) and the env var read by the `fix_large_tool_results` patch — fix once at the env layer and all three pick it up via `init.sh`.
119
+
120
+ ### "Non-http scheme" error in logs
121
+
122
+ Caused by setting `ORCHESTRATOR_URL` to a `file://`, `ftp://`, or similarly non-http(s) URL. The filter rejects it and serves the stale cache if available, otherwise skips injection. Fix by pointing the Valve at an `http://` or `https://` endpoint.
123
+
124
+ ## Version history
125
+
126
+ - **v4.1.0** — Breaking: removed `PREVIEW_MODE="artifact"` and `PREVIEW_MODE="both"`. `outlet()` no longer emits a fenced ```html `<iframe>` block; only the markdown preview link remains. The extra html block was redundant *and* actively harmful — the `fix_preview_url_detection` frontend patch guards on `!htmlGroups.some(o=>o.html)`, so when outlet pre-emitted an html block the patch skipped detection and the iframe rendered as a raw code fence in chat (issue #43 symptom). `"button"` is the new default; matches internal prod v3.8.0 behaviour. Saved `"artifact"` / `"both"` values fail Pydantic validation — re-seed Valves after upgrade.
127
+ - **v4.0.0** — Breaking: removed `FILE_SERVER_URL` and `SYSTEM_PROMPT_URL` Valves, replaced with a single `ORCHESTRATOR_URL` Valve (internal URL). The public URL is now owned by the server (`PUBLIC_BASE_URL` env) and delivered to the filter via the `X-Public-Base-URL` response header on `/system-prompt`. `_fetch_system_prompt()` now returns `(public_url, prompt)`; `outlet()` reads `public_url` from the cache instead of its own Valve. Tool's `FILE_SERVER_URL` Valve was renamed to `ORCHESTRATOR_URL` for consistency. `init.sh` re-seeds the new Valve names.
128
+ - **v3.4.0** — Removed the three legacy v3.2.0 boolean Valves (`ENABLE_PREVIEW_ARTIFACT`, `ENABLE_PREVIEW_BUTTON`, `ENABLE_ARCHIVE_BUTTON`) and their migration bridge. `PREVIEW_MODE` and `ARCHIVE_BUTTON` are the only knobs. Users upgrading straight from v3.2.0 revert to defaults — upgrade via v3.3.0 first if you need to preserve saved preferences.
129
+ - **v3.3.0** — Collapsed three boolean preview/archive Valves (`ENABLE_PREVIEW_ARTIFACT`, `ENABLE_PREVIEW_BUTTON`, `ENABLE_ARCHIVE_BUTTON`) into two Literal Valves (`PREVIEW_MODE`, `ARCHIVE_BUTTON`). Existing v3.2.0 deployments were migrated transparently by a Pydantic `@model_validator(mode="after")`. `outlet()` behaviour and all v3.1.0/v3.2.0 invariants preserved.
130
+ - **v3.2.0** — Added `ENABLE_PREVIEW_ARTIFACT` (default `True`), `ENABLE_PREVIEW_BUTTON` (default `False`), and `PREVIEW_BUTTON_TEXT` Valves. `outlet()` now emits an inline iframe artifact and/or a markdown preview link alongside the archive button. All v3.1.0 invariants preserved.
131
+ - **v3.1.0** — Removed the hardcoded ~460-line system prompt f-string; server became the single source of truth. HTTP fetch + LRU cache + stale-cache fallback. `SYSTEM_PROMPT_URL` Valve added (removed in v4.0.0); non-http(s) schemes rejected.
132
+ - **v3.0.2** — Last hardcoded-prompt revision. See git history for details.
133
+
134
+ For deeper context, consult the CHANGELOG blocks in the module docstring of `openwebui/functions/computer_link_filter.py` and the per-commit history on `main`.
@@ -0,0 +1,104 @@
1
+ <!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
2
+ <!-- Copyright (c) 2025 Open Computer Use Contributors -->
3
+
4
+ ---
5
+ status: draft
6
+ last-reviewed: 2026-06-07
7
+ owner: "@Wide-Moat/architects"
8
+ applies-to: next/v1
9
+ ---
10
+
11
+ Dependency-ordered build plan for the minimal-shelf implementation — contract-freeze first, a thin end-to-end thread next, then parallel fan-out — for the team implementing `next/v1` in the code repository.
12
+
13
+ # Implementation roadmap — minimal shelf
14
+
15
+ The architecture set (`docs/architecture/`) is settled enough to build: six components, eleven inter-component edges (F1–F11), six drafted contracts, and eleven ADRs (ADR-0001 `accepted`, 0002–0011 `proposed` with settled decisions). This roadmap orders the build so a team working in parallel proves integration early and never codes against a moving contract.
16
+
17
+ Scope: the **minimal shelf** only — one-click solo deployment, `trusted_operator` profile, `runc` runtime, local-volume storage engine, host-local credentials, file-system audit sink. No IdP, no KVM, no SIEM, no external store. Full-shelf features are listed once, at the end, as deferred.
18
+
19
+ ## Components and edges
20
+
21
+ The six containers and the directed edges between them ([`05-c4-container.md`](../architecture/05-c4-container.md) §4 defines the F-labels). HARD = the target must exist for the source's critical path; SOFT = the source emits without blocking.
22
+
23
+ | Edge | Source → Target | Crosses | Type |
24
+ |---|---|---|---|
25
+ | F1 | MCP caller → MCP gateway (01) | MCP authz spec | inbound |
26
+ | F5 | MCP gateway (01) → Control API (02) | session create/status, service identity | HARD |
27
+ | F2 | Operator → Control API (02) | operator-only ingress, kill-switch | HARD (privileged) |
28
+ | F6 | Control API (02) → Session sandbox (05) | Session JWT, host dials guest | HARD |
29
+ | F7 | Storage broker (04) → Session sandbox (05) | mount, `filesystem_id` handle | HARD |
30
+ | F8 | Session sandbox (05) → Egress trust-edge (06) | single outbound path | HARD |
31
+ | F9 | Storage broker (04) → Egress trust-edge (06) | broker-signed backend leg (network engine only) | HARD (network engine) |
32
+ | F10 | every container → Audit pipeline (07) | OCSF event | SOFT (async fan-in) |
33
+ | F11 | data-plane client → Storage broker (04) north face | file/artifact API | SOFT (post-v1) |
34
+
35
+ ```mermaid
36
+ flowchart LR
37
+ CALLER[MCP caller] -->|F1| MCP[MCP gateway 01]
38
+ MCP -->|F5 HARD| CTRL[Control API 02]
39
+ OPER[Operator] -->|F2| CTRL
40
+ CTRL -->|F6 HARD host-dials| VM[Session sandbox 05]
41
+ BROKER[Storage broker 04] -->|F7 HARD mount| VM
42
+ VM -->|F8 HARD| EDGE[Egress trust-edge 06]
43
+ MCP -.->|F10 soft| AUD[Audit pipeline 07]
44
+ CTRL -.->|F10 soft| AUD
45
+ BROKER -.->|F10 soft| AUD
46
+ VM -.->|F10 soft| AUD
47
+ EDGE -.->|F10 soft| AUD
48
+ ```
49
+
50
+ The graph is acyclic. `F1 → F5 → F6` is the integration spine; every other edge is either deferred or async fan-in.
51
+
52
+ ## Build order
53
+
54
+ Freeze the spine contracts before any component code; prove the end-to-end thread before thickening any single component (walking skeleton, not horizontal layers). The audit fan-in (F10) is async, so it is stubbed during the skeleton and the real pipeline is built in parallel afterward.
55
+
56
+ ### Phase 0 — Contract freeze (no service code)
57
+
58
+ Two spine edges are stubs ([#205](https://github.com/Wide-Moat/open-computer-use/issues/205)); freeze them before opening any consumer.
59
+
60
+ | Task | Edge | Contract | State today |
61
+ |---|---|---|---|
62
+ | Freeze session set-up RPC | F5 (gateway↔Control), F6 lifecycle | session-setup (Protobuf/gRPC) | stub, [#205](https://github.com/Wide-Moat/open-computer-use/issues/205) |
63
+ | Freeze operator REST surface | F2 | operator OpenAPI | stub, [#205](https://github.com/Wide-Moat/open-computer-use/issues/205) |
64
+ | Confirm exec channel | F6 dial | [`exec/exec-channel.schema.json`](../../contracts/exec/exec-channel.schema.json) | drafted — confirm, do not redesign |
65
+ | Confirm audit envelope | F10 | [`audit/audit-fanin.asyncapi.yaml`](../../contracts/audit/audit-fanin.asyncapi.yaml) | drafted — emitters code against it |
66
+
67
+ ### Phase 1 — Tracer slice (single thread, minimal parallelism)
68
+
69
+ Build the narrowest path that proves the three load-bearing HARD edges (F5, F6, exec contract) end to end: a caller issues one exec and gets a result. The Session sandbox is the core and the most self-contained piece — it builds first, against a thin Control driver that does only what the sandbox needs to come up. Everything else on the slice exists to stand the sandbox up and carry one call. Audit writes to a NULL sink. This is sequential by nature — it is the integration proof the team merges into.
70
+
71
+ 1. **Session sandbox (05)** — the core. Guest agent as PID 1, host-side exec supervisor terminating the dialled channel over the frozen [`exec/exec-channel.schema.json`](../../contracts/exec/exec-channel.schema.json). `runc` + hardened posture (seccomp BPF, Landlock, cap-drop ALL, read-only rootfs; [ADR-0003](../architecture/adr/0003-sandbox-runtime-tier-ladder.md) `trusted_operator` × `runc` cell). One container; the sub-container split ([#174](https://github.com/Wide-Moat/open-computer-use/issues/174)) is deferred.
72
+ 2. **Control / operator API (02)** — thin driver only at this phase: the lifecycle controller's two ordered steps — **create** the container (runc orchestration), then **dial** into it (Session JWT bound to `container_name` over the host-opened exec channel; the guest listens, non-host peers dropped at accept). Minimal-shelf auth is a host-rooted local operator credential ([ADR-0004](../architecture/adr/0004-operator-authentication-substrate.md) minimal variant). The session registry, denylist, quota, and kill-switch are not on the slice — they land in Phase 2.
73
+ 3. **MCP gateway (01)** — inbound MCP validator ([`mcp/2025-06-18/ocu-constraints.schema.json`](../../contracts/mcp/2025-06-18/ocu-constraints.schema.json)) forwarding session create/status to the Control driver over the frozen F5 RPC. Stateless per request.
74
+
75
+ ### Phase 2 — Parallel fan-out
76
+
77
+ Each track hangs off the proven spine behind a frozen contract, so the team runs them concurrently.
78
+
79
+ - **Track A — Control / operator API (02), full surface.** Thicken the Phase-1 driver into the session registry, the denylist (kill-switch authority, NFR-SEC-01), quota counters, and the operator/SOAR ingress (F2/F4). The customer-IdP + PAM-JIT path is full-shelf ([ADR-0004](../architecture/adr/0004-operator-authentication-substrate.md), [#225](https://github.com/Wide-Moat/open-computer-use/issues/225)).
80
+ - **Track B — Audit pipeline (07).** Swap the NULL sink for the real pipeline behind the F10 envelope: host-attested ingest, fsync-then-ack local durable commit, hash-chain writer, daily Merkle head, file-system sink ([ADR-0009](../architecture/adr/0009-audit-pipeline-pluggable-by-contract.md), minimal shelf). The bus, WORM store, SIEM bridge, and transparency log are pluggable seams, off on the minimal shelf.
81
+ - **Track C — Storage broker (04), south face.** The `filesystem_id`-scoped mount (F7) over the built storage contracts ([`mount-config`](../../contracts/storage/mount-config.schema.json), [`file-ops`](../../contracts/storage/file-ops.schema.json)). Local-volume backend engine — no network leg, so no F9 ([ADR-0010](../architecture/adr/0010-storage-backend-pluggable-adapter.md)). Host-local backend credential, admitted only single-tenant `trusted_operator` (NFR-SEC-60). The north face (F11, SPA) is deferred ([ADR-0002](../architecture/adr/0002-session-view-descriptor.md), post-v1).
82
+ - **Track D — Egress trust-edge (06), minimal rung.** Deny-all or transparent pass-through only (NFR-FLEX-15 ladder; [`02-trust-boundaries.md`](../architecture/02-trust-boundaries.md) §7): a deny-by-default forward route with the `x-deny-reason` structured deny and the content-blind egress tripwire (NFR-SEC-57). No CA, no SDS, no credential injection — those are the bump rung and above (full shelf).
83
+
84
+ ## Deferred to the full shelf (not minimal Phase 1–2)
85
+
86
+ Each is a clean abstraction boundary the minimal shelf builds against, activated later.
87
+
88
+ | Feature | Anchor | Gate |
89
+ |---|---|---|
90
+ | Customer IdP + PAM-JIT operator auth | [ADR-0004](../architecture/adr/0004-operator-authentication-substrate.md) full variant | [#225](https://github.com/Wide-Moat/open-computer-use/issues/225) |
91
+ | STS-scoped-per-session backend credential | [ADR-0010](../architecture/adr/0010-storage-backend-pluggable-adapter.md), NFR-SEC-25 | full shelf |
92
+ | gVisor / microVM runtime tiers | [ADR-0003](../architecture/adr/0003-sandbox-runtime-tier-ladder.md) | [#161](https://github.com/Wide-Moat/open-computer-use/issues/161) |
93
+ | Egress bump rung + SDS minter + credential injection | [ADR-0005](../architecture/adr/0005-egress-credential-delivery-envoy-sds.md), [ADR-0007](../architecture/adr/0007-egress-auth-mechanism.md) | [#240](https://github.com/Wide-Moat/open-computer-use/issues/240) |
94
+ | Broker north face / live-session views | [ADR-0002](../architecture/adr/0002-session-view-descriptor.md) | [#210](https://github.com/Wide-Moat/open-computer-use/issues/210) |
95
+ | WORM store, SIEM bridge, transparency log | [ADR-0009](../architecture/adr/0009-audit-pipeline-pluggable-by-contract.md) | [#150](https://github.com/Wide-Moat/open-computer-use/issues/150), [#151](https://github.com/Wide-Moat/open-computer-use/issues/151) |
96
+
97
+ ## Test coverage moves with the code
98
+
99
+ Each component's verification method is named in its owning NFR row ([`manifesto/02-nfrs.md`](../architecture/manifesto/02-nfrs.md) verification column) and in the STRIDE rows it must exercise ([`06-threat-model.md`](../architecture/06-threat-model.md)). Tests ship in the same PR as the code, using the method the NFR names: unit and property tests on parsers and the policy resolver, integration tests on each HARD edge, the exec golden-path E2E on the Phase 1 slice. The CI gates already enforced on every PR (secrets, SAST, SCA, IaC, contract-schema, doc-lint) bound it; the performance baselines are the NFR-PERF rows (session-create p99, exec overhead, egress latency, audit backpressure). A consolidated test-strategy doc lands once the first component's code does, when at least one verification cell is enforced rather than planned.
100
+
101
+ ## Open questions
102
+
103
+ 1. Broker and edge cardinality — one instance per deployment or per sandbox host — picks a topology at build time; the diagram may change, the component specs do not. [#175](https://github.com/Wide-Moat/open-computer-use/issues/175).
104
+ 2. Session sandbox sub-container split (exec supervisor vs guest as separate containers). [#174](https://github.com/Wide-Moat/open-computer-use/issues/174).
@@ -0,0 +1,229 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 820" font-family="Inter, -apple-system, system-ui, sans-serif">
2
+ <defs>
3
+ <style>
4
+ .title { font-size: 20px; font-weight: 700; fill: #1a1a2e; }
5
+ .subtitle { font-size: 11px; fill: #6b7280; }
6
+ .cat-label { font-size: 13px; font-weight: 600; fill: #fff; }
7
+ .item { font-size: 11px; fill: #374151; }
8
+ .item-bold { font-size: 11px; font-weight: 600; fill: #1f2937; }
9
+ .version { font-size: 10px; fill: #6b7280; }
10
+ .section-border { fill: none; stroke: #e5e7eb; stroke-width: 1; rx: 8; }
11
+ </style>
12
+ <linearGradient id="header-bg" x1="0" y1="0" x2="900" y2="0">
13
+ <stop offset="0%" stop-color="#1a1a2e"/>
14
+ <stop offset="100%" stop-color="#16213e"/>
15
+ </linearGradient>
16
+ <linearGradient id="lang-bg" x1="0" y1="0" x2="1" y2="0">
17
+ <stop offset="0%" stop-color="#3b82f6"/>
18
+ <stop offset="100%" stop-color="#2563eb"/>
19
+ </linearGradient>
20
+ <linearGradient id="tools-bg" x1="0" y1="0" x2="1" y2="0">
21
+ <stop offset="0%" stop-color="#8b5cf6"/>
22
+ <stop offset="100%" stop-color="#7c3aed"/>
23
+ </linearGradient>
24
+ <linearGradient id="py-bg" x1="0" y1="0" x2="1" y2="0">
25
+ <stop offset="0%" stop-color="#10b981"/>
26
+ <stop offset="100%" stop-color="#059669"/>
27
+ </linearGradient>
28
+ <linearGradient id="node-bg" x1="0" y1="0" x2="1" y2="0">
29
+ <stop offset="0%" stop-color="#f59e0b"/>
30
+ <stop offset="100%" stop-color="#d97706"/>
31
+ </linearGradient>
32
+ <linearGradient id="browser-bg" x1="0" y1="0" x2="1" y2="0">
33
+ <stop offset="0%" stop-color="#ef4444"/>
34
+ <stop offset="100%" stop-color="#dc2626"/>
35
+ </linearGradient>
36
+ <linearGradient id="fs-bg" x1="0" y1="0" x2="1" y2="0">
37
+ <stop offset="0%" stop-color="#64748b"/>
38
+ <stop offset="100%" stop-color="#475569"/>
39
+ </linearGradient>
40
+ </defs>
41
+
42
+ <!-- Background -->
43
+ <rect width="900" height="820" rx="12" fill="#fafbfc" stroke="#d1d5db" stroke-width="1"/>
44
+
45
+ <!-- Header -->
46
+ <rect width="900" height="60" rx="12" fill="url(#header-bg)"/>
47
+ <rect y="48" width="900" height="12" fill="url(#header-bg)"/>
48
+ <text x="24" y="32" class="title" fill="#fff">Sandbox Container</text>
49
+ <text x="24" y="48" class="subtitle" fill="#94a3b8">Ubuntu 24.04 (Noble) · linux/amd64 · open-computer-use:latest</text>
50
+ <text x="876" y="36" text-anchor="end" font-size="10" fill="#94a3b8">One container per chat session</text>
51
+
52
+ <!-- Row 1: Languages + System Tools -->
53
+ <!-- Languages -->
54
+ <rect x="16" y="72" width="430" height="130" class="section-border" fill="#f8fafc"/>
55
+ <rect x="16" y="72" width="430" height="28" rx="8" fill="url(#lang-bg)"/>
56
+ <rect x="16" y="92" width="430" height="8" fill="url(#lang-bg)"/>
57
+ <text x="32" y="91" class="cat-label">Languages &amp; Runtimes</text>
58
+
59
+ <text x="32" y="120" class="item-bold">Python 3.12</text>
60
+ <text x="130" y="120" class="version">pip, venv</text>
61
+ <text x="32" y="138" class="item-bold">Node.js 22</text>
62
+ <text x="130" y="138" class="version">npm 10.9</text>
63
+ <text x="32" y="156" class="item-bold">Java 21</text>
64
+ <text x="130" y="156" class="version">OpenJDK JRE</text>
65
+ <text x="32" y="174" class="item-bold">Bun</text>
66
+ <text x="130" y="174" class="version">latest</text>
67
+ <text x="32" y="192" class="item-bold">TypeScript 5.9</text>
68
+ <text x="160" y="192" class="version">tsc, tsx</text>
69
+
70
+ <text x="240" y="120" class="item-bold">Bash</text>
71
+ <text x="300" y="120" class="version">+ tmux, sudo</text>
72
+ <text x="240" y="138" class="item-bold">Git</text>
73
+ <text x="300" y="138" class="version">+ glab 1.52</text>
74
+ <text x="240" y="156" class="item-bold">Claude Code</text>
75
+ <text x="340" y="156" class="version">CLI</text>
76
+ <text x="240" y="174" class="item-bold">Playwright CLI</text>
77
+ <text x="360" y="174" class="version">0.1.1</text>
78
+
79
+ <!-- System Tools -->
80
+ <rect x="454" y="72" width="430" height="130" class="section-border" fill="#f8fafc"/>
81
+ <rect x="454" y="72" width="430" height="28" rx="8" fill="url(#tools-bg)"/>
82
+ <rect x="454" y="92" width="430" height="8" fill="url(#tools-bg)"/>
83
+ <text x="470" y="91" class="cat-label">System Tools</text>
84
+
85
+ <text x="470" y="120" class="item-bold">LibreOffice</text>
86
+ <text x="560" y="120" class="version">Writer, Calc, Impress</text>
87
+ <text x="470" y="138" class="item-bold">Pandoc</text>
88
+ <text x="560" y="138" class="version">Document conversion</text>
89
+ <text x="470" y="156" class="item-bold">FFmpeg</text>
90
+ <text x="560" y="156" class="version">Audio/video</text>
91
+ <text x="470" y="174" class="item-bold">ImageMagick</text>
92
+ <text x="560" y="174" class="version">Image processing</text>
93
+ <text x="470" y="192" class="item-bold">Graphviz</text>
94
+ <text x="560" y="192" class="version">Graph diagrams</text>
95
+
96
+ <text x="700" y="120" class="item-bold">Tesseract</text>
97
+ <text x="775" y="120" class="version">OCR (EN+RU)</text>
98
+ <text x="700" y="138" class="item-bold">Ghostscript</text>
99
+ <text x="785" y="138" class="version">PDF engine</text>
100
+ <text x="700" y="156" class="item-bold">qpdf</text>
101
+ <text x="785" y="156" class="version">PDF tools</text>
102
+ <text x="700" y="174" class="item-bold">ttyd</text>
103
+ <text x="785" y="174" class="version">Web terminal</text>
104
+ <text x="700" y="192" class="item-bold">socat</text>
105
+ <text x="785" y="192" class="version">CDP tunnel</text>
106
+
107
+ <!-- Row 2: Python Packages -->
108
+ <rect x="16" y="214" width="868" height="155" class="section-border" fill="#f8fafc"/>
109
+ <rect x="16" y="214" width="868" height="28" rx="8" fill="url(#py-bg)"/>
110
+ <rect x="16" y="234" width="868" height="8" fill="url(#py-bg)"/>
111
+ <text x="32" y="233" class="cat-label">Python Packages (110+)</text>
112
+
113
+ <!-- Col 1: Documents -->
114
+ <text x="32" y="262" class="item-bold">Documents</text>
115
+ <text x="32" y="278" class="item">python-docx, python-pptx</text>
116
+ <text x="32" y="294" class="item">openpyxl, xlsxwriter</text>
117
+ <text x="32" y="310" class="item">reportlab, markitdown</text>
118
+
119
+ <!-- Col 2: PDF -->
120
+ <text x="210" y="262" class="item-bold">PDF</text>
121
+ <text x="210" y="278" class="item">pypdf, pdfplumber</text>
122
+ <text x="210" y="294" class="item">pikepdf, pdfkit</text>
123
+ <text x="210" y="310" class="item">pdfminer, pdf2image</text>
124
+
125
+ <!-- Col 3: Images -->
126
+ <text x="380" y="262" class="item-bold">Images &amp; Vision</text>
127
+ <text x="380" y="278" class="item">Pillow, OpenCV</text>
128
+ <text x="380" y="294" class="item">scikit-image, Wand</text>
129
+ <text x="380" y="310" class="item">pytesseract, mediapipe</text>
130
+
131
+ <!-- Col 4: Data -->
132
+ <text x="550" y="262" class="item-bold">Data &amp; ML</text>
133
+ <text x="550" y="278" class="item">pandas, numpy, scipy</text>
134
+ <text x="550" y="294" class="item">scikit-learn, matplotlib</text>
135
+ <text x="550" y="310" class="item">seaborn, jax, onnxruntime</text>
136
+
137
+ <!-- Col 5: Web -->
138
+ <text x="730" y="262" class="item-bold">Web &amp; LLM</text>
139
+ <text x="730" y="278" class="item">playwright, requests</text>
140
+ <text x="730" y="294" class="item">beautifulsoup4, openai</text>
141
+ <text x="730" y="310" class="item">Flask, lxml, markdown</text>
142
+
143
+ <!-- Row footer -->
144
+ <text x="32" y="340" class="item">unoserver · camelot-py · tabula-py · cryptography · PyYAML · psutil · coloredlogs · click · humanfriendly</text>
145
+ <text x="32" y="356" class="version">Full list: requirements.txt (110 packages)</text>
146
+
147
+ <!-- Row 3: Node.js + Browser -->
148
+ <!-- Node.js -->
149
+ <rect x="16" y="381" width="430" height="130" class="section-border" fill="#f8fafc"/>
150
+ <rect x="16" y="381" width="430" height="28" rx="8" fill="url(#node-bg)"/>
151
+ <rect x="16" y="401" width="430" height="8" fill="url(#node-bg)"/>
152
+ <text x="32" y="400" class="cat-label">Node.js Packages (20)</text>
153
+
154
+ <text x="32" y="428" class="item-bold">Office</text>
155
+ <text x="100" y="428" class="item">pptxgenjs, docx, pdf-lib</text>
156
+ <text x="32" y="446" class="item-bold">Frontend</text>
157
+ <text x="100" y="446" class="item">React 19, TypeScript 5.9</text>
158
+ <text x="32" y="464" class="item-bold">Images</text>
159
+ <text x="100" y="464" class="item">sharp (resize, convert, optimize)</text>
160
+ <text x="32" y="482" class="item-bold">CLI tools</text>
161
+ <text x="100" y="482" class="item">mmdc (Mermaid), tsx, tsc, markdownlint</text>
162
+ <text x="32" y="500" class="item-bold">Automation</text>
163
+ <text x="100" y="500" class="item">playwright 1.57</text>
164
+
165
+ <!-- Browser -->
166
+ <rect x="454" y="381" width="430" height="130" class="section-border" fill="#f8fafc"/>
167
+ <rect x="454" y="381" width="430" height="28" rx="8" fill="url(#browser-bg)"/>
168
+ <rect x="454" y="401" width="430" height="8" fill="url(#browser-bg)"/>
169
+ <text x="470" y="400" class="cat-label">Browser &amp; Services</text>
170
+
171
+ <text x="470" y="428" class="item-bold">Chromium</text>
172
+ <text x="560" y="428" class="item">via Playwright (headless)</text>
173
+ <text x="470" y="446" class="item-bold">CDP</text>
174
+ <text x="560" y="446" class="item">:9222 (external) → :9223 (internal)</text>
175
+ <text x="470" y="464" class="item-bold">ttyd</text>
176
+ <text x="560" y="464" class="item">WebSocket terminal server</text>
177
+ <text x="470" y="482" class="item-bold">Claude Code</text>
178
+ <text x="560" y="482" class="item">Interactive AI sub-agent via TTY</text>
179
+ <text x="470" y="500" class="item-bold">inotifywait</text>
180
+ <text x="560" y="500" class="item">Skill usage tracking</text>
181
+
182
+ <!-- Row 4: Filesystem -->
183
+ <rect x="16" y="523" width="868" height="155" class="section-border" fill="#f8fafc"/>
184
+ <rect x="16" y="523" width="868" height="28" rx="8" fill="url(#fs-bg)"/>
185
+ <rect x="16" y="543" width="868" height="8" fill="url(#fs-bg)"/>
186
+ <text x="32" y="542" class="cat-label">Filesystem Layout</text>
187
+
188
+ <!-- Working dir -->
189
+ <text x="32" y="572" class="item-bold">/home/assistant/</text>
190
+ <text x="180" y="572" class="version">Working directory (Docker volume, persists per chat)</text>
191
+ <text x="32" y="590" class="item-bold">/home/node_modules/</text>
192
+ <text x="200" y="590" class="version">Shared npm packages (image layer, not per-container)</text>
193
+ <text x="32" y="608" class="item-bold">/usr/local/lib/node_modules_global/</text>
194
+ <text x="280" y="608" class="version">Global CLI tools: mmdc, tsc, tsx, claude</text>
195
+
196
+ <!-- Mount points -->
197
+ <text x="500" y="572" class="item-bold">/mnt/user-data/uploads/</text>
198
+ <text x="690" y="572" class="version">User files (read-only)</text>
199
+ <text x="500" y="590" class="item-bold">/mnt/user-data/outputs/</text>
200
+ <text x="690" y="590" class="version">Output files (served via API)</text>
201
+ <text x="500" y="608" class="item-bold">/mnt/skills/public/</text>
202
+ <text x="690" y="608" class="version">Built-in skills (16)</text>
203
+ <text x="500" y="626" class="item-bold">/mnt/skills/examples/</text>
204
+ <text x="690" y="626" class="version">Example skills (8)</text>
205
+ <text x="500" y="644" class="item-bold">/mnt/skills/user/</text>
206
+ <text x="690" y="644" class="version">User-uploaded skills</text>
207
+
208
+ <text x="32" y="626" class="item-bold">/opt/pw-browsers/</text>
209
+ <text x="200" y="626" class="version">Playwright Chromium cache</text>
210
+ <text x="32" y="644" class="item-bold">~/.claude/</text>
211
+ <text x="200" y="644" class="version">Claude Code config, settings, skill symlinks</text>
212
+ <text x="32" y="662" class="item-bold">~/.mcp.json</text>
213
+ <text x="200" y="662" class="version">MCP servers for Claude Code (auto-generated)</text>
214
+
215
+ <!-- Row 5: Fonts -->
216
+ <rect x="16" y="685" width="430" height="80" class="section-border" fill="#f8fafc"/>
217
+ <text x="32" y="708" class="item-bold">Fonts</text>
218
+ <text x="32" y="726" class="item">Liberation, DejaVu, FreeSans, Noto CJK, Noto Emoji</text>
219
+ <text x="32" y="744" class="version">Full Unicode coverage: Latin, Cyrillic, CJK, Emoji</text>
220
+
221
+ <!-- Ports -->
222
+ <rect x="454" y="685" width="430" height="80" class="section-border" fill="#f8fafc"/>
223
+ <text x="470" y="708" class="item-bold">Exposed Ports</text>
224
+ <text x="470" y="726" class="item">9222 — CDP (browser viewer) · 7681 — ttyd (terminal)</text>
225
+ <text x="470" y="744" class="version">Accessed via Computer Use Server proxy (not directly)</text>
226
+
227
+ <!-- Footer -->
228
+ <text x="450" y="798" text-anchor="middle" font-size="11" fill="#9ca3af">open-computer-use · github.com/Yambr/open-computer-use</text>
229
+ </svg>