@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,302 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""Tests for docker_manager._create_container env-injection behaviour.
|
|
4
|
+
|
|
5
|
+
Covers the three operator paths from Phase 3 (GATEWAY-05) plus the
|
|
6
|
+
ANTHROPIC_CUSTOM_HEADERS regression guard (GATEWAY-07) and the
|
|
7
|
+
current_anthropic_base_url ContextVar default (GATEWAY-01).
|
|
8
|
+
|
|
9
|
+
Run: cd computer-use-server && python -m pytest ../tests/orchestrator/test_docker_manager.py -v
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
import sys
|
|
14
|
+
import unittest
|
|
15
|
+
import importlib
|
|
16
|
+
import contextvars
|
|
17
|
+
from unittest.mock import patch, MagicMock
|
|
18
|
+
|
|
19
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', 'computer-use-server'))
|
|
20
|
+
|
|
21
|
+
from context_vars import (
|
|
22
|
+
current_chat_id,
|
|
23
|
+
current_user_email,
|
|
24
|
+
current_user_name,
|
|
25
|
+
current_gitlab_token,
|
|
26
|
+
current_gitlab_host,
|
|
27
|
+
current_anthropic_auth_token,
|
|
28
|
+
current_anthropic_base_url,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Ten gateway model/flag vars injected via CLAUDE_CODE_PASSTHROUGH_ENVS
|
|
33
|
+
GATEWAY_VAR_NAMES = (
|
|
34
|
+
"ANTHROPIC_MODEL",
|
|
35
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL",
|
|
36
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL",
|
|
37
|
+
"ANTHROPIC_DEFAULT_HAIKU_MODEL",
|
|
38
|
+
"CLAUDE_CODE_SUBAGENT_MODEL",
|
|
39
|
+
"CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS",
|
|
40
|
+
"DISABLE_PROMPT_CACHING",
|
|
41
|
+
"DISABLE_PROMPT_CACHING_SONNET",
|
|
42
|
+
"DISABLE_PROMPT_CACHING_OPUS",
|
|
43
|
+
"DISABLE_PROMPT_CACHING_HAIKU",
|
|
44
|
+
)
|
|
45
|
+
# The full set that a clean path-A env must not contain (12 keys total)
|
|
46
|
+
ALL_GATEWAY_ENV_KEYS = GATEWAY_VAR_NAMES + ("ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_BASE_URL")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _build_mock_docker_client():
|
|
50
|
+
"""Return a MagicMock wired to satisfy the _create_container call path.
|
|
51
|
+
|
|
52
|
+
_create_container uses:
|
|
53
|
+
- client.containers.run(...) — for the directory-setup ephemeral container
|
|
54
|
+
- client.containers.create(...) — for the actual sandbox container (the assertion target)
|
|
55
|
+
- client.networks.get(...) — for the compose-network attach (guarded by try/except)
|
|
56
|
+
- client.containers.get(...) — for the ORCHESTRATOR_CONTAINER_NAME lookup (compose net)
|
|
57
|
+
"""
|
|
58
|
+
client = MagicMock()
|
|
59
|
+
client.containers.run.return_value = None
|
|
60
|
+
client.containers.create.return_value = MagicMock()
|
|
61
|
+
# networks.list / volumes.list are not called by _create_container but harmless as defaults
|
|
62
|
+
client.networks.list.return_value = []
|
|
63
|
+
client.volumes.list.return_value = []
|
|
64
|
+
client.images.get.return_value = MagicMock()
|
|
65
|
+
return client
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _reset_context_vars():
|
|
69
|
+
"""Pin every ContextVar to a deterministic value to suppress cross-test leakage."""
|
|
70
|
+
current_chat_id.set("test-chat")
|
|
71
|
+
current_user_email.set(None)
|
|
72
|
+
current_user_name.set(None)
|
|
73
|
+
current_gitlab_token.set(None)
|
|
74
|
+
current_gitlab_host.set("gitlab.com")
|
|
75
|
+
current_anthropic_auth_token.set(None)
|
|
76
|
+
current_anthropic_base_url.set(None)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _clear_gateway_env():
|
|
80
|
+
"""Pop every gateway-related env var from os.environ."""
|
|
81
|
+
for k in ALL_GATEWAY_ENV_KEYS:
|
|
82
|
+
os.environ.pop(k, None)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class TestDockerManagerEnvInjection(unittest.TestCase):
|
|
86
|
+
"""Three-path env-injection matrix + empty-string guard + ANTHROPIC_CUSTOM_HEADERS regression."""
|
|
87
|
+
|
|
88
|
+
def _reload_docker_manager(self, overrides):
|
|
89
|
+
"""Apply a clean env matrix (clear gateway vars, apply overrides) and reload the module.
|
|
90
|
+
|
|
91
|
+
Returns the reloaded docker_manager module. Caller is responsible for using the
|
|
92
|
+
patch.dict context manager that wraps this method.
|
|
93
|
+
"""
|
|
94
|
+
_clear_gateway_env()
|
|
95
|
+
for k, v in overrides.items():
|
|
96
|
+
os.environ[k] = v
|
|
97
|
+
import docker_manager
|
|
98
|
+
importlib.reload(docker_manager)
|
|
99
|
+
return docker_manager
|
|
100
|
+
|
|
101
|
+
def _run_isolated(self, body):
|
|
102
|
+
"""Run `body` inside a fresh contextvars.Context so .set() calls do not leak to sibling tests.
|
|
103
|
+
|
|
104
|
+
`body` is a callable that takes no args and performs the test steps. Any ContextVar
|
|
105
|
+
mutations (e.g. current_chat_id.set("test-chat")) are confined to this Context copy.
|
|
106
|
+
"""
|
|
107
|
+
fresh_ctx = contextvars.Context()
|
|
108
|
+
return fresh_ctx.run(body)
|
|
109
|
+
|
|
110
|
+
def test_path_a_zero_config_injects_no_gateway_vars(self):
|
|
111
|
+
"""Path A: no ANTHROPIC_*/CLAUDE_CODE_* env vars on host -> no such keys in extra_env."""
|
|
112
|
+
def body():
|
|
113
|
+
with patch.dict(os.environ, {}, clear=False):
|
|
114
|
+
docker_manager = self._reload_docker_manager({})
|
|
115
|
+
_reset_context_vars()
|
|
116
|
+
client = _build_mock_docker_client()
|
|
117
|
+
with patch("docker_manager.get_docker_client", return_value=client):
|
|
118
|
+
docker_manager._create_container("test-chat", "owui-chat-test")
|
|
119
|
+
|
|
120
|
+
env_dict = client.containers.create.call_args.kwargs["environment"]
|
|
121
|
+
for key in ALL_GATEWAY_ENV_KEYS:
|
|
122
|
+
self.assertNotIn(key, env_dict, f"{key} leaked into zero-config path")
|
|
123
|
+
self._run_isolated(body)
|
|
124
|
+
|
|
125
|
+
def test_path_b_auth_only_injects_token_and_default_base_url(self):
|
|
126
|
+
"""Path B: ANTHROPIC_AUTH_TOKEN only -> token + default https://api.anthropic.com base URL."""
|
|
127
|
+
def body():
|
|
128
|
+
with patch.dict(os.environ, {}, clear=False):
|
|
129
|
+
docker_manager = self._reload_docker_manager(
|
|
130
|
+
{"ANTHROPIC_AUTH_TOKEN": "sk-EXAMPLE-path-b"}
|
|
131
|
+
)
|
|
132
|
+
_reset_context_vars()
|
|
133
|
+
client = _build_mock_docker_client()
|
|
134
|
+
with patch("docker_manager.get_docker_client", return_value=client):
|
|
135
|
+
docker_manager._create_container("test-chat", "owui-chat-test")
|
|
136
|
+
|
|
137
|
+
env_dict = client.containers.create.call_args.kwargs["environment"]
|
|
138
|
+
self.assertEqual(env_dict["ANTHROPIC_AUTH_TOKEN"], "sk-EXAMPLE-path-b")
|
|
139
|
+
self.assertEqual(env_dict["ANTHROPIC_BASE_URL"], "https://api.anthropic.com")
|
|
140
|
+
for name in GATEWAY_VAR_NAMES:
|
|
141
|
+
self.assertNotIn(name, env_dict, f"{name} leaked into auth-only path B")
|
|
142
|
+
self._run_isolated(body)
|
|
143
|
+
|
|
144
|
+
def test_path_c_custom_gateway_injects_all_twelve_keys(self):
|
|
145
|
+
"""Path C: token + base URL + all ten gateway vars -> all twelve keys present with exact values."""
|
|
146
|
+
def body():
|
|
147
|
+
overrides = {
|
|
148
|
+
"ANTHROPIC_AUTH_TOKEN": "sk-EXAMPLE-path-c",
|
|
149
|
+
"ANTHROPIC_BASE_URL": "https://litellm.internal/",
|
|
150
|
+
}
|
|
151
|
+
for name in GATEWAY_VAR_NAMES:
|
|
152
|
+
overrides[name] = f"TEST_{name}"
|
|
153
|
+
|
|
154
|
+
with patch.dict(os.environ, {}, clear=False):
|
|
155
|
+
docker_manager = self._reload_docker_manager(overrides)
|
|
156
|
+
_reset_context_vars()
|
|
157
|
+
client = _build_mock_docker_client()
|
|
158
|
+
with patch("docker_manager.get_docker_client", return_value=client):
|
|
159
|
+
docker_manager._create_container("test-chat", "owui-chat-test")
|
|
160
|
+
|
|
161
|
+
env_dict = client.containers.create.call_args.kwargs["environment"]
|
|
162
|
+
self.assertEqual(env_dict["ANTHROPIC_AUTH_TOKEN"], "sk-EXAMPLE-path-c")
|
|
163
|
+
self.assertEqual(env_dict["ANTHROPIC_BASE_URL"], "https://litellm.internal/")
|
|
164
|
+
for name in GATEWAY_VAR_NAMES:
|
|
165
|
+
self.assertEqual(
|
|
166
|
+
env_dict[name],
|
|
167
|
+
f"TEST_{name}",
|
|
168
|
+
f"{name} value mismatch in custom-gateway path",
|
|
169
|
+
)
|
|
170
|
+
self._run_isolated(body)
|
|
171
|
+
|
|
172
|
+
def test_empty_string_env_vars_are_not_injected(self):
|
|
173
|
+
"""Empty-string env vars must be skipped by the `if _value:` guard."""
|
|
174
|
+
def body():
|
|
175
|
+
overrides = {
|
|
176
|
+
"ANTHROPIC_AUTH_TOKEN": "sk-EXAMPLE-empty-guard",
|
|
177
|
+
"ANTHROPIC_MODEL": "", # explicit empty string
|
|
178
|
+
}
|
|
179
|
+
with patch.dict(os.environ, {}, clear=False):
|
|
180
|
+
docker_manager = self._reload_docker_manager(overrides)
|
|
181
|
+
_reset_context_vars()
|
|
182
|
+
client = _build_mock_docker_client()
|
|
183
|
+
with patch("docker_manager.get_docker_client", return_value=client):
|
|
184
|
+
docker_manager._create_container("test-chat", "owui-chat-test")
|
|
185
|
+
|
|
186
|
+
env_dict = client.containers.create.call_args.kwargs["environment"]
|
|
187
|
+
self.assertNotIn("ANTHROPIC_MODEL", env_dict)
|
|
188
|
+
# other nine gateway names also absent — none were set
|
|
189
|
+
for name in GATEWAY_VAR_NAMES:
|
|
190
|
+
self.assertNotIn(name, env_dict, f"{name} unexpectedly present")
|
|
191
|
+
self._run_isolated(body)
|
|
192
|
+
|
|
193
|
+
def test_anthropic_custom_headers_injection_regression_guard(self):
|
|
194
|
+
"""current_user_email set -> ANTHROPIC_CUSTOM_HEADERS + GIT_* vars land unchanged."""
|
|
195
|
+
def body():
|
|
196
|
+
with patch.dict(os.environ, {}, clear=False):
|
|
197
|
+
docker_manager = self._reload_docker_manager(
|
|
198
|
+
{"ANTHROPIC_AUTH_TOKEN": "sk-EXAMPLE-headers"}
|
|
199
|
+
)
|
|
200
|
+
_reset_context_vars()
|
|
201
|
+
current_user_email.set("alice@example.com")
|
|
202
|
+
client = _build_mock_docker_client()
|
|
203
|
+
with patch("docker_manager.get_docker_client", return_value=client):
|
|
204
|
+
docker_manager._create_container("test-chat", "owui-chat-test")
|
|
205
|
+
|
|
206
|
+
env_dict = client.containers.create.call_args.kwargs["environment"]
|
|
207
|
+
self.assertEqual(
|
|
208
|
+
env_dict["ANTHROPIC_CUSTOM_HEADERS"],
|
|
209
|
+
"x-openwebui-user-email: alice@example.com",
|
|
210
|
+
)
|
|
211
|
+
self.assertEqual(env_dict["GIT_AUTHOR_EMAIL"], "alice@example.com")
|
|
212
|
+
self.assertEqual(env_dict["GIT_COMMITTER_EMAIL"], "alice@example.com")
|
|
213
|
+
self._run_isolated(body)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class TestContextVarAnthropicBaseUrlDefault(unittest.TestCase):
|
|
217
|
+
"""GATEWAY-01 unit test: ContextVar default must be None so the `or` fallback fires."""
|
|
218
|
+
|
|
219
|
+
def test_current_anthropic_base_url_default_is_none_after_reload(self):
|
|
220
|
+
"""ContextVar must declare default=None so .get() returns None when unset.
|
|
221
|
+
|
|
222
|
+
We do NOT reload context_vars here — reloading creates a new ContextVar
|
|
223
|
+
singleton that other already-loaded modules no longer reference, which
|
|
224
|
+
pollutes sibling test files. Instead, we run the .get() inside a fresh
|
|
225
|
+
copy_context() so any prior .set() from other tests does not leak in,
|
|
226
|
+
then assert the declared default is None.
|
|
227
|
+
"""
|
|
228
|
+
import contextvars
|
|
229
|
+
import context_vars as cv_mod
|
|
230
|
+
|
|
231
|
+
# Inspect the default directly without touching live context state.
|
|
232
|
+
# This avoids cross-test pollution from any prior .set() calls.
|
|
233
|
+
fresh_ctx = contextvars.Context()
|
|
234
|
+
value = fresh_ctx.run(cv_mod.current_anthropic_base_url.get)
|
|
235
|
+
self.assertIsNone(value)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class TestBuildMcpConfigBaseUrlFallback(unittest.TestCase):
|
|
239
|
+
"""Regression guard: build_mcp_config must accept None/empty base_url.
|
|
240
|
+
|
|
241
|
+
Before the fix, callers in sub_agent (mcp_tools.py) and _create_container
|
|
242
|
+
(docker_manager.py) passed current_anthropic_base_url.get() directly —
|
|
243
|
+
which became None after the GATEWAY-01 ContextVar default change.
|
|
244
|
+
That hit base_url.rstrip("/") and raised AttributeError, silently
|
|
245
|
+
disabling MCP config write on the "MCP servers configured but no
|
|
246
|
+
base-url header" path.
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
def _reload_docker_manager(self):
|
|
250
|
+
import docker_manager
|
|
251
|
+
importlib.reload(docker_manager)
|
|
252
|
+
return docker_manager
|
|
253
|
+
|
|
254
|
+
def test_none_base_url_falls_back_to_module_constant(self):
|
|
255
|
+
"""None base_url: config builds successfully, uses module default."""
|
|
256
|
+
dm = self._reload_docker_manager()
|
|
257
|
+
cfg = dm.build_mcp_config("metabase", None, user_email="alice@example.com")
|
|
258
|
+
self.assertIsNotNone(cfg)
|
|
259
|
+
self.assertIn("metabase", cfg["mcpServers"])
|
|
260
|
+
url = cfg["mcpServers"]["metabase"]["url"]
|
|
261
|
+
self.assertTrue(url.endswith("/mcp/metabase"))
|
|
262
|
+
# Module default is https://api.anthropic.com (set by our getenv-or-literal pattern)
|
|
263
|
+
self.assertTrue(url.startswith("http"))
|
|
264
|
+
|
|
265
|
+
def test_empty_string_base_url_falls_back_to_module_constant(self):
|
|
266
|
+
"""Empty-string base_url: same fallback path as None — covers the
|
|
267
|
+
compose ${VAR:-} scenario that leaves the env set but empty."""
|
|
268
|
+
dm = self._reload_docker_manager()
|
|
269
|
+
cfg = dm.build_mcp_config("metabase", "", user_email="alice@example.com")
|
|
270
|
+
self.assertIsNotNone(cfg)
|
|
271
|
+
self.assertTrue(cfg["mcpServers"]["metabase"]["url"].endswith("/mcp/metabase"))
|
|
272
|
+
|
|
273
|
+
def test_explicit_base_url_overrides_module_constant(self):
|
|
274
|
+
"""When caller provides a non-empty base_url, it wins (with trailing / stripped)."""
|
|
275
|
+
dm = self._reload_docker_manager()
|
|
276
|
+
cfg = dm.build_mcp_config(
|
|
277
|
+
"metabase",
|
|
278
|
+
"https://litellm.internal/",
|
|
279
|
+
user_email="alice@example.com",
|
|
280
|
+
)
|
|
281
|
+
self.assertIsNotNone(cfg)
|
|
282
|
+
self.assertEqual(
|
|
283
|
+
cfg["mcpServers"]["metabase"]["url"],
|
|
284
|
+
"https://litellm.internal/mcp/metabase",
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class TestAnthropicBaseUrlEmptyStringHandling(unittest.TestCase):
|
|
289
|
+
"""Empty env vars from compose ${VAR:-} must not override the module default."""
|
|
290
|
+
|
|
291
|
+
def test_empty_env_treats_as_unset_for_anthropic_base_url(self):
|
|
292
|
+
"""docker-compose ${ANTHROPIC_BASE_URL:-} sets the var to "", which
|
|
293
|
+
os.getenv returns as "" (not the default). The module falls back to
|
|
294
|
+
the public Anthropic URL via `os.getenv(...) or "https://..."`."""
|
|
295
|
+
with patch.dict(os.environ, {"ANTHROPIC_BASE_URL": ""}, clear=False):
|
|
296
|
+
import docker_manager
|
|
297
|
+
importlib.reload(docker_manager)
|
|
298
|
+
self.assertEqual(docker_manager.ANTHROPIC_BASE_URL, "https://api.anthropic.com")
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
if __name__ == "__main__":
|
|
302
|
+
unittest.main()
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""
|
|
4
|
+
Tier 4 — InitializeResult.instructions must be dynamic per-request via the
|
|
5
|
+
current_instructions ContextVar.
|
|
6
|
+
|
|
7
|
+
The ContextVar-driven property lives on a subclass of the lowlevel MCP Server
|
|
8
|
+
that was swapped onto mcp._mcp_server after FastMCP(...) constructed it. This
|
|
9
|
+
test exercises the property directly rather than spinning up a full HTTP
|
|
10
|
+
InitializeRequest — cheaper, same load-bearing guarantee.
|
|
11
|
+
"""
|
|
12
|
+
import sys
|
|
13
|
+
import unittest
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
ROOT = Path(__file__).resolve().parent.parent.parent
|
|
17
|
+
sys.path.insert(0, str(ROOT / "computer-use-server"))
|
|
18
|
+
|
|
19
|
+
import mcp_tools # noqa: E402
|
|
20
|
+
from context_vars import current_instructions # noqa: E402
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class DynamicInstructionsContract(unittest.TestCase):
|
|
24
|
+
def test_class_was_swapped(self):
|
|
25
|
+
self.assertEqual(
|
|
26
|
+
mcp_tools.mcp._mcp_server.__class__.__name__,
|
|
27
|
+
"_DynamicInstructionsServer",
|
|
28
|
+
"mcp._mcp_server class swap did not happen at import time",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def test_static_fallback_when_contextvar_unset(self):
|
|
32
|
+
# Sanity: with no ContextVar, we get the static string
|
|
33
|
+
tok = current_instructions.set(None)
|
|
34
|
+
try:
|
|
35
|
+
v = mcp_tools.mcp._mcp_server.instructions
|
|
36
|
+
self.assertIn("README.md", v)
|
|
37
|
+
self.assertIn("resources/list", v)
|
|
38
|
+
finally:
|
|
39
|
+
current_instructions.reset(tok)
|
|
40
|
+
|
|
41
|
+
def test_contextvar_value_wins(self):
|
|
42
|
+
tok = current_instructions.set("PER-CHAT-DEMO")
|
|
43
|
+
try:
|
|
44
|
+
self.assertEqual(
|
|
45
|
+
mcp_tools.mcp._mcp_server.instructions,
|
|
46
|
+
"PER-CHAT-DEMO",
|
|
47
|
+
)
|
|
48
|
+
finally:
|
|
49
|
+
current_instructions.reset(tok)
|
|
50
|
+
|
|
51
|
+
def test_distinct_contextvar_values_return_distinct_instructions(self):
|
|
52
|
+
t1 = current_instructions.set("chat-alpha")
|
|
53
|
+
try:
|
|
54
|
+
a = mcp_tools.mcp._mcp_server.instructions
|
|
55
|
+
finally:
|
|
56
|
+
current_instructions.reset(t1)
|
|
57
|
+
|
|
58
|
+
t2 = current_instructions.set("chat-beta")
|
|
59
|
+
try:
|
|
60
|
+
b = mcp_tools.mcp._mcp_server.instructions
|
|
61
|
+
finally:
|
|
62
|
+
current_instructions.reset(t2)
|
|
63
|
+
|
|
64
|
+
self.assertEqual(a, "chat-alpha")
|
|
65
|
+
self.assertEqual(b, "chat-beta")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
if __name__ == "__main__":
|
|
69
|
+
unittest.main()
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""
|
|
4
|
+
Tier 6 — uploaded files as MCP resources.
|
|
5
|
+
|
|
6
|
+
Exercises:
|
|
7
|
+
- sync_chat_resources + list_resources for flat and nested paths
|
|
8
|
+
- read_resource returning text for text/*, bytes for everything else
|
|
9
|
+
- tenancy: a fresh chat has no inherited resources
|
|
10
|
+
- idempotent re-sync (no duplicate registrations)
|
|
11
|
+
- concurrency safety: sync while list_resources iterates
|
|
12
|
+
"""
|
|
13
|
+
import asyncio
|
|
14
|
+
import os
|
|
15
|
+
import shutil
|
|
16
|
+
import sys
|
|
17
|
+
import tempfile
|
|
18
|
+
import unittest
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
ROOT = Path(__file__).resolve().parent.parent.parent
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class McpResourcesContract(unittest.TestCase):
|
|
25
|
+
"""Needs BASE_DATA_DIR set BEFORE uploads/mcp_resources are imported."""
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def setUpClass(cls):
|
|
29
|
+
cls._tmp = tempfile.mkdtemp(prefix="ocu-resource-test-")
|
|
30
|
+
os.environ["BASE_DATA_DIR"] = cls._tmp
|
|
31
|
+
|
|
32
|
+
sys.path.insert(0, str(ROOT / "computer-use-server"))
|
|
33
|
+
# Fresh imports so BASE_DATA_DIR is picked up
|
|
34
|
+
import uploads as uploads_mod
|
|
35
|
+
import importlib
|
|
36
|
+
importlib.reload(uploads_mod)
|
|
37
|
+
|
|
38
|
+
import mcp_tools # noqa: F401 — the singleton
|
|
39
|
+
import mcp_resources as mr
|
|
40
|
+
importlib.reload(mr)
|
|
41
|
+
|
|
42
|
+
cls.mcp_tools = mcp_tools
|
|
43
|
+
cls.mcp_resources = mr
|
|
44
|
+
cls.uploads = uploads_mod
|
|
45
|
+
|
|
46
|
+
@classmethod
|
|
47
|
+
def tearDownClass(cls):
|
|
48
|
+
shutil.rmtree(cls._tmp, ignore_errors=True)
|
|
49
|
+
|
|
50
|
+
def _make_upload(self, chat_id: str, rel_path: str, content: str):
|
|
51
|
+
target = Path(self._tmp) / chat_id / "uploads" / rel_path
|
|
52
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
53
|
+
target.write_text(content)
|
|
54
|
+
|
|
55
|
+
def test_flat_and_nested_list_read(self):
|
|
56
|
+
self._make_upload("demoa", "hello.txt", "hi")
|
|
57
|
+
self._make_upload("demoa", "sub/nested.json", '{"k":1}')
|
|
58
|
+
n = asyncio.run(self.mcp_resources.sync_chat_resources("demoa"))
|
|
59
|
+
self.assertEqual(n, 2)
|
|
60
|
+
|
|
61
|
+
resources = asyncio.run(self.mcp_tools.mcp.list_resources())
|
|
62
|
+
uris = {str(r.uri) for r in resources}
|
|
63
|
+
self.assertIn("file://uploads/demoa/hello.txt", uris)
|
|
64
|
+
self.assertIn("file://uploads/demoa/sub%2Fnested.json", uris)
|
|
65
|
+
|
|
66
|
+
from pydantic import AnyUrl
|
|
67
|
+
flat = list(asyncio.run(self.mcp_tools.mcp.read_resource(
|
|
68
|
+
AnyUrl("file://uploads/demoa/hello.txt"))))
|
|
69
|
+
self.assertEqual(flat[0].content, "hi")
|
|
70
|
+
nested = list(asyncio.run(self.mcp_tools.mcp.read_resource(
|
|
71
|
+
AnyUrl("file://uploads/demoa/sub%2Fnested.json"))))
|
|
72
|
+
self.assertEqual(nested[0].content, '{"k":1}')
|
|
73
|
+
|
|
74
|
+
def test_tenancy_empty_for_unknown_chat(self):
|
|
75
|
+
# Plant a real upload for tenant A so the global resource registry
|
|
76
|
+
# has at least one entry. Then assert tenant B sees ZERO resources
|
|
77
|
+
# AND the registry-level list contains tenant A's URI but not any
|
|
78
|
+
# tenant-B URI — proves there is no leak across chats via the
|
|
79
|
+
# shared FastMCP._resource_manager._resources dict.
|
|
80
|
+
self._make_upload("tenant-a", "secret.txt", "A-only")
|
|
81
|
+
asyncio.run(self.mcp_resources.sync_chat_resources("tenant-a"))
|
|
82
|
+
|
|
83
|
+
n = asyncio.run(self.mcp_resources.sync_chat_resources("tenant-b"))
|
|
84
|
+
self.assertEqual(n, 0)
|
|
85
|
+
|
|
86
|
+
all_uris = {
|
|
87
|
+
str(r.uri) for r in asyncio.run(self.mcp_tools.mcp.list_resources())
|
|
88
|
+
}
|
|
89
|
+
# Tenant A's resource must still be present (sync_chat_resources(B)
|
|
90
|
+
# must not have wiped A).
|
|
91
|
+
self.assertIn("file://uploads/tenant-a/secret.txt", all_uris)
|
|
92
|
+
# And NO resource URI should mention tenant-b.
|
|
93
|
+
leaked = [u for u in all_uris if "tenant-b" in u]
|
|
94
|
+
self.assertEqual(leaked, [], f"tenant-b leaked URIs: {leaked}")
|
|
95
|
+
|
|
96
|
+
def test_idempotent_resync(self):
|
|
97
|
+
self._make_upload("demob", "once.txt", "only")
|
|
98
|
+
asyncio.run(self.mcp_resources.sync_chat_resources("demob"))
|
|
99
|
+
asyncio.run(self.mcp_resources.sync_chat_resources("demob"))
|
|
100
|
+
resources = asyncio.run(self.mcp_tools.mcp.list_resources())
|
|
101
|
+
demob_uris = [r for r in resources if "demob" in str(r.uri)]
|
|
102
|
+
self.assertEqual(len(demob_uris), 1, "re-sync must not duplicate entries")
|
|
103
|
+
|
|
104
|
+
def test_concurrent_sync_and_list(self):
|
|
105
|
+
"""Stress: sync + list in parallel. Without the lock around the
|
|
106
|
+
clear-then-rebuild, `dict changed size during iteration` fires."""
|
|
107
|
+
self._make_upload("democ", "a.txt", "A")
|
|
108
|
+
self._make_upload("democ", "b.txt", "B")
|
|
109
|
+
|
|
110
|
+
async def _stress():
|
|
111
|
+
await self.mcp_resources.sync_chat_resources("democ")
|
|
112
|
+
tasks = []
|
|
113
|
+
for _ in range(20):
|
|
114
|
+
tasks.append(self.mcp_resources.sync_chat_resources("democ"))
|
|
115
|
+
tasks.append(self.mcp_tools.mcp.list_resources())
|
|
116
|
+
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
117
|
+
for r in results:
|
|
118
|
+
if isinstance(r, Exception):
|
|
119
|
+
raise r
|
|
120
|
+
return len(results)
|
|
121
|
+
|
|
122
|
+
n = asyncio.run(_stress())
|
|
123
|
+
self.assertEqual(n, 40)
|
|
124
|
+
|
|
125
|
+
def test_list_changed_notification_skipped_outside_request_context(self):
|
|
126
|
+
"""sync_chat_resources is called from docker_manager._create_container
|
|
127
|
+
on a worker thread — no `request_ctx` is set, and we must NOT blow up.
|
|
128
|
+
Notification is silently skipped; fresh list still surfaces on the
|
|
129
|
+
next resources/list call."""
|
|
130
|
+
self._make_upload("demod", "skip.txt", "no ctx")
|
|
131
|
+
# Confirm we actually have no request context right now
|
|
132
|
+
from mcp.server.lowlevel.server import request_ctx
|
|
133
|
+
self.assertRaises(LookupError, request_ctx.get)
|
|
134
|
+
# Should not raise — graceful skip of the notification branch
|
|
135
|
+
n = asyncio.run(self.mcp_resources.sync_chat_resources("demod"))
|
|
136
|
+
self.assertEqual(n, 1)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
if __name__ == "__main__":
|
|
140
|
+
unittest.main()
|