@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,76 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: proposed
|
|
6
|
+
last-reviewed: 2026-06-06
|
|
7
|
+
owner: "@Wide-Moat/architects"
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
supersedes: []
|
|
10
|
+
superseded-by: null
|
|
11
|
+
compliance-impact: [SOC2-CC7.2, ISO27001-A.8.15, NYDFS-500.06, DORA-Art.10, EU-AI-Act-Art.12]
|
|
12
|
+
license-impact: none
|
|
13
|
+
threat-mitigation-link: ../06-threat-model.md
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
The audit pipeline's durable bus, WORM store, SIEM, and transparency log are integration contracts the customer fills; OCU delivers only the chain of custody and a local durable commit.
|
|
17
|
+
|
|
18
|
+
# ADR-0009: Audit pipeline is pluggable-by-contract
|
|
19
|
+
|
|
20
|
+
## Status
|
|
21
|
+
|
|
22
|
+
`proposed`
|
|
23
|
+
|
|
24
|
+
## Context
|
|
25
|
+
|
|
26
|
+
The Audit pipeline ([component 07](../components/07-audit-pipeline.md), trust-zone 5 of [02-trust-boundaries.md](../02-trust-boundaries.md) §2) turns each source's OCSF event into a durable, ordered, tamper-evident record and forwards it to a customer sink. Two substrates were left undecided: the durable-bus product and the WORM cold-tier store ([component 07](../components/07-audit-pipeline.md) Shelf delta — "ADR-level picks; neither is decided here"). [02-trust-boundaries.md](../02-trust-boundaries.md) §10 held "mandatory in code, pluggable in sinks" unanchored by an ADR.
|
|
27
|
+
|
|
28
|
+
The build-scope principle ([03-non-negotiables.md](../manifesto/03-non-negotiables.md)) sets the rule: OCU builds the control plane and the sandbox; every neighbouring capability is integrated off-the-shelf, bundled only as a one-click-solo reference. A bus, an object store, a SIEM, and a transparency log are neighbouring systems that run when OCU is stopped. The open question is where, inside the audit pipeline, the build/buy line falls — what OCU must author versus what the customer plugs in.
|
|
29
|
+
|
|
30
|
+
## Decision
|
|
31
|
+
|
|
32
|
+
We draw the build/buy line once for the whole audit tract: OCU delivers the chain of custody and a local durable commit; everything downstream — bus, store, SIEM, transparency log, signing-key custody — is a published contract the customer fills, with a one-click-solo reference default, carrying no OCU CVE responsibility.
|
|
33
|
+
|
|
34
|
+
## Consequences
|
|
35
|
+
|
|
36
|
+
OCU's mandatory core (the DELIVER side of [02-nfrs.md](../manifesto/02-nfrs.md) §Scope ownership), present on both shelves and chaos-testable:
|
|
37
|
+
|
|
38
|
+
- **Host-attested ingest** — binds the OCSF `source` to the verified channel identity, never the payload ([NFR-SEC-09](../manifesto/02-nfrs.md)).
|
|
39
|
+
- **A local durable commit** — fsync-then-ack on the always-present file-system sink, before the source's publish is acknowledged. This is what [NFR-REL-03](../manifesto/02-nfrs.md) (RPO = 0) forces: an arbitrary customer bus whose ack semantics OCU does not control cannot hold RPO = 0, so the no-loss commit point is OCU's, upstream of any seam. It does not force OCU to own the bus. Write-before-ack and "no synchronous DB on the critical path" are [NFR-REL-12](../manifesto/02-nfrs.md).
|
|
40
|
+
- **Chain writer + Merkle-head accumulator + envelope signer** — per-source hash linkage, the daily head, and the submission-envelope signature ([NFR-SEC-03](../manifesto/02-nfrs.md)). OCU signs only the envelope; the transparency-log operator signs the head.
|
|
41
|
+
- **OCSF envelope and retention-policy enforcement** — the mandatory fields out-of-band of the payload ([NFR-MAINT-AUDIT-SCHEMA](../manifesto/02-nfrs.md)) and the 7 y / 10 y floor on both shelves ([NFR-COMP-01](../manifesto/02-nfrs.md)).
|
|
42
|
+
|
|
43
|
+
The pluggable seams (the ENABLE side), each a contract plus a solo-reference default:
|
|
44
|
+
|
|
45
|
+
| Seam | Solo reference | Full-shelf | Open question |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| Durable-bus product | embedded append-only file / WAL | customer NATS or Kafka | [#150](https://github.com/Wide-Moat/open-computer-use/issues/150) |
|
|
48
|
+
| WORM cold-tier store | none — FS + hash-chain is the floor | customer S3 Object Lock Compliance / Ceph RGW | — |
|
|
49
|
+
| SIEM sink | file-system sink only | OCSF bridge (Splunk HEC, syslog-TLS, ECS, UDM) | [#150](https://github.com/Wide-Moat/open-computer-use/issues/150) |
|
|
50
|
+
| Transparency-log endpoint | local Merkle head | customer-pointed (public or private) | [#151](https://github.com/Wide-Moat/open-computer-use/issues/151) |
|
|
51
|
+
| Envelope-key custody | host-local key | HSM-rooted PKCS#11 / KMIP | — |
|
|
52
|
+
|
|
53
|
+
- Positive: the minimal shelf runs from one `docker-compose up` with no bus, no object store, and no SIEM; the FS sink plus hash-chain and signed Merkle head is the complete tamper-evidence story. The enterprise shelf points each seam at infrastructure the customer already operates and audits.
|
|
54
|
+
- Positive: OCU carries no CVE, SBOM, or version lifecycle for a bus, store, SIEM, or log it does not write. The reference defaults exist for the solo path, not as a bundled product line.
|
|
55
|
+
- Negative: the minimal-shelf tamper-evidence is detective (the chain detects deletion or truncation after the fact), not the preventive WORM-immutability of the full shelf ([NFR-COMP-01](../manifesto/02-nfrs.md)). A deployment whose threat model needs immutability against a privileged actor wires the WORM seam.
|
|
56
|
+
- Neutral: this resolves the two [component 07](../components/07-audit-pipeline.md) Shelf-delta picks in one boundary rule and anchors [02-trust-boundaries.md](../02-trust-boundaries.md) §10 to an ADR. Per-seam transport and backpressure detail stays open ([#150](https://github.com/Wide-Moat/open-computer-use/issues/150), [#151](https://github.com/Wide-Moat/open-computer-use/issues/151)).
|
|
57
|
+
|
|
58
|
+
## Alternatives considered
|
|
59
|
+
|
|
60
|
+
- **Bundle a durable bus (ship NATS or Kafka, own its CVE/SBOM/version lifecycle).** Rejected: a bus is a neighbouring system that runs without OCU, so bundling it violates the build-scope principle ([03-non-negotiables.md](../manifesto/03-non-negotiables.md)) and makes OCU accountable for a CVE surface the customer's own platform team already operates. The reference default for the solo path is an embedded WAL, not a bundled bus product.
|
|
61
|
+
- **Make the durable commit pluggable too (write straight to the customer's bus, no OCU-local commit).** Rejected: [NFR-REL-03](../manifesto/02-nfrs.md) RPO = 0 cannot hold against an arbitrary bus whose ack semantics OCU does not control — acking before the bus confirms durability opens a loss window, blocking on a slow bus violates the spill-not-block behaviour of [NFR-REL-12](../manifesto/02-nfrs.md). The thin local commit is the one part that cannot be a pure plug.
|
|
62
|
+
- **Two ADRs, one per substrate (bus / WORM).** Rejected: under the build-scope principle both are pluggable seams on the same side of one boundary, so the build/buy line is a single decision; splitting it duplicates the rationale and fragments a Nygard one-decision-per-file record. The [ADR-0005](0005-egress-credential-delivery-envoy-sds.md) precedent records one role for one container.
|
|
63
|
+
|
|
64
|
+
## Compliance impact
|
|
65
|
+
|
|
66
|
+
- `SOC2-CC7.2` / `ISO27001-A.8.15`: the chain of custody (hash linkage, Merkle head, envelope signature) is OCU-authored and present on both shelves; logging integrity does not depend on the customer's choice of sink.
|
|
67
|
+
- `NYDFS-500.06` / `DORA-Art.10`: the audit trail and its retention floor are machine-enforced on both shelves ([NFR-COMP-01](../manifesto/02-nfrs.md)); the WORM substrate satisfies the immutability expectation when the full-shelf seam is wired.
|
|
68
|
+
- `EU-AI-Act-Art.12`: the record-keeping obligation is met by the mandatory core; the transparency-log endpoint is the customer's choice of public or private operator.
|
|
69
|
+
|
|
70
|
+
## License impact
|
|
71
|
+
|
|
72
|
+
None. No bus, store, SIEM, or transparency-log dependency is bundled by this decision; the reference defaults (embedded WAL, file-system sink, local Merkle head) are OCU code. Customer-provided substrates are integrated over their standard APIs.
|
|
73
|
+
|
|
74
|
+
## Threat mitigation
|
|
75
|
+
|
|
76
|
+
Addresses Tampering and Repudiation on the audit path: the chain of custody is authored before any record leaves the pipeline, so a record's integrity is independent of the pluggable sink, and the local durable commit holds RPO = 0 against a stalled or hostile downstream. Per-seam residuals — SIEM-bridge backpressure ([#150](https://github.com/Wide-Moat/open-computer-use/issues/150)) and the transparency-log publishing path ([#151](https://github.com/Wide-Moat/open-computer-use/issues/151)) — stay open.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: proposed
|
|
6
|
+
last-reviewed: 2026-06-07
|
|
7
|
+
owner: "@Wide-Moat/architects"
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
supersedes: []
|
|
10
|
+
superseded-by: null
|
|
11
|
+
compliance-impact: [SOC2-CC6.1, ISO27001-A.8.10]
|
|
12
|
+
license-impact: none
|
|
13
|
+
threat-mitigation-link: ../06-threat-model.md
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
The Storage broker owns the guest file-operation contract and drives the backend through a pluggable engine adapter — a local volume and an S3 store from day one — so the guest never sees the backend protocol and no engine is bundled for production.
|
|
17
|
+
|
|
18
|
+
# ADR-0010: Storage backend is a pluggable adapter behind the broker
|
|
19
|
+
|
|
20
|
+
## Status
|
|
21
|
+
|
|
22
|
+
`proposed`
|
|
23
|
+
|
|
24
|
+
## Context
|
|
25
|
+
|
|
26
|
+
The Storage broker ([component 04](../components/04-storage-broker.md)) is the sole component that speaks the backend protocol and signs every backend request ([NFR-SEC-25](../manifesto/02-nfrs.md)); the guest holds only a `filesystem_id` handle and issues file-operation verbs that name no backend object (invariant 2). Which engine sits behind that signer was deferred — [component 04](../components/04-storage-broker.md) Shelf delta carried `needs ADR: object-store engine selection`, and the same question is phrased identically as an open item in [08-contracts.md](../08-contracts.md) §6 ([#208](https://github.com/Wide-Moat/open-computer-use/issues/208)): does the file-operation contract stay distinct from any object-store API at every shelf, and where is that boundary asserted.
|
|
27
|
+
|
|
28
|
+
OCU is an ephemeral workspace ([04-non-goals.md](../manifesto/04-non-goals.md)): it retains the audit record of file activity, never the customer file bytes, so the engine carries no retention, WORM, versioning, or erasure duty — those belong to the customer's store. Under the build-scope principle ([03-non-negotiables.md](../manifesto/03-non-negotiables.md)) an object store is a neighbouring system that runs when OCU is stopped.
|
|
29
|
+
|
|
30
|
+
## Decision
|
|
31
|
+
|
|
32
|
+
The broker drives the backend through a pluggable engine adapter behind its single object-store client: the guest↔broker file-operation contract is OCU-defined and stays distinct from the backend protocol at every shelf, a local-volume engine and an S3 engine are both present from day one, and no engine is bundled for production.
|
|
33
|
+
|
|
34
|
+
## Consequences
|
|
35
|
+
|
|
36
|
+
- **The two contracts stay distinct, and this closes [#208](https://github.com/Wide-Moat/open-computer-use/issues/208).** The guest↔broker contract is the OCU-defined file-operation interface (open/read/write/list over FUSE / virtio-fs / 9p, [08-contracts.md](../08-contracts.md)), deliberately POSIX-shaped, never the backend protocol. The boundary is asserted inside the broker's object-store client: invariant 2 ([component 04](../components/04-storage-broker.md)) — no caller request names a backend object directly — is the falsifiable statement of the split. The engine choice is the role `conform` backend leg ([08-contracts.md](../08-contracts.md)); the file-op mount is the role `define` surface.
|
|
37
|
+
- Positive: swapping the engine changes neither the file-operation contract nor any of the broker's ten invariants ([component 04](../components/04-storage-broker.md)) — substrate and transport are component-spec choices, not contract. A later engine (e.g. a cloud object store) is a third adapter behind the unchanged contract, with the guest mount and the schema untouched.
|
|
38
|
+
- Positive: the local-volume engine has no network leg, so the minimal shelf runs from one `docker-compose up` with no external object store and no cloud credential, holding the one-click-solo invariant ([03-non-negotiables.md](../manifesto/03-non-negotiables.md)). The egress-transit invariant ([NFR-SEC-25](../manifesto/02-nfrs.md)) applies to a network engine's leg, not to the local-volume engine, which has nothing to transit.
|
|
39
|
+
- Positive: production engines are customer-provided and not bundled — AWS S3, Ceph RGW (the reference object store in [05-licensing-posture.md](../manifesto/05-licensing-posture.md)), or any S3-compatible store. OCU owns no engine CVE, SBOM, or version lifecycle, mirroring [ADR-0009](0009-audit-pipeline-pluggable-by-contract.md)'s no-CVE posture.
|
|
40
|
+
- Neutral: resolves the engine half of the [component 04](../components/04-storage-broker.md) Shelf-delta picks; the broker runtime tier is a separate concern, resolved in [component 04](../components/04-storage-broker.md) §Operational concerns at the [NFR-SEC-02](../manifesto/02-nfrs.md) hardened-`runc` floor (profile-independent, no tier ladder). Per-tenant instantiation ([NFR-SEC-76](../manifesto/02-nfrs.md)) and the credential substrate ([NFR-SEC-60](../manifesto/02-nfrs.md) / [NFR-SEC-25](../manifesto/02-nfrs.md)) are unchanged — both engines serve both shelves, differing only in whether the credential is a host filesystem permission (local volume) or a backend key (network engine).
|
|
41
|
+
- Negative: the local-volume engine is durability/HA-naive (single host, no erasure coding) and is a solo-reference only; a production deployment wires the S3 engine to its own store. OCU makes no durability promise for the local-volume path.
|
|
42
|
+
- Negative: the file-operation contract must carry chunked upload and Range read as first-class verbs so a large object never crosses as one message; this puts the size ceiling in the broker's chunk policy, not the engine, and obliges every adapter to translate chunking to the backend's transfer model.
|
|
43
|
+
|
|
44
|
+
## Alternatives considered
|
|
45
|
+
|
|
46
|
+
- **Make S3 the conformance target — the broker's contract is the S3 API, solo bundles an S3 server (the prior closed draft).** Rejected: inverts the canon topology — [component 04](../components/04-storage-broker.md) invariant 2 makes the guest speak a file-operation interface that names no backend object, and [08-contracts.md](../08-contracts.md) already separates the `define` mount leg from the `conform` backend leg. Collapsing them re-exposes the backend protocol guest-ward, contradicts [NFR-SEC-25](../manifesto/02-nfrs.md), and fails [#208](https://github.com/Wide-Moat/open-computer-use/issues/208) by denying the distinction it asks us to assert.
|
|
47
|
+
- **Bundle a production engine (ship Ceph or MinIO and own its lifecycle).** Rejected: an object store is a neighbouring system that runs without OCU, so bundling it for production violates the build-scope principle ([03-non-negotiables.md](../manifesto/03-non-negotiables.md)) and the durable-store non-goal ([04-non-goals.md](../manifesto/04-non-goals.md)), and takes on a CVE surface the customer's platform team already operates. MinIO's community edition is AGPL ([05-licensing-posture.md](../manifesto/05-licensing-posture.md) rejection table).
|
|
48
|
+
- **Ship one engine (S3 only), add local-volume later.** Rejected: breaks the one-click-solo invariant ([03-non-negotiables.md](../manifesto/03-non-negotiables.md)) — the minimal shelf would require an external object store and a credential before the first session. The local-volume engine is what lets the solo path run with no external service, so both exist from day one.
|
|
49
|
+
|
|
50
|
+
## Compliance impact
|
|
51
|
+
|
|
52
|
+
- `SOC2-CC6.1` / `ISO27001-A.8.10`: backend-credential confidentiality holds because the broker is the sole backend-protocol speaker and the guest never receives a backend key; the engine choice does not change this property on either shelf.
|
|
53
|
+
|
|
54
|
+
## License impact
|
|
55
|
+
|
|
56
|
+
No production engine is bundled. The local-volume reference engine is OCU code over the host filesystem and pulls in no third-party dependency. Customer-provided engines are integrated over the backend protocol and carry no OCU lifecycle.
|
|
57
|
+
|
|
58
|
+
## Threat mitigation
|
|
59
|
+
|
|
60
|
+
Addresses Information Disclosure on the backend leg: the backend protocol terminates inside the broker's object-store client, the request is broker-signed, and a network engine's leg traverses the storage-dedicated lane on the egress edge allow-list-only without TLS termination ([NFR-SEC-25](../manifesto/02-nfrs.md), [ADR-0011](0011-storage-egress-lane.md)), so the signed request is byte-intact and no backend credential or endpoint reaches the guest. A local-volume engine opens no network leg, so the in-transit obligation is vacuous for it.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: proposed
|
|
6
|
+
last-reviewed: 2026-06-07
|
|
7
|
+
owner: "@Wide-Moat/architects"
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
supersedes: []
|
|
10
|
+
superseded-by: null
|
|
11
|
+
compliance-impact: [SOC2-CC6.1, ISO27001-A.8.10, NYDFS-500.15, DORA-Art.28]
|
|
12
|
+
license-impact: none
|
|
13
|
+
threat-mitigation-link: ../06-threat-model.md
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
The storage-backend leg is reached over a storage-dedicated lane on the Egress trust-edge — out-of-process from the broker, distinct from the guest egress lane — so detaching storage from the guest-egress policy class does not move the enforcement into the credential-holder.
|
|
17
|
+
|
|
18
|
+
# ADR-0011: Storage backend reached over a storage-dedicated egress lane
|
|
19
|
+
|
|
20
|
+
## Status
|
|
21
|
+
|
|
22
|
+
`proposed`
|
|
23
|
+
|
|
24
|
+
## Context
|
|
25
|
+
|
|
26
|
+
A network backend engine's leg ([ADR-0010](0010-storage-backend-pluggable-adapter.md)) was routed through the same Egress trust-edge lane that governs the guest's LLM / internet egress ([NFR-SEC-25](../manifesto/02-nfrs.md), [08-contracts.md](../08-contracts.md) F9). Storage and guest-internet are different traffic classes with different authorization — file scope/intent/`downloadable` on one side, the upstream allow-list and credential injection on the other ([05-c4-container.md](../05-c4-container.md) §4) — yet a single shared lane cannot express a storage-specific policy without touching the guest lane. A local-volume engine has no network leg at all, so the shared-lane wording was over-broad for it.
|
|
27
|
+
|
|
28
|
+
Two constraints bound where the storage leg's network enforcement can live. The broker holds the backend credential, so a control co-located inside the broker process dies with broker compromise (the confused-deputy path P4-E1 is already live) — strictly weaker than the status quo, where the enforcement is a separate container the broker cannot edit. And P4-E2 ([06-threat-model.md](../06-threat-model.md) §3) requires "no outbound path the control cannot see"; detaching from the guest lane must not re-open that hole.
|
|
29
|
+
|
|
30
|
+
## Decision
|
|
31
|
+
|
|
32
|
+
The broker-originated backend leg is reached over a storage-dedicated lane on the Egress trust-edge — a distinct policy lane, out-of-process from the broker, on the existing outbound-mediation container — not the guest-egress lane and not a control inside the broker. The broker holds the credential, signs once, and originates the leg; the lane forwards it allow-list-only with no TLS termination and enforces, where the broker cannot suppress it, the destination allow-list, the one proxy-owned resolver and its deny-set, the exfil tripwire, and an edge-authored OCSF event per backend operation ([NFR-SEC-85](../manifesto/02-nfrs.md)).
|
|
33
|
+
|
|
34
|
+
## Consequences
|
|
35
|
+
|
|
36
|
+
- The enforcement stays out-of-broker, so it survives broker compromise: a fully-compromised broker holds the credential but can neither relax the storage allow-list, nor silence the connect-time deny, nor suppress or backfill the edge-authored OCSF event — the property the shared-lane transit gave today, kept ([NFR-SEC-85](../manifesto/02-nfrs.md), closing the in-broker-control weakening).
|
|
37
|
+
- P4-E2 holds equal-or-stronger. The leg is now a distinguishable policy class rather than an indistinguishable guest-egress lookalike, so the lane can express a storage-specific deny it could not before, while the count of outbound paths the control can see is unchanged — still one outbound-mediation container, with the direct broker-to-backend dial still forbidden ([NFR-SEC-16](../manifesto/02-nfrs.md)).
|
|
38
|
+
- The one proxy-owned resolver is the sole resolution authority for both lanes ([NFR-SEC-12](../manifesto/02-nfrs.md)) — the storage lane shares it, it does not bring its own, so detaching the lane creates no second resolver and no second SSRF/rebind surface.
|
|
39
|
+
- No new container. The storage lane is a second listener on the existing Egress trust-edge container, so the five-zone / six-container model ([05-c4-container.md](../05-c4-container.md) §1) is unchanged.
|
|
40
|
+
- Positive: single-egress is single-egress-per-purpose ([NFR-SEC-05](../manifesto/02-nfrs.md), [NFR-SEC-16](../manifesto/02-nfrs.md)) — guest-internet / upstream-API on the forward-proxy lane, customer object storage on the storage lane, both deny-by-default and audited. The storage lane does no credential injection, no customer-CA bump, no edge ICAP — those are upstream-API-shaped and never applied to storage.
|
|
41
|
+
- Positive: a local-volume engine ([ADR-0010](0010-storage-backend-pluggable-adapter.md)) opens no network leg, so the lane is vacuous for it; the minimal shelf holds the one-click-solo property unchanged.
|
|
42
|
+
- Neutral: storage user-data content inspection runs at the broker on plaintext before signing ([NFR-SEC-81](../manifesto/02-nfrs.md)), since the lane is pass-through and sees only the broker-signed ciphertext — this is where the content-blind-storage residual ([#182](https://github.com/Wide-Moat/open-computer-use/issues/182)) is closed for storage.
|
|
43
|
+
- Negative: in-transit confidentiality on the leg rests on the broker's own TLS to the backend ([NFR-SEC-25](../manifesto/02-nfrs.md) — the broker signs and originates the request), not on a shared-edge property; the broker must validate the backend certificate strictly and fail closed. P4-T2 in-transit confidentiality now rests on [NFR-SEC-25](../manifesto/02-nfrs.md) + [NFR-SEC-85](../manifesto/02-nfrs.md) (broker-originated TLS); [NFR-SEC-05](../manifesto/02-nfrs.md) stays guest-egress-scoped.
|
|
44
|
+
|
|
45
|
+
## Alternatives considered
|
|
46
|
+
|
|
47
|
+
- **Keep the storage leg on the shared guest-egress lane (the status quo before this ADR).** Rejected: storage and guest-internet are different traffic classes, so one lane cannot carry a storage-specific policy without touching the guest lane; the leg is also indistinguishable from guest egress for audit and deny purposes. Fails the separation the storage contour requires.
|
|
48
|
+
- **Move the allow-list, resolver, tripwire, and OCSF emit into the broker (broker enforces its own exit).** Rejected: the broker holds the backend credential, so a control in the same process is defeated by broker compromise (P4-E1 confused-deputy is live) — strictly weaker than today's separate-container enforcement, and it re-opens the P4-E2 uncontrolled-exit hole. It would also stand up a second resolver, contradicting [NFR-SEC-12](../manifesto/02-nfrs.md).
|
|
49
|
+
- **A dedicated storage-egress sidecar (own process, own resolver) in the Egress zone.** Rejected: a standalone process reads as a seventh container against the five-zone / six-container model ([05-c4-container.md](../05-c4-container.md) §1), and its own resolver violates the single-resolution-authority clause of [NFR-SEC-12](../manifesto/02-nfrs.md). A second listener on the existing edge delivers the same separation without either cost.
|
|
50
|
+
|
|
51
|
+
## Compliance impact
|
|
52
|
+
|
|
53
|
+
- `SOC2-CC6.1` / `ISO27001-A.8.10`: backend-credential confidentiality holds — the broker is the sole credential holder and the lane terminates no TLS, so no credential reaches the lane or the guest.
|
|
54
|
+
- `NYDFS-500.15` / `DORA-Art.28`: the storage leg is a controlled, audited outbound path with an edge-authored event a compromised broker cannot suppress; third-party-storage access is governed and recorded.
|
|
55
|
+
|
|
56
|
+
## License impact
|
|
57
|
+
|
|
58
|
+
None. The storage lane is a listener configuration on the already-bundled outbound-mediation edge ([ADR-0006](0006-egress-forward-proxy-substrate.md)); no new dependency is introduced.
|
|
59
|
+
|
|
60
|
+
## Threat mitigation
|
|
61
|
+
|
|
62
|
+
Re-homes P4-D2 and P4-E2 ([06-threat-model.md](../06-threat-model.md) §3) off the shared single-egress wording onto the storage lane: the broker-signed leg traverses an out-of-broker enforcement point under a deny-by-default allow-list, the deny-set, the exfil tripwire, and an edge-authored OCSF event, so no outbound path the control cannot see exists by policy even under broker compromise. P4-T2 in-transit confidentiality re-anchors onto the broker-originated TLS ([NFR-SEC-25](../manifesto/02-nfrs.md) + [NFR-SEC-85](../manifesto/02-nfrs.md)), off the now guest-egress-scoped [NFR-SEC-05](../manifesto/02-nfrs.md).
|
|
63
|
+
|
|
64
|
+
## Open questions
|
|
65
|
+
|
|
66
|
+
1. Per-session backend byte / rate ceiling on the storage lane — resource-exhaustion theme, [#188](https://github.com/Wide-Moat/open-computer-use/issues/188).
|
|
67
|
+
2. Whether broker-side plaintext DLP on user-data is mandatory or per-deployment on the storage path — content-blind theme, [#182](https://github.com/Wide-Moat/open-computer-use/issues/182).
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: proposed
|
|
6
|
+
last-reviewed: 2026-06-08
|
|
7
|
+
owner: "@Wide-Moat/architects"
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
supersedes: [future-architecture/adr/0001-control-plane-language-go, future-architecture/adr/0002-guest-agent-language-go]
|
|
10
|
+
superseded-by: null
|
|
11
|
+
compliance-impact: [SOC2-CC8.1]
|
|
12
|
+
license-impact: none
|
|
13
|
+
threat-mitigation-link: ../02-trust-boundaries.md#4-per-tenant-isolation-menu
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
Fixes the implementation language for each build target: Go for the host-side control and supervision processes, Rust for the in-sandbox guest agent. Audience: anyone writing or reviewing component code.
|
|
17
|
+
|
|
18
|
+
# ADR-0012: Implementation language
|
|
19
|
+
|
|
20
|
+
## Status
|
|
21
|
+
|
|
22
|
+
`proposed`
|
|
23
|
+
|
|
24
|
+
## Context
|
|
25
|
+
|
|
26
|
+
No prior ADR in this set fixes an implementation language; the choice crosses every component (the guest agent, the host exec-supervisor, the Control / operator API) and is expensive to reverse once code lands.
|
|
27
|
+
|
|
28
|
+
Two build targets sit in different trust zones with different constraints:
|
|
29
|
+
|
|
30
|
+
- **Host-side control and supervision** — the Control / operator API ([component 02](../components/02-control-operator-api.md)) and the host exec-supervisor that the Session sandbox spec ([component 05](../components/05-session-sandbox.md)) places outside the guest. This grows into session lifecycle, quota, denylist, kill-switch, and (on the full shelf) k8s orchestration and cloud-provider integration. It is operated daily.
|
|
31
|
+
- **The in-sandbox guest agent** — PID 1 inside the sandbox ([component 05](../components/05-session-sandbox.md)). It is the inner attack target: untrusted agent-issued code, prompt-injected agents, and compromised in-sandbox dependencies all reach it first. Its control-channel handler is a direct RCE target, and it ships inside every sandbox image.
|
|
32
|
+
|
|
33
|
+
The two talk over a wire contract ([`exec/exec-channel.schema.json`](../../../contracts/exec/exec-channel.schema.json)), not shared memory, so they need not share a language.
|
|
34
|
+
|
|
35
|
+
## Decision
|
|
36
|
+
|
|
37
|
+
Host-side control and supervision processes are written in **Go**: the Control / operator API and the host exec-supervisor — the process that terminates the exec WebSocket, spawns and reaps guest processes, and strips the deny-pattern env set at fork ([component 05](../components/05-session-sandbox.md)). The in-sandbox PID-1 guest agent is written in **Rust**. The fork/exec boundary is the Go/Rust seam: the Go supervisor writes the spawn frame onto the exec channel; the Rust agent runs on the other side. The two share no runtime and no in-process state.
|
|
38
|
+
|
|
39
|
+
## Consequences
|
|
40
|
+
|
|
41
|
+
- The Go side gets the canonical k8s client (`client-go`), mature AWS and GCP SDKs, and goroutine-per-connection concurrency that fits the long-lived control and exec channels — the full-shelf orchestration path stays on the ecosystem built for it. Go is the language the project currently operates in; the maintenance surface carries no additional toolchain cost.
|
|
42
|
+
- The Rust guest agent is a static-PIE binary on the RCE target: memory safety removes a bug class from the control-channel handler, the binary that ships in every image stays a few megabytes rather than ten-plus, and `tokio` fits the long-lived channel with bounded per-stream stdio (NFR-SEC-74). The cost is a second toolchain and a language the project is less fluent in — accepted because the guest surface is protocol-shaped (bounded schema, no ambient library surface), which is where that toolchain cost is lowest.
|
|
43
|
+
- The exec-channel union ([`exec/exec-channel.schema.json`](../../../contracts/exec/exec-channel.schema.json)) is the single source for the wire types both sides build against; the Go host side and the Rust guest side each conform to it (generated or validated in CI, the carrier owned by [`08-contracts.md`](../08-contracts.md) §4), not by hand-maintained parallel definitions.
|
|
44
|
+
- A Cargo workspace MAY share a wire-types crate across Rust binaries, but the guest agent and any host-side Rust helper compile to separate binaries; the guest binary ships inside the hostile rootfs and the host binaries never do.
|
|
45
|
+
- Component specs record no language in their prose; this ADR is the single source. New source files carry the SPDX header in the comment syntax of their language.
|
|
46
|
+
- This decision binds implementation only. It forces no Layer-6 container split and changes no contract, NFR, or trust boundary.
|
|
47
|
+
- The "ships inside every image / rootfs" phrasing above describes where the agent *runs* (PID 1 in the hostile guest), not where it is *stored*: [ADR-0020](0020-sandbox-image-provisioning.md) fixes the agent as a runtime artifact injected at session-start, never baked into a sandbox image. The language choice here is unaffected.
|
|
48
|
+
|
|
49
|
+
## Alternatives considered
|
|
50
|
+
|
|
51
|
+
- **Go everywhere (including the guest agent).** One toolchain, one hiring story, `chromedp` available for later CDP work. Rejected for the guest agent: a garbage-collected ten-plus-megabyte binary on the per-image RCE target trades away the memory-safety class and the small-surface audit benefit for a code-sharing win that does not exist (the two sides talk over a wire contract, not shared code).
|
|
52
|
+
- **Rust everywhere (including the control plane).** Smallest binaries, one memory-safety story. Rejected for the host side: the k8s client and cloud-provider SDKs are a fraction as mature in Rust as in Go, the control plane is the daily-operated surface where the project is most fluent in Go, and a control-plane-heavy codebase is where Rust's iteration friction is highest. Code the team cannot maintain confidently is a liability.
|
|
53
|
+
- **Python (continue the PoC stack).** Zero migration from the current `main`-line server. Rejected: no static binary, a weaker k8s-controller story, and weaker type safety for a long-lived production service — the wrong base for a regulated-enterprise control plane.
|
|
54
|
+
|
|
55
|
+
## Compliance impact
|
|
56
|
+
|
|
57
|
+
| Control | Component | Evidence |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| SOC2-CC8.1 | all build targets | one recorded language per target → deterministic toolchain, SBOM surface, and supply-chain scan per artifact (this ADR) |
|
|
60
|
+
|
|
61
|
+
## License impact
|
|
62
|
+
|
|
63
|
+
None. Both toolchains and their standard libraries clear the licence gate ([`manifesto/05-licensing-posture.md`](../manifesto/05-licensing-posture.md)): Go is BSD-3, Rust is MIT/Apache-2.0. Per-dependency gating is unchanged; this ADR adopts no library.
|
|
64
|
+
|
|
65
|
+
## Threat mitigation
|
|
66
|
+
|
|
67
|
+
The Rust guest agent narrows the in-sandbox RCE target's bug class on the boundary the threat model marks as the inner attack surface ([component 05](../components/05-session-sandbox.md) failure modes, reaching actor A1). Per-tier escape resistance and the per-release red-team gate stay governed by NFR-SEC-02; this ADR adds no requirement to either and substitutes for no isolation control — a memory-safe agent is not a substitute for the sandbox boundary.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: proposed
|
|
6
|
+
last-reviewed: 2026-06-16
|
|
7
|
+
owner: "@Wide-Moat/architects"
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
supersedes: []
|
|
10
|
+
superseded-by: null
|
|
11
|
+
compliance-impact: [DORA-Art.28, EU-AI-Act-Art.15, NIST-SP-800-190]
|
|
12
|
+
license-impact: bundled-images
|
|
13
|
+
threat-mitigation-link: null
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
Fixes which image a sandbox runs and how a customer supplies their own — the axis canon names nowhere. Audience: anyone touching the Session sandbox rootfs, the control-plane admission path, or the Bill of Materials.
|
|
17
|
+
|
|
18
|
+
# ADR-0020: Sandbox image provisioning
|
|
19
|
+
|
|
20
|
+
## Status
|
|
21
|
+
|
|
22
|
+
`proposed` — **stub**. Context and the axis are fixed; the Decision is held open behind the owner rulings and open questions below. This ADR does not leave draft until those close.
|
|
23
|
+
|
|
24
|
+
## Context
|
|
25
|
+
|
|
26
|
+
[Component 05](../components/05-session-sandbox.md) and [ADR-0003](0003-sandbox-runtime-tier-ladder.md) specify the sandbox's runtime *security* and *isolation* exhaustively, but nothing specifies what **image** runs inside it or how a customer brings their own. The gap already leaks: NFR-FS-01/02 say "per-template", yet [`glossary.md`](../glossary.md) defines no `template` or `image` term (a one-source-of-truth break). A regulated buyer cannot adopt a fixed Ubuntu blob — their InfoSec mandates a hardened base, their workloads need different toolchains, and air-gap forbids any phone-home pull. "Bring your own image" is therefore a deal-requirement, not a convenience, and — unlike the agent loop ([04-non-goals](../manifesto/04-non-goals.md)) — a sandbox without an image cannot be a non-goal.
|
|
27
|
+
|
|
28
|
+
Two axes are in play and must not collapse into one: **image-fatness** (what is *in* the box) and the **runtime tier** (what *isolates* the box, fixed by [ADR-0003](0003-sandbox-runtime-tier-ladder.md) — runc/gVisor/microVM). ADR-0003 scopes itself to the runtime-tier ladder only; the image-fatness axis is this ADR's to fix. The [ADR-0012](0012-implementation-language.md) Rust static-PIE guest agent is not part of any image — it is part of the runtime, injected into every image at start, so an image carries only its userland. A bundled image is a release artifact carrying full CVE/SBOM/SLSA/RoI responsibility ([05-licensing-posture](../manifesto/05-licensing-posture.md)).
|
|
29
|
+
|
|
30
|
+
## Decision
|
|
31
|
+
|
|
32
|
+
**TBD.** The shape below is the owner's locked input; the load-bearing choices stay open (see Open questions). The ADR records the direction, not yet the decision.
|
|
33
|
+
|
|
34
|
+
Owner rulings (authoritative, not relitigated):
|
|
35
|
+
|
|
36
|
+
1. **One materialize path for every image.** There is no "OCU image" versus "BYO image" as two modes. An image (an OCU-prebuilt rung or a customer base) is given → OCU appends its runtime layers → OCU starts it. The agent is part of the runtime, never baked into an image; the prebuilt rungs are a shelf of convenient agent-less userlands that flow through the same pipe as a customer image. `FROM-min-base` as a second path is rejected — it reintroduced the duality.
|
|
37
|
+
2. **Injection is an appended OCI layer, not a bake or a synthetic file.** OCU appends the runtime as standard OCI layers over the base (`mutate.AppendLayers`-style), leaving the base image byte-unmutated — the common-tooling path, not a microVM/FUSE-specific synthetic-file scheme. Two static (no-libc) binaries ride these layers: the control agent (PID 1) and the `ocu-rclone-filestore` mount binary the agent starts; the mount binary needs `/dev/fuse` + `SYS_ADMIN` from the runtime.
|
|
38
|
+
3. **Image-fatness is a named axis orthogonal to the [ADR-0003](0003-sandbox-runtime-tier-ladder.md) runtime tier**, exposing a four-rung shelf — `min`, `medium` (+ userland, no browser), `high` (+ Chromium + CDP), `xhigh` (+ Claude Code CLI as an on-rootfs binary) — plus customer **BYO** through the identical path.
|
|
39
|
+
4. **All four rungs are bundled.** OCU builds, signs, and owns the CVE/SBOM/SLSA/RoI of every rung, including Chromium and the Claude Code CLI. There is no customer-overlay tier.
|
|
40
|
+
5. **Provenance is two-signature and uniform.** The image (OCU's or the customer's) carries its own signature OCU verifies; the agent carries OCU's signature, the same known binary every time. Admission verifies the two separately; the per-session provenance record, not a merged-rootfs signature, is the system of record.
|
|
41
|
+
6. **Injection is covered by a merge-blocking test matrix.** A CI gate proves agent-as-PID-1, mount-comes-up, base-image-byte-unmutated, two-signature verification, and the NFR-SEC-14 posture across substrate × image-rung × BYO; negative cells (unsigned base, missing `/dev/fuse`/`SYS_ADMIN`) must fail closed. Carried as an NFR row, not restated here.
|
|
42
|
+
|
|
43
|
+
Provisioning is a **role on the existing control plane** ([component 02](../components/02-control-operator-api.md)) — selection, admission validation, materialization — not a new component or deployable; it is the session-create step *before* the mount-config push. The runtime tier stays the deployment-wide knob, never a field on the image request.
|
|
44
|
+
|
|
45
|
+
## Consequences
|
|
46
|
+
|
|
47
|
+
- Positive: one materialize path means identical sandbox behaviour for a prebuilt rung and a customer base — no "worked on ours, broke on theirs" class; a hardened-base BYO path becomes expressible; the `min`/`medium` floor preserves the one-click solo shelf (a Chromium critical rebuilds `high`/`xhigh` only).
|
|
48
|
+
- Negative: bundling all four rungs puts OCU on the Chromium release cadence under the NFR-MAINT-01 patch SLA (≤7d for CVSS ≥9.0) — `xhigh` (CLI + Chromium) sets the release cadence and is the most expensive artifact to keep in SLA.
|
|
49
|
+
- Neutral: image provisioning consumes a pre-built OCI artifact read-only; OCU runs no session-time registry-push build (unlike the E2B template-manager model).
|
|
50
|
+
- Affects [component 02](../components/02-control-operator-api.md) (admission role), [component 05](../components/05-session-sandbox.md) (agent injected as PID 1, not image-borne), [05-licensing-posture](../manifesto/05-licensing-posture.md) (bundled BoM rows), [glossary.md](../glossary.md) (two new terms).
|
|
51
|
+
- Per-substrate boot/materialize mechanics (runc, gVisor, Firecracker, Docker-compose, Kubernetes) are an internal design detail of components 02/05, not ADR Decision text.
|
|
52
|
+
|
|
53
|
+
## Alternatives considered
|
|
54
|
+
|
|
55
|
+
- **Customer-overlay for high/xhigh** (OCU ships only the recipe) — rejected by owner ruling 4; OCU owns all CVE/RoI instead.
|
|
56
|
+
- **Two paths — agent baked in OCU images, injected only for BYO** — rejected: two behaviours is two bug surfaces ("worked on ours, broke on theirs"); the agent is part of the runtime and injected uniformly, so `FROM-min-base` as a second path is dropped.
|
|
57
|
+
- **Synthetic FUSE file for the agent** (microsandbox `init.krun`-style) — rejected as the primary mechanism: microVM/FUSE-centric, not common OCI tooling; the appended-OCI-layer path works on every substrate. May resurface as a microVM-tier option only.
|
|
58
|
+
- **Fold image-fatness into ADR-0003** — rejected: ADR-0003 selects the isolation boundary; conflating it with what-is-in-the-box collapses two independent axes.
|
|
59
|
+
- **Build-from-image at session time** (E2B template-manager) — rejected: OCU consumes a pre-built signed OCI artifact read-only; no session-time build surface.
|
|
60
|
+
|
|
61
|
+
## Compliance impact
|
|
62
|
+
|
|
63
|
+
- `DORA-Art.28`: each bundled rung carries a Register-of-Information row (the Chromium and Claude Code CLI fourth-party entries are OCU's once bundled).
|
|
64
|
+
- `EU-AI-Act-Art.15`: the image is part of the agent-execution boundary; SBOM/provenance per rung is the cybersecurity evidence.
|
|
65
|
+
- `NIST-SP-800-190` §3: image provenance, digest-pinning, and signature verification at admission.
|
|
66
|
+
|
|
67
|
+
## License impact
|
|
68
|
+
|
|
69
|
+
`min` and `medium` enter the Bill of Materials in [`05-licensing-posture.md`](../manifesto/05-licensing-posture.md) as bundled images; `high` (Chromium) and `xhigh` (Claude Code CLI) add bundled rows whose CVE/RoI OCU owns. The Claude Code CLI must clear the dependency licence gate before its row lands — not yet verified.
|
|
70
|
+
|
|
71
|
+
## Threat mitigation
|
|
72
|
+
|
|
73
|
+
Not threat-driven. The admission floor (image digest-pin, cosign-verify image and the injected agent against offline-bundle keys, agent-version-match on the injected runtime binary, arch match, runtime-tier match) attaches to NFR-SEC-16/18/38 once the Decision lands. The agent's presence is not checked on the image — OCU injects its own known binary every time.
|
|
74
|
+
|
|
75
|
+
## Open questions
|
|
76
|
+
|
|
77
|
+
1. Ship `medium` bundled, or bundle `min` only and treat `medium` as the first heavier rung? Bundling `medium` is an ongoing CVE commitment (CPython/OpenSSL/glibc churn under NFR-MAINT-01). — owner ruling needed, track issue.
|
|
78
|
+
2. BoM rows for `high`/`xhigh`/Chromium/Claude-Code-CLI do not exist in [`05-licensing-posture.md`](../manifesto/05-licensing-posture.md); the CLI's licence-gate result is unverified. — must land before this ADR cites them, track issue.
|
|
79
|
+
3. Agent injection on Firecracker writes into a freshly-built ext4 with no content-addressed layer identity; OCU signs the final template. Confirm the two-signature record (image + agent) covers the converted artifact. — track issue.
|
|
80
|
+
4. Does `image_tier`/`image_ref` ride the existing gateway→Control session-setup RPC as additive fields, or warrant a typed surface in [08-contracts](../08-contracts.md) §1? — confirm with contracts owner.
|
|
81
|
+
5. FIPS-140-3 variant per bundled rung (NFR-SEC-28) doubles the bundled evidence set (min/medium × default+FIPS). — release-pipeline scope decision, track issue.
|
|
82
|
+
6. The merge-blocking injection test-matrix gate (ruling 6) is not yet an NFR row in [`02-nfrs.md`](../manifesto/02-nfrs.md); the FUSE-under-gVisor and `/dev/fuse`-in-Firecracker mount cells need proving, not assuming. — land the NFR row + CI gate, track issue.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: stub
|
|
6
|
+
last-reviewed: 2026-06-06
|
|
7
|
+
owner: "@Wide-Moat/architects"
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Architecture Decision Records. One file per decision. ADRs appear on demand following the decision tree in `CLAUDE.md`; no bulk-creation of empty stubs.
|
|
12
|
+
|
|
13
|
+
## Template
|
|
14
|
+
|
|
15
|
+
[`0000-template.md`](./0000-template.md) — copy when starting a new ADR.
|
|
16
|
+
|
|
17
|
+
## Index
|
|
18
|
+
|
|
19
|
+
| Number | Title | Status | Supersedes | Last-reviewed |
|
|
20
|
+
|---|---|---|---|---|
|
|
21
|
+
| [0001](0001-layer-0-gate-legacy-exclusion.md) | Layer 0 gate — legacy exclusion | accepted | — | 2026-05-24 |
|
|
22
|
+
| [0002](0002-session-view-descriptor.md) | Session view is descriptor-driven | proposed | — | 2026-06-01 |
|
|
23
|
+
| [0003](0003-sandbox-runtime-tier-ladder.md) | Sandbox runtime tier ladder | proposed | — | 2026-06-01 |
|
|
24
|
+
| [0004](0004-operator-authentication-substrate.md) | Operator authentication substrate | proposed | — | 2026-06-01 |
|
|
25
|
+
| [0005](0005-egress-credential-delivery-envoy-sds.md) | Egress credential delivery is off-the-shelf Envoy SDS | proposed | — | 2026-06-01 |
|
|
26
|
+
| [0006](0006-egress-forward-proxy-substrate.md) | Egress forward-proxy substrate | proposed | — | 2026-06-01 |
|
|
27
|
+
| [0007](0007-egress-auth-mechanism.md) | Egress auth mechanism — edge-inject vs protocol-broker | proposed | — | 2026-06-01 |
|
|
28
|
+
| [0008](0008-session-egress-attribution.md) | Session-to-egress attribution by presented token | proposed | — | 2026-06-02 |
|
|
29
|
+
| [0009](0009-audit-pipeline-pluggable-by-contract.md) | Audit pipeline is pluggable-by-contract | proposed | — | 2026-06-06 |
|
|
30
|
+
| [0010](0010-storage-backend-pluggable-adapter.md) | Storage backend is a pluggable adapter behind the broker | proposed | — | 2026-06-07 |
|
|
31
|
+
| [0011](0011-storage-egress-lane.md) | Storage backend reached over a storage-dedicated egress lane | proposed | — | 2026-06-07 |
|
|
32
|
+
| [0012](0012-implementation-language.md) | Implementation language — Go host-side, Rust guest agent | proposed | legacy 0001/0002 | 2026-06-08 |
|
|
33
|
+
| [0020](0020-sandbox-image-provisioning.md) | Sandbox image provisioning (image-fatness ladder + BYO) — stub | proposed | — | 2026-06-16 |
|
|
34
|
+
|
|
35
|
+
## Lifecycle
|
|
36
|
+
|
|
37
|
+
`proposed` → `accepted` (on PR merge) → `superseded` (when replaced by a later ADR; both files cross-link via front-matter).
|
|
38
|
+
|
|
39
|
+
`deprecated` is for decisions that no longer apply but were not superseded by a specific replacement.
|
|
40
|
+
|
|
41
|
+
## ADR threshold
|
|
42
|
+
|
|
43
|
+
An ADR is for decisions that are:
|
|
44
|
+
|
|
45
|
+
- **Load-bearing** — other components rely on this being decided one way.
|
|
46
|
+
- **Hard to reverse** — undoing it costs more than a typical refactor.
|
|
47
|
+
- **Cross-component** — affects at least two components or boundaries.
|
|
48
|
+
|
|
49
|
+
Decisions that don't meet the bar belong inline in the relevant component spec. See `CLAUDE.md` decision tree §3 for the test.
|
|
50
|
+
|
|
51
|
+
## Hard cap
|
|
52
|
+
|
|
53
|
+
Each ADR ≤ 200 lines. If it doesn't fit, the decision is too big — split it.
|
|
File without changes
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: draft
|
|
6
|
+
last-reviewed: 2026-06-03
|
|
7
|
+
owner: "@Wide-Moat/architects"
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Index of the `components/` directory: one spec slot per Layer 6 container, its spec status, and the decisions and contracts already bound to it. Audience: an engineer about to open or write a component spec.
|
|
12
|
+
|
|
13
|
+
## 1. Index scope
|
|
14
|
+
|
|
15
|
+
Layer 6 ([`05-c4-container.md`](../05-c4-container.md) §3) is the source of truth for what each container does; this index does not restate it — it records where each is specified and what already binds it.
|
|
16
|
+
|
|
17
|
+
A spec is added per [PROCESS.md](../PROCESS.md): open an issue, create `components/NN-<name>.md` from [`0000-template.md`](0000-template.md) at `status: stub`, discuss in the PR. The number `NN` is the container's row order below; it is assigned here and does not change once given.
|
|
18
|
+
|
|
19
|
+
## 2. Container specs
|
|
20
|
+
|
|
21
|
+
Each row links the container's responsibility (Layer 6) and lists the spec file, its current status, and the ADRs and contracts that already bind it. `—` in the Bound ADRs column means no ADR binds the container yet; opening one is its own PR. `NN` is the container row identifier — there is no `03`, the set is the six containers of [`05-c4-container.md`](../05-c4-container.md) §3, and the number does not track a trust zone (the Session sandbox is container 05, trust zone 3).
|
|
22
|
+
|
|
23
|
+
| NN | Container | Spec | Status | Bound ADRs | Bound contracts |
|
|
24
|
+
|---|---|---|---|---|---|
|
|
25
|
+
| 01 | MCP gateway (agent-facing) | [`01-mcp-gateway.md`](01-mcp-gateway.md) | draft | — | [`mcp/ocu-constraints`](../../../contracts/mcp/2025-06-18/ocu-constraints.schema.json) |
|
|
26
|
+
| 02 | Control / operator API | [`02-control-operator-api.md`](02-control-operator-api.md) | draft | [0004](../adr/0004-operator-authentication-substrate.md) | — |
|
|
27
|
+
| 04 | Storage broker | [`04-storage-broker.md`](04-storage-broker.md) | draft | [0002](../adr/0002-session-view-descriptor.md), [0010](../adr/0010-storage-backend-pluggable-adapter.md), [0011](../adr/0011-storage-egress-lane.md) | [`storage/mount-config`](../../../contracts/storage/mount-config.schema.json), [`storage/file-ops`](../../../contracts/storage/file-ops.schema.json), [`storage/file-artifact-api`](../../../contracts/storage/file-artifact-api.schema.json) |
|
|
28
|
+
| 05 | Session sandbox `[1..N]` | [`05-session-sandbox.md`](05-session-sandbox.md) | draft | [0003](../adr/0003-sandbox-runtime-tier-ladder.md) | [`exec/exec-channel`](../../../contracts/exec/exec-channel.schema.json) |
|
|
29
|
+
| 06 | Egress trust-edge proxy | [`06-egress-trust-edge.md`](06-egress-trust-edge.md) | draft | [0005](../adr/0005-egress-credential-delivery-envoy-sds.md), [0006](../adr/0006-egress-forward-proxy-substrate.md), [0007](../adr/0007-egress-auth-mechanism.md), [0008](../adr/0008-session-egress-attribution.md) | — |
|
|
30
|
+
| 07 | Audit pipeline | [`07-audit-pipeline.md`](07-audit-pipeline.md) | draft | [0009](../adr/0009-audit-pipeline-pluggable-by-contract.md) | [`audit/audit-fanin`](../../../contracts/audit/audit-fanin.asyncapi.yaml) |
|
|
31
|
+
|
|
32
|
+
The guest agent is the process that constitutes the Session sandbox container ([`05-c4-container.md`](../05-c4-container.md) §3), not a separate row; its protocol is specified inside `05-session-sandbox.md`.
|
|
33
|
+
|
|
34
|
+
## 3. Maturation order
|
|
35
|
+
|
|
36
|
+
All six are at `draft`. The ones a contract or a pending decision already pins harden to `proposed`/`accepted` first, because their spec has the least free design left and the most to verify against:
|
|
37
|
+
|
|
38
|
+
1. **Storage broker** — three contracts and seven NFR anchors already fix its surface; the spec records the two-face component split and the per-tenant instantiation question ([#175](https://github.com/Wide-Moat/open-computer-use/issues/175)).
|
|
39
|
+
2. **Session sandbox** — the exec-channel contract fixes its machine edge; the runtime-tier-by-`workload_trust_profile` decision is fixed by [ADR-0003](../adr/0003-sandbox-runtime-tier-ladder.md) and the sub-container split is open ([#174](https://github.com/Wide-Moat/open-computer-use/issues/174)).
|
|
40
|
+
3. **Egress trust-edge** — no built contract yet, but the deny-reason and egress-wide-bump behaviour are NFR-anchored and cross the broker boundary; the auth mechanism is fixed by [ADR-0007](../adr/0007-egress-auth-mechanism.md) (edge-inject in v1), the substrate is Envoy plus a self-hosted SDS minting service, and the upstream credential arrives over Envoy SDS.
|
|
41
|
+
|
|
42
|
+
The other three reach `accepted` once these three settle their shared invariants and the ADRs their `adr:` keys cite ([ADR-0003](../adr/0003-sandbox-runtime-tier-ladder.md) runtime tier, [ADR-0004](../adr/0004-operator-authentication-substrate.md) operator-auth, [ADR-0010](../adr/0010-storage-backend-pluggable-adapter.md) object-store engine) move from `proposed` to `accepted`.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: stub
|
|
6
|
+
last-reviewed: YYYY-MM-DD
|
|
7
|
+
owner: "@github-handle"
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
compliance: []
|
|
10
|
+
threat-model: null
|
|
11
|
+
contract: null
|
|
12
|
+
adr: []
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
Template for a component specification, used by `next/v1` engineers when adding a new component to the architecture.
|
|
16
|
+
|
|
17
|
+
# Component-NN: <name>
|
|
18
|
+
|
|
19
|
+
## Purpose
|
|
20
|
+
|
|
21
|
+
One sentence: what role does this component play, and for whom? No marketing tone.
|
|
22
|
+
|
|
23
|
+
## Boundaries
|
|
24
|
+
|
|
25
|
+
What crosses in, what crosses out, what state does this component own.
|
|
26
|
+
|
|
27
|
+
| Direction | What | From / to | Protocol |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
|
|
30
|
+
If the table has fewer than three rows, use prose.
|
|
31
|
+
|
|
32
|
+
## Invariants
|
|
33
|
+
|
|
34
|
+
The rules this component upholds, independent of its caller. Each invariant is enforceable by a test.
|
|
35
|
+
|
|
36
|
+
## Failure modes
|
|
37
|
+
|
|
38
|
+
What can go wrong, how it manifests, what the recovery contract is.
|
|
39
|
+
|
|
40
|
+
## Operational concerns
|
|
41
|
+
|
|
42
|
+
Configuration, observability, scaling axis, capacity model, upgrade discipline. Cite the relevant ADRs.
|
|
43
|
+
|
|
44
|
+
## Open questions
|
|
45
|
+
|
|
46
|
+
Capped at 5. Each entry links to a GitHub issue. If you hit 6, either resolve one or promote it to an ADR.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
Hard cap: 600 lines. Sections appear in this fixed order. No additional H2 headings outside this list.
|