@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,49 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
3
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
4
|
+
# TEST-05: openwebui/init.sh must byte-equal the v0.9.2.0 baseline.
|
|
5
|
+
#
|
|
6
|
+
# Milestone v0.9.2.1 explicitly forbids modifying init.sh — saved-memory hard
|
|
7
|
+
# rule (feedback_init_sh_marker.md) and Pitfall 10 in PITFALLS.md. The init
|
|
8
|
+
# script is marker-gated: env->Valve is a one-shot bootstrap, NOT a sync that
|
|
9
|
+
# rewrites Valves on every restart (which would annoy operators by clobbering
|
|
10
|
+
# their UI tweaks). Any byte change here is a regression.
|
|
11
|
+
#
|
|
12
|
+
# If a future milestone genuinely needs to edit init.sh, bump the EXPECTED
|
|
13
|
+
# constant in this script in the same commit.
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
ROOT="${1:-$(cd "$(dirname "$0")/.." && pwd)}"
|
|
18
|
+
INIT_SH="$ROOT/openwebui/init.sh"
|
|
19
|
+
|
|
20
|
+
EXPECTED="31ce03b67804ed11c5a5e42be8364c0adfedd356d1e9aed9ce87e8318c9c27a7"
|
|
21
|
+
|
|
22
|
+
if [ ! -f "$INIT_SH" ]; then
|
|
23
|
+
echo "FAIL: $INIT_SH does not exist."
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
28
|
+
ACTUAL=$(sha256sum "$INIT_SH" | awk '{print $1}')
|
|
29
|
+
elif command -v shasum >/dev/null 2>&1; then
|
|
30
|
+
ACTUAL=$(shasum -a 256 "$INIT_SH" | awk '{print $1}')
|
|
31
|
+
else
|
|
32
|
+
echo "FAIL: neither sha256sum nor shasum is available on this system."
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
if [ "$ACTUAL" != "$EXPECTED" ]; then
|
|
37
|
+
echo "FAIL: openwebui/init.sh has been modified."
|
|
38
|
+
echo " Expected sha256: $EXPECTED (v0.9.2.0 baseline)"
|
|
39
|
+
echo " Actual sha256: $ACTUAL"
|
|
40
|
+
echo " Milestone v0.9.2.1 forbids modifying init.sh — see PITFALLS Pitfall 10"
|
|
41
|
+
echo " and saved memory feedback_init_sh_marker.md. The file must stay"
|
|
42
|
+
echo " byte-identical to the v0.9.2.0 baseline because init.sh is"
|
|
43
|
+
echo " marker-gated: env->Valve is a one-shot bootstrap, not a sync."
|
|
44
|
+
echo " If this edit is intentional in a later milestone, bump EXPECTED in"
|
|
45
|
+
echo " tests/test_init_sh_unchanged.sh in the same commit."
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
echo "PASS: openwebui/init.sh matches v0.9.2.0 baseline (sha256 $EXPECTED)."
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""TEST-02-01: D-05 / D-06 — empty _OPENCODE_ALIAS_MAP and raising _resolve_opencode.
|
|
4
|
+
|
|
5
|
+
Covers:
|
|
6
|
+
1. _OPENCODE_ALIAS_MAP literal is {} (no Anthropic baseline)
|
|
7
|
+
2. _merge_opencode_alias_map() with OPENCODE_MODEL_ALIASES unset returns {}
|
|
8
|
+
3. _resolve_opencode("sonnet", "sonnet") with env unset raises ValueError
|
|
9
|
+
4. ValueError message contains required substrings per D-06
|
|
10
|
+
5. With OPENCODE_MODEL_ALIASES='{"sonnet":"anthropic/claude-sonnet-4-6"}',
|
|
11
|
+
_resolve_opencode("sonnet", "sonnet") returns ("anthropic/claude-sonnet-4-6", "sonnet")
|
|
12
|
+
6. Provider/model pass-through: "openrouter/qwen/qwen-3-coder" (contains '/')
|
|
13
|
+
bypasses alias map and returns verbatim
|
|
14
|
+
|
|
15
|
+
Env-scrub pattern mirrors tests/orchestrator/test_sub_agent_dispatch.py:48-55
|
|
16
|
+
so local-dev shells with model-override env vars do not break assertions.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import importlib
|
|
20
|
+
import os
|
|
21
|
+
import sys
|
|
22
|
+
|
|
23
|
+
import pytest
|
|
24
|
+
|
|
25
|
+
_SERVER_DIR = os.path.join(
|
|
26
|
+
os.path.dirname(__file__), "..", "computer-use-server"
|
|
27
|
+
)
|
|
28
|
+
sys.path.insert(0, _SERVER_DIR)
|
|
29
|
+
|
|
30
|
+
# Env vars that could affect opencode alias resolution — scrub before each test.
|
|
31
|
+
_OPENCODE_ENV_VARS = (
|
|
32
|
+
"OPENCODE_MODEL_ALIASES",
|
|
33
|
+
"OPENCODE_SUB_AGENT_DEFAULT_MODEL",
|
|
34
|
+
"OPENCODE_MODEL",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _drop_modules():
|
|
39
|
+
"""Drop cli_runtime + docker_manager so the next import re-reads env."""
|
|
40
|
+
for mod in ("cli_runtime", "docker_manager"):
|
|
41
|
+
sys.modules.pop(mod, None)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _import_cli_runtime():
|
|
45
|
+
_drop_modules()
|
|
46
|
+
return importlib.import_module("cli_runtime")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@pytest.fixture(autouse=True)
|
|
50
|
+
def _scrub_opencode_env(monkeypatch):
|
|
51
|
+
"""Scrub opencode-related env vars before each test."""
|
|
52
|
+
for var in _OPENCODE_ENV_VARS:
|
|
53
|
+
monkeypatch.delenv(var, raising=False)
|
|
54
|
+
yield
|
|
55
|
+
_drop_modules()
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# ---------------------------------------------------------------------------
|
|
59
|
+
# Test 1: _OPENCODE_ALIAS_MAP literal is empty dict
|
|
60
|
+
# ---------------------------------------------------------------------------
|
|
61
|
+
|
|
62
|
+
def test_opencode_alias_map_is_empty_dict():
|
|
63
|
+
"""D-05: _OPENCODE_ALIAS_MAP must be an empty dict — no Anthropic baseline."""
|
|
64
|
+
cli_runtime = _import_cli_runtime()
|
|
65
|
+
assert cli_runtime._OPENCODE_ALIAS_MAP == {}, (
|
|
66
|
+
f"Expected _OPENCODE_ALIAS_MAP == {{}} but got {cli_runtime._OPENCODE_ALIAS_MAP!r}"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# ---------------------------------------------------------------------------
|
|
71
|
+
# Test 2: _merge_opencode_alias_map() with no env returns {}
|
|
72
|
+
# ---------------------------------------------------------------------------
|
|
73
|
+
|
|
74
|
+
def test_merge_opencode_alias_map_no_env_returns_empty():
|
|
75
|
+
"""D-05: with OPENCODE_MODEL_ALIASES unset, merged map is empty."""
|
|
76
|
+
cli_runtime = _import_cli_runtime()
|
|
77
|
+
result = cli_runtime._merge_opencode_alias_map()
|
|
78
|
+
assert result == {}, (
|
|
79
|
+
f"Expected empty merged map but got {result!r}"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# ---------------------------------------------------------------------------
|
|
84
|
+
# Test 3: _resolve_opencode raises ValueError for unresolvable alias
|
|
85
|
+
# ---------------------------------------------------------------------------
|
|
86
|
+
|
|
87
|
+
def test_resolve_opencode_missing_alias_raises_value_error():
|
|
88
|
+
"""D-06: alias 'sonnet' not in map, no env default -> ValueError."""
|
|
89
|
+
cli_runtime = _import_cli_runtime()
|
|
90
|
+
with pytest.raises(ValueError):
|
|
91
|
+
cli_runtime._resolve_opencode("sonnet", "sonnet")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# ---------------------------------------------------------------------------
|
|
95
|
+
# Test 4: ValueError message contains required D-06 substrings
|
|
96
|
+
# ---------------------------------------------------------------------------
|
|
97
|
+
|
|
98
|
+
def test_resolve_opencode_missing_alias_error_message():
|
|
99
|
+
"""D-06: error message must name the alias, OPENCODE_MODEL_ALIASES, list-subagent-models."""
|
|
100
|
+
cli_runtime = _import_cli_runtime()
|
|
101
|
+
with pytest.raises(ValueError) as exc_info:
|
|
102
|
+
cli_runtime._resolve_opencode("sonnet", "sonnet")
|
|
103
|
+
msg = str(exc_info.value)
|
|
104
|
+
assert "alias 'sonnet' is not defined" in msg, (
|
|
105
|
+
f"Error message missing \"alias 'sonnet' is not defined\": {msg!r}"
|
|
106
|
+
)
|
|
107
|
+
assert "OPENCODE_MODEL_ALIASES" in msg, (
|
|
108
|
+
f"Error message missing 'OPENCODE_MODEL_ALIASES': {msg!r}"
|
|
109
|
+
)
|
|
110
|
+
assert "list-subagent-models" in msg, (
|
|
111
|
+
f"Error message missing 'list-subagent-models': {msg!r}"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# ---------------------------------------------------------------------------
|
|
116
|
+
# Test 5: With OPENCODE_MODEL_ALIASES env set, alias resolves correctly
|
|
117
|
+
# ---------------------------------------------------------------------------
|
|
118
|
+
|
|
119
|
+
def test_resolve_opencode_alias_via_env(monkeypatch):
|
|
120
|
+
"""D-05 / D-06: operator-supplied alias in OPENCODE_MODEL_ALIASES resolves."""
|
|
121
|
+
monkeypatch.setenv(
|
|
122
|
+
"OPENCODE_MODEL_ALIASES",
|
|
123
|
+
'{"sonnet": "anthropic/claude-sonnet-4-6"}',
|
|
124
|
+
)
|
|
125
|
+
cli_runtime = _import_cli_runtime()
|
|
126
|
+
model_id, display = cli_runtime._resolve_opencode("sonnet", "sonnet")
|
|
127
|
+
assert model_id == "anthropic/claude-sonnet-4-6"
|
|
128
|
+
assert display == "sonnet"
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# ---------------------------------------------------------------------------
|
|
132
|
+
# Test 6: Provider/model pass-through — string with '/' bypasses alias map
|
|
133
|
+
# ---------------------------------------------------------------------------
|
|
134
|
+
|
|
135
|
+
def test_resolve_opencode_provider_model_passthrough():
|
|
136
|
+
"""Existing pass-through: 'openrouter/qwen/qwen-3-coder' (contains '/')
|
|
137
|
+
is returned verbatim — alias map lookup skipped."""
|
|
138
|
+
cli_runtime = _import_cli_runtime()
|
|
139
|
+
model_id, display = cli_runtime._resolve_opencode(
|
|
140
|
+
"openrouter/qwen/qwen-3-coder",
|
|
141
|
+
"openrouter/qwen/qwen-3-coder",
|
|
142
|
+
)
|
|
143
|
+
assert model_id == "openrouter/qwen/qwen-3-coder"
|
|
144
|
+
assert display == "openrouter/qwen/qwen-3-coder"
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""Regression guard for security-critical dependency versions.
|
|
4
|
+
|
|
5
|
+
Ensures that patched CVE versions from PR #22 are not accidentally downgraded.
|
|
6
|
+
|
|
7
|
+
Run: python -m pytest tests/test_requirements.py -v
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import re
|
|
11
|
+
import unittest
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
ROOT = Path(__file__).resolve().parent.parent
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _parse_version(req_path: Path, package: str):
|
|
18
|
+
"""Return pinned version as int tuple, e.g. (12, 1, 1). Returns None if not found."""
|
|
19
|
+
pattern = re.compile(rf'^{re.escape(package)}==(.+)$', re.IGNORECASE)
|
|
20
|
+
for line in req_path.read_text().splitlines():
|
|
21
|
+
m = pattern.match(line.strip())
|
|
22
|
+
if m:
|
|
23
|
+
return tuple(int(x) for x in m.group(1).split("."))
|
|
24
|
+
return None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TestSandboxDependencyVersions(unittest.TestCase):
|
|
28
|
+
"""Security-patched versions in requirements.txt (sandbox / Dockerfile)."""
|
|
29
|
+
|
|
30
|
+
REQ = ROOT / "requirements.txt"
|
|
31
|
+
|
|
32
|
+
def _assert_at_least(self, package, min_version):
|
|
33
|
+
found = _parse_version(self.REQ, package)
|
|
34
|
+
self.assertIsNotNone(found, f"{package} not found in {self.REQ}")
|
|
35
|
+
self.assertGreaterEqual(
|
|
36
|
+
found,
|
|
37
|
+
min_version,
|
|
38
|
+
f"{package}=={'.'.join(map(str, found))} is below required "
|
|
39
|
+
f">={'.'.join(map(str, min_version))} (CVE patch)",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
def test_pillow_at_least_12_1_1(self):
|
|
43
|
+
"""CVE: PSD out-of-bounds write. Pillow 12 also changed Image.LANCZOS API."""
|
|
44
|
+
self._assert_at_least("pillow", (12, 1, 1))
|
|
45
|
+
|
|
46
|
+
def test_urllib3_at_least_2_6_3(self):
|
|
47
|
+
"""CVE: decompression bomb + redirect bypass."""
|
|
48
|
+
self._assert_at_least("urllib3", (2, 6, 3))
|
|
49
|
+
|
|
50
|
+
def test_cryptography_at_least_46_0_6(self):
|
|
51
|
+
"""CVE: SECT curves subgroup attack."""
|
|
52
|
+
self._assert_at_least("cryptography", (46, 0, 6))
|
|
53
|
+
|
|
54
|
+
def test_pyjwt_at_least_2_12_1(self):
|
|
55
|
+
"""CVE: critical header extensions bypass."""
|
|
56
|
+
self._assert_at_least("PyJWT", (2, 12, 1))
|
|
57
|
+
|
|
58
|
+
def test_pdfminer_six_at_least_20251230(self):
|
|
59
|
+
"""CVE: pickle deserialization RCE. Version is a date integer."""
|
|
60
|
+
found = _parse_version(self.REQ, "pdfminer.six")
|
|
61
|
+
self.assertIsNotNone(found, f"pdfminer.six not found in {self.REQ}")
|
|
62
|
+
# Version is a single date integer like 20251230
|
|
63
|
+
self.assertGreaterEqual(
|
|
64
|
+
found[0],
|
|
65
|
+
20251230,
|
|
66
|
+
f"pdfminer.six=={found[0]} is below required >=20251230 (CVE patch)",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def test_pdfplumber_at_least_0_11_9(self):
|
|
70
|
+
"""Bumped to satisfy pdfminer.six constraint."""
|
|
71
|
+
self._assert_at_least("pdfplumber", (0, 11, 9))
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class TestOrchestratorDependencyVersions(unittest.TestCase):
|
|
75
|
+
"""Security-patched versions in computer-use-server/requirements.txt."""
|
|
76
|
+
|
|
77
|
+
REQ = ROOT / "computer-use-server" / "requirements.txt"
|
|
78
|
+
|
|
79
|
+
def test_python_multipart_at_least_0_0_22(self):
|
|
80
|
+
"""CVE patch for python-multipart."""
|
|
81
|
+
found = _parse_version(self.REQ, "python-multipart")
|
|
82
|
+
self.assertIsNotNone(found, f"python-multipart not found in {self.REQ}")
|
|
83
|
+
self.assertGreaterEqual(
|
|
84
|
+
found,
|
|
85
|
+
(0, 0, 22),
|
|
86
|
+
f"python-multipart=={'.'.join(map(str, found))} is below required >=0.0.22",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
unittest.main()
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""Tests for per-CLI sub_agent docstring variants (REQ-MCP-01 / Plan 01-04).
|
|
4
|
+
|
|
5
|
+
Tests the _subagent_docstring_for_cli helper and related constants directly
|
|
6
|
+
from source without importing the full mcp_tools module (which requires the
|
|
7
|
+
docker/mcp runtime environment).
|
|
8
|
+
|
|
9
|
+
Run: python -m pytest tests/test_subagent_docstring.py -v
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
import sys
|
|
14
|
+
import types
|
|
15
|
+
import unittest
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
ROOT = Path(__file__).resolve().parent.parent
|
|
19
|
+
SRC = ROOT / "computer-use-server" / "mcp_tools.py"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _load_docstring_helpers():
|
|
23
|
+
"""Extract and exec only the docstring-related portion of mcp_tools.py.
|
|
24
|
+
|
|
25
|
+
Avoids importing the full module (which requires mcp, docker, etc.).
|
|
26
|
+
Returns a module-like namespace with the three constants and the helper.
|
|
27
|
+
"""
|
|
28
|
+
src = SRC.read_text()
|
|
29
|
+
|
|
30
|
+
# Extract lines from _SUBAGENT_DOC_CLAUDE through end of _subagent_docstring_for_cli
|
|
31
|
+
lines = src.splitlines()
|
|
32
|
+
start = None
|
|
33
|
+
end = None
|
|
34
|
+
for i, line in enumerate(lines):
|
|
35
|
+
if start is None and line.startswith("_SUBAGENT_DOC_CLAUDE = "):
|
|
36
|
+
start = i
|
|
37
|
+
if start is not None and line.startswith(" return _SUBAGENT_DOC_CLAUDE"):
|
|
38
|
+
end = i + 1
|
|
39
|
+
break
|
|
40
|
+
|
|
41
|
+
assert start is not None, "Could not find _SUBAGENT_DOC_CLAUDE in mcp_tools.py"
|
|
42
|
+
assert end is not None, "Could not find end of _subagent_docstring_for_cli"
|
|
43
|
+
|
|
44
|
+
snippet = "\n".join(lines[start:end])
|
|
45
|
+
ns: dict = {}
|
|
46
|
+
exec(compile(snippet, str(SRC), "exec"), ns) # noqa: S102
|
|
47
|
+
return ns
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
_NS = _load_docstring_helpers()
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class TestSubagentDocstringForCli(unittest.TestCase):
|
|
54
|
+
"""_subagent_docstring_for_cli returns the correct variant per CLI."""
|
|
55
|
+
|
|
56
|
+
def _doc(self, cli: str) -> str:
|
|
57
|
+
return _NS["_subagent_docstring_for_cli"](cli)
|
|
58
|
+
|
|
59
|
+
# --- list-subagent-models redirect in all variants ---
|
|
60
|
+
|
|
61
|
+
def test_claude_has_list_subagent_models_redirect(self):
|
|
62
|
+
assert "list-subagent-models" in self._doc("claude")
|
|
63
|
+
|
|
64
|
+
def test_opencode_has_list_subagent_models_redirect(self):
|
|
65
|
+
assert "list-subagent-models" in self._doc("opencode")
|
|
66
|
+
|
|
67
|
+
def test_codex_has_list_subagent_models_redirect(self):
|
|
68
|
+
assert "list-subagent-models" in self._doc("codex")
|
|
69
|
+
|
|
70
|
+
# --- claude variant contains all three aliases ---
|
|
71
|
+
|
|
72
|
+
def test_claude_contains_sonnet(self):
|
|
73
|
+
assert "sonnet" in self._doc("claude")
|
|
74
|
+
|
|
75
|
+
def test_claude_contains_opus(self):
|
|
76
|
+
assert "opus" in self._doc("claude")
|
|
77
|
+
|
|
78
|
+
def test_claude_contains_haiku(self):
|
|
79
|
+
assert "haiku" in self._doc("claude")
|
|
80
|
+
|
|
81
|
+
# --- codex variant is alias-free ---
|
|
82
|
+
|
|
83
|
+
def test_codex_no_bare_sonnet(self):
|
|
84
|
+
assert "sonnet" not in self._doc("codex").lower()
|
|
85
|
+
|
|
86
|
+
def test_codex_no_bare_opus(self):
|
|
87
|
+
assert "opus" not in self._doc("codex").lower()
|
|
88
|
+
|
|
89
|
+
def test_codex_no_bare_haiku(self):
|
|
90
|
+
assert "haiku" not in self._doc("codex").lower()
|
|
91
|
+
|
|
92
|
+
# --- opencode variant does not expose bare Claude aliases ---
|
|
93
|
+
|
|
94
|
+
def test_opencode_no_bare_haiku(self):
|
|
95
|
+
# 'haiku' must not appear as a bare alias (only as part of provider/model is OK)
|
|
96
|
+
doc = self._doc("opencode")
|
|
97
|
+
# Allow 'anthropic/claude-haiku-*' but not standalone 'haiku'
|
|
98
|
+
without_provider = re.sub(r'anthropic/claude-\S+', '', doc)
|
|
99
|
+
assert "haiku" not in without_provider.lower()
|
|
100
|
+
|
|
101
|
+
# --- unknown CLI falls back to claude ---
|
|
102
|
+
|
|
103
|
+
def test_unknown_cli_falls_back_to_claude(self):
|
|
104
|
+
assert self._doc("unknown") == self._doc("claude")
|
|
105
|
+
|
|
106
|
+
def test_empty_cli_falls_back_to_claude(self):
|
|
107
|
+
assert self._doc("") == self._doc("claude")
|
|
108
|
+
|
|
109
|
+
# --- OPENCODE_MODEL_ALIASES hint present in opencode variant ---
|
|
110
|
+
|
|
111
|
+
def test_opencode_mentions_alias_env(self):
|
|
112
|
+
assert "OPENCODE_MODEL_ALIASES" in self._doc("opencode")
|
|
113
|
+
|
|
114
|
+
# --- per-CLI env var hints present ---
|
|
115
|
+
|
|
116
|
+
def test_claude_mentions_claude_env(self):
|
|
117
|
+
assert "CLAUDE_SUB_AGENT_DEFAULT_MODEL" in self._doc("claude")
|
|
118
|
+
|
|
119
|
+
def test_opencode_mentions_opencode_env(self):
|
|
120
|
+
assert "OPENCODE_SUB_AGENT_DEFAULT_MODEL" in self._doc("opencode")
|
|
121
|
+
|
|
122
|
+
def test_codex_mentions_codex_env(self):
|
|
123
|
+
assert "CODEX_SUB_AGENT_DEFAULT_MODEL" in self._doc("codex")
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class TestMcpToolsStructure(unittest.TestCase):
|
|
127
|
+
"""Static source checks on mcp_tools.py registration structure."""
|
|
128
|
+
|
|
129
|
+
def setUp(self):
|
|
130
|
+
self.src = SRC.read_text()
|
|
131
|
+
|
|
132
|
+
def test_no_decorator_on_sub_agent(self):
|
|
133
|
+
"""@mcp.tool() decorator must not appear on the sub_agent def."""
|
|
134
|
+
lines = self.src.splitlines()
|
|
135
|
+
for i, line in enumerate(lines):
|
|
136
|
+
if "async def sub_agent(" in line:
|
|
137
|
+
# Check two lines above for @mcp.tool()
|
|
138
|
+
preceding = lines[max(0, i - 3):i]
|
|
139
|
+
for prev in preceding:
|
|
140
|
+
self.assertNotIn("@mcp.tool()", prev,
|
|
141
|
+
"sub_agent still has @mcp.tool() decorator")
|
|
142
|
+
break
|
|
143
|
+
else:
|
|
144
|
+
self.fail("Could not find async def sub_agent")
|
|
145
|
+
|
|
146
|
+
def test_doc_assignment_present(self):
|
|
147
|
+
"""sub_agent.__doc__ = _subagent_docstring_for_cli(...) must be present."""
|
|
148
|
+
assert "sub_agent.__doc__ = _subagent_docstring_for_cli" in self.src
|
|
149
|
+
|
|
150
|
+
def test_mcp_add_tool_call_present(self):
|
|
151
|
+
"""mcp.add_tool(sub_agent) must be present (not counting comments)."""
|
|
152
|
+
code_lines = [line for line in self.src.splitlines()
|
|
153
|
+
if "mcp.add_tool(sub_agent)" in line and not line.strip().startswith("#")]
|
|
154
|
+
self.assertEqual(len(code_lines), 1,
|
|
155
|
+
f"Expected exactly 1 mcp.add_tool(sub_agent) call, found: {code_lines}")
|
|
156
|
+
|
|
157
|
+
def test_no_sub_agent_default_model_usage(self):
|
|
158
|
+
"""Legacy bare SUB_AGENT_DEFAULT_MODEL must be absent; per-CLI env must be documented.
|
|
159
|
+
|
|
160
|
+
Phase 2 D-03: the legacy global is removed from docker_manager.py and the
|
|
161
|
+
module docstring is updated to document the three per-CLI env vars instead.
|
|
162
|
+
This assertion verifies the docstring update happened.
|
|
163
|
+
|
|
164
|
+
Note: check for the bare legacy name without a CLI prefix (CLAUDE_/OPENCODE_/CODEX_).
|
|
165
|
+
The per-CLI variants CLAUDE_SUB_AGENT_DEFAULT_MODEL etc. are expected and fine.
|
|
166
|
+
"""
|
|
167
|
+
import re
|
|
168
|
+
# The legacy line was "- SUB_AGENT_DEFAULT_MODEL: Default model ..."
|
|
169
|
+
# Per-CLI lines like "- CLAUDE_SUB_AGENT_DEFAULT_MODEL: ..." are OK.
|
|
170
|
+
legacy_pattern = re.compile(r'(?<![A-Z_])SUB_AGENT_DEFAULT_MODEL: Default model')
|
|
171
|
+
assert not legacy_pattern.search(self.src), (
|
|
172
|
+
"Legacy bare SUB_AGENT_DEFAULT_MODEL docstring entry still present in mcp_tools.py"
|
|
173
|
+
)
|
|
174
|
+
assert "CLAUDE_SUB_AGENT_DEFAULT_MODEL" in self.src, (
|
|
175
|
+
"CLAUDE_SUB_AGENT_DEFAULT_MODEL must be documented in mcp_tools.py module docstring"
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
def test_resolve_subagent_model_used(self):
|
|
179
|
+
"""resolve_subagent_model with empty string and resolved cli must be the fallback.
|
|
180
|
+
|
|
181
|
+
WR-03: the call was moved inside the try block and now uses the already-resolved
|
|
182
|
+
cli variable (resolve_subagent_model("", cli)) rather than calling resolve_cli()
|
|
183
|
+
a second time inline.
|
|
184
|
+
"""
|
|
185
|
+
# Accept either form: original inline call or the refactored cli-variable form
|
|
186
|
+
assert (
|
|
187
|
+
'resolve_subagent_model("", resolve_cli())' in self.src
|
|
188
|
+
or 'resolve_subagent_model("", cli)' in self.src
|
|
189
|
+
), "resolve_subagent_model with empty string fallback not found in sub_agent"
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
if __name__ == "__main__":
|
|
193
|
+
unittest.main()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""Tests for computer_use_tools (Open WebUI Tool).
|
|
4
|
+
|
|
5
|
+
Run: python -m pytest tests/test_tools.py -v
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
import unittest
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
ROOT = Path(__file__).resolve().parent.parent
|
|
13
|
+
sys.path.insert(0, str(ROOT / "openwebui" / "tools"))
|
|
14
|
+
|
|
15
|
+
import computer_use_tools # noqa: E402
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ValveSchema(unittest.TestCase):
|
|
19
|
+
"""v4.0.0: Tool Valve renamed FILE_SERVER_URL → ORCHESTRATOR_URL for
|
|
20
|
+
consistency with the filter. Semantics unchanged — still the internal URL
|
|
21
|
+
of the Computer Use server for MCP forwarding.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def test_orchestrator_url_valve_exists(self):
|
|
25
|
+
valve_fields = set(computer_use_tools.Tools.Valves.model_fields.keys())
|
|
26
|
+
self.assertIn("ORCHESTRATOR_URL", valve_fields)
|
|
27
|
+
|
|
28
|
+
def test_file_server_url_valve_removed(self):
|
|
29
|
+
valve_fields = set(computer_use_tools.Tools.Valves.model_fields.keys())
|
|
30
|
+
self.assertNotIn("FILE_SERVER_URL", valve_fields)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
if __name__ == "__main__":
|
|
34
|
+
unittest.main()
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# `extract-text`
|
|
2
|
+
|
|
3
|
+
Vendored binary used by the `file-reading` and `pdf-reading` skills.
|
|
4
|
+
|
|
5
|
+
## What it is
|
|
6
|
+
|
|
7
|
+
`extract-text` is a Rust CLI built by Anthropic for unified plain-text extraction across document formats:
|
|
8
|
+
|
|
9
|
+
- **docx / odt / epub** → Markdown (headings, bold, lists, links, tables)
|
|
10
|
+
- **xlsx** → tab-separated rows under `## Sheet:` headers
|
|
11
|
+
- **pptx** → text under `## Slide N` headers
|
|
12
|
+
- **ipynb** → fenced code cells
|
|
13
|
+
- **rtf / html / htm** → plain text
|
|
14
|
+
|
|
15
|
+
Architecture: x86_64 ELF, dynamically linked, ~2 MB.
|
|
16
|
+
|
|
17
|
+
**This binary is x86_64-only.** Building the image under `linux/arm64`
|
|
18
|
+
(Apple Silicon, AWS Graviton without emulation) will produce a
|
|
19
|
+
non-functional binary — `extract-text /path/to/file.docx` segfaults
|
|
20
|
+
under qemu emulation. The project `CLAUDE.md` mandates
|
|
21
|
+
`docker build --platform linux/amd64`; honor that. For native arm64
|
|
22
|
+
deployments, either run amd64 under qemu (slow) or remove the `COPY`
|
|
23
|
+
line in `Dockerfile` and rely on the open-source fallbacks
|
|
24
|
+
(pandoc / python-docx / openpyxl / python-pptx / nbconvert) documented
|
|
25
|
+
in `skills/public/file-reading/SKILL.md`.
|
|
26
|
+
|
|
27
|
+
## Why it lives here
|
|
28
|
+
|
|
29
|
+
The binary is bundled into the sandbox image at `/usr/local/bin/extract-text` by the `Dockerfile`:
|
|
30
|
+
|
|
31
|
+
```dockerfile
|
|
32
|
+
COPY --chown=root:root vendor/extract-text/extract-text /usr/local/bin/extract-text
|
|
33
|
+
RUN chmod +x /usr/local/bin/extract-text
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The skills under `/mnt/skills/public/file-reading/` and `/mnt/skills/public/pdf-reading/` shell out to it as their first move for the formats listed above.
|
|
37
|
+
|
|
38
|
+
## Licensing
|
|
39
|
+
|
|
40
|
+
This binary is part of Anthropic's Skill bundle. Use is governed by your Anthropic agreement (Commercial Terms, Consumer Terms, or a separate written agreement). See `skills/README.md` in the project root for the full disclaimer that applies to all Anthropic-authored materials in this repository.
|
|
41
|
+
|
|
42
|
+
If your deployment is not covered by an Anthropic agreement, remove this directory and the matching `COPY` line in the `Dockerfile`. The dispatch tables in `file-reading/SKILL.md` and `pdf-reading/SKILL.md` document open-source fallbacks (`pandoc`, `python-docx`, `openpyxl`, `python-pptx`, `nbconvert`) that work without `extract-text`.
|
|
43
|
+
|
|
44
|
+
## Followup
|
|
45
|
+
|
|
46
|
+
A future patch should replace this vendored binary with a build-time `curl` + `sha256sum -c` step pulling from a signed release URL, so the blob does not live in git history.
|
|
Binary file
|