@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,289 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
3
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
4
|
+
"""Patch for Open WebUI: truncate large tool results in output (DB + LLM).
|
|
5
|
+
|
|
6
|
+
Problem: MCP tools (Metabase, OpenSearch, Playwright, etc.) return
|
|
7
|
+
results 15K-100K+ chars. After 2-3 calls the model context is exhausted.
|
|
8
|
+
Full results are also saved to DB, bloating chat storage.
|
|
9
|
+
|
|
10
|
+
Solution: truncate results in output in-place BEFORE they reach
|
|
11
|
+
serialize_content_blocks (-> DB) and convert_content_blocks_to_messages (-> LLM).
|
|
12
|
+
Single interception point: in tool loop before _saved_output deep copy.
|
|
13
|
+
|
|
14
|
+
If ORCHESTRATOR_URL is set, full result is uploaded as a file
|
|
15
|
+
to computer-use-server, model receives preview + file_path.
|
|
16
|
+
Otherwise, only preview + truncation notice.
|
|
17
|
+
|
|
18
|
+
Two intercept points:
|
|
19
|
+
Mod 2: Tool loop -- truncate CURRENT tool results before LLM + DB
|
|
20
|
+
Mod 3: History -- truncate OLD tool results loaded from DB before LLM
|
|
21
|
+
|
|
22
|
+
Config env vars:
|
|
23
|
+
TOOL_RESULT_MAX_CHARS (default: 50000) -- truncation threshold (~12.5K tokens). 0 = disable
|
|
24
|
+
TOOL_RESULT_PREVIEW_CHARS (default: 2000) -- preview size
|
|
25
|
+
ORCHESTRATOR_URL -- internal URL of computer-use-server for large-result uploads
|
|
26
|
+
|
|
27
|
+
Must run AFTER fix_tool_loop_errors.py (Mod 2 targets its marker).
|
|
28
|
+
Target: Open WebUI 0.9.5
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
import os
|
|
32
|
+
import sys
|
|
33
|
+
|
|
34
|
+
_PATCH_TARGET_OVERRIDE = os.environ.get("_PATCH_TARGET_OVERRIDE", "")
|
|
35
|
+
MIDDLEWARE_PATH = _PATCH_TARGET_OVERRIDE or "/app/backend/open_webui/utils/middleware.py"
|
|
36
|
+
|
|
37
|
+
PATCH_MARKER = "_truncate_large_results_in_output"
|
|
38
|
+
NEW_PATCH_MARKER = "FIX_LARGE_TOOL_RESULTS"
|
|
39
|
+
|
|
40
|
+
FUNCTION_CODE = '''
|
|
41
|
+
# === PATCH: _truncate_large_results_in_output -- truncate large MCP tool results (DB + LLM) ===
|
|
42
|
+
# FIX_LARGE_TOOL_RESULTS
|
|
43
|
+
import os as _os_module
|
|
44
|
+
|
|
45
|
+
_TOOL_RESULT_MAX_CHARS = int(_os_module.environ.get('TOOL_RESULT_MAX_CHARS', '50000'))
|
|
46
|
+
_TOOL_RESULT_PREVIEW_CHARS = int(_os_module.environ.get('TOOL_RESULT_PREVIEW_CHARS', '2000'))
|
|
47
|
+
_ORCHESTRATOR_URL = _os_module.environ.get('ORCHESTRATOR_URL', '').rstrip('/')
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def _upload_result_to_docker_ai(content: str, filename: str, chat_id: str) -> str:
|
|
51
|
+
"""Upload full tool result to docker-ai container. Returns file_path or empty string."""
|
|
52
|
+
if not _ORCHESTRATOR_URL or not chat_id:
|
|
53
|
+
return ''
|
|
54
|
+
try:
|
|
55
|
+
import aiohttp
|
|
56
|
+
upload_url = f'{_ORCHESTRATOR_URL}/api/uploads/{chat_id}/{filename}'
|
|
57
|
+
form = aiohttp.FormData()
|
|
58
|
+
form.add_field('file', content.encode('utf-8'), filename=filename, content_type='text/plain')
|
|
59
|
+
async with aiohttp.ClientSession() as session:
|
|
60
|
+
async with session.post(upload_url, data=form, timeout=aiohttp.ClientTimeout(total=15)) as resp:
|
|
61
|
+
if resp.status < 300:
|
|
62
|
+
return f'/mnt/user-data/uploads/{filename}'
|
|
63
|
+
log.warning('TOOL_RESULT_UPLOAD: status=%d url=%s', resp.status, upload_url)
|
|
64
|
+
except Exception as e:
|
|
65
|
+
log.warning('TOOL_RESULT_UPLOAD_ERR: %s', e)
|
|
66
|
+
return ''
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
async def _truncate_large_results_in_output(output: list, chat_id: str) -> None:
|
|
70
|
+
"""Truncate large tool results in output blocks IN-PLACE.
|
|
71
|
+
|
|
72
|
+
Iterates output blocks, finds tool_calls results with content > threshold,
|
|
73
|
+
optionally uploads full content to docker-ai, replaces with preview.
|
|
74
|
+
Affects both DB storage (serialize_content_blocks) and LLM context
|
|
75
|
+
(convert_content_blocks_to_messages) since both read from the same output.
|
|
76
|
+
"""
|
|
77
|
+
if _TOOL_RESULT_MAX_CHARS <= 0:
|
|
78
|
+
return
|
|
79
|
+
import time as _time
|
|
80
|
+
_trunc_msg = lambda size_kb, preview, fpath: (
|
|
81
|
+
(f'[Tool result truncated: {size_kb:.0f} KB]\\n'
|
|
82
|
+
f'Preview (first {_TOOL_RESULT_PREVIEW_CHARS} chars):\\n'
|
|
83
|
+
f'{preview}\\n\\n---\\n'
|
|
84
|
+
f'Full result saved to: {fpath}\\n'
|
|
85
|
+
f'Read with: view {fpath} view_range=[1, 50]')
|
|
86
|
+
if fpath else
|
|
87
|
+
(f'[Tool result truncated: {size_kb:.0f} KB -> first {_TOOL_RESULT_PREVIEW_CHARS} chars]\\n'
|
|
88
|
+
f'{preview}\\n\\n---\\n'
|
|
89
|
+
f'[Result truncated. Full output was {size_kb:.0f} KB.]')
|
|
90
|
+
)
|
|
91
|
+
for block in output:
|
|
92
|
+
btype = block.get('type', '')
|
|
93
|
+
# --- Chat Completions format: type=tool_calls, results[].content ---
|
|
94
|
+
if btype == 'tool_calls':
|
|
95
|
+
tool_names = {}
|
|
96
|
+
for tc in block.get('content', []):
|
|
97
|
+
if not isinstance(tc, dict):
|
|
98
|
+
continue
|
|
99
|
+
tc_id = tc.get('id', '')
|
|
100
|
+
tc_name = tc.get('function', {}).get('name', '') if isinstance(tc.get('function'), dict) else ''
|
|
101
|
+
if tc_id and tc_name:
|
|
102
|
+
tool_names[tc_id] = tc_name
|
|
103
|
+
for result in block.get('results', []):
|
|
104
|
+
content = result.get('content', '')
|
|
105
|
+
if not isinstance(content, str) or len(content) <= _TOOL_RESULT_MAX_CHARS:
|
|
106
|
+
continue
|
|
107
|
+
size_kb = len(content) / 1024
|
|
108
|
+
tc_id = result.get('tool_call_id', 'unknown')
|
|
109
|
+
tool_name = tool_names.get(tc_id, 'tool')
|
|
110
|
+
preview = content[:_TOOL_RESULT_PREVIEW_CHARS]
|
|
111
|
+
file_path = ''
|
|
112
|
+
if _ORCHESTRATOR_URL and chat_id:
|
|
113
|
+
fname = f'tool_result_{tool_name}_{tc_id[:8]}_{int(_time.time())}.txt'
|
|
114
|
+
file_path = await _upload_result_to_docker_ai(content, fname, chat_id)
|
|
115
|
+
result['content'] = _trunc_msg(size_kb, preview, file_path)
|
|
116
|
+
log.info('TOOL_RESULT_TRUNCATED: fmt=tool_calls tool=%s orig_kb=%.1f uploaded=%s',
|
|
117
|
+
tool_name, size_kb, bool(file_path))
|
|
118
|
+
# --- Responses API format: type=function_call_output, output[].text ---
|
|
119
|
+
elif btype == 'function_call_output':
|
|
120
|
+
for part in block.get('output', []):
|
|
121
|
+
if part.get('type') != 'input_text':
|
|
122
|
+
continue
|
|
123
|
+
text = part.get('text', '')
|
|
124
|
+
if not isinstance(text, str) or len(text) <= _TOOL_RESULT_MAX_CHARS:
|
|
125
|
+
continue
|
|
126
|
+
size_kb = len(text) / 1024
|
|
127
|
+
preview = text[:_TOOL_RESULT_PREVIEW_CHARS]
|
|
128
|
+
call_id = block.get('call_id', 'unknown')
|
|
129
|
+
file_path = ''
|
|
130
|
+
if _ORCHESTRATOR_URL and chat_id:
|
|
131
|
+
fname = f'tool_result_{call_id[:12]}_{int(_time.time())}.txt'
|
|
132
|
+
file_path = await _upload_result_to_docker_ai(text, fname, chat_id)
|
|
133
|
+
part['text'] = _trunc_msg(size_kb, preview, file_path)
|
|
134
|
+
log.info('TOOL_RESULT_TRUNCATED: fmt=function_call_output call_id=%s orig_kb=%.1f uploaded=%s',
|
|
135
|
+
call_id[:12], size_kb, bool(file_path))
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _truncate_tool_messages_in_history(messages: list) -> None:
|
|
139
|
+
"""Truncate large tool result messages from chat history IN-PLACE.
|
|
140
|
+
|
|
141
|
+
Sync version (no upload) for old results loaded from DB via
|
|
142
|
+
process_messages_with_output(). Prevents context window overflow
|
|
143
|
+
from accumulated tool results in long chat sessions.
|
|
144
|
+
"""
|
|
145
|
+
if _TOOL_RESULT_MAX_CHARS <= 0:
|
|
146
|
+
return
|
|
147
|
+
for msg in messages:
|
|
148
|
+
if msg.get('role') != 'tool':
|
|
149
|
+
continue
|
|
150
|
+
content = msg.get('content', '')
|
|
151
|
+
if not isinstance(content, str) or len(content) <= _TOOL_RESULT_MAX_CHARS:
|
|
152
|
+
continue
|
|
153
|
+
size_kb = len(content) / 1024
|
|
154
|
+
preview = content[:_TOOL_RESULT_PREVIEW_CHARS]
|
|
155
|
+
msg['content'] = (
|
|
156
|
+
f'[Tool result from history truncated: {size_kb:.0f} KB -> first {_TOOL_RESULT_PREVIEW_CHARS} chars]\\n'
|
|
157
|
+
f'{preview}\\n\\n---\\n'
|
|
158
|
+
f'[Result truncated. Full output was {size_kb:.0f} KB.]'
|
|
159
|
+
)
|
|
160
|
+
log.info('TOOL_RESULT_HISTORY_TRUNCATED: orig_kb=%.1f', size_kb)
|
|
161
|
+
# === END PATCH: _truncate_large_results_in_output ===
|
|
162
|
+
'''
|
|
163
|
+
|
|
164
|
+
# Search pattern: targets code AFTER fix_tool_loop_errors.py (TOOL_LOOP_ERRORS_UNIFIED marker).
|
|
165
|
+
# v0.9.2: Patch 3's REPLACE now emits `'metadata': metadata,` inside new_form_data — include it
|
|
166
|
+
# in the SEARCH so the cascade region is fully covered and any upstream drift of the metadata
|
|
167
|
+
# key fails loud here rather than silently producing a broken middleware.
|
|
168
|
+
SEARCH_TOOL_LOOP = (
|
|
169
|
+
" _saved_output = json.loads(json.dumps(output))"
|
|
170
|
+
" # TOOL_LOOP_ERRORS_UNIFIED: save for restore on error\n"
|
|
171
|
+
" try:\n"
|
|
172
|
+
" new_form_data = {\n"
|
|
173
|
+
" **form_data,\n"
|
|
174
|
+
" 'model': model_id,\n"
|
|
175
|
+
" 'stream': True,\n"
|
|
176
|
+
" 'metadata': metadata,\n"
|
|
177
|
+
" }\n"
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
REPLACE_TOOL_LOOP = (
|
|
181
|
+
" await _truncate_large_results_in_output("
|
|
182
|
+
"output, metadata.get('chat_id', '')) # LARGE_TOOL_RESULTS\n"
|
|
183
|
+
" _saved_output = json.loads(json.dumps(output))"
|
|
184
|
+
" # TOOL_LOOP_ERRORS_UNIFIED: save for restore on error\n"
|
|
185
|
+
" try:\n"
|
|
186
|
+
" new_form_data = {\n"
|
|
187
|
+
" **form_data,\n"
|
|
188
|
+
" 'model': model_id,\n"
|
|
189
|
+
" 'stream': True,\n"
|
|
190
|
+
" 'metadata': metadata,\n"
|
|
191
|
+
" }\n"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
# Mod 3: Truncate historical tool messages loaded from DB
|
|
196
|
+
SEARCH_HISTORY = (
|
|
197
|
+
" form_data['messages'] = process_messages_with_output(\n"
|
|
198
|
+
" form_data.get('messages', []),\n"
|
|
199
|
+
" reasoning_format=get_reasoning_format(model),\n"
|
|
200
|
+
" )\n"
|
|
201
|
+
"\n"
|
|
202
|
+
" system_message = get_system_message(form_data.get('messages', []))\n"
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
REPLACE_HISTORY = (
|
|
206
|
+
" form_data['messages'] = process_messages_with_output(\n"
|
|
207
|
+
" form_data.get('messages', []),\n"
|
|
208
|
+
" reasoning_format=get_reasoning_format(model),\n"
|
|
209
|
+
" )\n"
|
|
210
|
+
" _truncate_tool_messages_in_history(form_data['messages']) # LARGE_TOOL_RESULTS: trim old results\n"
|
|
211
|
+
"\n"
|
|
212
|
+
" system_message = get_system_message(form_data.get('messages', []))\n"
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def apply_patch():
|
|
217
|
+
"""Apply large tool results truncation patch to middleware.py."""
|
|
218
|
+
|
|
219
|
+
if not os.path.exists(MIDDLEWARE_PATH):
|
|
220
|
+
print(
|
|
221
|
+
f"ERROR: fix_large_tool_results target file {MIDDLEWARE_PATH} not found. "
|
|
222
|
+
"Refusing to produce a silently-broken image.",
|
|
223
|
+
file=sys.stderr,
|
|
224
|
+
)
|
|
225
|
+
sys.exit(1)
|
|
226
|
+
|
|
227
|
+
with open(MIDDLEWARE_PATH, "r", encoding="utf-8") as f:
|
|
228
|
+
content = f.read()
|
|
229
|
+
|
|
230
|
+
# Check if already applied
|
|
231
|
+
if PATCH_MARKER in content or NEW_PATCH_MARKER in content:
|
|
232
|
+
print(f"ALREADY PATCHED: {MIDDLEWARE_PATH} contains {PATCH_MARKER}")
|
|
233
|
+
return True
|
|
234
|
+
|
|
235
|
+
# Mod 1: Inject functions after imports
|
|
236
|
+
import_marker = "from open_webui.models.chats import Chats"
|
|
237
|
+
marker_idx = content.find(import_marker)
|
|
238
|
+
if marker_idx < 0:
|
|
239
|
+
print(
|
|
240
|
+
f"ERROR: fix_large_tool_results Mod 1 anchor (import marker "
|
|
241
|
+
f"'from open_webui.models.chats import Chats') not found in {MIDDLEWARE_PATH} "
|
|
242
|
+
"— upstream may have restructured imports. "
|
|
243
|
+
"Refusing to produce a silently-broken image.",
|
|
244
|
+
file=sys.stderr,
|
|
245
|
+
)
|
|
246
|
+
sys.exit(1)
|
|
247
|
+
|
|
248
|
+
eol_idx = content.index("\n", marker_idx) + 1
|
|
249
|
+
content = content[:eol_idx] + FUNCTION_CODE + content[eol_idx:]
|
|
250
|
+
print(" [1/3] Injected functions: _truncate_large_results_in_output, _truncate_tool_messages_in_history, _upload_result_to_docker_ai")
|
|
251
|
+
|
|
252
|
+
# Mod 2: Add truncation call before _saved_output in tool loop
|
|
253
|
+
if SEARCH_TOOL_LOOP not in content:
|
|
254
|
+
print(
|
|
255
|
+
"ERROR: fix_large_tool_results Mod 2 anchor (TOOL_LOOP_ERRORS_UNIFIED marker) "
|
|
256
|
+
"not found. Run fix_tool_loop_errors.py first, or upstream tool-loop structure "
|
|
257
|
+
"changed. Refusing to produce a silently-broken image.",
|
|
258
|
+
file=sys.stderr,
|
|
259
|
+
)
|
|
260
|
+
sys.exit(1)
|
|
261
|
+
content = content.replace(SEARCH_TOOL_LOOP, REPLACE_TOOL_LOOP, 1)
|
|
262
|
+
print(" [2/3] Tool loop: truncate current results before _saved_output")
|
|
263
|
+
|
|
264
|
+
# Mod 3: Truncate historical tool messages from DB
|
|
265
|
+
if SEARCH_HISTORY not in content:
|
|
266
|
+
print(
|
|
267
|
+
"ERROR: fix_large_tool_results Mod 3 anchor (process_messages_with_output / "
|
|
268
|
+
"get_system_message block) not found in middleware.py — upstream may have "
|
|
269
|
+
"restructured. Refusing to produce a silently-broken image.",
|
|
270
|
+
file=sys.stderr,
|
|
271
|
+
)
|
|
272
|
+
sys.exit(1)
|
|
273
|
+
content = content.replace(SEARCH_HISTORY, REPLACE_HISTORY, 1)
|
|
274
|
+
print(" [3/3] History: truncate old tool results from DB")
|
|
275
|
+
|
|
276
|
+
with open(MIDDLEWARE_PATH, "w", encoding="utf-8") as f:
|
|
277
|
+
f.write(content)
|
|
278
|
+
|
|
279
|
+
print("PATCHED: fix_large_tool_results applied successfully.")
|
|
280
|
+
print(" Config: TOOL_RESULT_MAX_CHARS (default 50000), TOOL_RESULT_PREVIEW_CHARS (default 2000)")
|
|
281
|
+
print(" Upload: ORCHESTRATOR_URL (optional, for Computer Use)")
|
|
282
|
+
print(" Log markers: TOOL_RESULT_TRUNCATED, TOOL_RESULT_HISTORY_TRUNCATED")
|
|
283
|
+
return True
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
if __name__ == "__main__":
|
|
287
|
+
print("Applying large tool results truncation patch to middleware.py...")
|
|
288
|
+
success = apply_patch()
|
|
289
|
+
sys.exit(0 if success else 1)
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
3
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
4
|
+
"""
|
|
5
|
+
Patch for Open WebUI 0.9.5 (host-agnostic): automatic detection of file URLs in messages
|
|
6
|
+
|
|
7
|
+
Problem: To show file preview in the Artifacts panel, we need to detect
|
|
8
|
+
Computer Use Server file links in assistant messages and auto-open the
|
|
9
|
+
preview SPA in the Artifacts panel.
|
|
10
|
+
|
|
11
|
+
Solution: Patch getCodeBlockContents() -- the function that parses message content.
|
|
12
|
+
Push an iframe into htmlGroups array (e): if no code blocks found but content has
|
|
13
|
+
a link to /files/{chat_id}/... or /preview/{chat_id} -- push iframe artifact.
|
|
14
|
+
The existing chain (getContents -> artifactContents -> auto-show) handles the rest.
|
|
15
|
+
|
|
16
|
+
Host-agnostic: the iframe src is reconstructed at runtime from the matched URL's own
|
|
17
|
+
origin, so no build-time host configuration is needed.
|
|
18
|
+
|
|
19
|
+
=== Compiled-code anchor ===
|
|
20
|
+
|
|
21
|
+
Wn=r=>{r=Ce(r);const t=r.match(/```[\\s\\S]*?```/g);let n=[],e=[];
|
|
22
|
+
... // code block parsing fills e[] with {html, css, js} groups
|
|
23
|
+
const i=e.map(o=>o.html).join(""),a=e.map(o=>o.css).join(""),l=e.map(o=>o.js).join("");
|
|
24
|
+
return{codeBlocks:n,html:i.trim(),css:a.trim(),js:l.trim(),htmlGroups:e.filter(...).map(...)}
|
|
25
|
+
|
|
26
|
+
Injection point: BEFORE `const i=e.map(o=>o.html).join("")`
|
|
27
|
+
We push our iframe artifact into `e` (mutable let array), then `const i` naturally
|
|
28
|
+
picks it up. No const reassignment needed.
|
|
29
|
+
|
|
30
|
+
// INJECTED:
|
|
31
|
+
/* FIX_PREVIEW_URL_DETECTION */
|
|
32
|
+
if(!e.some(o=>o.html)&&r&&/\\/(files|preview)\\//.test(r)){
|
|
33
|
+
var _pm=r.match(/regex/); if(_pm) e.push({html:'<iframe...>',css:'...',js:''});
|
|
34
|
+
}
|
|
35
|
+
const i=e.map(o=>o.html).join(""); // now includes our iframe
|
|
36
|
+
|
|
37
|
+
Fail-loud contract: if the anchor regex does not match any chunk, the script
|
|
38
|
+
exits with sys.exit(1) and prints "ERROR: ..." on stderr. This intentionally
|
|
39
|
+
fails the Docker build rather than producing a silently-broken image.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
import os
|
|
43
|
+
import sys
|
|
44
|
+
import glob
|
|
45
|
+
import re
|
|
46
|
+
|
|
47
|
+
BUILD_CHUNKS_DIR = "/app/build/_app/immutable/chunks"
|
|
48
|
+
|
|
49
|
+
# Search pattern: the const declarations right before return
|
|
50
|
+
# We match: })}const i=e.map(o=>o.html).join("")
|
|
51
|
+
CONST_DECL_PATTERN = re.compile(
|
|
52
|
+
r'(\}\)\})const (\w+)=(\w+)\.map\(\w+=>\w+\.html\)\.join\(""\)'
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
# Context marker: the backtick regex (confirms we're in getCodeBlockContents)
|
|
56
|
+
BACKTICK_REGEX_MARKER = r'[\s\S]*?' # part of /```[\s\S]*?```/g
|
|
57
|
+
|
|
58
|
+
# This patch is host-agnostic. The iframe `src` is reconstructed at runtime
|
|
59
|
+
# from the matched URL's own origin (_pm[1] in the injected JS), so no
|
|
60
|
+
# build-time host configuration is consumed here. COMPUTER_USE_SERVER_URL
|
|
61
|
+
# is intentionally not read by this patch.
|
|
62
|
+
|
|
63
|
+
# Idempotency marker -- injected as a JS comment at the patch site.
|
|
64
|
+
# Presence of this marker indicates the chunk has already been patched by this script.
|
|
65
|
+
IDEMPOTENCY_MARKER = "/* FIX_PREVIEW_URL_DETECTION */"
|
|
66
|
+
# Legacy marker -- continue to recognise chunks patched by v0.8.12 runs.
|
|
67
|
+
LEGACY_PATCHED_MARKER = "preview-url-detect"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def find_chunk_file():
|
|
71
|
+
"""Find JS chunk containing getCodeBlockContents (by const pattern + backtick regex)"""
|
|
72
|
+
if not os.path.isdir(BUILD_CHUNKS_DIR):
|
|
73
|
+
print(f"ERROR: Directory not found: {BUILD_CHUNKS_DIR}", file=sys.stderr)
|
|
74
|
+
return None
|
|
75
|
+
|
|
76
|
+
for filepath in sorted(glob.glob(os.path.join(BUILD_CHUNKS_DIR, "*.js"))):
|
|
77
|
+
if filepath.endswith(".map"):
|
|
78
|
+
continue
|
|
79
|
+
try:
|
|
80
|
+
with open(filepath, "r", encoding="utf-8") as f:
|
|
81
|
+
content = f.read()
|
|
82
|
+
# Check for already-patched file first (new or legacy marker)
|
|
83
|
+
if (IDEMPOTENCY_MARKER in content) or (LEGACY_PATCHED_MARKER in content and '_pm' in content):
|
|
84
|
+
if BACKTICK_REGEX_MARKER in content:
|
|
85
|
+
return filepath
|
|
86
|
+
# Check for unpatched file
|
|
87
|
+
has_const = CONST_DECL_PATTERN.search(content)
|
|
88
|
+
has_backtick = BACKTICK_REGEX_MARKER in content
|
|
89
|
+
if has_const and has_backtick:
|
|
90
|
+
return filepath
|
|
91
|
+
except Exception as e:
|
|
92
|
+
print(f" Warning: Could not read {filepath}: {e}")
|
|
93
|
+
continue
|
|
94
|
+
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def extract_param_name(content, const_match):
|
|
99
|
+
"""Extract the function parameter name (the 'content' parameter).
|
|
100
|
+
|
|
101
|
+
Looks backwards from the const declaration to find PARAM.match(/```...)
|
|
102
|
+
"""
|
|
103
|
+
before = content[max(0, const_match.start() - 2000):const_match.start()]
|
|
104
|
+
param_match = re.search(r'(\w+)\.match\(/```', before)
|
|
105
|
+
if param_match:
|
|
106
|
+
return param_match.group(1)
|
|
107
|
+
return None
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def build_injection(param_name, groups_var):
|
|
111
|
+
"""Build the URL detection code to inject before const declarations.
|
|
112
|
+
|
|
113
|
+
Pushes an iframe artifact into the htmlGroups array (e).
|
|
114
|
+
The array is mutable (let), so push works in strict mode.
|
|
115
|
+
|
|
116
|
+
Host-agnostic: matches any HTTP(S) URL whose path contains /files/<id>/
|
|
117
|
+
or /preview/<id>. The actual host is read back from the matched URL
|
|
118
|
+
itself, so the filter's X-Public-Base-URL (localhost, 127.0.0.1,
|
|
119
|
+
computer-use-server, public domain, etc.) all work without the patch
|
|
120
|
+
having to know what it is at build time.
|
|
121
|
+
"""
|
|
122
|
+
# Build the JS expression that, at runtime, produces an iframe tag string.
|
|
123
|
+
# Two literal fragments + two interpolations (_pm[1]=origin, _pm[2]=id).
|
|
124
|
+
iframe_html_expr = (
|
|
125
|
+
"'<iframe src=\"'+_pm[1]+'/preview/'+_pm[2]+"
|
|
126
|
+
"'\" style=\"width:100%;height:100%;border:none\" "
|
|
127
|
+
"allow=\"clipboard-write; keyboard-map\"></iframe>\\n'"
|
|
128
|
+
)
|
|
129
|
+
iframe_css = (
|
|
130
|
+
"'*{margin:0;padding:0;overflow:hidden}"
|
|
131
|
+
"html,body{height:100%}\\n'"
|
|
132
|
+
)
|
|
133
|
+
# Host-agnostic detector: /(files|preview)\/ in url path, then capture
|
|
134
|
+
# the origin (_pm[1]) and the id segment (_pm[2]) via a single regex.
|
|
135
|
+
# Guard with `!param.some(o=>o.html)` so genuine fenced <html> blocks
|
|
136
|
+
# still take precedence.
|
|
137
|
+
# NOTE: we match origin http(s)://host[:port] then /files|/preview/ then id.
|
|
138
|
+
return (
|
|
139
|
+
f'{IDEMPOTENCY_MARKER}'
|
|
140
|
+
f'if(!{groups_var}.some(o=>o.html)&&{param_name}&&'
|
|
141
|
+
f'/\\/(files|preview)\\//.test({param_name}))'
|
|
142
|
+
f'{{var _pm={param_name}.match('
|
|
143
|
+
f'/(https?:\\/\\/[^\\/\\s\\"\\)]+)\\/(?:files|preview)\\/([^\\/\\s\\"\\)]+)/'
|
|
144
|
+
f');if(_pm){{{groups_var}.push({{html:{iframe_html_expr},css:{iframe_css},js:""}})}}}}'
|
|
145
|
+
f'/*{LEGACY_PATCHED_MARKER}*/'
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def apply_patch():
|
|
150
|
+
"""Apply the preview URL detection patch to getCodeBlockContents."""
|
|
151
|
+
chunk_file = find_chunk_file()
|
|
152
|
+
if not chunk_file:
|
|
153
|
+
print("ERROR: Could not find JS chunk with getCodeBlockContents", file=sys.stderr)
|
|
154
|
+
print(f" Searched in: {BUILD_CHUNKS_DIR}/*.js", file=sys.stderr)
|
|
155
|
+
return False
|
|
156
|
+
|
|
157
|
+
print(f" Found chunk: {os.path.basename(chunk_file)}")
|
|
158
|
+
|
|
159
|
+
with open(chunk_file, "r", encoding="utf-8") as f:
|
|
160
|
+
content = f.read()
|
|
161
|
+
|
|
162
|
+
# --- Idempotency short-circuit ---
|
|
163
|
+
# Either the new-style marker or the legacy marker indicates a prior run
|
|
164
|
+
# has already patched this chunk. Declare success without mutating.
|
|
165
|
+
if IDEMPOTENCY_MARKER in content:
|
|
166
|
+
print(f"ALREADY PATCHED: {os.path.basename(chunk_file)} contains {IDEMPOTENCY_MARKER}")
|
|
167
|
+
return True
|
|
168
|
+
if LEGACY_PATCHED_MARKER in content and '_pm' in content:
|
|
169
|
+
print(f"ALREADY PATCHED: {os.path.basename(chunk_file)} contains legacy marker '{LEGACY_PATCHED_MARKER}'")
|
|
170
|
+
return True
|
|
171
|
+
|
|
172
|
+
# Find the const declaration: })}const i=e.map(o=>o.html).join("")
|
|
173
|
+
const_match = CONST_DECL_PATTERN.search(content)
|
|
174
|
+
if not const_match:
|
|
175
|
+
print("ERROR: Could not find const html declaration pattern", file=sys.stderr)
|
|
176
|
+
return False
|
|
177
|
+
|
|
178
|
+
# Extract variable names
|
|
179
|
+
prefix = const_match.group(1) # })}
|
|
180
|
+
html_var = const_match.group(2) # i
|
|
181
|
+
groups_var = const_match.group(3) # e
|
|
182
|
+
|
|
183
|
+
print(f" Variables: html={html_var}, htmlGroups={groups_var}")
|
|
184
|
+
|
|
185
|
+
# Extract parameter name
|
|
186
|
+
param_name = extract_param_name(content, const_match)
|
|
187
|
+
if not param_name:
|
|
188
|
+
print("ERROR: Could not determine content parameter name", file=sys.stderr)
|
|
189
|
+
return False
|
|
190
|
+
|
|
191
|
+
print(f" Content param: {param_name}")
|
|
192
|
+
|
|
193
|
+
# Build injection code
|
|
194
|
+
injection = build_injection(param_name, groups_var)
|
|
195
|
+
|
|
196
|
+
print(f" Injection ({len(injection)} chars):")
|
|
197
|
+
print(f" {injection[:140]}...")
|
|
198
|
+
|
|
199
|
+
# Injection point: between })} and const i=...
|
|
200
|
+
# Replace: })}const i=... -> })}INJECTION;const i=...
|
|
201
|
+
old = const_match.group(0)
|
|
202
|
+
new = prefix + injection + "const " + old[len(prefix) + len("const "):]
|
|
203
|
+
|
|
204
|
+
content_new = content.replace(old, new, 1)
|
|
205
|
+
|
|
206
|
+
if content_new == content:
|
|
207
|
+
print("ERROR: Replacement had no effect", file=sys.stderr)
|
|
208
|
+
return False
|
|
209
|
+
|
|
210
|
+
with open(chunk_file, "w", encoding="utf-8") as f:
|
|
211
|
+
f.write(content_new)
|
|
212
|
+
|
|
213
|
+
print(f"PATCHED! File: {os.path.basename(chunk_file)}")
|
|
214
|
+
return True
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
if __name__ == "__main__":
|
|
218
|
+
print("Applying Preview URL detection patch to Open WebUI frontend...")
|
|
219
|
+
success = apply_patch()
|
|
220
|
+
if not success:
|
|
221
|
+
print(
|
|
222
|
+
"ERROR: fix_preview_url_detection anchor not found in "
|
|
223
|
+
f"{BUILD_CHUNKS_DIR}/*.js -- getCodeBlockContents compiled shape changed. "
|
|
224
|
+
"Check v0.9.5 source + update CONST_DECL_PATTERN. "
|
|
225
|
+
"Refusing to produce a silently-broken image.",
|
|
226
|
+
file=sys.stderr,
|
|
227
|
+
)
|
|
228
|
+
sys.exit(1)
|
|
229
|
+
print("PATCHED: fix_preview_url_detection applied successfully.")
|
|
230
|
+
sys.exit(0)
|