@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,566 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""TEST-03: per-CLI adapter argv-build + result-parse coverage.
|
|
4
|
+
|
|
5
|
+
Plan 05-04 of Phase 5. Covers:
|
|
6
|
+
- CodexAdapter.build_argv shape (D1 verbatim)
|
|
7
|
+
- CodexAdapter.parse_result against tests/fixtures/cli/codex_run.jsonl
|
|
8
|
+
- OpenCodeAdapter.build_argv shape (D3 verbatim)
|
|
9
|
+
- OpenCodeAdapter.parse_result against tests/fixtures/cli/opencode_run.jsonl
|
|
10
|
+
- ClaudeAdapter.parse_result against tests/fixtures/cli/claude_v0.9.2.0_stdout.json
|
|
11
|
+
(the build_argv byte-compat is in test_subagent_claude_compat.py — Phase 4)
|
|
12
|
+
- ClaudeAdapter.parse_result returncode-as-error gate (BLOCKER 1):
|
|
13
|
+
empty stdout + rc != 0 must produce is_error=True.
|
|
14
|
+
|
|
15
|
+
The Claude byte-compat invariant has TWO halves:
|
|
16
|
+
- argv side: test_subagent_claude_compat.py + claude_v0.9.2.0_argv.json
|
|
17
|
+
- parse side: this file + claude_v0.9.2.0_stdout.json
|
|
18
|
+
Both must stay green to keep ROADMAP success criterion #1 satisfied.
|
|
19
|
+
|
|
20
|
+
Note on test_claude_parse_result_nonzero_returncode_is_error:
|
|
21
|
+
This test is marked pytest.mark.xfail(strict=True) in plan 05-04 because
|
|
22
|
+
ClaudeAdapter.parse_result today (post-04, pre-05-05) ignores returncode
|
|
23
|
+
and always returns the JSON-parsed is_error flag (False when stdout has
|
|
24
|
+
no result line). Plan 05-05 Task 0 patches ClaudeAdapter to set
|
|
25
|
+
`is_error = is_error or (returncode != 0)` and to thread returncode into
|
|
26
|
+
SubAgentResult.returncode; once that lands, this test flips to PASS,
|
|
27
|
+
strict=True turns the unexpected pass into a hard failure so the xfail
|
|
28
|
+
marker is forced to be removed in lockstep with the fix. This is the
|
|
29
|
+
agreed BLOCKER 1 regression guard handover from 05-04 -> 05-05.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
import json
|
|
33
|
+
import os
|
|
34
|
+
import sys
|
|
35
|
+
|
|
36
|
+
import pytest
|
|
37
|
+
|
|
38
|
+
_SERVER_DIR = os.path.join(
|
|
39
|
+
os.path.dirname(__file__), "..", "..", "computer-use-server"
|
|
40
|
+
)
|
|
41
|
+
sys.path.insert(0, _SERVER_DIR)
|
|
42
|
+
|
|
43
|
+
_FIXTURE_DIR = os.path.join(
|
|
44
|
+
os.path.dirname(__file__), "..", "fixtures", "cli"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# ===========================================================================
|
|
49
|
+
# CodexAdapter
|
|
50
|
+
# ===========================================================================
|
|
51
|
+
|
|
52
|
+
def test_codex_build_argv_shape():
|
|
53
|
+
from cli_adapters.codex import CodexAdapter
|
|
54
|
+
argv = CodexAdapter().build_argv(
|
|
55
|
+
task="run the thing",
|
|
56
|
+
system_prompt="you are codex",
|
|
57
|
+
model="gpt-5-codex",
|
|
58
|
+
max_turns=25,
|
|
59
|
+
timeout_s=3600,
|
|
60
|
+
)
|
|
61
|
+
# Head: literal command + subcommand
|
|
62
|
+
assert argv[0:2] == ["codex", "exec"]
|
|
63
|
+
# Required flags present (D1)
|
|
64
|
+
for flag in ("--ephemeral", "--json", "--full-auto",
|
|
65
|
+
"--skip-git-repo-check", "--output-last-message",
|
|
66
|
+
"--cd", "--model"):
|
|
67
|
+
assert flag in argv, f"missing flag {flag!r} in codex argv: {argv}"
|
|
68
|
+
# --model carries through
|
|
69
|
+
assert argv[argv.index("--model") + 1] == "gpt-5-codex"
|
|
70
|
+
# --cd points at /tmp/codex-agents-<12-hex>
|
|
71
|
+
cd_target = argv[argv.index("--cd") + 1]
|
|
72
|
+
assert cd_target.startswith("/tmp/codex-agents-")
|
|
73
|
+
assert len(cd_target.split("-")[-1]) == 12, cd_target
|
|
74
|
+
# --output-last-message points inside the same workdir
|
|
75
|
+
last_msg = argv[argv.index("--output-last-message") + 1]
|
|
76
|
+
assert last_msg.startswith(cd_target + "/"), (cd_target, last_msg)
|
|
77
|
+
# Final arg is the combined system_prompt + "---" + task
|
|
78
|
+
assert "you are codex" in argv[-1]
|
|
79
|
+
assert "---" in argv[-1]
|
|
80
|
+
assert "run the thing" in argv[-1]
|
|
81
|
+
# Pitfall: --full-auto is the safe choice, not --dangerously-bypass...
|
|
82
|
+
assert "--dangerously-bypass-approvals-and-sandbox" not in argv
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_codex_build_argv_empty_system_prompt():
|
|
86
|
+
from cli_adapters.codex import CodexAdapter
|
|
87
|
+
argv = CodexAdapter().build_argv(
|
|
88
|
+
task="hi", system_prompt="", model="gpt-5-codex",
|
|
89
|
+
max_turns=25, timeout_s=60,
|
|
90
|
+
)
|
|
91
|
+
assert argv[-1] == "hi"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def test_codex_build_argv_warns_on_resume_session_id(capfd):
|
|
95
|
+
from cli_adapters.codex import CodexAdapter
|
|
96
|
+
CodexAdapter().build_argv(
|
|
97
|
+
task="t", system_prompt="", model="gpt-5-codex",
|
|
98
|
+
max_turns=25, timeout_s=60,
|
|
99
|
+
resume_session_id="ignored-uuid",
|
|
100
|
+
)
|
|
101
|
+
err = capfd.readouterr().err
|
|
102
|
+
assert "codex-adapter" in err
|
|
103
|
+
assert "ignored-uuid" in err
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def test_codex_parse_result_against_fixture():
|
|
107
|
+
from cli_adapters.codex import CodexAdapter
|
|
108
|
+
with open(os.path.join(_FIXTURE_DIR, "codex_run.jsonl")) as f:
|
|
109
|
+
stdout = f.read()
|
|
110
|
+
result = CodexAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
111
|
+
assert result.text == "Hello from codex. The answer is 42."
|
|
112
|
+
# Pitfall 4: cost is None for codex.
|
|
113
|
+
assert result.cost_usd is None
|
|
114
|
+
assert result.turns is None
|
|
115
|
+
assert result.session_id is None
|
|
116
|
+
assert result.is_error is False
|
|
117
|
+
assert result.returncode == 0
|
|
118
|
+
# raw_events preserved.
|
|
119
|
+
assert len(result.raw_events) >= 3
|
|
120
|
+
assert any(e.get("type") == "turn.completed" for e in result.raw_events)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def test_codex_parse_result_error_returncode():
|
|
124
|
+
from cli_adapters.codex import CodexAdapter
|
|
125
|
+
result = CodexAdapter().parse_result(
|
|
126
|
+
stdout="", stderr="something exploded", returncode=1
|
|
127
|
+
)
|
|
128
|
+
assert result.is_error is True
|
|
129
|
+
assert result.returncode == 1
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def test_codex_parse_result_returncode_field_propagated():
|
|
133
|
+
"""SubAgentResult.returncode is the rc passed in (added in plan 05-02 Task 0)."""
|
|
134
|
+
from cli_adapters.codex import CodexAdapter
|
|
135
|
+
for rc in (0, 1, 124, 137, 143):
|
|
136
|
+
result = CodexAdapter().parse_result(stdout="", stderr="", returncode=rc)
|
|
137
|
+
assert result.returncode == rc
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def test_codex_parse_result_skips_malformed_lines():
|
|
141
|
+
from cli_adapters.codex import CodexAdapter
|
|
142
|
+
bad = '\n'.join([
|
|
143
|
+
"this is not json",
|
|
144
|
+
json.dumps({"type": "item.completed", "item": {"type": "message", "content": [{"type": "text", "text": "ok"}]}}),
|
|
145
|
+
"{also not valid",
|
|
146
|
+
])
|
|
147
|
+
result = CodexAdapter().parse_result(stdout=bad, stderr="", returncode=0)
|
|
148
|
+
assert result.text == "ok"
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# ===========================================================================
|
|
152
|
+
# OpenCodeAdapter
|
|
153
|
+
# ===========================================================================
|
|
154
|
+
|
|
155
|
+
def test_opencode_build_argv_shape():
|
|
156
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
157
|
+
argv = OpenCodeAdapter().build_argv(
|
|
158
|
+
task="say hi",
|
|
159
|
+
system_prompt="you are oc",
|
|
160
|
+
model="anthropic/claude-sonnet-4-6",
|
|
161
|
+
max_turns=25,
|
|
162
|
+
timeout_s=60,
|
|
163
|
+
)
|
|
164
|
+
assert argv[0:2] == ["opencode", "run"]
|
|
165
|
+
# combined prompt is positional arg #3 (index 2)
|
|
166
|
+
assert "you are oc" in argv[2]
|
|
167
|
+
assert "---" in argv[2]
|
|
168
|
+
assert "say hi" in argv[2]
|
|
169
|
+
# --model + value
|
|
170
|
+
assert argv[argv.index("--model") + 1] == "anthropic/claude-sonnet-4-6"
|
|
171
|
+
# --format json
|
|
172
|
+
assert argv[argv.index("--format") + 1] == "json"
|
|
173
|
+
# --dangerously-skip-permissions present
|
|
174
|
+
assert "--dangerously-skip-permissions" in argv
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def test_opencode_build_argv_empty_system_prompt():
|
|
178
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
179
|
+
argv = OpenCodeAdapter().build_argv(
|
|
180
|
+
task="hi", system_prompt="",
|
|
181
|
+
model="openrouter/qwen/qwen-3-coder",
|
|
182
|
+
max_turns=25, timeout_s=60,
|
|
183
|
+
)
|
|
184
|
+
assert argv[2] == "hi"
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def test_opencode_build_argv_warns_on_resume_session_id(capfd):
|
|
188
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
189
|
+
OpenCodeAdapter().build_argv(
|
|
190
|
+
task="t", system_prompt="",
|
|
191
|
+
model="anthropic/claude-sonnet-4-6",
|
|
192
|
+
max_turns=25, timeout_s=60,
|
|
193
|
+
resume_session_id="ignored-uuid",
|
|
194
|
+
)
|
|
195
|
+
err = capfd.readouterr().err
|
|
196
|
+
assert "opencode-adapter" in err
|
|
197
|
+
assert "ignored-uuid" in err
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def test_opencode_parse_result_against_fixture():
|
|
201
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
202
|
+
with open(os.path.join(_FIXTURE_DIR, "opencode_run.jsonl")) as f:
|
|
203
|
+
stdout = f.read()
|
|
204
|
+
result = OpenCodeAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
205
|
+
assert result.text == "Hello from opencode. Answer: forty-two."
|
|
206
|
+
# cost summed across two step-finish events: 0.0042 + 0.0011 = 0.0053
|
|
207
|
+
assert result.cost_usd is not None
|
|
208
|
+
assert abs(result.cost_usd - 0.0053) < 1e-9
|
|
209
|
+
assert result.turns is None
|
|
210
|
+
assert result.session_id is None
|
|
211
|
+
assert result.is_error is False
|
|
212
|
+
assert result.returncode == 0
|
|
213
|
+
assert any(e.get("type") == "step-finish" for e in result.raw_events)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def test_opencode_parse_result_no_cost_path():
|
|
217
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
218
|
+
sample = json.dumps({"type": "message-completed", "text": "done"})
|
|
219
|
+
result = OpenCodeAdapter().parse_result(stdout=sample, stderr="", returncode=0)
|
|
220
|
+
assert result.text == "done"
|
|
221
|
+
assert result.cost_usd is None
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def test_opencode_parse_result_returncode_field_propagated():
|
|
225
|
+
"""SubAgentResult.returncode is the rc passed in (added in plan 05-02 Task 0)."""
|
|
226
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
227
|
+
for rc in (0, 1, 124, 137, 143):
|
|
228
|
+
result = OpenCodeAdapter().parse_result(stdout="", stderr="", returncode=rc)
|
|
229
|
+
assert result.returncode == rc
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def test_opencode_parse_result_content_blocks():
|
|
233
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
234
|
+
sample = json.dumps({
|
|
235
|
+
"type": "assistant-message-completed",
|
|
236
|
+
"content": [{"type": "text", "text": "from-blocks"}],
|
|
237
|
+
})
|
|
238
|
+
result = OpenCodeAdapter().parse_result(stdout=sample, stderr="", returncode=0)
|
|
239
|
+
assert result.text == "from-blocks"
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def test_opencode_parse_result_usage_total_cost_path():
|
|
243
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
244
|
+
sample = "\n".join([
|
|
245
|
+
json.dumps({"type": "step-finish", "usage": {"total_cost": 0.01}}),
|
|
246
|
+
json.dumps({"type": "step-finish", "usage": {"total_cost": 0.02}}),
|
|
247
|
+
json.dumps({"type": "assistant-message-completed", "text": "ok"}),
|
|
248
|
+
])
|
|
249
|
+
result = OpenCodeAdapter().parse_result(stdout=sample, stderr="", returncode=0)
|
|
250
|
+
assert abs(result.cost_usd - 0.03) < 1e-9
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
# ===========================================================================
|
|
254
|
+
# ClaudeAdapter — parse_result roundtrip (the build_argv side is in
|
|
255
|
+
# test_subagent_claude_compat.py and stays untouched).
|
|
256
|
+
# ===========================================================================
|
|
257
|
+
|
|
258
|
+
@pytest.fixture(scope="module")
|
|
259
|
+
def claude_stdout_fixture():
|
|
260
|
+
with open(os.path.join(_FIXTURE_DIR, "claude_v0.9.2.0_stdout.json")) as f:
|
|
261
|
+
return json.load(f)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def test_claude_parse_result_happy_path_byte_compat(claude_stdout_fixture):
|
|
265
|
+
from cli_adapters.claude import ClaudeAdapter
|
|
266
|
+
case = claude_stdout_fixture["happy_path"]
|
|
267
|
+
result = ClaudeAdapter().parse_result(
|
|
268
|
+
stdout=case["stdout"], stderr=case["stderr"], returncode=case["returncode"],
|
|
269
|
+
)
|
|
270
|
+
exp = case["expected"]
|
|
271
|
+
assert result.text == exp["text"]
|
|
272
|
+
assert result.cost_usd == exp["cost_usd"]
|
|
273
|
+
assert result.turns == exp["turns"]
|
|
274
|
+
assert result.is_error is exp["is_error"]
|
|
275
|
+
assert result.session_id == exp["session_id"]
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def test_claude_parse_result_zero_cost_becomes_none(claude_stdout_fixture):
|
|
279
|
+
"""Pitfall 4: total_cost_usd=0.0 becomes None (render 'unavailable'),
|
|
280
|
+
same for num_turns=0 and session_id==''."""
|
|
281
|
+
from cli_adapters.claude import ClaudeAdapter
|
|
282
|
+
case = claude_stdout_fixture["zero_cost_path"]
|
|
283
|
+
result = ClaudeAdapter().parse_result(
|
|
284
|
+
stdout=case["stdout"], stderr=case["stderr"], returncode=case["returncode"],
|
|
285
|
+
)
|
|
286
|
+
exp = case["expected"]
|
|
287
|
+
assert result.text == exp["text"]
|
|
288
|
+
assert result.cost_usd is None
|
|
289
|
+
assert result.turns is None
|
|
290
|
+
assert result.session_id is None
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def test_claude_parse_result_nonzero_returncode_is_error():
|
|
294
|
+
"""BLOCKER 1 regression guard.
|
|
295
|
+
|
|
296
|
+
v0.9.2.0 detected killed/timed-out claude runs at the mcp_tools layer
|
|
297
|
+
by checking exit_code in (137, 143, 124). Phase 5 lifts that into
|
|
298
|
+
ClaudeAdapter.parse_result so the caller can act on
|
|
299
|
+
SubAgentResult.is_error consistently across all CLIs.
|
|
300
|
+
|
|
301
|
+
Without this fix, claude rc=137/143/124 with no JSON `result` line
|
|
302
|
+
in stdout would silently return is_error=False and an empty text —
|
|
303
|
+
plan 05-05's Sub-Agent-Terminated branch would never fire and the
|
|
304
|
+
operator would see a "successful" but empty result.
|
|
305
|
+
|
|
306
|
+
After plan 05-05 Task 0 patches ClaudeAdapter.parse_result to set
|
|
307
|
+
`is_error = is_error or (returncode != 0)` and to thread the
|
|
308
|
+
returncode into SubAgentResult.returncode, this test passes and the
|
|
309
|
+
xfail marker above MUST be removed.
|
|
310
|
+
"""
|
|
311
|
+
from cli_adapters.claude import ClaudeAdapter
|
|
312
|
+
adapter = ClaudeAdapter()
|
|
313
|
+
for rc in (124, 137, 143, 1, -9, -15):
|
|
314
|
+
result = adapter.parse_result(stdout="", stderr="killed", returncode=rc)
|
|
315
|
+
assert result.is_error is True, (
|
|
316
|
+
f"rc={rc} with empty stdout must set is_error=True; got {result}"
|
|
317
|
+
)
|
|
318
|
+
# Plan 05-02 Task 0 added returncode field; plan 05-05 Task 0 populates it.
|
|
319
|
+
assert result.returncode == rc, (
|
|
320
|
+
f"rc={rc} must be threaded into SubAgentResult.returncode; "
|
|
321
|
+
f"got {result.returncode}"
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def test_claude_parse_result_happy_path_returncode_zero():
|
|
326
|
+
"""Successful claude run: returncode=0 must NOT flip is_error to True.
|
|
327
|
+
|
|
328
|
+
Today (pre-05-05) ClaudeAdapter does not pass returncode into
|
|
329
|
+
SubAgentResult; the dataclass default returncode=0 applies, so
|
|
330
|
+
result.returncode == 0 holds. After 05-05 Task 0 explicitly threads
|
|
331
|
+
the rc, the same assertion holds for the rc=0 input. Either way:
|
|
332
|
+
is_error stays False and returncode stays 0.
|
|
333
|
+
"""
|
|
334
|
+
from cli_adapters.claude import ClaudeAdapter
|
|
335
|
+
good_stdout = json.dumps({
|
|
336
|
+
"type": "result",
|
|
337
|
+
"result": "ok",
|
|
338
|
+
"total_cost_usd": 0.5,
|
|
339
|
+
"num_turns": 3,
|
|
340
|
+
"is_error": False,
|
|
341
|
+
"session_id": "s1",
|
|
342
|
+
})
|
|
343
|
+
result = ClaudeAdapter().parse_result(stdout=good_stdout, stderr="", returncode=0)
|
|
344
|
+
assert result.is_error is False
|
|
345
|
+
assert result.text == "ok"
|
|
346
|
+
assert result.returncode == 0
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
# ===========================================================================
|
|
350
|
+
# CodexAdapter — gap-closure tests (D-17 / D-18, plan 02-07)
|
|
351
|
+
# ===========================================================================
|
|
352
|
+
|
|
353
|
+
def test_codex_parse_result_usage_cost_extraction():
|
|
354
|
+
"""Codex adapter tracks token counts from turn.completed usage events.
|
|
355
|
+
|
|
356
|
+
The codex protocol does NOT surface a USD cost (cost_usd is always None
|
|
357
|
+
per the adapter docstring and Pitfall 4). Instead, the adapter accumulates
|
|
358
|
+
tokens_in / tokens_out from turn.completed events. This test verifies that
|
|
359
|
+
a turn.completed event with a usage block does NOT crash the parser and
|
|
360
|
+
that cost_usd stays None (the documented behaviour — not a gap to fix here).
|
|
361
|
+
Token counters are internal locals; we assert the visible field that IS
|
|
362
|
+
documented: cost_usd == None.
|
|
363
|
+
"""
|
|
364
|
+
from cli_adapters.codex import CodexAdapter
|
|
365
|
+
stdout = "\n".join([
|
|
366
|
+
json.dumps({"type": "turn.completed", "turn_id": "t-1",
|
|
367
|
+
"usage": {"input_tokens": 500, "output_tokens": 20}}),
|
|
368
|
+
json.dumps({"type": "item.completed", "item": {
|
|
369
|
+
"type": "message",
|
|
370
|
+
"content": [{"type": "text", "text": "result with tokens"}],
|
|
371
|
+
}}),
|
|
372
|
+
])
|
|
373
|
+
result = CodexAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
374
|
+
# Codex never computes USD cost — cost_usd must remain None.
|
|
375
|
+
assert result.cost_usd is None
|
|
376
|
+
assert result.text == "result with tokens"
|
|
377
|
+
assert result.is_error is False
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def test_codex_parse_result_empty_event_stream():
|
|
381
|
+
"""Empty stdout with rc=0 should not raise and should produce is_error=False.
|
|
382
|
+
|
|
383
|
+
Codex uses rc-based error detection only; rc=0 with no events is not
|
|
384
|
+
classified as an error. text falls back to stdout (empty string).
|
|
385
|
+
"""
|
|
386
|
+
from cli_adapters.codex import CodexAdapter
|
|
387
|
+
result = CodexAdapter().parse_result(stdout="", stderr="", returncode=0)
|
|
388
|
+
assert result.is_error is False
|
|
389
|
+
assert result.returncode == 0
|
|
390
|
+
assert result.text == ""
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
def test_codex_parse_result_error_event_in_stream():
|
|
394
|
+
"""Codex protocol has no application-level error event type.
|
|
395
|
+
|
|
396
|
+
The adapter does not handle a codex 'error' event specially; rc=0 with
|
|
397
|
+
any non-recognised event type produces is_error=False. This test documents
|
|
398
|
+
the current behaviour explicitly so future maintainers know that codex
|
|
399
|
+
error detection is entirely rc-based (unlike opencode which has et=='error').
|
|
400
|
+
|
|
401
|
+
If a future codex protocol version emits error events, this test will fail
|
|
402
|
+
and an adapter update will be required (follow-up: REQ-MCP-14 or newer).
|
|
403
|
+
"""
|
|
404
|
+
from cli_adapters.codex import CodexAdapter
|
|
405
|
+
# Construct a synthetic 'error' event in codex-style JSONL.
|
|
406
|
+
stdout = json.dumps({"type": "error", "message": "model unavailable"})
|
|
407
|
+
result = CodexAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
408
|
+
# Current behaviour: no special handling → is_error driven by rc only.
|
|
409
|
+
assert result.is_error is False # rc=0, no rc-based error gate triggered
|
|
410
|
+
assert result.returncode == 0
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
# ===========================================================================
|
|
414
|
+
# OpenCodeAdapter — gap-closure tests (D-17 / D-18, plan 02-07)
|
|
415
|
+
# ===========================================================================
|
|
416
|
+
|
|
417
|
+
def test_opencode_parse_result_multi_event_stream():
|
|
418
|
+
"""Multi-event stdout: assistant-message-completed + step-finish + message-completed.
|
|
419
|
+
|
|
420
|
+
The adapter uses "last seen wins" for text extraction across all three
|
|
421
|
+
event types. A step-finish event in between should update text only if
|
|
422
|
+
it has a text/content field; message-completed with text sets the final.
|
|
423
|
+
"""
|
|
424
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
425
|
+
stdout = "\n".join([
|
|
426
|
+
json.dumps({"type": "assistant-message-completed", "text": "first message"}),
|
|
427
|
+
json.dumps({"type": "step-finish", "cost": 0.001}),
|
|
428
|
+
json.dumps({"type": "message-completed", "text": "final answer"}),
|
|
429
|
+
])
|
|
430
|
+
result = OpenCodeAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
431
|
+
assert result.is_error is False
|
|
432
|
+
assert result.text == "final answer"
|
|
433
|
+
assert result.cost_usd is not None
|
|
434
|
+
assert abs(result.cost_usd - 0.001) < 1e-9
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def test_opencode_parse_result_empty_stdout():
|
|
438
|
+
"""Empty stdout with rc=0: adapter should not raise.
|
|
439
|
+
|
|
440
|
+
is_error is driven by returncode != 0 initially (rc=0 → False).
|
|
441
|
+
text falls back through last_message_text (empty) → stdout (empty) → stderr (empty).
|
|
442
|
+
"""
|
|
443
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
444
|
+
result = OpenCodeAdapter().parse_result(stdout="", stderr="", returncode=0)
|
|
445
|
+
assert result.is_error is False
|
|
446
|
+
assert result.returncode == 0
|
|
447
|
+
assert result.text == ""
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
def test_opencode_parse_result_malformed_json_between_valid_events():
|
|
451
|
+
"""A malformed JSON line between valid events must not stop parsing.
|
|
452
|
+
|
|
453
|
+
The adapter skips json.JSONDecodeError and continues to the next line.
|
|
454
|
+
The final valid event must still be extracted.
|
|
455
|
+
"""
|
|
456
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
457
|
+
stdout = "\n".join([
|
|
458
|
+
json.dumps({"type": "assistant-message-completed", "text": "a"}),
|
|
459
|
+
"{not valid json",
|
|
460
|
+
json.dumps({"type": "message-completed", "text": "b"}),
|
|
461
|
+
])
|
|
462
|
+
result = OpenCodeAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
463
|
+
assert result.text == "b"
|
|
464
|
+
assert result.is_error is False
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
def test_opencode_parse_result_error_event_message_extraction():
|
|
468
|
+
"""Phase 1 D-11 regression guard: et=='error' sets is_error=True.
|
|
469
|
+
|
|
470
|
+
opencode exits with rc=0 on application-level errors but emits an
|
|
471
|
+
{"type": "error", "data": {"message": "..."}} event. The adapter must
|
|
472
|
+
detect this, set is_error=True, and surface the error message prefixed
|
|
473
|
+
with 'opencode error: '.
|
|
474
|
+
"""
|
|
475
|
+
from cli_adapters.opencode import OpenCodeAdapter
|
|
476
|
+
stdout = json.dumps({"type": "error", "data": {"message": "upstream auth failed"}})
|
|
477
|
+
result = OpenCodeAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
478
|
+
assert result.is_error is True
|
|
479
|
+
assert result.text == "opencode error: upstream auth failed"
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
# ===========================================================================
|
|
483
|
+
# ClaudeAdapter — gap-closure tests (D-17 / D-18, plan 02-07)
|
|
484
|
+
# ===========================================================================
|
|
485
|
+
|
|
486
|
+
def test_claude_parse_result_malformed_json():
|
|
487
|
+
"""Non-JSON garbage in stdout: adapter must not raise and must not crash.
|
|
488
|
+
|
|
489
|
+
ClaudeAdapter wraps parsing in try/except; malformed stdout with rc=0
|
|
490
|
+
should produce is_error=False (no JSON result line found, returncode=0
|
|
491
|
+
so the BLOCKER-1 gate does not fire). text falls back to stdout raw.
|
|
492
|
+
"""
|
|
493
|
+
from cli_adapters.claude import ClaudeAdapter
|
|
494
|
+
result = ClaudeAdapter().parse_result(
|
|
495
|
+
stdout="not-json garbage", stderr="", returncode=0
|
|
496
|
+
)
|
|
497
|
+
# No exception raised. text falls back to raw stdout.
|
|
498
|
+
assert result.is_error is False
|
|
499
|
+
assert result.returncode == 0
|
|
500
|
+
# The fallback text is the raw stdout when no JSON result line is found.
|
|
501
|
+
assert "garbage" in result.text
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def test_claude_parse_result_empty_stdout():
|
|
505
|
+
"""Empty stdout with rc=0: is_error must be False.
|
|
506
|
+
|
|
507
|
+
The BLOCKER-1 gate in ClaudeAdapter is `is_error = is_error or (returncode != 0)`.
|
|
508
|
+
With rc=0 and no parseable result line, is_error stays False.
|
|
509
|
+
text is the empty stdout string (the raw fallback).
|
|
510
|
+
"""
|
|
511
|
+
from cli_adapters.claude import ClaudeAdapter
|
|
512
|
+
result = ClaudeAdapter().parse_result(stdout="", stderr="", returncode=0)
|
|
513
|
+
assert result.is_error is False
|
|
514
|
+
assert result.returncode == 0
|
|
515
|
+
# text fallback: response_text="" → stdout="" is the assigned value
|
|
516
|
+
assert result.text == ""
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
def test_claude_parse_result_event_without_content():
|
|
520
|
+
"""Result JSON with null 'result' field: adapter must not crash.
|
|
521
|
+
|
|
522
|
+
If the result line has type=='result' but result==null (or missing),
|
|
523
|
+
response_text remains "" and the fallback logic kicks in. session_id
|
|
524
|
+
and cost fields should still be extracted when present.
|
|
525
|
+
"""
|
|
526
|
+
from cli_adapters.claude import ClaudeAdapter
|
|
527
|
+
stdout = json.dumps({
|
|
528
|
+
"type": "result",
|
|
529
|
+
"result": None,
|
|
530
|
+
"total_cost_usd": 0.0,
|
|
531
|
+
"num_turns": 0,
|
|
532
|
+
"is_error": False,
|
|
533
|
+
"session_id": "sess-abc",
|
|
534
|
+
})
|
|
535
|
+
result = ClaudeAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
536
|
+
# result field is None → response_text stays "" → fallback to stdout
|
|
537
|
+
assert result.is_error is False
|
|
538
|
+
assert result.returncode == 0
|
|
539
|
+
# session_id="sess-abc" is extracted from the JSON
|
|
540
|
+
assert result.session_id == "sess-abc"
|
|
541
|
+
# cost=0.0 → None (Pitfall 4)
|
|
542
|
+
assert result.cost_usd is None
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
def test_codex_parse_result_partial_truncated_json():
|
|
546
|
+
"""Truncated last line (partial JSON) must be skipped without crashing.
|
|
547
|
+
|
|
548
|
+
If the codex stream is cut off mid-event (e.g. timeout kills the process
|
|
549
|
+
mid-write), the adapter should parse all complete events before the
|
|
550
|
+
truncated line and return whatever text was accumulated so far.
|
|
551
|
+
"""
|
|
552
|
+
from cli_adapters.codex import CodexAdapter
|
|
553
|
+
stdout = "\n".join([
|
|
554
|
+
json.dumps({"type": "item.completed", "item": {
|
|
555
|
+
"type": "message",
|
|
556
|
+
"content": [{"type": "text", "text": "partial run result"}],
|
|
557
|
+
}}),
|
|
558
|
+
'{"type": "turn.completed", "usage": {"input_tokens": 100,', # truncated
|
|
559
|
+
])
|
|
560
|
+
result = CodexAdapter().parse_result(stdout=stdout, stderr="", returncode=0)
|
|
561
|
+
assert result.text == "partial run result"
|
|
562
|
+
assert result.is_error is False
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
if __name__ == "__main__":
|
|
566
|
+
sys.exit(pytest.main([__file__, "-v"]))
|