@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,160 @@
1
+ # SPDX-License-Identifier: FSL-1.1-Apache-2.0
2
+ # Copyright (c) 2025 Open Computer Use Contributors
3
+ """Tests for fix_skip_embedding_chat_files.py against v0.9.1 and v0.9.2 retrieval.py fixtures."""
4
+ import ast
5
+ import os
6
+ import shutil
7
+ import subprocess
8
+ import sys
9
+ import tempfile
10
+ import unittest
11
+ from pathlib import Path
12
+
13
+ REPO_ROOT = Path(__file__).resolve().parents[2]
14
+ PATCH_DIR = REPO_ROOT / "openwebui" / "patches"
15
+ sys.path.insert(0, str(Path(__file__).parent))
16
+ from conftest import load_retrieval_v091, load_retrieval_v092 # noqa: E402
17
+
18
+
19
+ def _run_patch(patch_name: str, target_file: Path) -> subprocess.CompletedProcess:
20
+ env = {**os.environ, "_PATCH_TARGET_OVERRIDE": str(target_file)}
21
+ return subprocess.run(
22
+ [sys.executable, str(PATCH_DIR / f"{patch_name}.py")],
23
+ env=env, capture_output=True, text=True, timeout=30,
24
+ )
25
+
26
+
27
+ class TestFixSkipEmbeddingChatFiles(unittest.TestCase):
28
+ PATCH_NAME = "fix_skip_embedding_chat_files"
29
+ NEW_MARKER = "FIX_SKIP_EMBEDDING_CHAT_FILES"
30
+ PRIMARY_ANCHOR = " collection_name = f'file-{file.id}'"
31
+
32
+ def setUp(self):
33
+ self.tmp = tempfile.mkdtemp()
34
+ self.target = Path(self.tmp) / "retrieval.py"
35
+ self.target.write_text(load_retrieval_v091(), encoding="utf-8")
36
+
37
+ def tearDown(self):
38
+ shutil.rmtree(self.tmp, ignore_errors=True)
39
+
40
+ def test_fresh_apply(self):
41
+ r = _run_patch(self.PATCH_NAME, self.target)
42
+ self.assertEqual(r.returncode, 0, f"stderr={r.stderr}")
43
+ self.assertIn(f"PATCHED: {self.PATCH_NAME}", r.stdout)
44
+ content = self.target.read_text()
45
+ self.assertIn(self.NEW_MARKER, content)
46
+ ast.parse(content)
47
+
48
+ def test_idempotent_rerun(self):
49
+ r1 = _run_patch(self.PATCH_NAME, self.target)
50
+ self.assertEqual(r1.returncode, 0)
51
+ after_first = self.target.read_text()
52
+ r2 = _run_patch(self.PATCH_NAME, self.target)
53
+ self.assertEqual(r2.returncode, 0)
54
+ self.assertIn("ALREADY PATCHED", r2.stdout)
55
+ self.assertEqual(after_first, self.target.read_text())
56
+
57
+ def test_broken_fixture_fails_loud(self):
58
+ content = self.target.read_text()
59
+ self.assertIn(self.PRIMARY_ANCHOR, content)
60
+ self.target.write_text(
61
+ content.replace(self.PRIMARY_ANCHOR, " # ANCHOR_REMOVED_FOR_TEST")
62
+ )
63
+ r = _run_patch(self.PATCH_NAME, self.target)
64
+ self.assertEqual(r.returncode, 1, f"stdout={r.stdout} stderr={r.stderr}")
65
+ self.assertIn("ERROR:", r.stderr)
66
+ self.assertIn(self.PATCH_NAME, r.stderr)
67
+
68
+
69
+ class TestFixSkipEmbeddingChatFilesV092(unittest.TestCase):
70
+ """3-state coverage against real v0.9.2 retrieval.py fixture."""
71
+
72
+ PATCH_NAME = "fix_skip_embedding_chat_files"
73
+ NEW_MARKER = "FIX_SKIP_EMBEDDING_CHAT_FILES"
74
+ PRIMARY_ANCHOR = " collection_name = f'file-{file.id}'"
75
+
76
+ def setUp(self):
77
+ self.tmp = tempfile.mkdtemp()
78
+ self.target = Path(self.tmp) / "retrieval.py"
79
+ self.target.write_text(load_retrieval_v092(), encoding="utf-8")
80
+
81
+ def tearDown(self):
82
+ shutil.rmtree(self.tmp, ignore_errors=True)
83
+
84
+ def test_fresh_apply_v092(self):
85
+ r = _run_patch(self.PATCH_NAME, self.target)
86
+ self.assertEqual(r.returncode, 0, f"stderr={r.stderr}")
87
+ self.assertIn(f"PATCHED: {self.PATCH_NAME}", r.stdout)
88
+ content = self.target.read_text()
89
+ self.assertIn(self.NEW_MARKER, content)
90
+ ast.parse(content)
91
+
92
+ def test_idempotent_rerun_v092(self):
93
+ r1 = _run_patch(self.PATCH_NAME, self.target)
94
+ self.assertEqual(r1.returncode, 0)
95
+ after_first = self.target.read_text()
96
+ r2 = _run_patch(self.PATCH_NAME, self.target)
97
+ self.assertEqual(r2.returncode, 0)
98
+ self.assertIn("ALREADY PATCHED", r2.stdout)
99
+ self.assertEqual(after_first, self.target.read_text())
100
+
101
+ def test_broken_fixture_fails_loud_v092(self):
102
+ content = self.target.read_text()
103
+ self.assertIn(self.PRIMARY_ANCHOR, content)
104
+ self.target.write_text(
105
+ content.replace(self.PRIMARY_ANCHOR, " # ANCHOR_REMOVED_FOR_TEST")
106
+ )
107
+ r = _run_patch(self.PATCH_NAME, self.target)
108
+ self.assertEqual(r.returncode, 1, f"stdout={r.stdout} stderr={r.stderr}")
109
+ self.assertIn("ERROR:", r.stderr)
110
+ self.assertIn(self.PATCH_NAME, r.stderr)
111
+
112
+ def test_patched_call_uses_await_v092(self):
113
+ # Regression guard for issue #96: Files.update_file_data_by_id was
114
+ # sync in v0.8.x, async since v0.9.x. process_file() is async, so the
115
+ # patched call must be awaited — otherwise the coroutine is dropped,
116
+ # the DB status stays 'pending', and the frontend spinner hangs.
117
+ r = _run_patch(self.PATCH_NAME, self.target)
118
+ self.assertEqual(r.returncode, 0, f"stderr={r.stderr}")
119
+ content = self.target.read_text()
120
+ self.assertIn("await Files.update_file_data_by_id(", content)
121
+ self.assertNotRegex(
122
+ content,
123
+ r"(?<!await )Files\.update_file_data_by_id\(",
124
+ "Found a non-awaited Files.update_file_data_by_id call; "
125
+ "this regresses issue #96.",
126
+ )
127
+
128
+ def test_patched_kb_fallback_does_not_block_event_loop_v092(self):
129
+ # Storage.get_file and Loader.load are sync; calling them directly in
130
+ # the async process_file handler would block the OWUI event loop for
131
+ # the entire read/parse (minutes for large PDFs). Upstream OWUI
132
+ # offloads via asyncio.to_thread / Loader.aload; the KB fallback
133
+ # injected by this patch must do the same.
134
+ r = _run_patch(self.PATCH_NAME, self.target)
135
+ self.assertEqual(r.returncode, 0, f"stderr={r.stderr}")
136
+ content = self.target.read_text()
137
+ # Locate the inserted KB fallback block by its marker comment.
138
+ marker = "KB fallback: extracting content from"
139
+ self.assertIn(marker, content)
140
+ block_start = content.index(marker)
141
+ # Bound the block to the next non-indented line to scope assertions.
142
+ block = content[block_start:block_start + 4000]
143
+ self.assertIn("await asyncio.to_thread(Storage.get_file", block)
144
+ self.assertIn("await _fb_loader.aload(", block)
145
+ self.assertNotRegex(
146
+ block,
147
+ r"(?<!to_thread\()Storage\.get_file\(",
148
+ "KB fallback calls Storage.get_file without asyncio.to_thread; "
149
+ "this blocks the OWUI event loop on storage I/O.",
150
+ )
151
+ self.assertNotRegex(
152
+ block,
153
+ r"(?<!await )_fb_loader\.load\(",
154
+ "KB fallback calls _fb_loader.load() synchronously; "
155
+ "use aload() to keep the event loop responsive.",
156
+ )
157
+
158
+
159
+ if __name__ == "__main__":
160
+ unittest.main()
@@ -0,0 +1,120 @@
1
+ # SPDX-License-Identifier: FSL-1.1-Apache-2.0
2
+ # Copyright (c) 2025 Open Computer Use Contributors
3
+ """Tests for fix_skip_rag_files_native_fc.py against v0.9.1 middleware.py."""
4
+ import ast
5
+ import os
6
+ import shutil
7
+ import subprocess
8
+ import sys
9
+ import tempfile
10
+ import unittest
11
+ from pathlib import Path
12
+
13
+ REPO_ROOT = Path(__file__).resolve().parents[2]
14
+ PATCH_DIR = REPO_ROOT / "openwebui" / "patches"
15
+ sys.path.insert(0, str(Path(__file__).parent))
16
+ from conftest import load_middleware_v091, load_middleware_v092 # noqa: E402
17
+
18
+
19
+ def _run_patch(patch_name: str, target_file: Path) -> subprocess.CompletedProcess:
20
+ env = {**os.environ, "_PATCH_TARGET_OVERRIDE": str(target_file)}
21
+ return subprocess.run(
22
+ [sys.executable, str(PATCH_DIR / f"{patch_name}.py")],
23
+ env=env, capture_output=True, text=True, timeout=30,
24
+ )
25
+
26
+
27
+ class TestFixSkipRagFilesNativeFc(unittest.TestCase):
28
+ PATCH_NAME = "fix_skip_rag_files_native_fc"
29
+ NEW_MARKER = "FIX_SKIP_RAG_FILES_NATIVE_FC"
30
+ PRIMARY_ANCHOR = (
31
+ " form_data, flags = await chat_completion_files_handler("
32
+ "request, form_data, extra_params, user)"
33
+ )
34
+
35
+ def setUp(self):
36
+ self.tmp = tempfile.mkdtemp()
37
+ self.target = Path(self.tmp) / "middleware.py"
38
+ self.target.write_text(load_middleware_v091(), encoding="utf-8")
39
+
40
+ def tearDown(self):
41
+ shutil.rmtree(self.tmp, ignore_errors=True)
42
+
43
+ def test_fresh_apply(self):
44
+ r = _run_patch(self.PATCH_NAME, self.target)
45
+ self.assertEqual(r.returncode, 0, f"stderr={r.stderr}")
46
+ self.assertIn(f"PATCHED: {self.PATCH_NAME}", r.stdout)
47
+ content = self.target.read_text()
48
+ self.assertIn(self.NEW_MARKER, content)
49
+ ast.parse(content)
50
+
51
+ def test_idempotent_rerun(self):
52
+ r1 = _run_patch(self.PATCH_NAME, self.target)
53
+ self.assertEqual(r1.returncode, 0)
54
+ after_first = self.target.read_text()
55
+ r2 = _run_patch(self.PATCH_NAME, self.target)
56
+ self.assertEqual(r2.returncode, 0)
57
+ self.assertIn("ALREADY PATCHED", r2.stdout)
58
+ self.assertEqual(after_first, self.target.read_text())
59
+
60
+ def test_broken_fixture_fails_loud(self):
61
+ content = self.target.read_text()
62
+ self.assertIn(self.PRIMARY_ANCHOR, content)
63
+ self.target.write_text(
64
+ content.replace(self.PRIMARY_ANCHOR, " # ANCHOR_REMOVED_FOR_TEST")
65
+ )
66
+ r = _run_patch(self.PATCH_NAME, self.target)
67
+ self.assertEqual(r.returncode, 1, f"stdout={r.stdout} stderr={r.stderr}")
68
+ self.assertIn("ERROR:", r.stderr)
69
+ self.assertIn(self.PATCH_NAME, r.stderr)
70
+
71
+
72
+ class TestFixSkipRagFilesNativeFcV092(unittest.TestCase):
73
+ """3-state coverage against real v0.9.2 middleware.py fixture."""
74
+
75
+ PATCH_NAME = "fix_skip_rag_files_native_fc"
76
+ NEW_MARKER = "FIX_SKIP_RAG_FILES_NATIVE_FC"
77
+ PRIMARY_ANCHOR = (
78
+ " form_data, flags = await chat_completion_files_handler("
79
+ "request, form_data, extra_params, user)"
80
+ )
81
+
82
+ def setUp(self):
83
+ self.tmp = tempfile.mkdtemp()
84
+ self.target = Path(self.tmp) / "middleware.py"
85
+ self.target.write_text(load_middleware_v092(), encoding="utf-8")
86
+
87
+ def tearDown(self):
88
+ shutil.rmtree(self.tmp, ignore_errors=True)
89
+
90
+ def test_fresh_apply_v092(self):
91
+ r = _run_patch(self.PATCH_NAME, self.target)
92
+ self.assertEqual(r.returncode, 0, f"stderr={r.stderr}")
93
+ self.assertIn(f"PATCHED: {self.PATCH_NAME}", r.stdout)
94
+ content = self.target.read_text()
95
+ self.assertIn(self.NEW_MARKER, content)
96
+ ast.parse(content)
97
+
98
+ def test_idempotent_rerun_v092(self):
99
+ r1 = _run_patch(self.PATCH_NAME, self.target)
100
+ self.assertEqual(r1.returncode, 0)
101
+ after_first = self.target.read_text()
102
+ r2 = _run_patch(self.PATCH_NAME, self.target)
103
+ self.assertEqual(r2.returncode, 0)
104
+ self.assertIn("ALREADY PATCHED", r2.stdout)
105
+ self.assertEqual(after_first, self.target.read_text())
106
+
107
+ def test_broken_fixture_fails_loud_v092(self):
108
+ content = self.target.read_text()
109
+ self.assertIn(self.PRIMARY_ANCHOR, content)
110
+ self.target.write_text(
111
+ content.replace(self.PRIMARY_ANCHOR, " # ANCHOR_REMOVED_FOR_TEST")
112
+ )
113
+ r = _run_patch(self.PATCH_NAME, self.target)
114
+ self.assertEqual(r.returncode, 1, f"stdout={r.stdout} stderr={r.stderr}")
115
+ self.assertIn("ERROR:", r.stderr)
116
+ self.assertIn(self.PATCH_NAME, r.stderr)
117
+
118
+
119
+ if __name__ == "__main__":
120
+ unittest.main()
@@ -0,0 +1,128 @@
1
+ # SPDX-License-Identifier: FSL-1.1-Apache-2.0
2
+ # Copyright (c) 2025 Open Computer Use Contributors
3
+ """Tests for fix_tool_loop_errors.py against v0.9.1 middleware.py.
4
+
5
+ 3-state coverage: fresh apply / idempotent re-run / broken fixture fails loud.
6
+ """
7
+ import ast
8
+ import os
9
+ import shutil
10
+ import subprocess
11
+ import sys
12
+ import tempfile
13
+ import unittest
14
+ from pathlib import Path
15
+
16
+ REPO_ROOT = Path(__file__).resolve().parents[2]
17
+ PATCH_DIR = REPO_ROOT / "openwebui" / "patches"
18
+ sys.path.insert(0, str(Path(__file__).parent))
19
+ from conftest import load_middleware_v091, load_middleware_v092 # noqa: E402
20
+
21
+
22
+ def _run_patch(patch_name: str, target_file: Path) -> subprocess.CompletedProcess:
23
+ env = {**os.environ, "_PATCH_TARGET_OVERRIDE": str(target_file)}
24
+ return subprocess.run(
25
+ [sys.executable, str(PATCH_DIR / f"{patch_name}.py")],
26
+ env=env, capture_output=True, text=True, timeout=30,
27
+ )
28
+
29
+
30
+ class TestFixToolLoopErrors(unittest.TestCase):
31
+ PATCH_NAME = "fix_tool_loop_errors"
32
+ NEW_MARKER = "FIX_TOOL_LOOP_ERRORS"
33
+ # Distinctive single line from SEARCH_TOOL_LOOP / SEARCH_ITER anchors
34
+ PRIMARY_ANCHOR = (
35
+ " while len(tool_calls) > 0 and tool_call_retries < "
36
+ "CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES:"
37
+ )
38
+
39
+ def setUp(self):
40
+ self.tmp = tempfile.mkdtemp()
41
+ self.target = Path(self.tmp) / "middleware.py"
42
+ self.target.write_text(load_middleware_v091(), encoding="utf-8")
43
+
44
+ def tearDown(self):
45
+ shutil.rmtree(self.tmp, ignore_errors=True)
46
+
47
+ def test_fresh_apply(self):
48
+ r = _run_patch(self.PATCH_NAME, self.target)
49
+ self.assertEqual(r.returncode, 0, f"stderr={r.stderr}\nstdout={r.stdout}")
50
+ self.assertIn(f"PATCHED: {self.PATCH_NAME}", r.stdout)
51
+ content = self.target.read_text()
52
+ self.assertIn(self.NEW_MARKER, content)
53
+ self.assertIn("TOOL_LOOP_ERRORS_UNIFIED", content)
54
+ ast.parse(content)
55
+
56
+ def test_idempotent_rerun(self):
57
+ r1 = _run_patch(self.PATCH_NAME, self.target)
58
+ self.assertEqual(r1.returncode, 0)
59
+ after_first = self.target.read_text()
60
+ r2 = _run_patch(self.PATCH_NAME, self.target)
61
+ self.assertEqual(r2.returncode, 0)
62
+ self.assertIn("ALREADY PATCHED", r2.stdout)
63
+ self.assertEqual(after_first, self.target.read_text())
64
+
65
+ def test_broken_fixture_fails_loud(self):
66
+ content = self.target.read_text()
67
+ self.assertIn(self.PRIMARY_ANCHOR, content, "test fixture assumption wrong")
68
+ self.target.write_text(
69
+ content.replace(self.PRIMARY_ANCHOR, " # ANCHOR_REMOVED_FOR_TEST")
70
+ )
71
+ r = _run_patch(self.PATCH_NAME, self.target)
72
+ self.assertEqual(r.returncode, 1, f"expected exit 1; stdout={r.stdout} stderr={r.stderr}")
73
+ self.assertIn("ERROR:", r.stderr)
74
+ self.assertIn(self.PATCH_NAME, r.stderr)
75
+
76
+
77
+ class TestFixToolLoopErrorsV092(unittest.TestCase):
78
+ """3-state coverage against real v0.9.2 middleware.py fixture."""
79
+
80
+ PATCH_NAME = "fix_tool_loop_errors"
81
+ NEW_MARKER = "FIX_TOOL_LOOP_ERRORS"
82
+ PRIMARY_ANCHOR = (
83
+ " while len(tool_calls) > 0 and tool_call_retries < "
84
+ "CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES:"
85
+ )
86
+
87
+ def setUp(self):
88
+ self.tmp = tempfile.mkdtemp()
89
+ self.target = Path(self.tmp) / "middleware.py"
90
+ self.target.write_text(load_middleware_v092(), encoding="utf-8")
91
+
92
+ def tearDown(self):
93
+ shutil.rmtree(self.tmp, ignore_errors=True)
94
+
95
+ def test_fresh_apply_v092(self):
96
+ r = _run_patch(self.PATCH_NAME, self.target)
97
+ self.assertEqual(r.returncode, 0, f"stderr={r.stderr}\nstdout={r.stdout}")
98
+ self.assertIn(f"PATCHED: {self.PATCH_NAME}", r.stdout)
99
+ content = self.target.read_text()
100
+ self.assertIn(self.NEW_MARKER, content)
101
+ self.assertIn("TOOL_LOOP_ERRORS_UNIFIED", content)
102
+ # v0.9.2 specific: the new 'metadata': metadata, key is emitted
103
+ self.assertIn("'metadata': metadata,", content)
104
+ ast.parse(content)
105
+
106
+ def test_idempotent_rerun_v092(self):
107
+ r1 = _run_patch(self.PATCH_NAME, self.target)
108
+ self.assertEqual(r1.returncode, 0)
109
+ after_first = self.target.read_text()
110
+ r2 = _run_patch(self.PATCH_NAME, self.target)
111
+ self.assertEqual(r2.returncode, 0)
112
+ self.assertIn("ALREADY PATCHED", r2.stdout)
113
+ self.assertEqual(after_first, self.target.read_text())
114
+
115
+ def test_broken_fixture_fails_loud_v092(self):
116
+ content = self.target.read_text()
117
+ self.assertIn(self.PRIMARY_ANCHOR, content, "test fixture assumption wrong")
118
+ self.target.write_text(
119
+ content.replace(self.PRIMARY_ANCHOR, " # ANCHOR_REMOVED_FOR_TEST")
120
+ )
121
+ r = _run_patch(self.PATCH_NAME, self.target)
122
+ self.assertEqual(r.returncode, 1, f"expected exit 1; stdout={r.stdout} stderr={r.stderr}")
123
+ self.assertIn("ERROR:", r.stderr)
124
+ self.assertIn(self.PATCH_NAME, r.stderr)
125
+
126
+
127
+ if __name__ == "__main__":
128
+ unittest.main()
@@ -0,0 +1,132 @@
1
+ # SPDX-License-Identifier: FSL-1.1-Apache-2.0
2
+ # Copyright (c) 2025 Open Computer Use Contributors
3
+ """Tests for path traversal protection in computer-use-server/app.py endpoints.
4
+
5
+ Note: FastAPI/Starlette normalizes `..` in URL paths at the HTTP level,
6
+ so path traversal via `../../` in URL segments is blocked before reaching handlers.
7
+ These tests verify that:
8
+ 1. sanitize_chat_id() rejects malicious chat_id values
9
+ 2. safe_path() provides defense-in-depth at the application level
10
+ 3. Normal operations continue to work correctly
11
+ """
12
+ import sys
13
+ from pathlib import Path
14
+ from unittest.mock import patch
15
+
16
+ import pytest
17
+
18
+ sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent / "computer-use-server"))
19
+
20
+ from fastapi.testclient import TestClient
21
+
22
+
23
+ VALID_CHAT_ID = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
24
+
25
+
26
+ @pytest.fixture
27
+ def tmp_data(tmp_path):
28
+ """Create temporary data directory with test files."""
29
+ chat_dir = tmp_path / VALID_CHAT_ID
30
+ outputs = chat_dir / "outputs"
31
+ uploads = chat_dir / "uploads"
32
+ outputs.mkdir(parents=True)
33
+ uploads.mkdir(parents=True)
34
+ (outputs / "test.txt").write_text("hello")
35
+ (uploads / "uploaded.txt").write_text("world")
36
+ return tmp_path
37
+
38
+
39
+ @pytest.fixture
40
+ def client(tmp_data):
41
+ """TestClient with patched BASE_DATA_DIR."""
42
+ import app as app_module
43
+ with patch.object(app_module, "BASE_DATA_DIR", tmp_data):
44
+ yield TestClient(app_module.app)
45
+
46
+
47
+ class TestChatIdValidation:
48
+ """Test that endpoints reject malicious chat_id values."""
49
+
50
+ def test_upload_rejects_dot_dot_chat_id(self, client):
51
+ resp = client.post(
52
+ "/api/uploads/..test../file.txt",
53
+ files={"file": ("test.txt", b"content")},
54
+ )
55
+ assert resp.status_code == 400
56
+
57
+ def test_download_rejects_dot_dot_chat_id(self, client):
58
+ resp = client.get("/files/..test../somefile")
59
+ assert resp.status_code == 400
60
+
61
+ def test_archive_rejects_dot_dot_chat_id(self, client):
62
+ resp = client.get("/files/..test../archive")
63
+ assert resp.status_code == 400
64
+
65
+ def test_outputs_rejects_dot_dot_chat_id(self, client):
66
+ resp = client.get("/api/outputs/..test..")
67
+ assert resp.status_code == 400
68
+
69
+ def test_manifest_rejects_dot_dot_chat_id(self, client):
70
+ resp = client.get("/api/uploads/..test../manifest")
71
+ assert resp.status_code == 400
72
+
73
+ def test_uploads_list_rejects_dot_dot_chat_id(self, client):
74
+ resp = client.get("/api/uploads/..test../list")
75
+ assert resp.status_code == 400
76
+
77
+
78
+ class TestNormalOperations:
79
+ """Test that legitimate operations continue to work."""
80
+
81
+ def test_upload_normal(self, client):
82
+ resp = client.post(
83
+ f"/api/uploads/{VALID_CHAT_ID}/newfile.txt",
84
+ files={"file": ("newfile.txt", b"content")},
85
+ )
86
+ assert resp.status_code == 200
87
+
88
+ def test_download_normal(self, client):
89
+ resp = client.get(f"/files/{VALID_CHAT_ID}/test.txt")
90
+ assert resp.status_code == 200
91
+ assert resp.text == "hello"
92
+
93
+ def test_archive_normal(self, client):
94
+ resp = client.get(f"/files/{VALID_CHAT_ID}/archive")
95
+ assert resp.status_code == 200
96
+ assert resp.headers["content-type"] == "application/zip"
97
+
98
+ def test_outputs_normal(self, client):
99
+ resp = client.get(f"/api/outputs/{VALID_CHAT_ID}")
100
+ assert resp.status_code == 200
101
+
102
+ def test_manifest_normal(self, client):
103
+ resp = client.get(f"/api/uploads/{VALID_CHAT_ID}/manifest")
104
+ assert resp.status_code == 200
105
+
106
+ def test_uploads_list_normal(self, client):
107
+ resp = client.get(f"/api/uploads/{VALID_CHAT_ID}/list")
108
+ assert resp.status_code == 200
109
+
110
+ def test_default_chat_id(self, client, tmp_data):
111
+ """chat_id='default' should be accepted."""
112
+ (tmp_data / "default" / "outputs").mkdir(parents=True)
113
+ resp = client.get("/api/outputs/default")
114
+ assert resp.status_code == 200
115
+
116
+
117
+ class TestSafePathDirectly:
118
+ """Direct unit tests for safe_path integration — defense-in-depth."""
119
+
120
+ def test_safe_path_blocks_traversal(self, tmp_data):
121
+ from security import safe_path
122
+ from fastapi import HTTPException
123
+ base = tmp_data / VALID_CHAT_ID / "outputs"
124
+ with pytest.raises(HTTPException) as exc:
125
+ safe_path(base, "../../etc/passwd")
126
+ assert exc.value.status_code == 403
127
+
128
+ def test_safe_path_allows_subdirs(self, tmp_data):
129
+ from security import safe_path
130
+ base = tmp_data / VALID_CHAT_ID / "outputs"
131
+ result = safe_path(base, "subdir/file.txt")
132
+ assert str(result).startswith(str(base.resolve()))
@@ -0,0 +1,36 @@
1
+ # SPDX-License-Identifier: FSL-1.1-Apache-2.0
2
+ # Copyright (c) 2025 Open Computer Use Contributors
3
+ """Tests for path traversal protection in docker_manager._get_meta_path."""
4
+ import sys
5
+ from pathlib import Path
6
+ from unittest.mock import patch
7
+
8
+ import pytest
9
+ from fastapi import HTTPException
10
+
11
+ sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent / "computer-use-server"))
12
+
13
+ import docker_manager
14
+
15
+
16
+ VALID_CHAT_ID = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
17
+
18
+
19
+ class TestGetMetaPath:
20
+ def test_traversal_rejected(self, tmp_path):
21
+ with patch.object(docker_manager, "BASE_DATA_DIR", tmp_path):
22
+ with pytest.raises(HTTPException) as exc_info:
23
+ docker_manager._get_meta_path("../../etc")
24
+ assert exc_info.value.status_code == 400
25
+
26
+ def test_slash_rejected(self, tmp_path):
27
+ with patch.object(docker_manager, "BASE_DATA_DIR", tmp_path):
28
+ with pytest.raises(HTTPException) as exc_info:
29
+ docker_manager._get_meta_path("abc/def")
30
+ assert exc_info.value.status_code == 400
31
+
32
+ def test_normal_chat_id(self, tmp_path):
33
+ with patch.object(docker_manager, "BASE_DATA_DIR", tmp_path):
34
+ result = docker_manager._get_meta_path(VALID_CHAT_ID)
35
+ assert result == tmp_path / VALID_CHAT_ID / ".meta.json"
36
+ assert str(tmp_path) in str(result)
@@ -0,0 +1,87 @@
1
+ # SPDX-License-Identifier: FSL-1.1-Apache-2.0
2
+ # Copyright (c) 2025 Open Computer Use Contributors
3
+ """Tests for path traversal protection in settings-wrapper/app.py."""
4
+ import importlib
5
+ import inspect
6
+ import sys
7
+ from pathlib import Path
8
+ from unittest.mock import patch
9
+
10
+ import pytest
11
+
12
+ from fastapi.testclient import TestClient
13
+
14
+
15
+ @pytest.fixture
16
+ def settings_client(tmp_path):
17
+ """TestClient with patched SKILLS_DIR and disabled auth."""
18
+ skills_dir = tmp_path / "skills"
19
+ skills_dir.mkdir()
20
+ (skills_dir / "valid-skill.zip").write_bytes(b"PK\x03\x04fake")
21
+
22
+ # Import settings-wrapper/app.py with a unique module name to avoid conflicts
23
+ settings_wrapper_path = Path(__file__).resolve().parent.parent.parent / "settings-wrapper"
24
+ spec = importlib.util.spec_from_file_location(
25
+ "settings_wrapper_app",
26
+ str(settings_wrapper_path / "app.py"),
27
+ )
28
+ settings_app = importlib.util.module_from_spec(spec)
29
+ sys.modules["settings_wrapper_app"] = settings_app
30
+ spec.loader.exec_module(settings_app)
31
+
32
+ with patch.object(settings_app, "SKILLS_DIR", skills_dir), \
33
+ patch.object(settings_app, "API_KEY", ""):
34
+ yield TestClient(settings_app.app)
35
+
36
+
37
+ class TestDownloadSkillImplementation:
38
+ """Verify download_skill uses os.path pattern that CodeQL natively recognizes.
39
+
40
+ CodeQL py/path-injection does NOT recognize pathlib.Path.resolve() + is_relative_to()
41
+ as a containment check barrier. It DOES natively recognize os.path.realpath() +
42
+ startswith() when used in the same function scope.
43
+ """
44
+
45
+ def test_uses_os_path_realpath_not_is_relative_to(self, settings_client):
46
+ """download_skill must use os.path.realpath, not is_relative_to."""
47
+ settings_wrapper_path = Path(__file__).resolve().parent.parent.parent / "settings-wrapper"
48
+ spec = importlib.util.spec_from_file_location(
49
+ "_settings_wrapper_impl_check",
50
+ str(settings_wrapper_path / "app.py"),
51
+ )
52
+ mod = importlib.util.module_from_spec(spec)
53
+ spec.loader.exec_module(mod)
54
+ source = inspect.getsource(mod.download_skill)
55
+ assert "is_relative_to" not in source, (
56
+ "download_skill uses is_relative_to() which CodeQL does not recognise "
57
+ "as a path containment sanitizer. Use os.path.realpath + startswith."
58
+ )
59
+ assert "os.path.realpath" in source, (
60
+ "download_skill must use os.path.realpath() for CodeQL to suppress "
61
+ "py/path-injection false positives."
62
+ )
63
+ assert "startswith" in source, (
64
+ "download_skill must use startswith() for the containment check."
65
+ )
66
+
67
+
68
+ class TestDownloadSkillTraversal:
69
+ def test_dot_dot_in_name_rejected(self, settings_client):
70
+ """Skill name containing '..' should be rejected."""
71
+ resp = settings_client.get(
72
+ "/api/internal/skills/..evil../download"
73
+ )
74
+ assert resp.status_code == 400
75
+
76
+ def test_normal_skill(self, settings_client):
77
+ resp = settings_client.get(
78
+ "/api/internal/skills/valid-skill/download"
79
+ )
80
+ assert resp.status_code == 200
81
+
82
+ def test_native_skill(self, settings_client):
83
+ resp = settings_client.get(
84
+ "/api/internal/skills/nonexistent-skill/download"
85
+ )
86
+ assert resp.status_code == 200
87
+ assert resp.json()["type"] == "native"