@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,163 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""Claude Code CLI adapter — byte-identical lift of mcp_tools.py.
|
|
4
|
+
|
|
5
|
+
LIFTED FROM (verbatim, no logic changes):
|
|
6
|
+
- mcp_tools.py:812-857 → parse_result(...) [JSON-line parser]
|
|
7
|
+
- mcp_tools.py:967-1019 → build_argv(...) [argv builder, two branches]
|
|
8
|
+
|
|
9
|
+
DORMANT in Phase 4: mcp_tools.sub_agent does NOT call this adapter yet.
|
|
10
|
+
The production path stays in mcp_tools.sub_agent through Phase 6 (success
|
|
11
|
+
criterion #4: "MCP sub_agent tool signature and behaviour are unchanged
|
|
12
|
+
in this phase"). Phase 7 flips dispatch through cli_runtime.
|
|
13
|
+
|
|
14
|
+
The byte-identicality of build_argv vs the v0.9.2.0 production code is
|
|
15
|
+
verified by tests/orchestrator/test_subagent_claude_compat.py (golden
|
|
16
|
+
snapshot, plan 04-04). The argv layer is what is asserted byte-identical;
|
|
17
|
+
the surrounding `cd <wd> && <headers_env> ...` shell-execution wrapper
|
|
18
|
+
stays in mcp_tools.sub_agent (RESEARCH.md note at line 215).
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import json
|
|
22
|
+
|
|
23
|
+
from .result import SubAgentResult
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ClaudeAdapter:
|
|
27
|
+
"""Adapter for the `claude` CLI (Anthropic Claude Code).
|
|
28
|
+
|
|
29
|
+
Does NOT inherit from CliAdapter — structural typing via typing.Protocol
|
|
30
|
+
is sufficient (RESEARCH.md lines 244-260).
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def build_argv(
|
|
34
|
+
self,
|
|
35
|
+
task: str,
|
|
36
|
+
system_prompt: str,
|
|
37
|
+
model: str,
|
|
38
|
+
max_turns: int,
|
|
39
|
+
timeout_s: int,
|
|
40
|
+
*,
|
|
41
|
+
resume_session_id: str = "",
|
|
42
|
+
plan_file: str = "",
|
|
43
|
+
) -> list[str]:
|
|
44
|
+
"""Return the argv list for invoking `claude --print ...`.
|
|
45
|
+
|
|
46
|
+
Two branches (lifted from mcp_tools.py:962-1019):
|
|
47
|
+
- RESUME: when resume_session_id is non-empty, build the resume argv.
|
|
48
|
+
- NEW SESSION: otherwise, build the new-session argv with --model
|
|
49
|
+
and --append-system-prompt.
|
|
50
|
+
|
|
51
|
+
Common flags appended to BOTH branches (lifted from mcp_tools.py:954-959):
|
|
52
|
+
--max-turns N --permission-mode bypassPermissions
|
|
53
|
+
--disallowedTools AskUserQuestion,ExitPlanMode --output-format json
|
|
54
|
+
|
|
55
|
+
Note: timeout_s is part of the Protocol but not consumed here — the
|
|
56
|
+
existing v0.9.2.0 invocation enforces timeout via the asyncio wrapper
|
|
57
|
+
in mcp_tools.sub_agent, NOT via a CLI flag. Accepted for Protocol
|
|
58
|
+
uniformity; codex/opencode adapters will use it.
|
|
59
|
+
|
|
60
|
+
Note: plan_file is part of the Protocol but not consumed here — the
|
|
61
|
+
short-prompt construction (`Read and execute your task plan from
|
|
62
|
+
<plan_file>`) lives in mcp_tools.sub_agent today and is passed in as
|
|
63
|
+
`task`. Accepted for Protocol uniformity.
|
|
64
|
+
"""
|
|
65
|
+
common = [
|
|
66
|
+
"--max-turns", str(max_turns),
|
|
67
|
+
"--permission-mode", "bypassPermissions",
|
|
68
|
+
"--disallowedTools", "AskUserQuestion,ExitPlanMode",
|
|
69
|
+
"--output-format", "json",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
if resume_session_id:
|
|
73
|
+
# RESUME branch (lifted from mcp_tools.py:962-973)
|
|
74
|
+
return [
|
|
75
|
+
"claude",
|
|
76
|
+
"-p", task,
|
|
77
|
+
"--resume", resume_session_id,
|
|
78
|
+
*common,
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
# NEW SESSION branch (lifted from mcp_tools.py:974-1019)
|
|
82
|
+
return [
|
|
83
|
+
"claude",
|
|
84
|
+
"-p", task,
|
|
85
|
+
"--model", model,
|
|
86
|
+
"--append-system-prompt", system_prompt,
|
|
87
|
+
*common,
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
def parse_result(
|
|
91
|
+
self,
|
|
92
|
+
stdout: str,
|
|
93
|
+
stderr: str,
|
|
94
|
+
returncode: int,
|
|
95
|
+
) -> SubAgentResult:
|
|
96
|
+
"""Parse Claude's `--output-format json` stream.
|
|
97
|
+
|
|
98
|
+
Body lifted verbatim from mcp_tools.py:_format_sub_agent_result
|
|
99
|
+
(lines 819-845). Tail (lines 847-855) is REMOVED here — string
|
|
100
|
+
formatting belongs to a future render layer (Phase 7 concern), not
|
|
101
|
+
the parser. Returns SubAgentResult instead.
|
|
102
|
+
|
|
103
|
+
cost_usd → None when total_cost_usd is 0.0 OR missing (per Pitfall 4:
|
|
104
|
+
render "cost: unavailable" rather than "$0.00" upstream).
|
|
105
|
+
turns → None when num_turns is 0 OR missing (same rationale).
|
|
106
|
+
session_id → None when empty string OR missing.
|
|
107
|
+
|
|
108
|
+
is_error → True when the JSON `result` line says is_error=True OR when
|
|
109
|
+
returncode != 0. The returncode gate aligns ClaudeAdapter with
|
|
110
|
+
CodexAdapter/OpenCodeAdapter (Phase 5 BLOCKER 1) — without it, killed
|
|
111
|
+
or timed-out claude runs (rc=137/143/124 with empty stdout) would
|
|
112
|
+
silently render as success because there is no JSON `result` line to
|
|
113
|
+
flip is_error.
|
|
114
|
+
|
|
115
|
+
returncode → captured into SubAgentResult.returncode (added in plan
|
|
116
|
+
05-02 Task 0) so the caller can render distinct user-facing messages
|
|
117
|
+
for rc=124 (timeout), rc=137 (SIGKILL), rc=143 (SIGTERM).
|
|
118
|
+
"""
|
|
119
|
+
response_text = ""
|
|
120
|
+
cost = 0.0
|
|
121
|
+
turns = 0
|
|
122
|
+
is_error = False
|
|
123
|
+
session_id = ""
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
for line in stdout.strip().split("\n"):
|
|
127
|
+
line = line.strip()
|
|
128
|
+
if '"type"' in line and '"result"' in line:
|
|
129
|
+
try:
|
|
130
|
+
parsed = json.loads(line)
|
|
131
|
+
if parsed.get("type") == "result":
|
|
132
|
+
response_text = parsed.get("result", "")
|
|
133
|
+
cost = parsed.get("total_cost_usd", 0.0)
|
|
134
|
+
turns = parsed.get("num_turns", 0)
|
|
135
|
+
is_error = parsed.get("is_error", False)
|
|
136
|
+
session_id = parsed.get("session_id", "")
|
|
137
|
+
break
|
|
138
|
+
except json.JSONDecodeError:
|
|
139
|
+
continue
|
|
140
|
+
except Exception as e:
|
|
141
|
+
# Preserve operator-visible diagnostic from the original
|
|
142
|
+
# _format_sub_agent_result (line 842).
|
|
143
|
+
print(f"[SUB-AGENT] Failed to parse JSON output: {e}")
|
|
144
|
+
|
|
145
|
+
if not response_text:
|
|
146
|
+
response_text = stdout
|
|
147
|
+
|
|
148
|
+
# BLOCKER 1: align with CodexAdapter/OpenCodeAdapter — non-zero rc is
|
|
149
|
+
# ALWAYS an error, even when the JSON `result` line is missing
|
|
150
|
+
# (killed/SIGKILL/SIGTERM/timeout cases). Without this gate,
|
|
151
|
+
# rc=137 + empty stdout would silently produce is_error=False and
|
|
152
|
+
# mcp_tools' Sub-Agent-Terminated branch would never fire.
|
|
153
|
+
is_error = is_error or (returncode != 0)
|
|
154
|
+
|
|
155
|
+
return SubAgentResult(
|
|
156
|
+
text=response_text,
|
|
157
|
+
cost_usd=cost if cost else None,
|
|
158
|
+
turns=turns if turns else None,
|
|
159
|
+
is_error=is_error,
|
|
160
|
+
session_id=session_id or None,
|
|
161
|
+
raw_events=[],
|
|
162
|
+
returncode=returncode,
|
|
163
|
+
)
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""Codex CLI adapter (ADAPT-03) — Phase 5 implementation.
|
|
4
|
+
|
|
5
|
+
Invokes `codex exec --ephemeral --json --output-last-message <tmpfile> ...`
|
|
6
|
+
with --full-auto (NOT --dangerously-bypass-approvals-and-sandbox per
|
|
7
|
+
PITFALLS.md anti-pattern table). Justification for --full-auto: we run
|
|
8
|
+
inside an isolated Docker container that already provides the sandbox
|
|
9
|
+
boundary that codex's own approval layer would otherwise enforce.
|
|
10
|
+
|
|
11
|
+
System-prompt injection is via concatenation into the prompt argument
|
|
12
|
+
("<system_prompt>\\n\\n---\\n\\n<task>") — codex 0.125.0 has no
|
|
13
|
+
--append-system-prompt / --system flag (Pitfall 2 in PITFALLS.md).
|
|
14
|
+
|
|
15
|
+
The /tmp/codex-agents-<uuid> workdir is created by cli_runtime.dispatch
|
|
16
|
+
BEFORE invocation (codex requires --cd to point at an existing dir).
|
|
17
|
+
Adapter stays a pure function — no side effects.
|
|
18
|
+
|
|
19
|
+
cost_usd is always None — codex JSONL stream does not surface a USD cost
|
|
20
|
+
(Pitfall 4: render "unavailable" upstream, not "$0.00").
|
|
21
|
+
|
|
22
|
+
parse_result populates SubAgentResult.returncode with the passed-in
|
|
23
|
+
returncode so plan 05-05's mcp_tools error-rendering branch can switch
|
|
24
|
+
on it (rc=124 timeout, rc=137 SIGKILL, rc=143 SIGTERM, default non-zero
|
|
25
|
+
"failed with exit code N").
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
import json
|
|
29
|
+
import uuid
|
|
30
|
+
|
|
31
|
+
from .result import SubAgentResult
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class CodexAdapter:
|
|
35
|
+
"""Adapter for the `codex` CLI (@openai/codex 0.125.0).
|
|
36
|
+
|
|
37
|
+
Does NOT inherit from CliAdapter — structural typing via typing.Protocol
|
|
38
|
+
is sufficient (matches ClaudeAdapter pattern).
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def build_argv(
|
|
42
|
+
self,
|
|
43
|
+
task: str,
|
|
44
|
+
system_prompt: str,
|
|
45
|
+
model: str,
|
|
46
|
+
max_turns: int,
|
|
47
|
+
timeout_s: int,
|
|
48
|
+
*,
|
|
49
|
+
resume_session_id: str = "",
|
|
50
|
+
plan_file: str = "",
|
|
51
|
+
) -> list[str]:
|
|
52
|
+
"""Return argv for `codex exec --ephemeral --json ...`.
|
|
53
|
+
|
|
54
|
+
Notes:
|
|
55
|
+
- max_turns is NOT honored by codex CLI (Claude-only flag); the
|
|
56
|
+
SUB_AGENT_TIMEOUT backstop is the caller's responsibility
|
|
57
|
+
(Pitfall 5 — codex turn-counting is a Phase 7 followup).
|
|
58
|
+
- resume_session_id is IGNORED with informational stderr warning
|
|
59
|
+
(codex --ephemeral is stateless by design; documented in
|
|
60
|
+
Phase 8 docs).
|
|
61
|
+
- plan_file is part of the Protocol but not consumed here — the
|
|
62
|
+
short-prompt construction (`Read and execute your task plan ...`)
|
|
63
|
+
is built by mcp_tools.sub_agent and passed in as `task`, same
|
|
64
|
+
as ClaudeAdapter.
|
|
65
|
+
"""
|
|
66
|
+
workdir = f"/tmp/codex-agents-{uuid.uuid4().hex[:12]}"
|
|
67
|
+
last_msg_file = f"{workdir}/last_message.txt"
|
|
68
|
+
|
|
69
|
+
# Pitfall 2: codex has no --append-system-prompt; concatenate as
|
|
70
|
+
# task preamble. Empty system_prompt => task only.
|
|
71
|
+
combined_prompt = (
|
|
72
|
+
f"{system_prompt}\n\n---\n\n{task}" if system_prompt else task
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
if resume_session_id:
|
|
76
|
+
# Inform the operator (stderr) that codex --ephemeral cannot
|
|
77
|
+
# honor session resume. We do NOT raise — caller may have
|
|
78
|
+
# supplied resume_session_id from a previous claude run; we
|
|
79
|
+
# gracefully start a fresh ephemeral session.
|
|
80
|
+
import sys
|
|
81
|
+
print(
|
|
82
|
+
f"[codex-adapter] WARNING: resume_session_id={resume_session_id!r} "
|
|
83
|
+
f"ignored — codex --ephemeral is stateless.",
|
|
84
|
+
file=sys.stderr,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
return [
|
|
88
|
+
"codex", "exec",
|
|
89
|
+
"--ephemeral",
|
|
90
|
+
"--json",
|
|
91
|
+
"--output-last-message", last_msg_file,
|
|
92
|
+
"--model", model,
|
|
93
|
+
"--full-auto",
|
|
94
|
+
"--cd", workdir,
|
|
95
|
+
"--skip-git-repo-check",
|
|
96
|
+
combined_prompt,
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
def parse_result(
|
|
100
|
+
self,
|
|
101
|
+
stdout: str,
|
|
102
|
+
stderr: str,
|
|
103
|
+
returncode: int,
|
|
104
|
+
) -> SubAgentResult:
|
|
105
|
+
"""Parse codex's `--json` JSONL event stream.
|
|
106
|
+
|
|
107
|
+
Schema (developers.openai.com/codex/noninteractive):
|
|
108
|
+
- turn.started / turn.completed (with usage.input_tokens / output_tokens)
|
|
109
|
+
- item.completed where item.type == "message" carries the
|
|
110
|
+
assistant text in item.content[].text
|
|
111
|
+
|
|
112
|
+
cost_usd is always None (Pitfall 4): codex doesn't surface USD
|
|
113
|
+
cost in the stream; computing it would require a per-model price
|
|
114
|
+
table (deferred to v0.9.x).
|
|
115
|
+
|
|
116
|
+
turns is None (codex's turn.completed is per-turn, not cumulative
|
|
117
|
+
count; we do not maintain a counter here).
|
|
118
|
+
|
|
119
|
+
session_id is None (--ephemeral runs have no session id).
|
|
120
|
+
|
|
121
|
+
returncode is captured into SubAgentResult.returncode so the
|
|
122
|
+
caller (plan 05-05) can render distinct user-facing messages for
|
|
123
|
+
rc=124/137/143/non-zero.
|
|
124
|
+
"""
|
|
125
|
+
events: list[dict] = []
|
|
126
|
+
last_message_text = ""
|
|
127
|
+
tokens_in = 0
|
|
128
|
+
tokens_out = 0
|
|
129
|
+
is_error = (returncode != 0)
|
|
130
|
+
|
|
131
|
+
for line in stdout.strip().split("\n"):
|
|
132
|
+
line = line.strip()
|
|
133
|
+
if not line:
|
|
134
|
+
continue
|
|
135
|
+
try:
|
|
136
|
+
event = json.loads(line)
|
|
137
|
+
except json.JSONDecodeError:
|
|
138
|
+
continue
|
|
139
|
+
events.append(event)
|
|
140
|
+
et = event.get("type", "")
|
|
141
|
+
if et == "item.completed":
|
|
142
|
+
item = event.get("item", {})
|
|
143
|
+
if item.get("type") == "message":
|
|
144
|
+
for block in item.get("content", []) or []:
|
|
145
|
+
if isinstance(block, dict) and block.get("type") == "text":
|
|
146
|
+
last_message_text = block.get("text", last_message_text)
|
|
147
|
+
if et == "turn.completed":
|
|
148
|
+
usage = event.get("usage", {}) or {}
|
|
149
|
+
tokens_in += usage.get("input_tokens", 0) or 0
|
|
150
|
+
tokens_out += usage.get("output_tokens", 0) or 0
|
|
151
|
+
|
|
152
|
+
# If codex exits early with no parseable message AND no stdout, fall back
|
|
153
|
+
# to stderr so the caller surfaces the real CLI error instead of a generic
|
|
154
|
+
# "failed with exit code N" banner. Per CodeRabbit PR#75 review.
|
|
155
|
+
return SubAgentResult(
|
|
156
|
+
text=last_message_text or stdout or stderr,
|
|
157
|
+
cost_usd=None,
|
|
158
|
+
turns=None,
|
|
159
|
+
is_error=is_error,
|
|
160
|
+
session_id=None,
|
|
161
|
+
raw_events=events,
|
|
162
|
+
returncode=returncode,
|
|
163
|
+
)
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""OpenCode CLI adapter (ADAPT-04) — Phase 5 implementation.
|
|
4
|
+
|
|
5
|
+
Invokes `opencode run "<prompt>" --model <provider/model> --format json
|
|
6
|
+
--dangerously-skip-permissions`. Justification for
|
|
7
|
+
--dangerously-skip-permissions: we run inside an isolated Docker sandbox
|
|
8
|
+
container; the CLI's own permission layer is redundant inside that
|
|
9
|
+
boundary (same rationale as codex --full-auto in cli_adapters/codex.py).
|
|
10
|
+
|
|
11
|
+
System-prompt injection is via concatenation into the prompt argument
|
|
12
|
+
("<system_prompt>\\n\\n---\\n\\n<task>") — opencode's per-mode system
|
|
13
|
+
prompt lives in the rendered config (Phase 6 concern), not on the CLI
|
|
14
|
+
(Pitfall 2 in PITFALLS.md).
|
|
15
|
+
|
|
16
|
+
Model MUST be in `provider/model` form (e.g. anthropic/claude-sonnet-4-6,
|
|
17
|
+
openrouter/qwen/qwen-3-coder). cli_runtime.resolve_subagent_model
|
|
18
|
+
expands single-word aliases ("sonnet" -> "anthropic/claude-sonnet-4-6")
|
|
19
|
+
before reaching this adapter; bare ids without a "/" prefix get a
|
|
20
|
+
runtime warning from the resolver.
|
|
21
|
+
|
|
22
|
+
cost_usd may be a float (when opencode's provider reports per-step cost)
|
|
23
|
+
or None (when not). Pitfall 4: caller renders None as "unavailable",
|
|
24
|
+
not "$0.00".
|
|
25
|
+
|
|
26
|
+
parse_result populates SubAgentResult.returncode with the passed-in
|
|
27
|
+
returncode so plan 05-05's mcp_tools error-rendering branch can switch
|
|
28
|
+
on it (rc=124 timeout, rc=137 SIGKILL, rc=143 SIGTERM, default non-zero
|
|
29
|
+
"failed with exit code N").
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
import json
|
|
33
|
+
|
|
34
|
+
from .result import SubAgentResult
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class OpenCodeAdapter:
|
|
38
|
+
"""Adapter for the `opencode` CLI (sst/opencode-ai 1.14.25)."""
|
|
39
|
+
|
|
40
|
+
def build_argv(
|
|
41
|
+
self,
|
|
42
|
+
task: str,
|
|
43
|
+
system_prompt: str,
|
|
44
|
+
model: str,
|
|
45
|
+
max_turns: int,
|
|
46
|
+
timeout_s: int,
|
|
47
|
+
*,
|
|
48
|
+
resume_session_id: str = "",
|
|
49
|
+
plan_file: str = "",
|
|
50
|
+
) -> list[str]:
|
|
51
|
+
"""Return argv for `opencode run <prompt> --model ... --format json ...`.
|
|
52
|
+
|
|
53
|
+
Notes:
|
|
54
|
+
- max_turns is NOT honored by opencode CLI (Claude-only flag);
|
|
55
|
+
SUB_AGENT_TIMEOUT is the backstop (Pitfall 5).
|
|
56
|
+
- resume_session_id is IGNORED with informational stderr warning;
|
|
57
|
+
opencode `run --continue` requires a per-mode session config
|
|
58
|
+
that we do not ship until Phase 6.
|
|
59
|
+
- plan_file is part of the Protocol but not consumed here.
|
|
60
|
+
"""
|
|
61
|
+
# Pitfall 2: opencode has no CLI flag for system prompt; concatenate
|
|
62
|
+
# as task preamble (mirrors CodexAdapter shape).
|
|
63
|
+
combined_prompt = (
|
|
64
|
+
f"{system_prompt}\n\n---\n\n{task}" if system_prompt else task
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
if resume_session_id:
|
|
68
|
+
import sys
|
|
69
|
+
print(
|
|
70
|
+
f"[opencode-adapter] WARNING: resume_session_id={resume_session_id!r} "
|
|
71
|
+
f"ignored — opencode run is stateless (Phase 6 will add --continue).",
|
|
72
|
+
file=sys.stderr,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return [
|
|
76
|
+
"opencode", "run",
|
|
77
|
+
combined_prompt,
|
|
78
|
+
"--model", model,
|
|
79
|
+
"--format", "json",
|
|
80
|
+
"--dangerously-skip-permissions",
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
def parse_result(
|
|
84
|
+
self,
|
|
85
|
+
stdout: str,
|
|
86
|
+
stderr: str,
|
|
87
|
+
returncode: int,
|
|
88
|
+
) -> SubAgentResult:
|
|
89
|
+
"""Parse opencode's --format json event stream.
|
|
90
|
+
|
|
91
|
+
Schema (opencode.ai/docs/events) varies per provider; the parser is
|
|
92
|
+
defensive — preserves raw_events for debugging even when the
|
|
93
|
+
structured fields are missing.
|
|
94
|
+
|
|
95
|
+
Recognised final-message event types:
|
|
96
|
+
- assistant-message-completed
|
|
97
|
+
- step-finish
|
|
98
|
+
- message-completed
|
|
99
|
+
|
|
100
|
+
Cost: summed from step-finish events when event.cost or
|
|
101
|
+
event.usage.total_cost is present (numeric). Stays None if no
|
|
102
|
+
cost-bearing events arrive (e.g. provider doesn't report cost).
|
|
103
|
+
|
|
104
|
+
returncode is captured into SubAgentResult.returncode so the
|
|
105
|
+
caller (plan 05-05) can render distinct messages for rc=124/137/143.
|
|
106
|
+
"""
|
|
107
|
+
events: list[dict] = []
|
|
108
|
+
last_message_text = ""
|
|
109
|
+
cost_usd: float | None = None
|
|
110
|
+
is_error = (returncode != 0)
|
|
111
|
+
|
|
112
|
+
for line in stdout.strip().split("\n"):
|
|
113
|
+
line = line.strip()
|
|
114
|
+
if not line:
|
|
115
|
+
continue
|
|
116
|
+
try:
|
|
117
|
+
event = json.loads(line)
|
|
118
|
+
except json.JSONDecodeError:
|
|
119
|
+
continue
|
|
120
|
+
events.append(event)
|
|
121
|
+
et = event.get("type", "")
|
|
122
|
+
|
|
123
|
+
# Application-level error events (opencode exits rc=0 but emits these).
|
|
124
|
+
# Must be checked first so the error branch wins over any text extraction
|
|
125
|
+
# that might otherwise overwrite last_message_text with empty/garbage.
|
|
126
|
+
if et == "error":
|
|
127
|
+
is_error = True
|
|
128
|
+
err_data = event.get("data", {}) or {}
|
|
129
|
+
if isinstance(err_data, dict):
|
|
130
|
+
err_msg = err_data.get("message") or str(err_data)
|
|
131
|
+
else:
|
|
132
|
+
err_msg = str(err_data)
|
|
133
|
+
last_message_text = f"opencode error: {err_msg}"
|
|
134
|
+
continue
|
|
135
|
+
|
|
136
|
+
# Capture the final assistant text (last seen wins).
|
|
137
|
+
if et in ("assistant-message-completed", "step-finish", "message-completed"):
|
|
138
|
+
text_field = (
|
|
139
|
+
event.get("text")
|
|
140
|
+
or event.get("content")
|
|
141
|
+
or event.get("message", {}).get("content")
|
|
142
|
+
)
|
|
143
|
+
if isinstance(text_field, str):
|
|
144
|
+
last_message_text = text_field
|
|
145
|
+
elif isinstance(text_field, list):
|
|
146
|
+
for block in text_field:
|
|
147
|
+
if isinstance(block, dict) and block.get("type") == "text":
|
|
148
|
+
last_message_text = block.get("text", last_message_text)
|
|
149
|
+
|
|
150
|
+
# Cost aggregation: per-step cost on step-finish.
|
|
151
|
+
if et == "step-finish":
|
|
152
|
+
step_cost = event.get("cost")
|
|
153
|
+
if step_cost is None:
|
|
154
|
+
usage = event.get("usage", {}) or {}
|
|
155
|
+
step_cost = usage.get("total_cost")
|
|
156
|
+
if isinstance(step_cost, (int, float)):
|
|
157
|
+
cost_usd = (cost_usd or 0.0) + float(step_cost)
|
|
158
|
+
|
|
159
|
+
# If opencode exits early with no parseable message AND no stdout, fall
|
|
160
|
+
# back to stderr (mirrors codex adapter; same CodeRabbit PR#75 review).
|
|
161
|
+
return SubAgentResult(
|
|
162
|
+
text=last_message_text or stdout or stderr,
|
|
163
|
+
cost_usd=cost_usd,
|
|
164
|
+
turns=None,
|
|
165
|
+
is_error=is_error,
|
|
166
|
+
session_id=None,
|
|
167
|
+
raw_events=events,
|
|
168
|
+
returncode=returncode,
|
|
169
|
+
)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
"""Normalised sub-agent result type returned by every CLI adapter.
|
|
4
|
+
|
|
5
|
+
cost_usd is Optional because non-Claude CLIs (codex, opencode) do not
|
|
6
|
+
surface a USD cost in their JSON output (Pitfall 4 in PITFALLS.md).
|
|
7
|
+
None is rendered as "cost: unavailable" in the result string by the
|
|
8
|
+
caller; never as "$0.00" (which would be operator-misleading).
|
|
9
|
+
|
|
10
|
+
turns and session_id are Optional for the same reason — codex/opencode
|
|
11
|
+
do not emit equivalent fields. The Claude adapter populates them when
|
|
12
|
+
present in the parsed JSON.
|
|
13
|
+
|
|
14
|
+
raw_events is reserved for future cost computation (model→price tables)
|
|
15
|
+
and debugging; Phase 4 leaves it empty for the Claude adapter.
|
|
16
|
+
|
|
17
|
+
returncode is the underlying CLI process exit code, captured so the
|
|
18
|
+
caller can render distinct user-facing messages for rc=124 (timeout),
|
|
19
|
+
rc=137 (SIGKILL), rc=143 (SIGTERM) — preserves v0.9.2.0 UX through
|
|
20
|
+
the dispatch refactor.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass(frozen=True)
|
|
27
|
+
class SubAgentResult:
|
|
28
|
+
text: str
|
|
29
|
+
cost_usd: float | None
|
|
30
|
+
turns: int | None
|
|
31
|
+
is_error: bool
|
|
32
|
+
session_id: str | None
|
|
33
|
+
raw_events: list[dict] = field(default_factory=list)
|
|
34
|
+
returncode: int = 0
|