@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,510 @@
1
+ #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: FSL-1.1-Apache-2.0
3
+ # Copyright (c) 2025 Open Computer Use Contributors
4
+ """Unified patch: error handling for tool loop, code interpreter, SSE, and background tasks.
5
+
6
+ Replaces 3 separate patches:
7
+ - fix_debug_streaming_errors.py (TEMPORARY debug logging)
8
+ - fix_transport_retry.py (transport error handling + non-streaming errors)
9
+ - fix_tool_loop_error.py (budget error display + background tasks)
10
+
11
+ Problems solved:
12
+ 1. Tool loop errors silently swallowed (log.debug + break) — user sees garbage
13
+ 2. Transport errors (aiohttp.ClientPayloadError) leave partial output
14
+ 3. Non-streaming errors (JSONResponse 400) silently break
15
+ 4. "Model not found" on budget exhaustion — cryptic message for user
16
+ 5. Background tasks (follow_ups/title/tags) crash on 404 after budget exceeded
17
+ 6. SSE parse errors logged at debug level only
18
+
19
+ Applied at Docker build time. Works on ORIGINAL middleware.py (no dependencies).
20
+ Target: Open WebUI 0.9.5 (output-based architecture, serialize_output, prior_output).
21
+
22
+ Fail-loud: ANY sub-anchor miss triggers sys.exit(1) with stderr ERROR — refuses
23
+ to ship a partially-patched middleware.py. Idempotent: re-run prints ALREADY PATCHED.
24
+ """
25
+
26
+ import os
27
+ import sys
28
+
29
+ _PATCH_TARGET_OVERRIDE = os.environ.get("_PATCH_TARGET_OVERRIDE", "")
30
+ MIDDLEWARE_PATH = _PATCH_TARGET_OVERRIDE or "/app/backend/open_webui/utils/middleware.py"
31
+
32
+ PATCH_MARKER = "TOOL_LOOP_ERRORS_UNIFIED" # legacy marker — retained
33
+ NEW_PATCH_MARKER = "FIX_TOOL_LOOP_ERRORS" # v0.9.2.0 marker (appears in injected comments)
34
+
35
+ _BUDGET_MSG = (
36
+ "Model temporarily unavailable. "
37
+ "Request limit may be exceeded. "
38
+ "Try again later or choose another model."
39
+ )
40
+ _TRANSPORT_MSG = (
41
+ "Connection error while receiving model response. "
42
+ "Resend message to continue."
43
+ )
44
+ _ERROR_LABEL = "Error"
45
+
46
+ # ============================================================
47
+ # Mod 1: Tool loop — full error handling
48
+ # ============================================================
49
+ SEARCH_TOOL_LOOP = """\
50
+ try:
51
+ new_form_data = {
52
+ **form_data,
53
+ 'model': model_id,
54
+ 'stream': True,
55
+ 'metadata': metadata,
56
+ }
57
+
58
+ if ENABLE_RESPONSES_API_STATEFUL and last_response_id:
59
+ system_message = get_system_message(form_data['messages'])
60
+ new_form_data['messages'] = (
61
+ [system_message] if system_message else []
62
+ ) + convert_output_to_messages(
63
+ output, raw=True, reasoning_format=get_reasoning_format(model)
64
+ )
65
+ new_form_data['previous_response_id'] = last_response_id
66
+ else:
67
+ tool_messages = convert_output_to_messages(
68
+ output, raw=True, reasoning_format=get_reasoning_format(model)
69
+ )
70
+
71
+ # Chat Completions providers don't support multimodal
72
+ # tool messages. Extract images into a user message.
73
+ image_urls = []
74
+ for message in tool_messages:
75
+ if message.get('role') == 'tool' and isinstance(message.get('content'), list):
76
+ text_parts = []
77
+ for part in message['content']:
78
+ if part.get('type') == 'input_text':
79
+ text_parts.append(part.get('text', ''))
80
+ elif part.get('type') == 'input_image':
81
+ image_urls.append(part.get('image_url', ''))
82
+ message['content'] = ''.join(text_parts)
83
+
84
+ new_form_data['messages'] = [
85
+ *form_data['messages'],
86
+ *tool_messages,
87
+ ]
88
+
89
+ if image_urls:
90
+ new_form_data['messages'].append(
91
+ {
92
+ 'role': 'user',
93
+ 'content': [
94
+ {
95
+ 'type': 'text',
96
+ 'text': 'Here are the images from the tool results above. Please analyze them.',
97
+ },
98
+ *[{'type': 'image_url', 'image_url': {'url': url}} for url in image_urls],
99
+ ],
100
+ }
101
+ )
102
+
103
+ res = await generate_chat_completion(
104
+ request,
105
+ new_form_data,
106
+ user,
107
+ bypass_system_prompt=True,
108
+ )
109
+
110
+ if isinstance(res, StreamingResponse):
111
+ # Save accumulated output and start fresh.
112
+ # Responses API output_index values are relative
113
+ # to the current response — a clean output list
114
+ # keeps indices aligned. The display prefix
115
+ # ensures the UI shows tool history during
116
+ # streaming.
117
+ prior_output = list(output)
118
+ # Trim the trailing empty placeholder message
119
+ # so it doesn't persist as a ghost item once
120
+ # the new stream produces real content.
121
+ if (
122
+ prior_output
123
+ and prior_output[-1].get('type') == 'message'
124
+ and prior_output[-1].get('status') == 'in_progress'
125
+ ):
126
+ msg_parts = prior_output[-1].get('content', [])
127
+ if not msg_parts or (len(msg_parts) == 1 and not msg_parts[0].get('text', '').strip()):
128
+ prior_output.pop()
129
+ output = []
130
+ await stream_body_handler(res, new_form_data)
131
+ output[:0] = prior_output
132
+ prior_output = []
133
+ else:
134
+ break
135
+ except Exception as e:
136
+ log.debug(e)
137
+ break
138
+
139
+ if DETECT_CODE_INTERPRETER:"""
140
+
141
+ REPLACE_TOOL_LOOP = (
142
+ " _saved_output = json.loads(json.dumps(output)) # TOOL_LOOP_ERRORS_UNIFIED: save for restore on error\n"
143
+ " try:\n"
144
+ " new_form_data = {\n"
145
+ " **form_data,\n"
146
+ " 'model': model_id,\n"
147
+ " 'stream': True,\n"
148
+ " 'metadata': metadata,\n"
149
+ " }\n"
150
+ "\n"
151
+ " if ENABLE_RESPONSES_API_STATEFUL and last_response_id:\n"
152
+ " system_message = get_system_message(form_data['messages'])\n"
153
+ " new_form_data['messages'] = (\n"
154
+ " [system_message] if system_message else []\n"
155
+ " ) + convert_output_to_messages(\n"
156
+ " output, raw=True, reasoning_format=get_reasoning_format(model)\n"
157
+ " )\n"
158
+ " new_form_data['previous_response_id'] = last_response_id\n"
159
+ " else:\n"
160
+ " tool_messages = convert_output_to_messages(\n"
161
+ " output, raw=True, reasoning_format=get_reasoning_format(model)\n"
162
+ " )\n"
163
+ "\n"
164
+ " # Chat Completions providers don't support multimodal\n"
165
+ " # tool messages. Extract images into a user message.\n"
166
+ " image_urls = []\n"
167
+ " for message in tool_messages:\n"
168
+ " if message.get('role') == 'tool' and isinstance(message.get('content'), list):\n"
169
+ " text_parts = []\n"
170
+ " for part in message['content']:\n"
171
+ " if part.get('type') == 'input_text':\n"
172
+ " text_parts.append(part.get('text', ''))\n"
173
+ " elif part.get('type') == 'input_image':\n"
174
+ " image_urls.append(part.get('image_url', ''))\n"
175
+ " message['content'] = ''.join(text_parts)\n"
176
+ "\n"
177
+ " new_form_data['messages'] = [\n"
178
+ " *form_data['messages'],\n"
179
+ " *tool_messages,\n"
180
+ " ]\n"
181
+ "\n"
182
+ " if image_urls:\n"
183
+ " new_form_data['messages'].append(\n"
184
+ " {\n"
185
+ " 'role': 'user',\n"
186
+ " 'content': [\n"
187
+ " {\n"
188
+ " 'type': 'text',\n"
189
+ " 'text': 'Here are the images from the tool results above. Please analyze them.',\n"
190
+ " },\n"
191
+ " *[{'type': 'image_url', 'image_url': {'url': url}} for url in image_urls],\n"
192
+ " ],\n"
193
+ " }\n"
194
+ " )\n"
195
+ "\n"
196
+ " res = await generate_chat_completion(\n"
197
+ " request,\n"
198
+ " new_form_data,\n"
199
+ " user,\n"
200
+ " bypass_system_prompt=True,\n"
201
+ " )\n"
202
+ "\n"
203
+ " if isinstance(res, StreamingResponse):\n"
204
+ " # Save accumulated output and start fresh.\n"
205
+ " # Responses API output_index values are relative\n"
206
+ " # to the current response -- a clean output list\n"
207
+ " # keeps indices aligned. The display prefix\n"
208
+ " # ensures the UI shows tool history during\n"
209
+ " # streaming.\n"
210
+ " prior_output = list(output)\n"
211
+ " # Trim the trailing empty placeholder message\n"
212
+ " # so it doesn't persist as a ghost item once\n"
213
+ " # the new stream produces real content.\n"
214
+ " if (\n"
215
+ " prior_output\n"
216
+ " and prior_output[-1].get('type') == 'message'\n"
217
+ " and prior_output[-1].get('status') == 'in_progress'\n"
218
+ " ):\n"
219
+ " msg_parts = prior_output[-1].get('content', [])\n"
220
+ " if not msg_parts or (len(msg_parts) == 1 and not msg_parts[0].get('text', '').strip()):\n"
221
+ " prior_output.pop()\n"
222
+ " output = []\n"
223
+ " await stream_body_handler(res, new_form_data)\n"
224
+ " output[:0] = prior_output\n"
225
+ " prior_output = []\n"
226
+ " else:\n"
227
+ " # TOOL_LOOP_ERRORS_UNIFIED: handle non-streaming error (ContextWindowExceeded, rate limit, etc)\n"
228
+ " _err_detail = None\n"
229
+ " try:\n"
230
+ " if hasattr(res, 'body') and isinstance(res.body, bytes):\n"
231
+ " _resp_data = json.loads(res.body.decode('utf-8', 'replace'))\n"
232
+ " if 'error' in _resp_data:\n"
233
+ " _err_obj = _resp_data['error']\n"
234
+ " _err_detail = _err_obj.get('message') or _err_obj.get('detail') or str(_err_obj) if isinstance(_err_obj, dict) else str(_err_obj)\n"
235
+ " except Exception:\n"
236
+ " _err_detail = f'Non-streaming error response: {type(res).__name__}'\n"
237
+ " if _err_detail:\n"
238
+ " log.error('NON_STREAM_ERROR: chat=%s iter=%d error=%s',\n"
239
+ " metadata.get('chat_id', '')[:8], tool_call_retries, _err_detail)\n"
240
+ " if 'Model not found' in _err_detail:\n"
241
+ " _err_detail = '" + _BUDGET_MSG + "'\n"
242
+ " # Keep only message items (text the user already saw)\n"
243
+ " _msg_items = [item for item in _saved_output if item.get('type') == 'message']\n"
244
+ " _msg_items.append({'type': 'message', 'id': '', 'status': 'completed', 'role': 'assistant', 'content': [{'type': 'output_text', 'text': f'\\n\\n---\\n**" + _ERROR_LABEL + ":** {_err_detail[:1000]}'}]})\n"
245
+ " output[:] = _msg_items\n"
246
+ " try:\n"
247
+ " await event_emitter({'type': 'chat:message:error', 'data': {'error': {'content': _err_detail}}})\n"
248
+ " await event_emitter({'type': 'chat:completion', 'data': {'content': serialize_output(output), 'output': output}})\n"
249
+ " except Exception:\n"
250
+ " pass\n"
251
+ " break\n"
252
+ " except Exception as e:\n"
253
+ " # TOOL_LOOP_ERRORS_UNIFIED: restore clean output + show error; FIX_TOOL_LOOP_ERRORS\n"
254
+ " import traceback as _tb\n"
255
+ " _msg_items = [item for item in _saved_output if item.get('type') == 'message']\n"
256
+ " _err_mod = getattr(type(e), '__module__', '') or ''\n"
257
+ " _is_transport = 'aiohttp' in _err_mod or isinstance(e, (ConnectionError, TimeoutError, OSError))\n"
258
+ " if _is_transport:\n"
259
+ " log.warning('TRANSPORT_ERROR: chat=%s iter=%d error=%s',\n"
260
+ " metadata.get('chat_id', '')[:8], tool_call_retries, e)\n"
261
+ " _ui_err = '" + _TRANSPORT_MSG + "'\n"
262
+ " else:\n"
263
+ " log.error('TOOL_LOOP_ERROR: chat=%s iter=%d error=%s\\n%s',\n"
264
+ " metadata.get('chat_id', '')[:8], tool_call_retries, e, _tb.format_exc())\n"
265
+ " _ui_err = str(e)[:1000]\n"
266
+ " if 'Model not found' in _ui_err:\n"
267
+ " _ui_err = '" + _BUDGET_MSG + "'\n"
268
+ " try:\n"
269
+ " _msg_items.append({'type': 'message', 'id': '', 'status': 'completed', 'role': 'assistant', 'content': [{'type': 'output_text', 'text': f'\\n\\n---\\n**" + _ERROR_LABEL + ":** {_ui_err}'}]})\n"
270
+ " output[:] = _msg_items\n"
271
+ " await event_emitter({'type': 'chat:message:error', 'data': {'error': {'content': _ui_err}}})\n"
272
+ " await event_emitter({'type': 'chat:completion', 'data': {'content': serialize_output(output), 'output': output}})\n"
273
+ " except Exception:\n"
274
+ " pass\n"
275
+ " break\n"
276
+ "\n"
277
+ " if DETECT_CODE_INTERPRETER:"
278
+ )
279
+
280
+ # ============================================================
281
+ # Mod 2: Code interpreter catch -> log.error + UI error display
282
+ # v0.9.1: `title = await Chats.get_chat_title_by_id(...)` — async-ified
283
+ # v0.9.3+: title wrapped in multi-line parenthesized ternary (channel: guard)
284
+ # ============================================================
285
+ SEARCH_CODE_INTERP = """\
286
+ except Exception as e:
287
+ log.debug(e)
288
+ break
289
+
290
+ # Mark all in-progress items as completed
291
+ for item in output:
292
+ if item.get('status') == 'in_progress':
293
+ item['status'] = 'completed'
294
+
295
+ title = (
296
+ await Chats.get_chat_title_by_id(metadata['chat_id'])
297
+ if not metadata['chat_id'].startswith('channel:')
298
+ else ''
299
+ )"""
300
+
301
+ REPLACE_CODE_INTERP = (
302
+ " except Exception as e:\n"
303
+ " import traceback as _tb # TOOL_LOOP_ERRORS_UNIFIED; FIX_TOOL_LOOP_ERRORS\n"
304
+ " log.error('CODE_INTERP_ERROR: chat=%s iter=%d error=%s\\n%s',\n"
305
+ " metadata.get('chat_id', '')[:8], retries, e, _tb.format_exc())\n"
306
+ " try:\n"
307
+ " output.append({'type': 'message', 'id': '', 'status': 'completed', 'role': 'assistant', 'content': [{'type': 'output_text', 'text': f'\\n\\n---\\n**" + _ERROR_LABEL + ":** {str(e)[:1000]}'}]})\n"
308
+ " await event_emitter({'type': 'chat:completion', 'data': {'content': serialize_output(output), 'output': output}})\n"
309
+ " except Exception:\n"
310
+ " pass\n"
311
+ " break\n"
312
+ "\n"
313
+ " # Mark all in-progress items as completed\n"
314
+ " for item in output:\n"
315
+ " if item.get('status') == 'in_progress':\n"
316
+ " item['status'] = 'completed'\n"
317
+ "\n"
318
+ " title = (\n"
319
+ " await Chats.get_chat_title_by_id(metadata['chat_id'])\n"
320
+ " if not metadata['chat_id'].startswith('channel:')\n"
321
+ " else ''\n"
322
+ " )"
323
+ )
324
+
325
+ # ============================================================
326
+ # Mod 3: SSE parse catch -> log.error with context
327
+ # ============================================================
328
+ SEARCH_SSE = """\
329
+ except Exception as e:
330
+ done = 'data: [DONE]' in line
331
+ if done:
332
+ pass
333
+ else:
334
+ log.debug(f'Error: {e}')
335
+ continue"""
336
+
337
+ REPLACE_SSE = """\
338
+ except Exception as e:
339
+ done = 'data: [DONE]' in line
340
+ if done:
341
+ pass
342
+ else:
343
+ log.error('SSE_PARSE_ERROR: chat=%s line=%.200s error=%s', # TOOL_LOOP_ERRORS_UNIFIED; FIX_TOOL_LOOP_ERRORS
344
+ metadata.get('chat_id', '')[:8], str(line)[:200], e)
345
+ continue"""
346
+
347
+ # ============================================================
348
+ # Mod 4: Done emit try/except + background_tasks_handler wrapper
349
+ # v0.9.1: two new lines inserted between `await background_tasks_handler(ctx)`
350
+ # and `except asyncio.CancelledError:` — `ctx['assistant_message'] = {...}` +
351
+ # `await outlet_filter_handler(ctx)`. Both must be preserved inside the wrap.
352
+ # ============================================================
353
+ SEARCH_DONE_BG = """\
354
+ await event_emitter(
355
+ {
356
+ 'type': 'chat:completion',
357
+ 'data': data,
358
+ }
359
+ )
360
+
361
+ await background_tasks_handler(ctx)
362
+ ctx['assistant_message'] = {
363
+ 'content': serialize_output(output),
364
+ 'output': output,
365
+ **({'usage': usage} if usage else {}),
366
+ }
367
+ await outlet_filter_handler(ctx)
368
+ except asyncio.CancelledError:"""
369
+
370
+ REPLACE_DONE_BG = """\
371
+ try: # TOOL_LOOP_ERRORS_UNIFIED: wrap done emit; FIX_TOOL_LOOP_ERRORS
372
+ await event_emitter(
373
+ {
374
+ 'type': 'chat:completion',
375
+ 'data': data,
376
+ }
377
+ )
378
+ except Exception as _done_err:
379
+ log.error('DONE_EMIT_ERROR: chat=%s error=%s',
380
+ metadata.get('chat_id', '')[:8], _done_err)
381
+
382
+ try:
383
+ await background_tasks_handler(ctx)
384
+ ctx['assistant_message'] = {
385
+ 'content': serialize_output(output),
386
+ 'output': output,
387
+ **({'usage': usage} if usage else {}),
388
+ }
389
+ await outlet_filter_handler(ctx)
390
+ except Exception as _bg_err:
391
+ log.error('BACKGROUND_TASK_ERROR: chat=%s error=%s', # TOOL_LOOP_ERRORS_UNIFIED
392
+ metadata.get('chat_id', '')[:8], _bg_err)
393
+ except asyncio.CancelledError:"""
394
+
395
+ # ============================================================
396
+ # Mod 5: TOOL_LOOP_ITER lifecycle logging
397
+ # ============================================================
398
+ SEARCH_ITER = """\
399
+ while len(tool_calls) > 0 and tool_call_retries < CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES:
400
+ tool_call_retries += 1"""
401
+
402
+ REPLACE_ITER = """\
403
+ while len(tool_calls) > 0 and tool_call_retries < CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES:
404
+ tool_call_retries += 1
405
+ log.debug('TOOL_LOOP_ITER: chat=%s iter=%d pending_tc=%d', # TOOL_LOOP_ERRORS_UNIFIED; FIX_TOOL_LOOP_ERRORS
406
+ metadata.get('chat_id', '')[:8], tool_call_retries, len(tool_calls))"""
407
+
408
+
409
+ def apply_patch():
410
+ if not os.path.exists(MIDDLEWARE_PATH):
411
+ print(
412
+ f"ERROR: fix_tool_loop_errors target file {MIDDLEWARE_PATH} not found. "
413
+ "Refusing to produce a silently-broken image.",
414
+ file=sys.stderr,
415
+ )
416
+ sys.exit(1)
417
+
418
+ with open(MIDDLEWARE_PATH, "r", encoding="utf-8") as f:
419
+ content = f.read()
420
+
421
+ if PATCH_MARKER in content or NEW_PATCH_MARKER in content:
422
+ print(f"ALREADY PATCHED: {MIDDLEWARE_PATH} contains {PATCH_MARKER}")
423
+ return True
424
+
425
+ # v0.9.1 -> v0.9.2 backward-compat shim: v0.9.2 upstream inserted a new
426
+ # `'metadata': metadata,` key into the first `new_form_data = {` block. The
427
+ # SEARCH_TOOL_LOOP anchor targets the v0.9.2 shape; for v0.9.1 input we
428
+ # inject the missing key in-memory so the single SEARCH matches both
429
+ # upstream versions. No-op on v0.9.2 (V091_SHIM does not match there).
430
+ V091_SHIM = " 'stream': True,\n }\n\n if ENABLE_RESPONSES_API_STATEFUL"
431
+ V092_SHIM = " 'stream': True,\n 'metadata': metadata,\n }\n\n if ENABLE_RESPONSES_API_STATEFUL"
432
+ if V091_SHIM in content and V092_SHIM not in content:
433
+ content = content.replace(V091_SHIM, V092_SHIM, 1)
434
+
435
+ # Mod 1/5: tool_loop
436
+ if SEARCH_TOOL_LOOP not in content:
437
+ print(
438
+ f"ERROR: fix_tool_loop_errors anchor 1/5 (tool_loop) not found in {MIDDLEWARE_PATH} "
439
+ "— upstream may have refactored the tool-retry try/except. "
440
+ "Refusing to produce a silently-broken image.",
441
+ file=sys.stderr,
442
+ )
443
+ sys.exit(1)
444
+ content = content.replace(SEARCH_TOOL_LOOP, REPLACE_TOOL_LOOP, 1)
445
+ print(" [1/5] Tool loop: save/restore + transport + non-stream + Model not found + chat:message:error")
446
+
447
+ # Mod 2/5: code_interp (v0.9.1: await-ified Chats.get_chat_title_by_id)
448
+ if SEARCH_CODE_INTERP not in content:
449
+ print(
450
+ f"ERROR: fix_tool_loop_errors anchor 2/5 (code_interp) not found in {MIDDLEWARE_PATH} "
451
+ "— upstream may have refactored the code-interpreter except block or the "
452
+ "await Chats.get_chat_title_by_id call. "
453
+ "Refusing to produce a silently-broken image.",
454
+ file=sys.stderr,
455
+ )
456
+ sys.exit(1)
457
+ content = content.replace(SEARCH_CODE_INTERP, REPLACE_CODE_INTERP, 1)
458
+ print(" [2/5] Code interpreter: log.error + UI error display")
459
+
460
+ # Mod 3/5: sse
461
+ if SEARCH_SSE not in content:
462
+ print(
463
+ f"ERROR: fix_tool_loop_errors anchor 3/5 (sse) not found in {MIDDLEWARE_PATH} "
464
+ "— upstream may have refactored the SSE parse except block. "
465
+ "Refusing to produce a silently-broken image.",
466
+ file=sys.stderr,
467
+ )
468
+ sys.exit(1)
469
+ content = content.replace(SEARCH_SSE, REPLACE_SSE, 1)
470
+ print(" [3/5] SSE parse: log.error with context")
471
+
472
+ # Mod 4/5: done_bg
473
+ if SEARCH_DONE_BG not in content:
474
+ print(
475
+ f"ERROR: fix_tool_loop_errors anchor 4/5 (done_bg) not found in {MIDDLEWARE_PATH} "
476
+ "— upstream may have refactored the background_tasks_handler block "
477
+ "(v0.9.1 inserted assistant_message + outlet_filter_handler). "
478
+ "Refusing to produce a silently-broken image.",
479
+ file=sys.stderr,
480
+ )
481
+ sys.exit(1)
482
+ content = content.replace(SEARCH_DONE_BG, REPLACE_DONE_BG, 1)
483
+ print(" [4/5] Done emit wrapped + background_tasks_handler wrapped")
484
+
485
+ # Mod 5/5: iter
486
+ if SEARCH_ITER not in content:
487
+ print(
488
+ f"ERROR: fix_tool_loop_errors anchor 5/5 (iter) not found in {MIDDLEWARE_PATH} "
489
+ "— upstream may have refactored the tool-retry while-loop start. "
490
+ "Refusing to produce a silently-broken image.",
491
+ file=sys.stderr,
492
+ )
493
+ sys.exit(1)
494
+ content = content.replace(SEARCH_ITER, REPLACE_ITER, 1)
495
+ print(" [5/5] TOOL_LOOP_ITER lifecycle logging")
496
+
497
+ with open(MIDDLEWARE_PATH, "w", encoding="utf-8") as f:
498
+ f.write(content)
499
+
500
+ print("PATCHED: fix_tool_loop_errors applied successfully.")
501
+ print(" Log markers: TOOL_LOOP_ERROR, TRANSPORT_ERROR, NON_STREAM_ERROR,")
502
+ print(" CODE_INTERP_ERROR, SSE_PARSE_ERROR, DONE_EMIT_ERROR,")
503
+ print(" BACKGROUND_TASK_ERROR, TOOL_LOOP_ITER")
504
+ return True
505
+
506
+
507
+ if __name__ == "__main__":
508
+ print("Applying unified tool loop errors patch to middleware.py...")
509
+ success = apply_patch()
510
+ sys.exit(0 if success else 1)
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@mseep/open-computer-use",
3
+ "mcpName": "io.github.Wide-Moat/open-computer-use",
4
+ "version": "1.0.0",
5
+ "description": "Open Computer Use - Node.js Dependencies",
6
+ "license": "FSL-1.1-Apache-2.0",
7
+ "engines": {
8
+ "node": ">=22.20.0",
9
+ "npm": ">=10.9.3"
10
+ },
11
+ "dependencies": {
12
+ "@mermaid-js/mermaid-cli": "^11.12.0",
13
+ "docx": "^9.5.1",
14
+ "graphviz": "^0.0.9",
15
+ "markdown-pdf": "^11.0.0",
16
+ "markdown-toc": "^1.2.0",
17
+ "markdownlint-cli": "^0.45.0",
18
+ "markdownlint-cli2": "^0.18.1",
19
+ "marked": "^16.4.0",
20
+ "pdf-lib": "^1.17.1",
21
+ "pdfjs-dist": "^5.4.296",
22
+ "playwright": "1.57.0",
23
+ "pptxgenjs": "^4.0.1",
24
+ "react": "^19.2.0",
25
+ "react-dom": "^19.2.0",
26
+ "react-icons": "^5.5.0",
27
+ "remark-cli": "^12.0.1",
28
+ "remark-preset-lint-recommended": "^7.0.1",
29
+ "sharp": "^0.34.4",
30
+ "ts-node": "^10.9.2",
31
+ "tsx": "^4.20.6",
32
+ "typescript": "^5.9.3"
33
+ },
34
+ "keywords": [
35
+ "mseep",
36
+ "mcp-server"
37
+ ],
38
+ "publisher": "mseep"
39
+ }
@@ -0,0 +1,112 @@
1
+ # AI Computer Use - Python Dependencies
2
+ # Python 3.12.3
3
+
4
+ # Core document processing
5
+ python-docx==1.2.0
6
+ python-pptx==1.0.2
7
+ openpyxl==3.1.5
8
+ xlsxwriter==3.2.9
9
+ xlrd==2.0.1
10
+
11
+ # PDF processing
12
+ pypdf==5.9.0
13
+ pdfplumber==0.11.9
14
+ pypdfium2==4.30.0
15
+ PyMuPDF==1.24.10
16
+ pikepdf==9.11.0
17
+ pdfkit==1.0.0
18
+ pdfminer.six==20251230
19
+ pdf2image==1.17.0
20
+ reportlab==4.4.10
21
+
22
+ # Image processing
23
+ pillow==12.2.0
24
+ opencv-python==4.11.0.86
25
+ opencv-contrib-python==4.11.0.86
26
+ opencv-python-headless==4.11.0.86
27
+ imageio==2.37.0
28
+ imageio-ffmpeg==0.6.0
29
+ scikit-image==0.25.2
30
+ Wand==0.6.13
31
+
32
+ # OCR and text extraction
33
+ pytesseract==0.3.13
34
+ tabula-py==2.10.0
35
+ camelot-py==1.0.9
36
+
37
+ # Web and HTTP
38
+ requests==2.32.5
39
+ urllib3==2.6.3
40
+ httplib2==0.20.4
41
+ certifi==2025.10.5
42
+ beautifulsoup4==4.14.3
43
+ soupsieve==2.8
44
+
45
+ # LLM SDKs
46
+ openai>=2.20.0
47
+
48
+ # Markdown and documentation
49
+ markdown-it-py==4.0.0
50
+ markdownify==1.2.0
51
+ markitdown==0.1.3
52
+ marko==2.2.1
53
+ mistune==3.1.4
54
+ grip==4.6.2
55
+
56
+ # Data processing
57
+ pandas==2.3.3
58
+ numpy==2.3.3
59
+ scipy==1.16.2
60
+ scikit-learn==1.7.2
61
+
62
+ # Plotting and visualization
63
+ matplotlib==3.10.7
64
+ seaborn==0.13.2
65
+
66
+ # XML processing
67
+ lxml==6.0.2
68
+ et_xmlfile==2.0.0
69
+ defusedxml==0.7.1
70
+ odfpy==1.4.1
71
+
72
+ # Machine Learning
73
+ jax==0.7.2
74
+ jaxlib==0.7.2
75
+ # tensorflow-lite==2.13.0 - does NOT exist on PyPI, removed
76
+ onnxruntime==1.23.1
77
+ ml_dtypes==0.5.3
78
+ mediapipe==0.10.14
79
+ magika==0.6.2
80
+
81
+ # Web automation
82
+ playwright==1.57.0
83
+ pyee==13.0.0
84
+
85
+ # Office/LibreOffice integration
86
+ unoserver==3.4
87
+ pyoo==1.4
88
+
89
+ # CLI and utilities
90
+ click==8.3.0
91
+ colorama==0.4.6
92
+ coloredlogs==15.0.1
93
+ humanfriendly==10.0
94
+ tabulate==0.9.0
95
+ psutil==7.2.2
96
+
97
+ # Dev tools
98
+ Flask==3.1.3
99
+ Werkzeug==3.1.3
100
+
101
+ # Other dependencies
102
+ cryptography==46.0.6
103
+ PyJWT==2.12.1
104
+ python-dateutil==2.9.0.post0
105
+ pytz==2025.2
106
+ tzdata==2025.2
107
+ python-dotenv==1.1.1
108
+ PyYAML==6.0.3
109
+ pyyaml_env_tag==1.1
110
+ wrapt==1.17.3
111
+ Deprecated==1.2.18
112
+ six==1.17.0