@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.
- package/.coderabbit.yaml +25 -0
- package/.dockerignore +95 -0
- package/.env.example +137 -0
- package/.githooks/pre-commit +68 -0
- package/.github/CODEOWNERS +125 -0
- package/.github/ISSUE_TEMPLATE/adr-proposal.md +41 -0
- package/.github/ISSUE_TEMPLATE/bug-report.md +49 -0
- package/.github/ISSUE_TEMPLATE/component-proposal.md +38 -0
- package/.github/ISSUE_TEMPLATE/config.yml +15 -0
- package/.github/ISSUE_TEMPLATE/dependency-proposal.md +59 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
- package/.github/ISSUE_TEMPLATE/nfr-proposal.md +44 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- package/.github/codeql/codeql-config.yml +11 -0
- package/.github/codeql/extensions/security-models/python-sanitizers.model.yml +17 -0
- package/.github/codeql/extensions/security-models/qlpack.yml +7 -0
- package/.github/dependabot.yml +23 -0
- package/.github/security-exceptions.yml +23 -0
- package/.github/workflows/build.yml +420 -0
- package/.github/workflows/codeql.yml +33 -0
- package/.github/workflows/contracts-lint.yml +90 -0
- package/.github/workflows/docs-lint.yml +151 -0
- package/.github/workflows/helm.yml +131 -0
- package/.github/workflows/identity-lint.yml +30 -0
- package/.github/workflows/release-chart.yml +177 -0
- package/.github/workflows/release.yml +95 -0
- package/.github/workflows/security.yml +332 -0
- package/.github/workflows/stale.yml +31 -0
- package/.github/workflows/supply-chain.yml +242 -0
- package/.gitleaks.toml +53 -0
- package/.markdownlint.yaml +51 -0
- package/.semgrepignore +85 -0
- package/.vale/styles/Architecture/ap13-data-class-substrate.yml +12 -0
- package/.vale/styles/Architecture/banned-phrases.yml +23 -0
- package/.vale/styles/Architecture/banned-vocab.yml +23 -0
- package/.vale/styles/Architecture/marketing-tone.yml +19 -0
- package/.vale.ini +18 -0
- package/CHANGELOG.md +411 -0
- package/CLAUDE.md +218 -0
- package/CONTRIBUTING.md +82 -0
- package/Dockerfile +676 -0
- package/LICENSE +98 -0
- package/LICENSE-APACHE +202 -0
- package/LICENSE-MIT +21 -0
- package/NOTICE +36 -0
- package/README.md +516 -0
- package/SECURITY.md +45 -0
- package/THIRD-PARTY-LICENSES.md +14 -0
- package/apt-packages.txt +108 -0
- package/computer-use-server/.dockerignore +13 -0
- package/computer-use-server/Dockerfile +44 -0
- package/computer-use-server/README.md +84 -0
- package/computer-use-server/app.py +1544 -0
- package/computer-use-server/bin/list-subagent-models +449 -0
- package/computer-use-server/cli-defaults/README.md +31 -0
- package/computer-use-server/cli-defaults/codex.json +7 -0
- package/computer-use-server/cli-defaults/opencode.json +18 -0
- package/computer-use-server/cli_adapters/__init__.py +46 -0
- package/computer-use-server/cli_adapters/claude.py +163 -0
- package/computer-use-server/cli_adapters/codex.py +163 -0
- package/computer-use-server/cli_adapters/opencode.py +169 -0
- package/computer-use-server/cli_adapters/result.py +34 -0
- package/computer-use-server/cli_runtime.py +316 -0
- package/computer-use-server/context_vars.py +24 -0
- package/computer-use-server/docker_manager.py +1100 -0
- package/computer-use-server/docs_html.py +12 -0
- package/computer-use-server/mcp_resources.py +170 -0
- package/computer-use-server/mcp_tools.py +1430 -0
- package/computer-use-server/requirements.txt +17 -0
- package/computer-use-server/security.py +50 -0
- package/computer-use-server/skill_manager.py +664 -0
- package/computer-use-server/static/browser-viewer.js +445 -0
- package/computer-use-server/static/chart.umd.js +14 -0
- package/computer-use-server/static/docs.html +203 -0
- package/computer-use-server/static/github-dark.min.css +10 -0
- package/computer-use-server/static/github.min.css +10 -0
- package/computer-use-server/static/highlight.min.js +1213 -0
- package/computer-use-server/static/highlightjs-line-numbers.min.js +1 -0
- package/computer-use-server/static/icons.js +74 -0
- package/computer-use-server/static/jszip.min.js +13 -0
- package/computer-use-server/static/katex/auto-render.min.js +1 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/computer-use-server/static/katex/katex.min.css +1 -0
- package/computer-use-server/static/katex/katex.min.js +1 -0
- package/computer-use-server/static/locale.js +242 -0
- package/computer-use-server/static/mammoth.browser.min.js +21 -0
- package/computer-use-server/static/marked.min.js +6 -0
- package/computer-use-server/static/mermaid.min.js +2811 -0
- package/computer-use-server/static/pdf.min.js +22 -0
- package/computer-use-server/static/pdf.worker.min.js +22 -0
- package/computer-use-server/static/pptxviewjs.min.js +1 -0
- package/computer-use-server/static/preact-htm.min.js +1 -0
- package/computer-use-server/static/preview.css +1030 -0
- package/computer-use-server/static/preview.js +1522 -0
- package/computer-use-server/static/xlsx.full.min.js +22 -0
- package/computer-use-server/static/xterm-addon-fit.min.js +2 -0
- package/computer-use-server/static/xterm-addon-web-links.min.js +2 -0
- package/computer-use-server/static/xterm.css +218 -0
- package/computer-use-server/static/xterm.min.js +2 -0
- package/computer-use-server/system_prompt.py +761 -0
- package/computer-use-server/uploads.py +82 -0
- package/contracts/README.md +53 -0
- package/contracts/audit/audit-fanin.asyncapi.yaml +407 -0
- package/contracts/exec/exec-channel.schema.json +240 -0
- package/contracts/mcp/2025-06-18/ocu-constraints.schema.json +178 -0
- package/contracts/storage/file-artifact-api.schema.json +390 -0
- package/contracts/storage/file-ops.schema.json +217 -0
- package/contracts/storage/mount-config.schema.json +197 -0
- package/cron/Dockerfile +15 -0
- package/cron/cleanup-quick.sh +21 -0
- package/cron/cleanup.sh +127 -0
- package/data/outputs/.gitkeep +0 -0
- package/data/uploads/.gitkeep +0 -0
- package/docker-compose.test.yml +54 -0
- package/docker-compose.webui.yml +77 -0
- package/docker-compose.yml +96 -0
- package/docs/CLOUD.md +29 -0
- package/docs/COMPARISON.md +128 -0
- package/docs/DOCKER.md +469 -0
- package/docs/DYNAMIC-SKILLS.md +77 -0
- package/docs/FEATURES.md +100 -0
- package/docs/INSTALL.md +111 -0
- package/docs/KNOWN-BUGS.md +86 -0
- package/docs/MCP.md +320 -0
- package/docs/SCREENSHOTS.md +39 -0
- package/docs/SKILLS-USER-GUIDE.md +86 -0
- package/docs/SKILLS.md +483 -0
- package/docs/TERMINAL-TAB.md +56 -0
- package/docs/architecture/02-trust-boundaries.md +224 -0
- package/docs/architecture/03-c4-context.md +61 -0
- package/docs/architecture/04-bounded-contexts.md +119 -0
- package/docs/architecture/05-c4-container.md +88 -0
- package/docs/architecture/06-threat-model.md +172 -0
- package/docs/architecture/08-contracts.md +105 -0
- package/docs/architecture/MANIFESTO.md +38 -0
- package/docs/architecture/PROCESS.md +64 -0
- package/docs/architecture/README.md +37 -0
- package/docs/architecture/adr/0000-template.md +65 -0
- package/docs/architecture/adr/0001-layer-0-gate-legacy-exclusion.md +75 -0
- package/docs/architecture/adr/0002-session-view-descriptor.md +57 -0
- package/docs/architecture/adr/0003-sandbox-runtime-tier-ladder.md +63 -0
- package/docs/architecture/adr/0004-operator-authentication-substrate.md +63 -0
- package/docs/architecture/adr/0005-egress-credential-delivery-envoy-sds.md +62 -0
- package/docs/architecture/adr/0006-egress-forward-proxy-substrate.md +65 -0
- package/docs/architecture/adr/0007-egress-auth-mechanism.md +72 -0
- package/docs/architecture/adr/0008-session-egress-attribution.md +59 -0
- package/docs/architecture/adr/0009-audit-pipeline-pluggable-by-contract.md +76 -0
- package/docs/architecture/adr/0010-storage-backend-pluggable-adapter.md +60 -0
- package/docs/architecture/adr/0011-storage-egress-lane.md +67 -0
- package/docs/architecture/adr/0012-implementation-language.md +67 -0
- package/docs/architecture/adr/0020-sandbox-image-provisioning.md +82 -0
- package/docs/architecture/adr/README.md +53 -0
- package/docs/architecture/compliance/.gitkeep +0 -0
- package/docs/architecture/components/00-overview.md +42 -0
- package/docs/architecture/components/0000-template.md +50 -0
- package/docs/architecture/components/01-mcp-gateway.md +80 -0
- package/docs/architecture/components/02-control-operator-api.md +80 -0
- package/docs/architecture/components/04-storage-broker.md +104 -0
- package/docs/architecture/components/05-session-sandbox.md +93 -0
- package/docs/architecture/components/06-egress-trust-edge.md +95 -0
- package/docs/architecture/components/07-audit-pipeline.md +110 -0
- package/docs/architecture/diagrams/.gitkeep +0 -0
- package/docs/architecture/diagrams/02-trust-boundaries.mmd +111 -0
- package/docs/architecture/diagrams/06-threat-model.mmd +41 -0
- package/docs/architecture/diagrams/08-contracts.mmd +47 -0
- package/docs/architecture/diagrams/c4-container.mmd +59 -0
- package/docs/architecture/diagrams/c4-context.mmd +46 -0
- package/docs/architecture/glossary.md +172 -0
- package/docs/architecture/manifesto/.gitkeep +0 -0
- package/docs/architecture/manifesto/01-audience-and-buyer.md +57 -0
- package/docs/architecture/manifesto/02-nfrs.md +325 -0
- package/docs/architecture/manifesto/03-non-negotiables.md +35 -0
- package/docs/architecture/manifesto/04-non-goals.md +23 -0
- package/docs/architecture/manifesto/05-licensing-posture.md +61 -0
- package/docs/architecture/manifesto/06-starter-mode-policy.md +49 -0
- package/docs/architecture/manifesto/07-governance.md +60 -0
- package/docs/architecture/primitives-backlog.md +51 -0
- package/docs/architecture.svg +117 -0
- package/docs/claude-code-gateway.md +173 -0
- package/docs/cli-config-templates.md +240 -0
- package/docs/data-flow.svg +72 -0
- package/docs/demo-landing-page.gif +0 -0
- package/docs/demo-qwen-trending.gif +0 -0
- package/docs/dynamic-skills.svg +77 -0
- package/docs/file-flow.svg +126 -0
- package/docs/future-architecture/README.md +152 -0
- package/docs/future-architecture/adr/0001-control-plane-language-go.md +80 -0
- package/docs/future-architecture/adr/0002-guest-agent-language-go.md +84 -0
- package/docs/future-architecture/adr/0003-docker-poc-first-then-k8s.md +37 -0
- package/docs/future-architecture/adr/0004-pluggable-runtime-via-runtimeclass.md +34 -0
- package/docs/future-architecture/adr/0005-mcp-as-control-plane-gateway.md +34 -0
- package/docs/future-architecture/adr/0006-no-agpl-no-bsl-dependencies.md +41 -0
- package/docs/future-architecture/adr/0007-superseded-by-future-architecture.md +37 -0
- package/docs/future-architecture/adr/0008-internal-grpc-external-rest-mcp.md +106 -0
- package/docs/future-architecture/adr/0009-external-protocol-dialects.md +94 -0
- package/docs/future-architecture/adr/0010-lambda-as-inspiration-not-runtime.md +86 -0
- package/docs/future-architecture/adr/0011-kata-as-first-class-dind-runtime.md +84 -0
- package/docs/future-architecture/antipatterns.md +552 -0
- package/docs/future-architecture/architecture/01-layers.md +109 -0
- package/docs/future-architecture/architecture/02-layer4-control-plane.md +122 -0
- package/docs/future-architecture/architecture/03-layer3-providers.md +174 -0
- package/docs/future-architecture/architecture/04-layer2-runtimes.md +114 -0
- package/docs/future-architecture/architecture/04b-credential-broker.md +153 -0
- package/docs/future-architecture/architecture/05-layer1-guest-agent.md +138 -0
- package/docs/future-architecture/architecture/06-storage.md +134 -0
- package/docs/future-architecture/architecture/07-security.md +194 -0
- package/docs/future-architecture/architecture/08-networking.md +149 -0
- package/docs/future-architecture/architecture/09-templates.md +122 -0
- package/docs/future-architecture/architecture/10-observability.md +121 -0
- package/docs/future-architecture/design-notes.md +72 -0
- package/docs/future-architecture/gaps.md +281 -0
- package/docs/future-architecture/phase-template.md +123 -0
- package/docs/future-architecture/references.md +225 -0
- package/docs/future-architecture/research/01-kata-containers.md +100 -0
- package/docs/future-architecture/research/02-e2b-infra.md +133 -0
- package/docs/future-architecture/research/03-coder.md +115 -0
- package/docs/future-architecture/research/04-cloud-hypervisor.md +99 -0
- package/docs/future-architecture/research/05-firecracker.md +114 -0
- package/docs/future-architecture/research/06-agent-sandbox.md +142 -0
- package/docs/future-architecture/research/07-chromedp.md +78 -0
- package/docs/future-architecture/research/08-microsandbox.md +78 -0
- package/docs/future-architecture/research/09-agentbox.md +135 -0
- package/docs/future-architecture/research/10-sysbox.md +100 -0
- package/docs/future-architecture/research/11-firecracker-containerd.md +93 -0
- package/docs/future-architecture/research/12-docker-socket-proxy.md +59 -0
- package/docs/future-architecture/research/14-e2b-desktop-and-surf.md +107 -0
- package/docs/future-architecture/research/18-open-webui-terminals-observed.md +135 -0
- package/docs/future-architecture/research/bank-buyer.md +96 -0
- package/docs/future-architecture/research/enthusiast-audience.md +106 -0
- package/docs/future-architecture/research/proof-uipath-anthropic-2026-05.md +76 -0
- package/docs/future-architecture/research/widemoat-thesis-advisor.md +124 -0
- package/docs/future-architecture/roadmap.md +438 -0
- package/docs/kata-runtime.md +267 -0
- package/docs/kubernetes.md +86 -0
- package/docs/logo.png +0 -0
- package/docs/multi-cli.md +161 -0
- package/docs/openwebui-filter.md +134 -0
- package/docs/roadmap/implementation-roadmap.md +104 -0
- package/docs/sandbox-contents.svg +229 -0
- package/docs/screenshots/01-create-document.png +0 -0
- package/docs/screenshots/02-file-preview.png +0 -0
- package/docs/screenshots/03-browser-viewer.png +0 -0
- package/docs/screenshots/04-sub-agent-terminal.png +0 -0
- package/docs/screenshots/05-chat-overview.png +0 -0
- package/docs/screenshots/06-sub-agent-dashboard.png +0 -0
- package/docs/screenshots/07-frontend-design-skill.png +0 -0
- package/docs/screenshots/08-pptx-skill.png +0 -0
- package/docs/screenshots/09-skill-creator.png +0 -0
- package/docs/screenshots/10-data-chart.png +0 -0
- package/docs/shared-browser.svg +102 -0
- package/docs/system-prompt.md +113 -0
- package/docs/terminal-flow.svg +69 -0
- package/examples/helm/README.md +20 -0
- package/examples/helm/standalone/values.yaml +49 -0
- package/examples/helm/with-open-webui/README.md +99 -0
- package/examples/helm/with-open-webui/values-computer-use.yaml +32 -0
- package/examples/helm/with-open-webui/values-open-webui.yaml +67 -0
- package/fonts/NotoEmoji-Regular.ttf +0 -0
- package/helm/computer-use-server/.helmignore +17 -0
- package/helm/computer-use-server/Chart.yaml +32 -0
- package/helm/computer-use-server/README.md +211 -0
- package/helm/computer-use-server/templates/NOTES.txt +66 -0
- package/helm/computer-use-server/templates/_helpers.tpl +115 -0
- package/helm/computer-use-server/templates/configmap-dind-init.yaml +82 -0
- package/helm/computer-use-server/templates/configmap.yaml +18 -0
- package/helm/computer-use-server/templates/deployment.yaml +248 -0
- package/helm/computer-use-server/templates/ingress.yaml +38 -0
- package/helm/computer-use-server/templates/networkpolicy.yaml +50 -0
- package/helm/computer-use-server/templates/pdb.yaml +16 -0
- package/helm/computer-use-server/templates/pvc-data.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-skills-cache.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-user-data.yaml +20 -0
- package/helm/computer-use-server/templates/pvc-var-lib-docker.yaml +27 -0
- package/helm/computer-use-server/templates/secret.yaml +23 -0
- package/helm/computer-use-server/templates/service.yaml +22 -0
- package/helm/computer-use-server/templates/serviceaccount.yaml +15 -0
- package/helm/computer-use-server/templates/tests/test-health.yaml +23 -0
- package/helm/computer-use-server/values.schema.json +183 -0
- package/helm/computer-use-server/values.yaml +297 -0
- package/lychee.toml +36 -0
- package/openwebui/Dockerfile +52 -0
- package/openwebui/README.md +38 -0
- package/openwebui/functions/README.md +48 -0
- package/openwebui/functions/computer_link_filter.py +487 -0
- package/openwebui/init.sh +305 -0
- package/openwebui/patches/README.md +44 -0
- package/openwebui/patches/fix_artifacts_auto_show.py +441 -0
- package/openwebui/patches/fix_attached_files_position.py +87 -0
- package/openwebui/patches/fix_large_tool_args.py +156 -0
- package/openwebui/patches/fix_large_tool_results.py +289 -0
- package/openwebui/patches/fix_preview_url_detection.py +230 -0
- package/openwebui/patches/fix_skip_embedding_chat_files.py +229 -0
- package/openwebui/patches/fix_skip_rag_files_native_fc.py +100 -0
- package/openwebui/patches/fix_tool_loop_errors.py +510 -0
- package/package.json +39 -0
- package/requirements.txt +112 -0
- package/scripts/check-config.sh +141 -0
- package/scripts/docs-lint/ai-slop-detector.sh +202 -0
- package/scripts/docs-lint/architecture-tree-whitelist.sh +131 -0
- package/scripts/docs-lint/ascii-diagram-detector.sh +58 -0
- package/scripts/docs-lint/front-matter-validator.sh +97 -0
- package/scripts/docs-lint/gitignored-ref-detector.sh +122 -0
- package/scripts/docs-lint/identity-email-detector.sh +48 -0
- package/scripts/docs-lint/test-linters.sh +354 -0
- package/scripts/docs-lint/wc-budget.sh +61 -0
- package/scripts/githooks/pre-push +75 -0
- package/server.json +13 -0
- package/settings-wrapper/Dockerfile +9 -0
- package/settings-wrapper/README.md +119 -0
- package/settings-wrapper/app.py +113 -0
- package/settings-wrapper/requirements.txt +2 -0
- package/settings-wrapper/skills.json +25 -0
- package/skills/README.md +46 -0
- package/skills/examples/algorithmic-art/SKILL.md +405 -0
- package/skills/examples/algorithmic-art/templates/generator_template.js +223 -0
- package/skills/examples/algorithmic-art/templates/viewer.html +601 -0
- package/skills/examples/artifacts-builder/SKILL.md +74 -0
- package/skills/examples/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/examples/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/examples/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/examples/canvas-design/LICENSE.txt +202 -0
- package/skills/examples/canvas-design/SKILL.md +130 -0
- package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/examples/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/examples/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/examples/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/examples/copy-editing/SKILL.md +447 -0
- package/skills/examples/copy-editing/evals/evals.json +89 -0
- package/skills/examples/copy-editing/references/plain-english-alternatives.md +394 -0
- package/skills/examples/internal-comms/LICENSE.txt +202 -0
- package/skills/examples/internal-comms/SKILL.md +32 -0
- package/skills/examples/internal-comms/examples/3p-updates.md +47 -0
- package/skills/examples/internal-comms/examples/company-newsletter.md +65 -0
- package/skills/examples/internal-comms/examples/faq-answers.md +30 -0
- package/skills/examples/internal-comms/examples/general-comms.md +16 -0
- package/skills/examples/mcp-builder/SKILL.md +328 -0
- package/skills/examples/mcp-builder/reference/evaluation.md +602 -0
- package/skills/examples/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/skills/examples/mcp-builder/reference/node_mcp_server.md +916 -0
- package/skills/examples/mcp-builder/reference/python_mcp_server.md +752 -0
- package/skills/examples/mcp-builder/scripts/connections.py +151 -0
- package/skills/examples/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/examples/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/examples/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/examples/product-marketing-context/SKILL.md +241 -0
- package/skills/examples/product-marketing-context/evals/evals.json +85 -0
- package/skills/examples/single-cell-rna-qc/SKILL.md +175 -0
- package/skills/examples/single-cell-rna-qc/references/scverse_qc_guidelines.md +186 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_analysis.py +232 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_core.py +233 -0
- package/skills/examples/single-cell-rna-qc/scripts/qc_plotting.py +235 -0
- package/skills/examples/skill-creator/SKILL.md +355 -0
- package/skills/examples/skill-creator/references/output-patterns.md +82 -0
- package/skills/examples/skill-creator/references/workflows.md +28 -0
- package/skills/examples/skill-creator/scripts/init_skill.py +303 -0
- package/skills/examples/skill-creator/scripts/package_skill.py +110 -0
- package/skills/examples/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/examples/slack-gif-creator/SKILL.md +254 -0
- package/skills/examples/slack-gif-creator/core/easing.py +234 -0
- package/skills/examples/slack-gif-creator/core/frame_composer.py +176 -0
- package/skills/examples/slack-gif-creator/core/gif_builder.py +269 -0
- package/skills/examples/slack-gif-creator/core/validators.py +136 -0
- package/skills/examples/slack-gif-creator/requirements.txt +4 -0
- package/skills/examples/social-content/SKILL.md +278 -0
- package/skills/examples/social-content/evals/evals.json +92 -0
- package/skills/examples/social-content/references/platforms.md +170 -0
- package/skills/examples/social-content/references/post-templates.md +177 -0
- package/skills/examples/social-content/references/reverse-engineering.md +195 -0
- package/skills/examples/theme-factory/SKILL.md +59 -0
- package/skills/examples/theme-factory/theme-showcase.pdf +0 -0
- package/skills/examples/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/examples/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/examples/theme-factory/themes/desert-rose.md +19 -0
- package/skills/examples/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/examples/theme-factory/themes/golden-hour.md +19 -0
- package/skills/examples/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/examples/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/examples/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/examples/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/examples/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/examples/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/examples/web-artifacts-builder/SKILL.md +74 -0
- package/skills/examples/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/skills/examples/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/skills/examples/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/examples/writing-skills/SKILL.md +655 -0
- package/skills/examples/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/examples/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/examples/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/examples/writing-skills/persuasion-principles.md +187 -0
- package/skills/examples/writing-skills/render-graphs.js +168 -0
- package/skills/examples/writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/public/describe-image/SKILL.md +105 -0
- package/skills/public/describe-image/scripts/describe.py +389 -0
- package/skills/public/doc-coauthoring/SKILL.md +375 -0
- package/skills/public/docx/LICENSE.txt +30 -0
- package/skills/public/docx/SKILL.md +199 -0
- package/skills/public/docx/docx-js.md +350 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/public/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/public/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/public/docx/ooxml/scripts/pack.py +159 -0
- package/skills/public/docx/ooxml/scripts/unpack.py +29 -0
- package/skills/public/docx/ooxml/scripts/validate.py +69 -0
- package/skills/public/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/public/docx/ooxml/scripts/validation/base.py +951 -0
- package/skills/public/docx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/public/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/public/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/public/docx/ooxml.md +632 -0
- package/skills/public/docx/scripts/__init__.py +1 -0
- package/skills/public/docx/scripts/document.py +1292 -0
- package/skills/public/docx/scripts/templates/comments.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/public/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/public/docx/scripts/templates/people.xml +3 -0
- package/skills/public/docx/scripts/utilities.py +374 -0
- package/skills/public/file-reading/LICENSE.txt +30 -0
- package/skills/public/file-reading/SKILL.md +350 -0
- package/skills/public/frontend-design/LICENSE.txt +177 -0
- package/skills/public/frontend-design/SKILL.md +42 -0
- package/skills/public/gitlab-explorer/SKILL.md +174 -0
- package/skills/public/gitlab-explorer/references/git-commands.md +323 -0
- package/skills/public/gitlab-explorer/references/glab-commands.md +282 -0
- package/skills/public/gitlab-explorer/scripts/check_gitlab_auth.sh +109 -0
- package/skills/public/pdf/FORMS.md +205 -0
- package/skills/public/pdf/REFERENCE.md +612 -0
- package/skills/public/pdf/SKILL.md +364 -0
- package/skills/public/pdf/scripts/check_bounding_boxes.py +70 -0
- package/skills/public/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/skills/public/pdf/scripts/check_fillable_fields.py +12 -0
- package/skills/public/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/skills/public/pdf/scripts/create_validation_image.py +41 -0
- package/skills/public/pdf/scripts/extract_form_field_info.py +152 -0
- package/skills/public/pdf/scripts/fill_fillable_fields.py +114 -0
- package/skills/public/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/skills/public/pdf-reading/LICENSE.txt +30 -0
- package/skills/public/pdf-reading/REFERENCE.md +196 -0
- package/skills/public/pdf-reading/SKILL.md +305 -0
- package/skills/public/playwright-cli/SKILL.md +278 -0
- package/skills/public/playwright-cli/references/request-mocking.md +87 -0
- package/skills/public/playwright-cli/references/running-code.md +232 -0
- package/skills/public/playwright-cli/references/session-management.md +169 -0
- package/skills/public/playwright-cli/references/storage-state.md +275 -0
- package/skills/public/playwright-cli/references/test-generation.md +88 -0
- package/skills/public/playwright-cli/references/tracing.md +139 -0
- package/skills/public/playwright-cli/references/video-recording.md +43 -0
- package/skills/public/pptx/LICENSE.txt +30 -0
- package/skills/public/pptx/SKILL.md +484 -0
- package/skills/public/pptx/css.md +335 -0
- package/skills/public/pptx/html2pptx.md +893 -0
- package/skills/public/pptx/html2pptx.tgz +0 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/public/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/public/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/public/pptx/ooxml/scripts/pack.py +159 -0
- package/skills/public/pptx/ooxml/scripts/unpack.py +29 -0
- package/skills/public/pptx/ooxml/scripts/validate.py +69 -0
- package/skills/public/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/public/pptx/ooxml/scripts/validation/base.py +951 -0
- package/skills/public/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/public/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/public/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/public/pptx/ooxml.md +427 -0
- package/skills/public/pptx/scripts/inventory.py +1020 -0
- package/skills/public/pptx/scripts/rearrange.py +231 -0
- package/skills/public/pptx/scripts/replace.py +385 -0
- package/skills/public/pptx/scripts/thumbnail.py +450 -0
- package/skills/public/skill-creator/SKILL.md +356 -0
- package/skills/public/skill-creator/references/output-patterns.md +82 -0
- package/skills/public/skill-creator/references/workflows.md +28 -0
- package/skills/public/skill-creator/scripts/init_skill.py +303 -0
- package/skills/public/skill-creator/scripts/package_skill.py +110 -0
- package/skills/public/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/public/sub-agent/SKILL.md +186 -0
- package/skills/public/sub-agent/references/security-review.md +153 -0
- package/skills/public/sub-agent/references/usage.md +207 -0
- package/skills/public/sub-agent/scripts/list_subagent_models.sh +22 -0
- package/skills/public/test-driven-development/SKILL.md +371 -0
- package/skills/public/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/public/webapp-testing/LICENSE.txt +202 -0
- package/skills/public/webapp-testing/SKILL.md +96 -0
- package/skills/public/webapp-testing/examples/console_logging.py +35 -0
- package/skills/public/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/public/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/public/webapp-testing/scripts/with_server.py +106 -0
- package/skills/public/xlsx/LICENSE.txt +30 -0
- package/skills/public/xlsx/SKILL.md +316 -0
- package/skills/public/xlsx/preview_data.py +93 -0
- package/skills/public/xlsx/recalc.py +178 -0
- package/tests/README.md +42 -0
- package/tests/fixtures/cli/claude_v0.9.2.0_argv.json +46 -0
- package/tests/fixtures/cli/claude_v0.9.2.0_stdout.json +32 -0
- package/tests/fixtures/cli/codex_run.jsonl +4 -0
- package/tests/fixtures/cli/opencode_run.jsonl +6 -0
- package/tests/integration/README.md +56 -0
- package/tests/integration/conftest.py +280 -0
- package/tests/integration/pytest.ini +13 -0
- package/tests/integration/test_mcp_auth.py +85 -0
- package/tests/integration/test_mcp_tools.py +101 -0
- package/tests/integration/test_workspace_lifecycle.py +125 -0
- package/tests/orchestrator/mock_llm_server.py +343 -0
- package/tests/orchestrator/test_cli_adapters.py +566 -0
- package/tests/orchestrator/test_cli_adapters_live.py +527 -0
- package/tests/orchestrator/test_cli_runtime.py +451 -0
- package/tests/orchestrator/test_docker_manager.py +302 -0
- package/tests/orchestrator/test_dynamic_instructions.py +69 -0
- package/tests/orchestrator/test_mcp_resources.py +140 -0
- package/tests/orchestrator/test_mcp_tools.py +224 -0
- package/tests/orchestrator/test_passthrough_isolation.py +201 -0
- package/tests/orchestrator/test_readme_in_container.py +76 -0
- package/tests/orchestrator/test_render_cache.py +84 -0
- package/tests/orchestrator/test_runtime_cli_endpoint.py +108 -0
- package/tests/orchestrator/test_single_user_mode.py +212 -0
- package/tests/orchestrator/test_startup_warnings.py +123 -0
- package/tests/orchestrator/test_sub_agent_dispatch.py +327 -0
- package/tests/orchestrator/test_subagent_claude_compat.py +367 -0
- package/tests/orchestrator/test_system_prompt_endpoint.py +191 -0
- package/tests/orchestrator/test_tool_descriptions.py +52 -0
- package/tests/orchestrator/test_view_image.py +201 -0
- package/tests/patches/conftest.py +30 -0
- package/tests/patches/fixtures/__init__.py +10 -0
- package/tests/patches/fixtures/middleware_v0.9.1.py +5057 -0
- package/tests/patches/fixtures/middleware_v0.9.2.py +5120 -0
- package/tests/patches/fixtures/retrieval_v0.9.1.py +2684 -0
- package/tests/patches/fixtures/retrieval_v0.9.2.py +2700 -0
- package/tests/patches/test_fix_attached_files_position.py +118 -0
- package/tests/patches/test_fix_large_tool_args.py +130 -0
- package/tests/patches/test_fix_large_tool_results.py +531 -0
- package/tests/patches/test_fix_skip_embedding_chat_files.py +160 -0
- package/tests/patches/test_fix_skip_rag_files_native_fc.py +120 -0
- package/tests/patches/test_fix_tool_loop_errors.py +128 -0
- package/tests/security/test_path_traversal_app.py +132 -0
- package/tests/security/test_path_traversal_docker.py +36 -0
- package/tests/security/test_path_traversal_settings.py +87 -0
- package/tests/security/test_safe_path_util.py +166 -0
- package/tests/security/test_xss_preview.py +46 -0
- package/tests/test-default-model-resolution.py +136 -0
- package/tests/test-docker-image.sh +358 -0
- package/tests/test-list-subagent-models.sh +421 -0
- package/tests/test-mcp-endpoint-live.sh +92 -0
- package/tests/test-mcp-native-surface.sh +213 -0
- package/tests/test-no-cyrillic.sh +135 -0
- package/tests/test-opencode-error-mapping.py +130 -0
- package/tests/test-pr88-skills.sh +305 -0
- package/tests/test-project-structure.sh +202 -0
- package/tests/test-single-user-mode.sh +269 -0
- package/tests/test-skill-no-hardcoded-models.sh +65 -0
- package/tests/test-subagent-cli-surface.py +137 -0
- package/tests/test-subagent-runtime.sh +109 -0
- package/tests/test_codex_toml_converter.py +204 -0
- package/tests/test_default_resolver_no_legacy_global.py +159 -0
- package/tests/test_filter.py +648 -0
- package/tests/test_init_sh_unchanged.sh +49 -0
- package/tests/test_opencode_alias_map_drop.py +144 -0
- package/tests/test_requirements.py +91 -0
- package/tests/test_subagent_docstring.py +193 -0
- package/tests/test_tools.py +34 -0
- package/vendor/extract-text/README.md +46 -0
- package/vendor/extract-text/extract-text +0 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Comparison: Open Computer Use vs open-webui/open-terminal
|
|
2
|
+
|
|
3
|
+
Both projects are self-hosted and give LLMs a place to run code. They solve the same core problem with two fundamentally different architectural approaches — both for the technical stack and for the AI/user interaction model. This is not a "which is better" document; it's a map of trade-offs to help you pick the right tool for your use case.
|
|
4
|
+
|
|
5
|
+
> **Note:** We respect the open-terminal team and their work. If you spot any inaccuracies in this comparison, please [open an issue](https://github.com/Wide-Moat/open-computer-use/issues) — we want this to be fair and factual.
|
|
6
|
+
|
|
7
|
+
Claude.ai and OpenAI Operator are cloud-only, not self-hosted — we drew inspiration from them, but a detailed comparison isn't useful here. See the overview table for a quick reference.
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
| Feature | Open Computer Use | [open-terminal](https://github.com/open-webui/open-terminal) | Claude.ai | OpenAI Operator |
|
|
12
|
+
|---------|-------------------|---------------|-----------|-----------------|
|
|
13
|
+
| **Self-hosted** | Yes | Yes | No | No |
|
|
14
|
+
| **Managed SaaS option** | Yes — [yambr.com](https://yambr.com) (free demo at [chat.yambr.com](https://chat.yambr.com), hosted MCP at `api.yambr.com/mcp/computer_use`) | No | Yes (claude.ai) | Yes (operator) |
|
|
15
|
+
| **Any LLM** | Yes (OpenAI-compatible) | Any (via Open WebUI) | Claude only | GPT only |
|
|
16
|
+
| **Code execution** | Full Linux sandbox | Sandbox / bare metal | Sandbox | No |
|
|
17
|
+
| **Live browser** | CDP streaming (shared, interactive) | No | Screenshot-based | Screenshot-based |
|
|
18
|
+
| **Terminal** | ttyd + tmux (persistent, side panel) | PTY + WebSocket | IDE + terminal | N/A |
|
|
19
|
+
| **Sub-agent** | Claude Code CLI, interactive TTY + MCP | N/A | Built-in | N/A |
|
|
20
|
+
| **Skills system** | 13 built-in (auto-injected) + custom | Open WebUI native (text-only) | Custom instructions | N/A |
|
|
21
|
+
| **Document creation** | PPTX, DOCX, XLSX, PDF via skills | No | Via code | N/A |
|
|
22
|
+
| **File preview** | Server-side rendering (DOCX, PDF, PPTX, XLSX, code) | Client-side (via Open WebUI) | IDE | N/A |
|
|
23
|
+
| **Container isolation** | Docker (runc), per chat | Shared container (OS-level users) | Docker (gVisor) | N/A |
|
|
24
|
+
| **MCP server** | Streamable HTTP | FastMCP (stdio + streamable-http) | N/A | N/A |
|
|
25
|
+
| **Image size** | ~11 GB (full stack) | ~2 GB / ~200 MB / ~100 MB | N/A | N/A |
|
|
26
|
+
| **Setup complexity** | Docker Compose + reverse proxy + env config | Single `docker run` or `pip install` | N/A | N/A |
|
|
27
|
+
| **Jupyter notebooks** | No | Yes (per-session kernels via nbclient) | No | No |
|
|
28
|
+
| **Bare metal** | No (Docker required) | Yes (`pip install open-terminal`) | No | No |
|
|
29
|
+
| **Port proxy** | No | Yes (HTTP reverse-proxy to localhost services) | No | No |
|
|
30
|
+
| **Ecosystem** | Multi-client MCP server (Open WebUI, n8n, OpenAI Agents SDK, LiteLLM) | Native Open WebUI integration + enterprise orchestrator ([Terminals](https://github.com/open-webui/terminals)) | N/A | N/A |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Architecture and Isolation
|
|
35
|
+
|
|
36
|
+
**Open Computer Use** creates a new Docker container for every chat session. If the AI breaks something (installs wrong packages, corrupts files, fills disk), only that chat is affected. Next chat starts fresh. Containers are cleaned up automatically after idle timeout. Resource limits (2 GB RAM, 1 CPU) are enforced per container.
|
|
37
|
+
|
|
38
|
+
**open-terminal** runs a single container (or bare metal process) shared across sessions. Multi-user mode creates OS-level user accounts with isolated home directories (`chmod 2770` + group membership), file ownership enforcement via `sudo chown`, and path validation to prevent cross-user access. For container-per-user isolation, the separate [Terminals](https://github.com/open-webui/terminals) project manages dedicated open-terminal containers per user.
|
|
39
|
+
|
|
40
|
+
**Why this matters:** Non-technical users + AI agent executing arbitrary code is the worst case for a shared environment. The user doesn't control what the agent does, and the agent can do anything — install packages, fill disk, corrupt files, spawn processes. Container-per-chat means each session is disposable: if something breaks, only that chat is affected, and the next one starts clean.
|
|
41
|
+
|
|
42
|
+
**Trade-off:** Each container has a 2 GB RAM limit (configurable via `CONTAINER_MEM_LIMIT`). This is a ceiling, not an allocation — an idle container or one running simple commands uses very little memory. Heavy tasks like Chromium or LibreOffice consume more, up to the limit. open-terminal is lighter but shares kernel, network, and system resources between users. open-terminal's own documentation [notes](https://github.com/open-webui/open-terminal#built-in-multi-user-isolation) that single-container multi-user mode is not designed for production multi-user deployments.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## MCP Tools
|
|
47
|
+
|
|
48
|
+
The two projects take opposite approaches to tool design.
|
|
49
|
+
|
|
50
|
+
**Open Computer Use** exposes 5 high-level tools:
|
|
51
|
+
|
|
52
|
+
| Tool | Description |
|
|
53
|
+
|------|-------------|
|
|
54
|
+
| `bash_tool` | Run commands with real-time progress streaming, 15s heartbeats, 30K char output cap, timeout handling |
|
|
55
|
+
| `view` | Read files/directories with line numbers, auto-resize images to base64, detect binary formats |
|
|
56
|
+
| `create_file` | Create files with auto-parent-directory creation |
|
|
57
|
+
| `str_replace` | Edit files via find-and-replace with uniqueness validation |
|
|
58
|
+
| `sub_agent` | Delegate to Claude Code with model selection, session resume, MCP auto-config, cost tracking |
|
|
59
|
+
|
|
60
|
+
**open-terminal** exposes 15 core MCP tools via FastMCP (+ 4 notebook tools when enabled):
|
|
61
|
+
|
|
62
|
+
| Category | Tools |
|
|
63
|
+
|----------|-------|
|
|
64
|
+
| Files | list, read, write, display, replace, upload, grep, glob |
|
|
65
|
+
| Processes | execute, list, status, input, kill |
|
|
66
|
+
| Notebooks | create session, execute cell, get session, delete session |
|
|
67
|
+
|
|
68
|
+
**Trade-off:** Fewer powerful primitives (the AI uses `bash_tool` for search, process management, and anything else) vs. fine-grained operations that don't require shell knowledge.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Security
|
|
73
|
+
|
|
74
|
+
| Aspect | Open Computer Use | open-terminal |
|
|
75
|
+
|--------|-------------------|---------------|
|
|
76
|
+
| **Isolation** | Docker containers (kernel namespaces) | OS user accounts (chmod 2770 + group membership) |
|
|
77
|
+
| **Privilege escalation** | Non-root user with passwordless sudo; `no-new-privileges` flag | Non-root user with passwordless sudo (full image); no sudo in slim/alpine |
|
|
78
|
+
| **Resource limits** | Per-container (2 GB RAM, 1 CPU default) | OS-level only |
|
|
79
|
+
| **Egress firewall** | Configurable (Docker network policies) | Built-in DNS whitelist (dnsmasq + iptables + ipset), CAP_NET_ADMIN dropped after setup |
|
|
80
|
+
| **API key auth** | Bearer token (MCP_API_KEY) | Bearer token, constant-time comparison (hmac.compare_digest) |
|
|
81
|
+
| **Path traversal** | Sanitized chat_id + safe_path validation | resolve_path + is_path_allowed validation |
|
|
82
|
+
| **Skill/upload mounts** | Read-only | N/A |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## What Open Computer Use offers that open-terminal doesn't
|
|
87
|
+
|
|
88
|
+
- **Document creation skills** — 13 built-in skills with scripts and templates for generating professional documents:
|
|
89
|
+
- **PPTX**: HTML/CSS → PowerPoint via custom `html2pptx` library, or template-based editing with `inventory.py` (extract shapes), `replace.py` (smart text replacement), `thumbnail.py` (visual validation)
|
|
90
|
+
- **DOCX**: create from scratch with `docx-js`, or edit existing with tracked changes (OOXML redlining via `<w:ins>`/`<w:del>` tags)
|
|
91
|
+
- **XLSX**: formula-based spreadsheets with `openpyxl`, automatic recalculation via LibreOffice UNO (`recalc.py`), error scanning (#REF!, #DIV/0!)
|
|
92
|
+
- **PDF**: create with ReportLab (pre-registered Cyrillic/Emoji fonts), extract tables with tabula-py/camelot, fill forms, merge/split
|
|
93
|
+
- **Skill auto-injection** — skills with scripts, templates, and examples are mounted read-only into containers and injected into the system prompt. The AI gets structured instructions, not just text. Per-user custom skills via Settings Wrapper API.
|
|
94
|
+
- **Live shared browser** — Playwright + CDP streaming: AI automates via CDP, user watches and interacts in real-time (clicks, types passwords, scrolls) in the same Chromium instance. Not screenshot-based.
|
|
95
|
+
- **Claude Code sub-agent** — delegate complex multi-step tasks to Claude Code running autonomously inside the container. Supports model selection (sonnet/opus), session resume after timeout, cost/turns tracking, and auto-configured MCP servers.
|
|
96
|
+
- **Server-side file preview** — preview panel renders DOCX (via Mammoth), XLSX (multi-sheet tables), PDF (page-by-page canvas), PPTX (slide navigation), Markdown, images, and code with syntax highlighting. Works from any MCP client, not tied to Open WebUI's UI.
|
|
97
|
+
- **Container-per-chat isolation** — every chat gets a fresh Docker container with its own filesystem, network, and resource limits. Containers auto-cleanup after idle timeout. No cross-session contamination.
|
|
98
|
+
- **Persistent terminal** — ttyd + tmux: terminal sessions survive disconnects, user can switch between chat and terminal freely, or leave the chat interface entirely and work in the container via direct URL.
|
|
99
|
+
- **Pre-installed stack** — ~180 packages: LibreOffice suite, Playwright + Chromium, OCR (Tesseract), computer vision (OpenCV), image processing (ImageMagick, Pillow, sharp), GitLab CLI (glab), fonts (DejaVu, Noto CJK/Emoji for PDF/reports), ML libraries (JAX, ONNX Runtime, MediaPipe). Image size is ~11 GB vs open-terminal's ~2 GB / ~200 MB / ~100 MB.
|
|
100
|
+
- **Vision AI** — `describe-image` skill for multi-modal image analysis (charts, diagrams, screenshots) via Vision API.
|
|
101
|
+
- **Multi-client MCP support** — tested with Open WebUI, n8n, OpenAI Agents SDK, and LiteLLM. open-terminal also supports multiple transports (stdio + streamable-http via FastMCP) but is primarily tested with Open WebUI.
|
|
102
|
+
- **Container resurrection** — if a container is removed (e.g. by cron), saved metadata allows recreating it with the same volumes, environment, and MCP config.
|
|
103
|
+
- **Smart tool output** — bash_tool streams progress with 15s heartbeats, caps output at 30K chars (first/last 15K), handles semantic exit codes (grep returning 1 is "no match", not error).
|
|
104
|
+
|
|
105
|
+
## What open-terminal offers that we don't
|
|
106
|
+
|
|
107
|
+
- **Jupyter notebooks** — per-session kernels via nbclient, create and execute notebooks through the API
|
|
108
|
+
- **Bare metal mode** — `pip install open-terminal`, no Docker needed
|
|
109
|
+
- **Port proxy** — HTTP reverse-proxy to localhost services for web development
|
|
110
|
+
- **Lightweight image variants** — slim (~200 MB, Debian) and alpine (~100 MB) for minimal footprint
|
|
111
|
+
- **Document text extraction as API** — dedicated endpoint reads 11 formats as plain text (PDF, DOCX, PPTX, XLSX, XLS, RTF, ODT, ODS, ODP, EPUB, EML)
|
|
112
|
+
- **Process stdin** — send input to running processes (interactive CLI tools)
|
|
113
|
+
- **Session CWD tracking** — per-session working directory for the API, since open-terminal is stateless between requests
|
|
114
|
+
- **Runtime package installation via env vars** — `OPEN_TERMINAL_PACKAGES="cowsay"` installs apt/pip/npm packages at container startup without rebuilding the image
|
|
115
|
+
- **Docker-in-Docker** — Docker CLI + Compose + Buildx pre-installed, mount the socket for full DinD
|
|
116
|
+
- **TOML config files** — configure via `~/.config/open-terminal/config.toml` or `/etc/open-terminal/config.toml`
|
|
117
|
+
- **Log management** — per-process JSONL logs with configurable retention (7 days default) and flush tuning
|
|
118
|
+
- **Simpler setup** — single `docker run` command
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## When to choose what
|
|
123
|
+
|
|
124
|
+
**Choose Open Computer Use** for workflows that need browser automation, document creation, or Claude Code sub-agent. Container-per-chat isolation gives each session its own filesystem, network, and resource limits. Works across MCP clients (Open WebUI, n8n, OpenAI Agents SDK, LiteLLM).
|
|
125
|
+
|
|
126
|
+
**Choose open-terminal** for terminal-first workflows, especially in Open WebUI environments. Native integration with the Open WebUI ecosystem, minimal setup (single `docker run` or `pip install`), Jupyter notebooks, port proxying, and image variants from ~100 MB to ~2 GB. For multi-user deployments, the [Terminals](https://github.com/open-webui/terminals) project provides enterprise-grade container orchestration.
|
|
127
|
+
|
|
128
|
+
**Use both together:** Open WebUI supports connecting to both simultaneously — choose per task based on what each does best.
|
package/docs/DOCKER.md
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
# Docker Architecture
|
|
2
|
+
|
|
3
|
+
Technical documentation for the AI Computer Use Docker environment.
|
|
4
|
+
|
|
5
|
+
## Architecture Overview
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
See also: [architecture.svg](architecture.svg) for the full system diagram.
|
|
10
|
+
|
|
11
|
+
**Volume Mounts:**
|
|
12
|
+
- `uploads` → `/mnt/user-data/uploads` (read-only)
|
|
13
|
+
- `outputs` → `/mnt/user-data/outputs` (read-write, served via HTTP)
|
|
14
|
+
- `skills` → `/mnt/skills` (read-only)
|
|
15
|
+
- `workspace` → `/home/assistant` (read-write, per-chat Docker volume)
|
|
16
|
+
|
|
17
|
+
## Dockerfile Structure
|
|
18
|
+
|
|
19
|
+
### Multi-Stage Build
|
|
20
|
+
|
|
21
|
+
The Dockerfile uses a multi-stage build approach for optimal layer caching:
|
|
22
|
+
|
|
23
|
+
1. **base**: Environment variables
|
|
24
|
+
2. **system-packages**: APT packages installation
|
|
25
|
+
3. **python-deps**: Python packages
|
|
26
|
+
4. **node-deps**: Node.js packages
|
|
27
|
+
5. **playwright-setup**: Playwright browsers
|
|
28
|
+
6. **final**: Directory structure and permissions
|
|
29
|
+
|
|
30
|
+
### Benefits
|
|
31
|
+
- Faster rebuilds (cached layers)
|
|
32
|
+
- Smaller final image (no build artifacts)
|
|
33
|
+
- Better organization
|
|
34
|
+
|
|
35
|
+
## Components
|
|
36
|
+
|
|
37
|
+
### Python Environment
|
|
38
|
+
|
|
39
|
+
**Version**: 3.12.3
|
|
40
|
+
|
|
41
|
+
**Key Packages** (107 total):
|
|
42
|
+
- Document: python-docx 1.2.0, python-pptx 1.0.2, openpyxl 3.1.5
|
|
43
|
+
- PDF: pypdf 5.9.0, pdfplumber 0.11.7, reportlab 4.4.10
|
|
44
|
+
- Image: Pillow 11.3.0, opencv-python 4.11.0
|
|
45
|
+
- Data: pandas 2.3.3, numpy 2.3.3
|
|
46
|
+
- Web: playwright 1.57.0, requests 2.32.5
|
|
47
|
+
|
|
48
|
+
### Node.js Environment
|
|
49
|
+
|
|
50
|
+
**Version**: 22.20.0
|
|
51
|
+
|
|
52
|
+
**Key Packages** (21 total):
|
|
53
|
+
- React 19.2.0 + react-dom
|
|
54
|
+
- TypeScript 5.9.3
|
|
55
|
+
- pdf-lib 1.17.1
|
|
56
|
+
- mermaid-cli 11.12.0
|
|
57
|
+
- marked 16.4.0
|
|
58
|
+
|
|
59
|
+
### System Packages
|
|
60
|
+
|
|
61
|
+
**Total**: 108 APT packages
|
|
62
|
+
|
|
63
|
+
**Categories**:
|
|
64
|
+
- Build tools: gcc 13, g++ 13, make
|
|
65
|
+
- Java: OpenJDK 21
|
|
66
|
+
- LibreOffice: writer, calc, impress
|
|
67
|
+
- Media: ffmpeg, imagemagick
|
|
68
|
+
- OCR: tesseract-ocr (EN, RU)
|
|
69
|
+
- Fonts: 20+ font packages
|
|
70
|
+
|
|
71
|
+
## Mount Points
|
|
72
|
+
|
|
73
|
+
### 1. User Data Uploads (Read-Only)
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
Host: ./data/uploads
|
|
77
|
+
Container: /mnt/user-data/uploads
|
|
78
|
+
Mode: ro (read-only)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Purpose**: Input files for processing
|
|
82
|
+
**Usage**: Place files here from host, read from container
|
|
83
|
+
|
|
84
|
+
### 2. User Data Outputs (Read-Write)
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
Host: ./data/outputs
|
|
88
|
+
Container: /mnt/user-data/outputs
|
|
89
|
+
Mode: rw (read-write)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Purpose**: Generated files and results
|
|
93
|
+
**Usage**: Write from container, read from host
|
|
94
|
+
|
|
95
|
+
### 3. Skills System (Read-Only)
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
Host: ./skills
|
|
99
|
+
Container: /mnt/skills
|
|
100
|
+
Mode: ro (read-only)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Purpose**: Skills system files
|
|
104
|
+
**Structure**:
|
|
105
|
+
- /mnt/skills/public/ - Core skills
|
|
106
|
+
- /mnt/skills/examples/ - Example implementations
|
|
107
|
+
|
|
108
|
+
### 4. Workspace (Ephemeral)
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
Volume: ai-workspace
|
|
112
|
+
Container: /home/assistant
|
|
113
|
+
Mode: rw (read-write)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Purpose**: Temporary working directory
|
|
117
|
+
**Lifecycle**: Data cleared when volume is removed
|
|
118
|
+
**Usage**: Temporary files, intermediate processing
|
|
119
|
+
|
|
120
|
+
## Resource Management
|
|
121
|
+
|
|
122
|
+
### CPU Limits
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
limits:
|
|
126
|
+
cpus: '4.0' # Maximum 4 cores
|
|
127
|
+
reservations:
|
|
128
|
+
cpus: '2.0' # Reserved 2 cores
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Memory Limits
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
limits:
|
|
135
|
+
memory: 8G # Maximum 8GB
|
|
136
|
+
reservations:
|
|
137
|
+
memory: 4G # Reserved 4GB
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Disk Usage
|
|
141
|
+
|
|
142
|
+
- **Base Image**: ~1GB (Ubuntu 24.04)
|
|
143
|
+
- **Python Packages**: ~5GB
|
|
144
|
+
- **Node Packages**: ~500MB
|
|
145
|
+
- **Playwright Browsers**: ~500MB (Chromium only)
|
|
146
|
+
- **System Packages**: ~3GB
|
|
147
|
+
- **Total**: ~15-20GB
|
|
148
|
+
|
|
149
|
+
## Networking
|
|
150
|
+
|
|
151
|
+
### Default Configuration
|
|
152
|
+
|
|
153
|
+
```yaml
|
|
154
|
+
network_mode: bridge
|
|
155
|
+
ports:
|
|
156
|
+
- "8000:8000" # HTTP server (optional)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### DNS Configuration
|
|
160
|
+
|
|
161
|
+
Default: Uses Docker bridge network DNS
|
|
162
|
+
|
|
163
|
+
Custom DNS (if needed):
|
|
164
|
+
```yaml
|
|
165
|
+
dns:
|
|
166
|
+
- 8.8.8.8
|
|
167
|
+
- 8.8.4.4
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Security
|
|
171
|
+
|
|
172
|
+
### Enabled Features
|
|
173
|
+
|
|
174
|
+
1. **no-new-privileges**: Prevents privilege escalation
|
|
175
|
+
2. **Read-only mounts**: Skills and uploads are read-only
|
|
176
|
+
3. **Network isolation**: Bridge network mode
|
|
177
|
+
4. **Resource limits**: CPU and memory constraints (configurable, see examples above)
|
|
178
|
+
5. **Standard Docker runtime (runc)**: Containers share the host kernel. For stronger isolation, consider [gVisor (runsc)](https://gvisor.dev/) which intercepts syscalls in userspace — this is what Claude.ai uses. gVisor support is on the roadmap. On Kubernetes, the [Helm chart](kubernetes.md) already supports hypervisor-grade isolation today via [Kata Containers](kata-runtime.md).
|
|
179
|
+
|
|
180
|
+
### Optional Hardening
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
# Read-only root filesystem
|
|
184
|
+
read_only: true
|
|
185
|
+
tmpfs:
|
|
186
|
+
- /tmp:rw,noexec,nosuid
|
|
187
|
+
- /home/assistant:rw,noexec,nosuid
|
|
188
|
+
|
|
189
|
+
# Drop all capabilities
|
|
190
|
+
cap_drop:
|
|
191
|
+
- ALL
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Health Checks
|
|
195
|
+
|
|
196
|
+
### Docker Compose
|
|
197
|
+
|
|
198
|
+
```yaml
|
|
199
|
+
healthcheck:
|
|
200
|
+
test: ["CMD", "python3", "-c", "import sys; sys.exit(0)"]
|
|
201
|
+
interval: 30s
|
|
202
|
+
timeout: 10s
|
|
203
|
+
start_period: 10s
|
|
204
|
+
retries: 3
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Manual Health Check
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
docker exec ai-computer-use python3 -c "import sys; sys.exit(0)"
|
|
211
|
+
echo $? # Should output 0
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Environment Variables
|
|
215
|
+
|
|
216
|
+
### Python
|
|
217
|
+
- `PYTHONUNBUFFERED=1`: Unbuffered output
|
|
218
|
+
- `PIP_BREAK_SYSTEM_PACKAGES=1`: Allow system-wide pip installs
|
|
219
|
+
- `PYTHONDONTWRITEBYTECODE=1`: No .pyc files
|
|
220
|
+
|
|
221
|
+
### Node.js
|
|
222
|
+
- `NODE_PATH=/usr/local/lib/node_modules_global`
|
|
223
|
+
- `NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt`
|
|
224
|
+
|
|
225
|
+
### Java
|
|
226
|
+
- `JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64`
|
|
227
|
+
|
|
228
|
+
### Playwright
|
|
229
|
+
- `PLAYWRIGHT_BROWSERS_PATH=/opt/pw-browsers`
|
|
230
|
+
|
|
231
|
+
### SSL/TLS
|
|
232
|
+
- `REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt`
|
|
233
|
+
- `SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt`
|
|
234
|
+
|
|
235
|
+
## Performance Optimization
|
|
236
|
+
|
|
237
|
+
### Build Optimization
|
|
238
|
+
|
|
239
|
+
1. **Layer Caching**: Install packages in order of change frequency
|
|
240
|
+
2. **Multi-stage**: Separate build stages for better caching
|
|
241
|
+
3. **Cleanup**: Remove package caches after installation
|
|
242
|
+
|
|
243
|
+
### Runtime Optimization
|
|
244
|
+
|
|
245
|
+
1. **Volume Mounts**: Fast I/O for data directories
|
|
246
|
+
2. **Resource Limits**: Prevent resource exhaustion
|
|
247
|
+
3. **Ephemeral Workspace**: Named volume for fast disk access
|
|
248
|
+
|
|
249
|
+
## Troubleshooting
|
|
250
|
+
|
|
251
|
+
### Check Container Status
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
docker-compose ps
|
|
255
|
+
docker stats ai-computer-use
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### View Resource Usage
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
docker stats ai-computer-use --no-stream
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Inspect Container
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
docker inspect ai-computer-use
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Access Logs
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
docker-compose logs
|
|
274
|
+
docker-compose logs -f --tail=100
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Execute Commands
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
# One-off command
|
|
281
|
+
docker-compose exec ai-computer-use python3 --version
|
|
282
|
+
|
|
283
|
+
# Interactive shell
|
|
284
|
+
docker-compose exec ai-computer-use /bin/bash
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Maintenance
|
|
288
|
+
|
|
289
|
+
### Update Image
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
docker-compose build --no-cache
|
|
293
|
+
docker-compose up -d
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Clean Up
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
# Remove stopped containers
|
|
300
|
+
docker-compose down
|
|
301
|
+
|
|
302
|
+
# Remove volumes
|
|
303
|
+
docker-compose down -v
|
|
304
|
+
|
|
305
|
+
# Remove images
|
|
306
|
+
docker rmi ai-computer-use
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Backup Data
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
# Backup outputs
|
|
313
|
+
tar -czf outputs_backup.tar.gz data/outputs/
|
|
314
|
+
|
|
315
|
+
# Backup skills (if customized)
|
|
316
|
+
tar -czf skills_backup.tar.gz skills/
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## Advanced Configuration
|
|
320
|
+
|
|
321
|
+
### Custom Base Image
|
|
322
|
+
|
|
323
|
+
Edit Dockerfile:
|
|
324
|
+
```dockerfile
|
|
325
|
+
FROM ubuntu:24.04 # Change to different base
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Additional Packages
|
|
329
|
+
|
|
330
|
+
Add to `apt-packages.txt`:
|
|
331
|
+
```
|
|
332
|
+
package-name
|
|
333
|
+
another-package
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Python Packages
|
|
337
|
+
|
|
338
|
+
Add to `requirements.txt`:
|
|
339
|
+
```
|
|
340
|
+
package-name==version
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Node Packages
|
|
344
|
+
|
|
345
|
+
Add to `package.json`:
|
|
346
|
+
```json
|
|
347
|
+
{
|
|
348
|
+
"dependencies": {
|
|
349
|
+
"package-name": "^version"
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
## CI/CD Integration
|
|
355
|
+
|
|
356
|
+
### GitHub Actions Example
|
|
357
|
+
|
|
358
|
+
```yaml
|
|
359
|
+
name: Build Docker Image
|
|
360
|
+
on: [push]
|
|
361
|
+
jobs:
|
|
362
|
+
build:
|
|
363
|
+
runs-on: ubuntu-latest
|
|
364
|
+
steps:
|
|
365
|
+
- uses: actions/checkout@v3
|
|
366
|
+
- name: Build image
|
|
367
|
+
run: docker-compose build
|
|
368
|
+
- name: Test image
|
|
369
|
+
run: |
|
|
370
|
+
docker-compose up -d
|
|
371
|
+
docker-compose exec -T ai-computer-use python3 --version
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## LiteLLM Integration (Optional)
|
|
375
|
+
|
|
376
|
+
When using Computer Use via LiteLLM proxy, headers are passed through the `extra_headers` mechanism.
|
|
377
|
+
|
|
378
|
+
### Supported Headers
|
|
379
|
+
|
|
380
|
+
| Parameter | Direct Header | OpenWebUI Format | Required |
|
|
381
|
+
|----------|------------------|------------------|--------------|
|
|
382
|
+
| Chat ID | `X-Chat-Id` | `X-OpenWebUI-Chat-Id` | Yes |
|
|
383
|
+
| User Email | `X-User-Email` | `X-OpenWebUI-User-Email` | No |
|
|
384
|
+
| User Name | `X-User-Name` | `X-OpenWebUI-User-Name` | No |
|
|
385
|
+
| GitLab Token | `X-Gitlab-Token` | `X-OpenWebUI-Gitlab-Token` | No |
|
|
386
|
+
| GitLab Host | `X-Gitlab-Host` | `X-OpenWebUI-Gitlab-Host` | No |
|
|
387
|
+
| Anthropic API Key | `X-Anthropic-Api-Key` | `X-OpenWebUI-Anthropic-Api-Key` | No |
|
|
388
|
+
| Anthropic Base URL | `X-Anthropic-Base-Url` | `X-OpenWebUI-Anthropic-Base-Url` | No |
|
|
389
|
+
|
|
390
|
+
### LiteLLM Configuration
|
|
391
|
+
|
|
392
|
+
Add MCP server to your LiteLLM `config.yaml`:
|
|
393
|
+
|
|
394
|
+
```yaml
|
|
395
|
+
mcp_servers:
|
|
396
|
+
docker_ai:
|
|
397
|
+
url: "http://localhost:8081/mcp"
|
|
398
|
+
transport: "http"
|
|
399
|
+
auth_type: "bearer_token"
|
|
400
|
+
auth_value: "<MCP_API_KEY>"
|
|
401
|
+
extra_headers:
|
|
402
|
+
# OpenWebUI headers
|
|
403
|
+
- "x-openwebui-chat-id"
|
|
404
|
+
- "x-openwebui-user-email"
|
|
405
|
+
- "x-openwebui-user-name"
|
|
406
|
+
- "x-openwebui-gitlab-token"
|
|
407
|
+
- "x-openwebui-gitlab-host"
|
|
408
|
+
- "x-openwebui-anthropic-api-key"
|
|
409
|
+
- "x-openwebui-anthropic-base-url"
|
|
410
|
+
# Direct headers
|
|
411
|
+
- "x-chat-id"
|
|
412
|
+
- "x-user-email"
|
|
413
|
+
- "x-user-name"
|
|
414
|
+
- "x-gitlab-token"
|
|
415
|
+
- "x-gitlab-host"
|
|
416
|
+
- "x-anthropic-api-key"
|
|
417
|
+
- "x-anthropic-base-url"
|
|
418
|
+
allowed_tools:
|
|
419
|
+
- "bash_tool"
|
|
420
|
+
- "str_replace"
|
|
421
|
+
- "create_file"
|
|
422
|
+
- "view"
|
|
423
|
+
- "sub_agent"
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### How It Works
|
|
427
|
+
|
|
428
|
+
1. Client (OpenWebUI) adds `X-OpenWebUI-*` headers to requests
|
|
429
|
+
2. LiteLLM forwards them to MCP server (if specified in `extra_headers`)
|
|
430
|
+
3. `mcp_tools.py` reads headers via `set_context_from_headers()`
|
|
431
|
+
4. Priority: direct headers (`X-Chat-Id`) > OpenWebUI headers (`X-OpenWebUI-Chat-Id`)
|
|
432
|
+
|
|
433
|
+
### Example LiteLLM API Request
|
|
434
|
+
|
|
435
|
+
```bash
|
|
436
|
+
curl -X POST http://localhost:4000/v1/chat/completions \
|
|
437
|
+
-H "Authorization: Bearer <API_KEY>" \
|
|
438
|
+
-H "X-OpenWebUI-Chat-Id: my-chat-123" \
|
|
439
|
+
-H "X-OpenWebUI-User-Email: user@example.com" \
|
|
440
|
+
-H "Content-Type: application/json" \
|
|
441
|
+
-d '{
|
|
442
|
+
"model": "claude/claude-sonnet-4-5",
|
|
443
|
+
"messages": [{"role": "user", "content": "Run ls -la"}],
|
|
444
|
+
"tools": [{"type": "mcp", "server_label": "docker_ai"}]
|
|
445
|
+
}'
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### Direct MCP Server Access
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
# List tools
|
|
452
|
+
curl -s http://localhost:8081/mcp -X POST \
|
|
453
|
+
-H "Authorization: Bearer <MCP_API_KEY>" \
|
|
454
|
+
-H "Content-Type: application/json" \
|
|
455
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
|
|
456
|
+
|
|
457
|
+
# Execute command
|
|
458
|
+
curl -s http://localhost:8081/mcp -X POST \
|
|
459
|
+
-H "Authorization: Bearer <MCP_API_KEY>" \
|
|
460
|
+
-H "X-Chat-Id: test-123" \
|
|
461
|
+
-H "Content-Type: application/json" \
|
|
462
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"bash_tool","arguments":{"command":"echo Hello","description":"test"}}}'
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
## References
|
|
466
|
+
|
|
467
|
+
- [Dockerfile Best Practices](https://docs.docker.com/develop/dev-best-practices/)
|
|
468
|
+
- [Docker Compose Documentation](https://docs.docker.com/compose/)
|
|
469
|
+
- [Ubuntu 24.04 Release Notes](https://releases.ubuntu.com/24.04/)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Dynamic Per-User Skill Injection
|
|
2
|
+
|
|
3
|
+
System that fetches user-enabled skills and injects them into sandbox containers at runtime.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## How it works
|
|
8
|
+
|
|
9
|
+
1. **On chat start**, the server calls `skill_manager.get_user_skills(email)`
|
|
10
|
+
2. **Skill list** is fetched with 3-level fallback: memory cache (60s TTL) → Settings Wrapper API → disk cache → hardcoded defaults
|
|
11
|
+
3. **System prompt** gets `<available_skills>` XML block with skill names, descriptions, and paths
|
|
12
|
+
4. **User-uploaded skills** are downloaded as ZIP, cached locally, and bind-mounted into the container
|
|
13
|
+
|
|
14
|
+
Without Settings Wrapper, all 13 public skills are always enabled for everyone.
|
|
15
|
+
|
|
16
|
+
## Skill Categories
|
|
17
|
+
|
|
18
|
+
| Category | Storage | Mount Point | Source |
|
|
19
|
+
|----------|---------|-------------|--------|
|
|
20
|
+
| `public` | Baked in Docker image | `/mnt/skills/public/{name}/` | `skills/public/` |
|
|
21
|
+
| `example` | Baked in Docker image | `/mnt/skills/examples/{name}/` | `skills/examples/` |
|
|
22
|
+
| `user` | Host cache `/data/skills-cache/` | `/mnt/skills/user/{name}/` | ZIP from Settings Wrapper |
|
|
23
|
+
|
|
24
|
+
## Core Functions (skill_manager.py)
|
|
25
|
+
|
|
26
|
+
| Function | Purpose |
|
|
27
|
+
|----------|---------|
|
|
28
|
+
| `get_user_skills(email)` | Fetch enabled skills (async, 3-level fallback) |
|
|
29
|
+
| `get_user_skills_sync(email)` | Sync version (reads cache only, for Docker thread) |
|
|
30
|
+
| `ensure_skill_cached(skill)` | Download + extract user-uploaded ZIP |
|
|
31
|
+
| `build_available_skills_xml(skills)` | `<available_skills>` XML for system prompt |
|
|
32
|
+
| `build_sub_agent_skills_text(skills)` | Skill list for sub-agent prompt |
|
|
33
|
+
| `get_skill_mounts(skills)` | Docker volume mounts dict for user skills |
|
|
34
|
+
|
|
35
|
+
## API Endpoints
|
|
36
|
+
|
|
37
|
+
| Endpoint | Purpose |
|
|
38
|
+
|----------|---------|
|
|
39
|
+
| `GET /system-prompt?user_email=X&chat_id=Y` | Dynamic system prompt with user's skills |
|
|
40
|
+
| `GET /skill-mounts?user_email=X` | Docker volume mounts for user skills |
|
|
41
|
+
| `GET /skill-list?user_email=X` | Skills list for sub-agent prompt |
|
|
42
|
+
|
|
43
|
+
## ZIP Cache
|
|
44
|
+
|
|
45
|
+
- **Location**: `/data/skills-cache/{skill-name}/`
|
|
46
|
+
- **Manifest**: `.manifest.json` (name → SHA-256 + timestamp)
|
|
47
|
+
- **Atomic extraction**: unzip to temp dir → rename to final path
|
|
48
|
+
- **Stale cache reuse**: if API/download fails but old cache exists, use it
|
|
49
|
+
- **Host path**: Docker daemon needs host paths for bind mounts — configured via `SKILLS_CACHE_HOST_PATH`
|
|
50
|
+
|
|
51
|
+
## Configuration
|
|
52
|
+
|
|
53
|
+
| Variable | Default | Description |
|
|
54
|
+
|----------|---------|-------------|
|
|
55
|
+
| `MCP_TOKENS_URL` | _(empty)_ | Settings Wrapper URL |
|
|
56
|
+
| `MCP_TOKENS_API_KEY` | _(empty)_ | Internal API key |
|
|
57
|
+
| `SKILLS_CACHE_DIR` | `/data/skills-cache` | Container-internal cache path |
|
|
58
|
+
| `SKILLS_CACHE_HOST_PATH` | `/tmp/skills-cache` | Host path for Docker mounts |
|
|
59
|
+
|
|
60
|
+
## Verification
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Check system prompt (should list skills)
|
|
64
|
+
curl "http://localhost:8081/system-prompt?user_email=admin@open-computer-use.dev&chat_id=test" | head -50
|
|
65
|
+
|
|
66
|
+
# Check skill mounts
|
|
67
|
+
curl "http://localhost:8081/skill-mounts?user_email=admin@open-computer-use.dev"
|
|
68
|
+
|
|
69
|
+
# Check skill list
|
|
70
|
+
curl "http://localhost:8081/skill-list?user_email=admin@open-computer-use.dev"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Related Docs
|
|
74
|
+
|
|
75
|
+
- [SKILLS.md](SKILLS.md) — reference for all built-in skills
|
|
76
|
+
- [SKILLS-USER-GUIDE.md](SKILLS-USER-GUIDE.md) — user guide for skills
|
|
77
|
+
- [settings-wrapper/README.md](../settings-wrapper/README.md) — mock skill registry API
|