@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,59 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
# 12 — Tecnativa/docker-socket-proxy (privileged-API filter pattern)
|
|
5
|
+
|
|
6
|
+
> Source: [Tecnativa/docker-socket-proxy](https://github.com/Tecnativa/docker-socket-proxy). HAProxy-based filter for the Docker API.
|
|
7
|
+
> Pattern reference for Phase 2 (HTTP pool-manager sidecar — the *only* component that holds the Docker socket) and Phase 8 (egress filtering); general template for "filter access to a privileged API".
|
|
8
|
+
|
|
9
|
+
## 1. Endpoint allowlist via regex + env-gated rules
|
|
10
|
+
|
|
11
|
+
- **Where.** `haproxy.cfg:46-79` (frontend rules). Example `:60`:
|
|
12
|
+
```haproxy
|
|
13
|
+
http-request allow if { path,url_dec -m reg -i ^(/v[\d\.]+)?/containers } { env(CONTAINERS) -m bool }
|
|
14
|
+
```
|
|
15
|
+
- **What.** Each API category (CONTAINERS, NETWORKS, VOLUMES, …) has a regex path matcher + an env-var boolean gate. `0 = deny`, `1 = allow`.
|
|
16
|
+
- **Why for us.** Phase 2 pool-manager: same shape filters Docker socket access. Phase 8: same shape filters egress URLs.
|
|
17
|
+
- **Skip.** Docker version prefix `(/v[\d\.]+)?` is Docker-specific.
|
|
18
|
+
|
|
19
|
+
## 2. Method/path split — read-only by default
|
|
20
|
+
|
|
21
|
+
- **Where.** `haproxy.cfg:48` (global filter), `:51-55` (per-op gates).
|
|
22
|
+
- **What.** `http-request deny unless METH_GET || { env(POST) -m bool }`. GET/HEAD allowed; POST/PUT/DELETE require `POST=1`. Destructive ops (ALLOW_STOP, ALLOW_RESTARTS, …) have independent gates **even when** POST is on.
|
|
23
|
+
- **Why for us.** Phase 2 — observability (list, get) ≠ mutation (delete). Phase 8 — block all egress POST/DELETE by default.
|
|
24
|
+
- **Protocol-agnostic.** Works for REST, gRPC-JSON bridges.
|
|
25
|
+
|
|
26
|
+
## 3. Env-var-driven config — operator UX
|
|
27
|
+
|
|
28
|
+
- **Where.** `Dockerfile:4-33` (25+ env vars); `docker-entrypoint.sh:23` (template substitution).
|
|
29
|
+
- **What.** Operators set `CONTAINERS=1 ALLOW_START=1` to grant only specific capabilities. Defaults conservative (most=0; only `EVENTS`, `PING`, `VERSION` = 1).
|
|
30
|
+
- **Why for us.** Helm `values.yaml` exposes the same boolean knobs. No code recompile to change policy.
|
|
31
|
+
- **Skip for k8s API.** Use native RBAC for k8s; env gates are best as a *secondary defense layer*.
|
|
32
|
+
|
|
33
|
+
## 4. Health, observability, streaming-safe backends
|
|
34
|
+
|
|
35
|
+
- **Where.** `haproxy.cfg:42-44` (special `events` backend with `timeout server 0`), `:2, 13-14` (logging), README `:198-202` (`LOG_LEVEL`).
|
|
36
|
+
- **What.** Streaming endpoints (e.g. Docker `/events`, k8s watch) need **no server timeout** or they get killed mid-stream. Full request logs (httplog) feed audit.
|
|
37
|
+
- **Why for us.** Phase 2 — k8s watch streams and L1 streaming exec calls require the same treatment.
|
|
38
|
+
|
|
39
|
+
## 5. Least-privilege secure-by-default posture
|
|
40
|
+
|
|
41
|
+
- **Where.** README `:109-147` (access matrix); Dockerfile defaults.
|
|
42
|
+
- **What.** All dangerous operations default to deny (`AUTH=0`, `SECRETS=0`, `POST=0`, `CONTAINERS=0`). Only read-only basics allowed. **No catch-all "allow everything" gate.**
|
|
43
|
+
- **Why for us.** Foundational; matches cross-cutting pattern 13 (NetworkPolicy default-deny). Operator must opt-in to each capability.
|
|
44
|
+
|
|
45
|
+
## 6. Trust boundary at network edge — no TLS inside
|
|
46
|
+
|
|
47
|
+
- **Where.** README `:26-34`.
|
|
48
|
+
- **What.** No TLS inside the container network. Security relies on container/k8s networking isolation. External exposure forbidden.
|
|
49
|
+
- **Why for us.** Phase 2 — pool-manager runs in sandbox pod's netns or via Unix socket / private service. No mTLS within the trust boundary. mTLS only for cross-network egress (Phase 8).
|
|
50
|
+
|
|
51
|
+
## Adoption checklist
|
|
52
|
+
|
|
53
|
+
1. **Config as code** — template + env vars locked at deploy time (Helm/kustomize).
|
|
54
|
+
2. **Deny by default** — explicit allowlist, never blocklist.
|
|
55
|
+
3. **Granular gates** — separate controls per operation class.
|
|
56
|
+
4. **Audit logging** — full request log, configurable level.
|
|
57
|
+
5. **Streaming-safe backends** — no server timeout on watch / events / exec.
|
|
58
|
+
6. **Network-edge trust** — proxy is network-isolated; no TLS inside.
|
|
59
|
+
7. **Matrix tests** — see `tests/test_service.py:10-40` for permission-matrix testing.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
# 14 — e2b/desktop + e2b/surf (full-desktop vs CDP-direct)
|
|
5
|
+
|
|
6
|
+
> Source: [e2b-dev/desktop](https://github.com/e2b-dev/desktop) and [e2b-dev/surf](https://github.com/e2b-dev/surf).
|
|
7
|
+
> Decision point for Phase 7: evolve toward Xfce/VNC or stay CDP-direct?
|
|
8
|
+
|
|
9
|
+
**Verdict: stay CDP-direct.** Details below.
|
|
10
|
+
|
|
11
|
+
## 1. Desktop — Xvfb + Xfce4 + resolution
|
|
12
|
+
|
|
13
|
+
- **Where.** `packages/python-sdk/e2b_desktop/main.py:263-277` (`Sandbox.create`).
|
|
14
|
+
- **What.** Xvfb at `1024x768`, DPI 96, display `:0`. `startxfce4` background. Liveness via `xdpyinfo`.
|
|
15
|
+
- **Cost for us.** Full WM + panels + desktop icons we never render. Adds ~700 MB image + ~200 MB RAM per sandbox.
|
|
16
|
+
- **Skip.** CDP-direct doesn't need any of this.
|
|
17
|
+
|
|
18
|
+
## 2. Desktop — VNC + noVNC over WebSocket
|
|
19
|
+
|
|
20
|
+
- **Where.** `e2b_desktop/main.py:84-202` (`_VNCServer`).
|
|
21
|
+
- **What.** `x11vnc` on 5900 (RFB), `noVNC` (WebSocket wrapper) on 6080 over HTTPS. Optional password.
|
|
22
|
+
- **Trade-off.** VNC is low-latency for humans; **high-bandwidth for rapid AI actions** (full-screen re-encode per frame). noVNC adds 100–200 ms.
|
|
23
|
+
- **For us.** Headless agent ≠ human viewer → skip VNC. Chromium CDP screencast (binary frames, 30–60 fps) is cheaper. Surf uses VNC purely for **developer observation**, not the agent control path.
|
|
24
|
+
|
|
25
|
+
## 3. Desktop — `xdotool` input (X11 events)
|
|
26
|
+
|
|
27
|
+
- **Where.** `e2b_desktop/main.py:424-488`.
|
|
28
|
+
- **What.** `xdotool mousemove`, `xdotool click`, `xdotool key`, `xdotool type --delay`. Pixel coords. Screen size via `xrandr`.
|
|
29
|
+
- **Limitation.** Pure visual grounding — no OCR, no DOM. Agent must parse the screenshot.
|
|
30
|
+
- **For us.** CDP path unlocks **DOM queries** (`document.evaluate`, element bounding boxes). Far more reliable than visual coord guessing.
|
|
31
|
+
|
|
32
|
+
## 4. Desktop — screenshot via `scrot` to disk
|
|
33
|
+
|
|
34
|
+
- **Where.** `e2b_desktop/main.py:406-422`.
|
|
35
|
+
- **What.** `scrot --pointer` → PNG to disk → SDK reads → SDK deletes. ~50–100 ms roundtrip.
|
|
36
|
+
- **For us.** CDP `Page.captureScreenshot` is async, batched with actions, no disk I/O. CDP wins.
|
|
37
|
+
|
|
38
|
+
## 5. Surf — action loop pattern
|
|
39
|
+
|
|
40
|
+
- **Where.** `lib/streaming/openai.ts:336-575` (`stream()` async generator).
|
|
41
|
+
- **Loop.**
|
|
42
|
+
1. Screenshot → base64.
|
|
43
|
+
2. POST to OpenAI with `tools: [{ type: "computer" }]` (OpenAI's Computer tool).
|
|
44
|
+
3. Response: structured `output[]` with `computer_call` items, each containing batched `actions[]`.
|
|
45
|
+
4. Execute actions sequentially (click/type/scroll/…) via desktop SDK.
|
|
46
|
+
5. Capture screenshot after batch (with configurable fallback delay for async DOM).
|
|
47
|
+
6. Feed screenshot + reasoning into next iteration (context reset per turn).
|
|
48
|
+
7. **Bail** when no more `computer_call` returned.
|
|
49
|
+
- **For us.** **Adopt this loop in Phase 7.** Same shape for Claude Computer Use. Not bespoke — OpenAI codified it.
|
|
50
|
+
|
|
51
|
+
## 6. Surf — coordinates + safety
|
|
52
|
+
|
|
53
|
+
- **Where.** `lib/streaming/openai.ts:267-334` (`executeAction`); `types/openai.ts`.
|
|
54
|
+
- **Actions.** `click(x, y, button)`, `type(text)`, `scroll(x, y, dx, dy)`, `drag(path: [{x,y}, ...])`, `keypress(keys: string[])`, `wait(ms)`.
|
|
55
|
+
- **Footguns Surf ignores.**
|
|
56
|
+
- **No coordinate-bounds validation.** Agent picks (10000, 10000) → silent fail or Chromium crash.
|
|
57
|
+
- **Chunked typing** (`chunkSize=50`, `delayMs=25`) **required** for terminal input buffers.
|
|
58
|
+
- **Trailing wait deferred.** If last actions are `wait`, bundle into screenshot capture delay instead of sleeping.
|
|
59
|
+
- **For us.** Phase 7 — **add coordinate clipping** (validate within viewport). Adopt chunked typing for our `terminal_type` tool.
|
|
60
|
+
|
|
61
|
+
## 7. Surf — async settle delay
|
|
62
|
+
|
|
63
|
+
- **Where.** `lib/streaming/openai.ts:171-189, 232-265` (`shouldApplyFallbackDelay`, `captureBatchScreenshot`).
|
|
64
|
+
- **What.** If a batch contains `click`/`scroll`/`drag` or async keypresses (Enter/Tab/Escape) → wait 100 ms before screenshot. DOM may not settle immediately.
|
|
65
|
+
- **For us.** CDP has the same issue. `Page.captureScreenshot` right after a click can capture stale layout. **Always insert a small post-batch delay** (configurable per action type). Document the latency trade-off.
|
|
66
|
+
|
|
67
|
+
## 8. Surf — SSE streaming UI
|
|
68
|
+
|
|
69
|
+
- **Where.** `app/api/chat/route.ts:12-91`; `lib/streaming/index.ts`.
|
|
70
|
+
- **Events.** `SANDBOX_CREATED`, `REASONING`, `ACTION`, `ACTION_COMPLETED`, `SCREENSHOT`, `ERROR`, `DONE`.
|
|
71
|
+
- **Lazy sandbox.** Created on first message; reused for conversation.
|
|
72
|
+
- **No multi-turn memory** — each OpenAI call independent.
|
|
73
|
+
- **For us.** SSE is clean for developer/admin observation surfaces. For Phase 7 headless agent, log locally or stream via our own L4 channel.
|
|
74
|
+
|
|
75
|
+
## 9. Desktop image — `template/template.py:1-128`
|
|
76
|
+
|
|
77
|
+
- **Stack.** Ubuntu 22.04 + Xorg + Xvfb + xauth + xdotool + scrot + Xfce4 + x11vnc + noVNC + websockify + Firefox + Chrome + VS Code + LibreOffice + gedit + pcmanfm.
|
|
78
|
+
- **Image size.** ~2–3 GiB uncompressed. Startup: 10–20 s.
|
|
79
|
+
- **Our path.** Chromium alone: 200–300 MiB. No WM, no panels. Faster spawn, cheaper RAM, lower screenshot latency.
|
|
80
|
+
|
|
81
|
+
## 10. Comparison table
|
|
82
|
+
|
|
83
|
+
| Dimension | E2B Desktop + Surf | Our CDP-direct (Phase 7) |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| Display backend | Xvfb (X11) + Xfce4 | Chromium `--disable-gpu` / headless |
|
|
86
|
+
| Screenshot | scrot → disk; poll ~10 Hz | CDP `Page.captureScreenshot` / screencast; up to 60 Hz |
|
|
87
|
+
| Input | xdotool (X11 events, pixel coords) | CDP `Input.dispatchMouseEvent` (CSS pixels) |
|
|
88
|
+
| Action→shot latency | ~150–250 ms | ~50–100 ms |
|
|
89
|
+
| Coord origin | Screen pixels | Viewport CSS pixels (supports scroll offset) |
|
|
90
|
+
| DOM access | None | Full (`document.evaluate`, element boxes) |
|
|
91
|
+
| Multi-app | Yes (any X11 app) | Browser-only (terminal via separate MCP tool) |
|
|
92
|
+
| Sandbox startup | 10–20 s | 2–5 s |
|
|
93
|
+
| Sandbox image | 2–3 GiB | 300–500 MiB |
|
|
94
|
+
| Agent reliability | Visual + OCR risk | Semantic (DOM) + visual fallback |
|
|
95
|
+
|
|
96
|
+
## Verdict for Phase 7
|
|
97
|
+
|
|
98
|
+
1. **Stay CDP-direct.** VNC/Xfce overhead is not justified for first Computer Use agent. Browser is the primary target; terminal tasks handled by separate MCP tool.
|
|
99
|
+
2. **Screenshot strategy.** `Page.startScreencast` for live frames (30–60 fps); `captureScreenshot` for explicit "pause and analyze". Surf only polls — we can do better.
|
|
100
|
+
3. **Input primitives.** Adopt Surf's schema (`click`/`type`/`scroll`/`keypress`/`drag`/`wait`). Add coord validation + DOM-query layer (CDP `Runtime.evaluate`).
|
|
101
|
+
4. **Async settle.** Insert 100–150 ms delay after action batches containing clicks/scrolls/async keys.
|
|
102
|
+
5. **Error recovery.** Not in Surf — we add retry + Chromium restart on CDP connection loss.
|
|
103
|
+
6. **Multi-turn memory.** Surf resets per turn. We consider lightweight session state (screenshot/action history) for coherent long-form tasks.
|
|
104
|
+
|
|
105
|
+
## When to revisit
|
|
106
|
+
|
|
107
|
+
If we ever need **multi-app Computer Use** (e.g., AI agent that switches between browser + VS Code + terminal in the same display) → revisit Xfce/VNC. For now, single-app + separate tool channels keeps the stack lean.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
# 18 — Open WebUI `open-terminal` + `terminals` (observed)
|
|
5
|
+
|
|
6
|
+
> Source: [`open-webui/open-terminal`](https://github.com/open-webui/open-terminal) (sandbox shell server) and [`open-webui/terminals`](https://github.com/open-webui/terminals) (per-user orchestrator). Reviewed 2026-05.
|
|
7
|
+
>
|
|
8
|
+
> Status: **observation, hypothesis only.** Their target audience is single-user / SMB self-host. Our target is multi-tenant enterprise (financial-sector infosec, multi-cluster, BYOK, compliance-grade audit). This document records what they do at the wire-protocol level, and frames one open hypothesis about reusing that wire protocol as an external dialect — nothing here locks any architectural decision.
|
|
9
|
+
|
|
10
|
+
## 1. What the two projects are
|
|
11
|
+
|
|
12
|
+
- **`open-terminal`**: a FastAPI service that runs inside a single container and exposes a REST API + WebSocket terminal. Tools: bash exec, file CRUD, document extraction, port reverse-proxy, Jupyter kernels, optional in-process MCP via `FastMCP.from_fastapi(app)`.
|
|
13
|
+
- **`terminals`**: a separate FastAPI control-plane that provisions one `open-terminal` container *per `(user_id, policy_id)`* and reverse-proxies requests to it. Three backends: Docker socket, Kubernetes direct, Kubernetes via Kopf operator + `Terminal` CRD (`openwebui.com/v1alpha1`).
|
|
14
|
+
|
|
15
|
+
Open WebUI integrates both natively. The backend (`backend/open_webui/routers/configs.py:277-323`) auto-detects which one the user pointed at:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
GET {url}/api/v1/policies → 200 → server_type = "orchestrator" (terminals)
|
|
19
|
+
GET {url}/api/config → 200 → server_type = "terminal" (open-terminal)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
For an orchestrator, requests are routed as `/p/{policy_id}/{path}`. For a single terminal, paths pass through as-is.
|
|
23
|
+
|
|
24
|
+
## 2. Audience and scope difference
|
|
25
|
+
|
|
26
|
+
This is **not a critique** — these are different products solving different problems.
|
|
27
|
+
|
|
28
|
+
| Dimension | Open WebUI stack | Our target |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Primary user | Self-hoster, single-team install | Multi-tenant enterprise, paid SaaS |
|
|
31
|
+
| Tenancy boundary | Linux UID inside one container (multi-user mode) or one container per user (orchestrator) | One sandbox per session, microVM-isolated for untrusted tier |
|
|
32
|
+
| Runtime isolation | `runc` only | runc / sysbox / gVisor / kata-fc / kata-ch per template ([04-layer2-runtimes.md](../architecture/04-layer2-runtimes.md)) |
|
|
33
|
+
| Cluster model | Single cluster, single namespace | Multi-cluster, multi-AZ, federated |
|
|
34
|
+
| Identity | Static API key or Open WebUI JWT | OIDC + per-session JWT + secret broker ([07-security.md](../architecture/07-security.md)) |
|
|
35
|
+
| Secrets | env vars / K8s `Secret` | Per-session STS, key rotation ≤90d without restart |
|
|
36
|
+
| Egress | iptables + dnsmasq inside each container | Centralized JWT-allowlist egress proxy with audit pipeline ([08-networking.md](../architecture/08-networking.md), Phase 8) |
|
|
37
|
+
| Storage | `/home/user` bind-mount or PVC | 4-tier (image / squashfs skills / ephemeral workspace / S3 user-data) ([06-storage.md](../architecture/06-storage.md)) |
|
|
38
|
+
| Audit | SQL `audit_log` table | Append-only S3 with object-lock, ≥90d retention |
|
|
39
|
+
| HA control plane | Single process, in-memory `_instances` dict | 3+ replicas, leader election via `coordination.k8s.io/Lease`, external KV |
|
|
40
|
+
| Compliance posture | None specifically targeted | SOC2 / PCI / FedRAMP-class workloads in scope |
|
|
41
|
+
|
|
42
|
+
Their stack would be a regression for our targets. Ours would be over-engineering for theirs. Both can be correct.
|
|
43
|
+
|
|
44
|
+
## 3. Wire contract (what Open WebUI expects)
|
|
45
|
+
|
|
46
|
+
Useful to record verbatim because the protocol is what unlocks native integration in Open WebUI's UI.
|
|
47
|
+
|
|
48
|
+
### 3.1 Auto-detection probes
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
GET /api/v1/policies → orchestrator dialect
|
|
52
|
+
GET /api/config → single-terminal dialect, returns { features: { terminal: bool } }
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3.2 Orchestrator dialect (used by `terminals`)
|
|
56
|
+
|
|
57
|
+
- `GET /api/v1/policies` — list policies (`PolicyData`: image, env, cpu_limit, memory_limit, storage, storage_mode, idle_timeout_minutes)
|
|
58
|
+
- `POST/PUT/DELETE /api/v1/policies/{id}` — CRUD from admin UI
|
|
59
|
+
- `ALL /p/{policy_id}/{path:path}` — reverse-proxy to the provisioned sandbox; `X-User-Id` header required; orchestrator resolves `(user_id, policy_id) → sandbox`, replaces auth with the sandbox's internal API key, streams body bidirectionally
|
|
60
|
+
- `WS /p/{policy_id}/api/terminals/{session_id}` — WebSocket proxy with first-message `{"type":"auth","token":"..."}` handshake
|
|
61
|
+
|
|
62
|
+
### 3.3 Single-terminal dialect (used by `open-terminal`)
|
|
63
|
+
|
|
64
|
+
The endpoints under `/p/{policy_id}/` in orchestrator mode are exactly the endpoints `open-terminal` exposes at root. Open WebUI clients used by the UI:
|
|
65
|
+
|
|
66
|
+
- `GET /openapi.json` — OpenAPI 3.0 spec; tools from this spec are surfaced to the model as function-calling tools
|
|
67
|
+
- `GET /files/cwd`, `POST /files/cwd` — session-scoped CWD (keyed on `X-Session-Id`)
|
|
68
|
+
- `GET /files/list?directory=`, `GET /files/read?path=`, `GET /files/view?path=`
|
|
69
|
+
- `POST /files/upload?directory=` (multipart), `POST /files/mkdir`, `DELETE /files/delete`, `POST /files/move`, `POST /files/archive`
|
|
70
|
+
- `POST /api/terminals` → `{ id }`; then `WS /api/terminals/{id}` with first-message auth, binary frames for PTY I/O, JSON `{type:"resize",cols,rows}` / `{type:"ping"}` for control
|
|
71
|
+
|
|
72
|
+
All HTTP requests authenticated by `Authorization: Bearer <key>`; `X-Session-Id` keys per-chat state; `X-User-Id` keys per-user provisioning in orchestrator mode.
|
|
73
|
+
|
|
74
|
+
### 3.4 What Open WebUI gives back if a server implements this
|
|
75
|
+
|
|
76
|
+
- **`FileNav.svelte`** — full file browser in the chat sidebar (list, read, upload via drag-drop, download, mkdir, delete, move, archive)
|
|
77
|
+
- **`XTerminal.svelte`** — embedded xterm.js with the WebSocket protocol above
|
|
78
|
+
- **Tool calling** — OpenAPI tools auto-injected into the inference loop when the model has `capabilities.terminal = true`
|
|
79
|
+
- **`AddTerminalServerModal.svelte`** — admin / per-user UI to add a server, with orchestrator-mode policy editor
|
|
80
|
+
- **Per-chat `X-Session-Id`** — Open WebUI passes the chat id automatically, sandboxes can scope CWD and state to a session
|
|
81
|
+
|
|
82
|
+
## 4. Hard constraint: client parity
|
|
83
|
+
|
|
84
|
+
Current explicit requirement: **Open WebUI and n8n must reach an identical capability surface** so that skills are portable between clients. The MCP protocol is the only common denominator across the target clients today (Open WebUI MCP support, n8n MCP nodes, OpenAI Agents SDK, LiteLLM, Claude Desktop). See [`../../MCP.md`](../../MCP.md), [`../../COMPARISON.md`](../../COMPARISON.md).
|
|
85
|
+
|
|
86
|
+
This constraint **takes precedence** over any UX gain from native Open WebUI integration. Anything that splits the skill surface — i.e. tools that work in Open WebUI but not in n8n, or vice versa — is rejected by definition. ADR-0005 (MCP as user-facing control-plane gateway, frozen contract) stands.
|
|
87
|
+
|
|
88
|
+
## 5. Hypothesis (open, not decided)
|
|
89
|
+
|
|
90
|
+
Add an **external protocol dialect** to L4 that speaks the orchestrator wire contract from §3.2 alongside the primary MCP endpoint, while internal tool execution stays MCP-shaped end-to-end.
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
┌─── /mcp primary, frozen (n8n, Claude Desktop, LiteLLM, OpenAI Agents)
|
|
94
|
+
L4 (Go) ──────────┼─── /api/v1/policies, /p/... Open WebUI native UX (FileNav, XTerminal, OpenAPI tools)
|
|
95
|
+
├─── /v1/chat/completions OpenAI-compat (future, for OpenAI-API consumers)
|
|
96
|
+
└─── /admin/* operator UI
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
All four are adapters over the same internal connect-go RPC ([ADR-0008](../adr/0008-internal-grpc-external-rest-mcp.md)).
|
|
100
|
+
|
|
101
|
+
### What this would unlock
|
|
102
|
+
|
|
103
|
+
- Open WebUI users get the native file browser + embedded terminal + OpenAPI-tool injection out of the box, without our `computer_link_filter` and Open WebUI source patches.
|
|
104
|
+
- No regression for n8n / Claude Desktop / LiteLLM — they keep using `/mcp` unchanged.
|
|
105
|
+
|
|
106
|
+
### What still has to be proven before this becomes decision-grade
|
|
107
|
+
|
|
108
|
+
1. **Skill parity check.** The Open WebUI dialect would deliver tools via OpenAPI 3.0, not MCP `tools/call`. We have to confirm that for every skill we ship, the OpenAPI representation and the MCP representation produce identical model behaviour. If not, the dialect splits the skill surface and §4 forces rejection.
|
|
109
|
+
2. **CDP and live browser viewer.** Open WebUI's terminal dialect has no concept of a Chrome DevTools Protocol stream. Either we extend the dialect with our own WebSocket endpoint under `/p/{policy_id}/devtools/...` (and patch Open WebUI to recognise it — back to the patch-maintenance problem), or we accept that Computer Use's primary fronted-killer feature is unavailable through this path.
|
|
110
|
+
3. **`computer_link_filter` value.** Today the filter injects skill descriptions into the system prompt and rewrites output URLs into iframe previews. Open WebUI's native flow injects OpenAPI tool descriptions automatically but does **not** rewrite output URLs. We have to decide whether the URL-rewriting UX is essential — if yes, we still need the filter even when using the native dialect, and the simplification budget shrinks.
|
|
111
|
+
4. **State of the contract.** `open-webui/terminals` is at `v0.0.3` with an Enterprise License. Backwards-compat guarantees on the orchestrator wire format are unclear; pinning to a specific Open WebUI version range may be necessary.
|
|
112
|
+
5. **`X-Session-Id` semantics.** Open WebUI assumes sessions outlive single requests (CWD persists). Our session model is sandbox-per-chat with a TTL. Confirm the mapping doesn't surprise anyone — e.g. what happens to file ops sent during sandbox cold-start.
|
|
113
|
+
|
|
114
|
+
### Phase to evaluate
|
|
115
|
+
|
|
116
|
+
If pursued, this is a Phase 6 concern (L4 rewrite) at the earliest — the adapter lives in L4 and benefits from connect-go's HTTP+JSON pluralism. Not earlier: doing it on top of the current FastAPI server would create migration debt.
|
|
117
|
+
|
|
118
|
+
## 6. Patterns observed, not borrowed
|
|
119
|
+
|
|
120
|
+
For completeness, things their code does competently that we should make sure are covered in our own design (these are CNCF / k8s-api-convention basics, not their inventions — listing only to confirm we don't drop them):
|
|
121
|
+
|
|
122
|
+
- Status `phase` + `conditions[]` array on the CRD (k8s API conventions). Their flat `cpuLimit: "2"` vs nested `resources.limits.cpu` is the opposite — non-standard, breaks generic k8s tooling. **Antipattern note added below.**
|
|
123
|
+
- Finalizer-driven teardown (`settings.persistence.finalizer = "..."`) — standard. Required for our S3-cleanup / secret-revocation / egress-JWT-invalidation flows.
|
|
124
|
+
- PVC lifecycle separated from CR lifecycle (PVC outlives the controller object). Useful pattern for stateful workloads; **not directly applicable to us** since our default workspace home is ephemeral and persistence is S3-mediated.
|
|
125
|
+
- Reverse-proxy with retry on cold-start (5 attempts, 1s backoff) — required behaviour for warm-pool misses; should be explicit in [`03-layer3-providers.md`](../architecture/03-layer3-providers.md) and [`02-layer4-control-plane.md`](../architecture/02-layer4-control-plane.md).
|
|
126
|
+
|
|
127
|
+
## 7. Antipattern note candidate
|
|
128
|
+
|
|
129
|
+
For [`../antipatterns.md`](../antipatterns.md):
|
|
130
|
+
|
|
131
|
+
> **Flat resource fields on a CRD spec.** Using `spec.cpuLimit: "2"` and `spec.memoryLimit: "4Gi"` instead of the canonical `spec.resources.limits.{cpu,memory}` breaks `kubectl explain`, generic policy admission controllers (Kyverno, Gatekeeper templates that target `resources.limits`), and Helm-chart introspection tooling. Save the typing, lose the ecosystem. Always nest under `resources`.
|
|
132
|
+
|
|
133
|
+
## 8. Summary
|
|
134
|
+
|
|
135
|
+
`open-terminal` and `terminals` are well-scoped products for a different audience. Their wire protocol is the one piece worth recording for possible reuse as an external dialect of our L4 — strictly as a **hypothesis** subordinated to the MCP-first / client-parity constraint. No architecture commitment is made by this file.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: FSL-1.1-Apache-2.0 -->
|
|
2
|
+
<!-- Copyright (c) 2025 Open Computer Use Contributors -->
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
status: research-draft
|
|
6
|
+
last-reviewed: 2026-05-24
|
|
7
|
+
owner: architecture
|
|
8
|
+
applies-to: next/v1
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Evidence brief for the bank-buyer half of `manifesto/01-audience-and-buyer.md`; audience is the architect drafting §01.
|
|
12
|
+
|
|
13
|
+
## Buyer chain in a tier-1 US/EU bank
|
|
14
|
+
|
|
15
|
+
Singular "the buyer" does not exist. A purchase of an in-perimeter AI-agent platform at a tier-1 bank requires alignment across four parallel chains, each with veto power:
|
|
16
|
+
|
|
17
|
+
1. **Business sponsor + budget.** Increasingly a Chief AI Officer with a P&L. HSBC appointed David Rice as inaugural CAIO effective 1 Apr 2026 ([Banking Dive](https://www.bankingdive.com/news/hsbc-david-rice-ai-chief-cto-mario-shamtani-expanded-role-elhedery/815655/)). UBS named Daniele Magazzeni CAIO starting 1 Jan 2026 ([fintechfutures](https://www.fintechfutures.com/job-cuts-new-hires/hsbc-appoints-david-rice-as-its-inaugural-chief-ai-officer)). CBA appointed Ranil Boteju (Dec 2025); NatWest named Dr Maja Pantic Chief AI Research Officer (Jun 2025). JPMorgan has not announced a single CAIO title but routes AI through Mary Erdoes and the firm-wide AI/ML platform org. Assumption (uncited): the CAIO function exists in some form at every tier-1 by end-2026; in banks without the title, the sponsor is the COO of the largest LOB.
|
|
18
|
+
2. **Technical owner.** CIO or Head of Engineering Platforms. Buys the runtime, owns SLOs, signs the bill.
|
|
19
|
+
3. **Gatekeeper stack.** CISO + Chief Risk Officer + Chief Compliance Officer + Data Protection Officer. Any one of them can kill a deal during InfoSec or third-party-risk review.
|
|
20
|
+
4. **Procurement + Legal.** Run TPRM intake, redline the contract, escalate license oddities to outside counsel.
|
|
21
|
+
|
|
22
|
+
Gartner frames the analyst-side reading: by 2028, AI agents will handle 90% of B2B purchasing decisions, channelling >$15T ([digitalcommerce360](https://www.digitalcommerce360.com/2025/11/28/gartner-ai-agents-15-trillion-in-b2b-purchases-by-2028/)). For now (2026), the human chain above is what closes the deal — and Gartner also forecasts that >40% of agentic AI projects will be cancelled by end-2027 ([Gartner press 2025-06-25](https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027)). Default sales motion is "land with the CAIO, survive the gatekeepers, close through procurement."
|
|
23
|
+
|
|
24
|
+
## Deal-killers (review boards that veto)
|
|
25
|
+
|
|
26
|
+
| Board | What kills the deal | Citation |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| **Vendor Risk / TPRM** | NYDFS 21 Oct 2025 industry letter on TPSPs — covered entities must add contractual clauses on AI usage, training-data limits, sub-processor disclosure, exit obligations. Missing any = vendor cannot be onboarded. | [NYDFS IL 2025-10-21](https://www.dfs.ny.gov/industry-guidance/industry-letters/il20251021-guidance-managing-risks-third-party); [Inside Privacy](https://www.insideprivacy.com/cybersecurity-2/nydfs-publishes-industry-guidance-on-managing-cyber-risks-related-to-third-party-service-providers/) |
|
|
29
|
+
| **InfoSec architecture** | No proof of in-perimeter execution; no demonstrated egress controls against indirect prompt injection / data exfiltration; no signed audit trail under one retention policy. | [Purplesec on data exfiltration via prompt injection](https://purplesec.us/learn/data-exfiltration-ai-prompt-injection/); [dev.to AI governance gap](https://dev.to/ashutoshrana/every-enterprise-ai-framework-has-a-compliance-gap-heres-the-architecture-that-closes-it-20np) |
|
|
30
|
+
| **DORA (EU)** | Active enforcement began 2026; fines up to 2% of global turnover (entities) or €5M + 1% daily turnover (critical ICT TPPs); supervisors can suspend service. ~50% of regulated entities entered 2026 with known gaps (Deloitte). | [regulation-dora.eu enforcement](https://www.regulation-dora.eu/blog/dora-2026-enforcement-what-changes); [regulation-dora.eu penalties](https://www.regulation-dora.eu/blog/dora-penalties-fines-enforcement-guide-2025) |
|
|
31
|
+
| **Model Risk (was SR 11-7)** | SR 26-2 (17 Apr 2026, jointly Fed/OCC/FDIC) explicitly **excludes** generative and agentic AI from MRM scope as "novel and rapidly evolving" — but bank-wide risk-management and governance expectations still apply. The model-risk path WEAKENS; the broader operational-risk / TPRM / cyber path STRENGTHENS. | [SR 26-2 PDF](https://www.federalreserve.gov/supervisionreg/srletters/SR2602.pdf); [Sullivan & Cromwell memo](https://www.sullcrom.com/insights/memo/2026/April/OCC-Fed-FDIC-Issue-Revised-Guidance-Model-Risk-Management); [cutover.com analysis](https://cutover.com/blog/what-sr-26-2-means-for-banks-deploying-agentic-ai) |
|
|
32
|
+
| **Legal / Procurement** | FSL-1.1-Apache-2.0 is not on standard license whitelists. Procurement will escalate to outside counsel; expect questions on the 2-year Apache-2.0 conversion and the anti-SaaS clause. Plan one-pager + redlined MSA before first call. | (assumption, uncited; banks default to OSI-approved list) |
|
|
33
|
+
| **DPO / GDPR** | Sub-processor sprawl in public SaaS; data-residency commitments via cloud-provider regional inference are conditional. Claude default routes through US infra ([github issue 40526](https://github.com/anthropics/claude-code/issues/40526)). | [claudereadiness.com](https://claudereadiness.com/blog/claude-security-privacy-enterprise/) |
|
|
34
|
+
|
|
35
|
+
## Why-now 2026 forcing functions
|
|
36
|
+
|
|
37
|
+
- **EU AI Act timeline relief (and trap).** Digital Omnibus political agreement 7 May 2026: standalone Annex III high-risk deferred to **2 Dec 2027**; product-embedded high-risk to **2 Aug 2028** ([Consilium press 2026-05-07](https://www.consilium.europa.eu/en/press/press-releases/2026/05/07/artificial-intelligence-council-and-parliament-agree-to-simplify-and-streamline-rules/); [Hogan Lovells](https://www.hoganlovells.com/en/publications/eu-legislators-agree-to-delay-for-highrisk-ai-rules); [White & Case](https://www.whitecase.com/insight-alert/eu-agrees-digital-omnibus-deal-simplify-ai-rules)). Banks read this as "more time to do it right," not "skip it." Agentic systems will almost certainly land in Annex III when scoped against credit decisioning, KYC, employee monitoring.
|
|
38
|
+
- **DORA enforcement live.** Regulation in force since 17 Jan 2025; 2026 is the first full year of active supervisory action. First compulsion payments issued; cross-checks against the Register of Information automated ([regulation-dora.eu 2026 changes](https://www.regulation-dora.eu/blog/dora-2026-enforcement-what-changes)).
|
|
39
|
+
- **Shadow-AI cost is now a board metric.** IBM Cost of a Data Breach 2025: 20% of breached orgs had a shadow-AI incident; avg total cost $4.63M (vs $4.44M baseline) — $670K premium per breach; 97% of AI-breach victims lacked basic AI access controls ([VentureBeat](https://venturebeat.com/security/ibm-shadow-ai-breaches-cost-670k-more-97-of-firms-lack-controls); [IBM newsroom](https://newsroom.ibm.com/2025-07-30-ibm-report-13-of-organizations-reported-breaches-of-ai-models-or-applications,-97-of-which-reported-lacking-proper-ai-access-controls); [Kiteworks summary](https://www.kiteworks.com/cybersecurity-risk-management/ibm-2025-data-breach-report-ai-risks/)).
|
|
40
|
+
- **Public-SaaS Computer Use blockers in banking.** Anthropic's enterprise plan blocks financial-services categories by default in the Claude in Chrome extension ([Harmonic guide](https://www.harmonic.security/resources/securing-claude-cowork-a-security-practitioners-guide)); EU residency requires deployment via Bedrock/Vertex/Foundry rather than native Anthropic API ([github issue 40526](https://github.com/anthropics/claude-code/issues/40526)). Result: every bank that wants Computer Use must either (a) accept a sub-processor stack 3-deep or (b) self-host.
|
|
41
|
+
|
|
42
|
+
## Top use-cases that close vs theoretical
|
|
43
|
+
|
|
44
|
+
| Use-case | Close window in 2026 | Evidence |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| **KYC / AML investigator assistance** (alert-to-case-closure copilot, transaction-monitoring triage) | Closes now. 58% of banks already use AI for AML/KYC; a Dutch tier-1 reports 90% reduction in onboarding time, 30% staff workload cut. McKinsey writes specifically about agentic AI for client-onboarding and sanctions/fraud investigations. | [McKinsey on agentic AI for KYC/AML](https://www.mckinsey.com/capabilities/risk-and-resilience/our-insights/how-agentic-ai-can-change-the-way-banks-fight-financial-crime); [Deloitte AI adoption in FIs](https://www.deloitte.com/middle-east/en/services/consulting/perspectives/ai-adoption-in-financial-institutions-balancing-growth-and-governance.html) |
|
|
47
|
+
| **Internal IT helpdesk automation** | Closes now. Lowest regulatory exposure, internal user, defensible RoI. | (assumption; commonly named in BCG/Deloitte FI surveys) |
|
|
48
|
+
| **Developer productivity (sandboxed Computer Use for engineers)** | Closes 2026 if self-hosted; blocked on public SaaS by procurement. | (assumption from sub-processor and residency evidence above) |
|
|
49
|
+
| **Compliance evidence collection / control testing** | Closes 2026-2027. On-prem deployments make audit easier — "every artifact lives in one place under one retention policy with one signed audit trail" ([dev.to](https://dev.to/ashutoshrana/every-enterprise-ai-framework-has-a-compliance-gap-heres-the-architecture-that-closes-it-20np)). | |
|
|
50
|
+
| **Ops / back-office automation** | Closes 2026 in narrow workflows; broad deployment is year+ away. Only ~10% of FIs apply AI at scale per BCG; 75% still experimenting ([BCG retail banking report 2025](https://web-assets.bcg.com/9e/6f/ee4a643a48f9b4133de389e10386/2025-retail-banking-report-nov-2025-n.pdf); [BCG "AI reckoning"](https://web-assets.bcg.com/1a/b0/007d0359442eb77e5f3aaf07b5c1/for-banks-the-ai-reckoning-is-here-may-2025.pdf)). | |
|
|
51
|
+
| **Credit decisioning, customer-facing advisory** | Theoretical for v1. Annex III high-risk; SR 26-2 carve-out plus broad governance still attach; reputational risk too high without a track record. | EU AI Act + cited MRM evidence above. |
|
|
52
|
+
|
|
53
|
+
## Competitive gap in 2026
|
|
54
|
+
|
|
55
|
+
| Competitor | Posture | Gap they leave open |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| **Anthropic Enterprise** (Code with Claude, London 19 May 2026) | Self-hosted sandboxes in public beta; MCP tunnels in research preview. Tool execution moves customer-side; **orchestration, context, recovery stay Anthropic-side** ([InfoQ](https://www.infoq.com/news/2026/05/claude-mcp-tunnels/); [The New Stack](https://thenewstack.io/anthropic-mcp-tunnels-sandboxes/); [9to5Mac](https://9to5mac.com/2026/05/19/anthropic-enhances-claude-managed-agents-with-two-new-privacy-and-security-features/)). | Agent-loop control plane is a foreign dependency; model-lock-in is structural; not multi-provider. |
|
|
58
|
+
| **UiPath Automation Suite — on-prem agentic AI (5 May 2026)** | Self-hosted runtime, supports cloud or self-hosted LLMs. Public-sector launch but explicitly extended to banking. ([UiPath IR](https://ir.uipath.com/news/detail/446/uipath-automation-suite-delivers-on-premises-agentic-ai-for-the-public-sector); [DIGITIMES](https://www.digitimes.com/news/a20260522PD207/security-data.html); [Let's Data Science](https://letsdatascience.com/news/uipath-launches-on-premises-agentic-ai-for-public-sector-9d98d910)) | RPA shape (workflow-orchestrator first, computer-use second); commercial license; lock-in to UiPath skill format. The "agent gives you what you want only inside the UiPath product surface" trap. |
|
|
59
|
+
| **OpenAI Enterprise** | Hosted only; no in-perimeter agent loop GA. | Same as Anthropic but worse residency story. |
|
|
60
|
+
| **Microsoft Copilot Studio** | Tied to Azure tenant; assumes M365 + Graph + Azure OpenAI. | Not model-agnostic; not deployable outside Azure; not in-perimeter for non-Azure banks. |
|
|
61
|
+
| **Skyvern (OSS)** | AGPL-3.0 core; SOC2 Type II + HIPAA in managed cloud. Self-hostable via Docker. ([GitHub](https://github.com/Skyvern-AI/skyvern); [skyvern pricing](https://www.skyvern.com/pricing)) | **AGPL-3.0 is the gap.** Banks running a customised in-perimeter fork would face source-disclosure pressure if they ever exposed it as a "service" — most legal teams reject AGPL by policy. |
|
|
62
|
+
|
|
63
|
+
Gap that remains for an FSL-1.1-Apache-2.0, model-agnostic, in-perimeter platform with a customer-controlled agent loop: real, but narrower than 12 months ago. Differentiation must rest on (a) full agent loop in-perimeter (not just tool execution), (b) model-agnosticism with no Anthropic/OpenAI tax, (c) bank-acceptable license, (d) audit-evidence pipeline as a first-class component — not a UiPath/Anthropic afterthought.
|
|
64
|
+
|
|
65
|
+
## Domain-expert failure modes
|
|
66
|
+
|
|
67
|
+
Concrete patterns that kill enterprise AI deals in 2024-2026 compliance review:
|
|
68
|
+
|
|
69
|
+
1. **Mock-only on-prem path.** Vendor claims "self-hostable" but the orchestration/agent loop still phones home (Anthropic's first cut of Managed Agents was exactly this until the May 2026 update). Auditor asks for a network diagram, finds an outbound dependency on a public endpoint, deal stalls.
|
|
70
|
+
2. **BYOK theater.** Customer brings the KMS, but vendor still decrypts plaintext on vendor-managed servers. Fails any DPO review where the threat model includes the vendor.
|
|
71
|
+
3. **Sub-processor sprawl.** Single AI feature ends up with 4-deep sub-processor chain (LLM vendor → hyperscaler → vector-DB SaaS → observability SaaS). NYDFS Oct 2025 letter and DORA's third-party register both make this fatal: each link is a separate due-diligence file.
|
|
72
|
+
4. **Missing or non-tamper-evident audit trail.** 97% of orgs that suffered AI-related breaches in 2025 lacked basic AI access controls ([IBM newsroom](https://newsroom.ibm.com/2025-07-30-ibm-report-13-of-organizations-reported-breaches-of-ai-models-or-applications,-97-of-which-reported-lacking-proper-ai-access-controls)). Banks demand WORM-style append-only logs covering prompt, tool call, retrieved context, model output, human override.
|
|
73
|
+
5. **AGPL-via-the-back-door.** OSS component (Skyvern, browserless, similar) buried in the product, surfaced only at the OSS-license scan stage of TPRM. Auto-rejection in most banks.
|
|
74
|
+
6. **EU residency claimed via "we can deploy on Bedrock."** Conditional residency is not residency; the customer has to own the deployment to claim the control. Procurement reads this in 5 minutes.
|
|
75
|
+
7. **Pilot that never scales because risk controls were retrofitted.** 42% of orgs abandoned most AI initiatives in 2025; primary cause cited is compliance and governance, not technical ([dev.to](https://dev.to/ashutoshrana/every-enterprise-ai-framework-has-a-compliance-gap-heres-the-architecture-that-closes-it-20np)). The "we'll add audit later" architecture loses at the InfoSec review.
|
|
76
|
+
8. **Shadow-AI bypass.** Sanctioned tool too painful to use → users go back to ChatGPT on a personal phone. IBM: 20% of breaches now involve shadow AI ([VentureBeat](https://venturebeat.com/security/ibm-shadow-ai-breaches-cost-670k-more-97-of-firms-lack-controls)). A platform with friction higher than the public-SaaS alternative loses through this channel even after winning the deal.
|
|
77
|
+
|
|
78
|
+
## What this means for Manifesto §01
|
|
79
|
+
|
|
80
|
+
8 recommendations the architect should write into `manifesto/01-audience-and-buyer.md`:
|
|
81
|
+
|
|
82
|
+
1. **MUST** name the buyer as a chain, not a role. List the four chains (business sponsor / technical owner / gatekeeper stack / procurement-legal) with veto-mapping. One sentence each.
|
|
83
|
+
2. **MUST** name the CAIO as the modal sponsor for 2026-2028, with HSBC/UBS/CBA/NatWest as anchor citations. State the assumption that the function exists even when the title does not.
|
|
84
|
+
3. **MUST** name the top three deal-killers explicitly: TPRM/NYDFS, InfoSec architecture review, DORA active enforcement. One paragraph each, with the citations from this brief.
|
|
85
|
+
4. **MUST NOT** rest the thesis on "only enterprise in-perimeter Computer Use." UiPath shipped 5 May 2026; Anthropic shipped self-hosted sandboxes 19 May 2026. The defensible framing is "full agent loop in-perimeter, multi-provider, FSL-licensed, audit-evidence as first-class component" — pick at least two and stake them.
|
|
86
|
+
5. **MUST** state the SR 26-2 carve-out and its consequence: model-risk path weakens, TPRM / operational-risk / cyber path strengthens. v1 architecture must over-invest in the second, not the first.
|
|
87
|
+
6. **MUST NOT** cite the McKinsey "$200-340B" headline. Use BCG "~10% at scale, 75% still experimenting" and the IBM shadow-AI cost figures instead.
|
|
88
|
+
7. **SHOULD** list the v1 closing use-cases (KYC/AML copilot, internal IT helpdesk, developer productivity, compliance evidence) and explicitly mark credit decisioning + customer-facing advisory as out-of-scope for v1.
|
|
89
|
+
8. **SHOULD** include a "failure modes that kill the deal" table mirroring §Domain-expert failure modes above, abbreviated to one line each. Banks recognise their own review processes; this signals we know what theirs look like.
|
|
90
|
+
9. **SHOULD** keep §01 to ≤80 lines and stop. Detail belongs in component specs and ADRs; §01 names who buys and what stops them.
|
|
91
|
+
|
|
92
|
+
## Open questions
|
|
93
|
+
|
|
94
|
+
- Is "CAIO is the modal sponsor" true at JPMorgan / Goldman / Morgan Stanley, where AI is run from existing CTO/COO structures? Needs sponsor research.
|
|
95
|
+
- What is the actual procurement experience of FSL-1.1 in 3+ tier-1 banks? Currently an uncited assumption.
|
|
96
|
+
- Does the Anthropic 19 May 2026 release route the agent loop entirely customer-side in self-hosted-sandboxes mode, or only tool execution? Re-read the InfoQ + Anthropic docs before §01 lands.
|
|
@@ -0,0 +1,106 @@
|
|
|
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-05-24
|
|
7
|
+
owner: nick
|
|
8
|
+
applies-to: docs/architecture/manifesto/01-audience-and-buyer.md
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Research brief for the secondary (solo enthusiast) audience of `next/v1`; input to Manifesto §01.
|
|
12
|
+
|
|
13
|
+
## Is the OSS to enterprise funnel real for self-hostable infra?
|
|
14
|
+
|
|
15
|
+
Evidence is genuine but uneven. Three patterns dominate.
|
|
16
|
+
|
|
17
|
+
**Funnel works when the OSS product is the same engine as the paid product.** Sentry: self-hosted free version drove top-of-funnel; major customers (Instacart, GitHub, Disney, Atlassian, Reddit, Slack) started self-hosted, then bought hosted as scale made DIY uneconomic. Self-serve is ~70% of revenue as of May 2024 (4M developers, 90K orgs).<sup>[1]</sup> Sentry's FSL license is the direct precedent for this repo's license choice.
|
|
18
|
+
|
|
19
|
+
**Funnel works when bottom-up adoption produces internal champions.** HashiCorp Vault and Terraform — Community Editions onboard practitioners; HCP/Enterprise upsell triggers at the governance / scale / risk boundary. HashiConf 2024 explicitly markets a "Terraform migrate" beta to move CE workflows into HCP.<sup>[2]</sup> dbt followed the same shape: 5+ years of free `dbt Core` adoption, then dbt Cloud crossed $100M ARR by 2024 (Fortune 500 adoption +85% YoY).<sup>[3]</sup> Grafana: 25M users feed 5,000+ paying customers (Bloomberg, Citigroup, Dell, Salesforce); $6B valuation in 2024.<sup>[4]</sup>
|
|
20
|
+
|
|
21
|
+
**Funnel breaks when you cut off the free engine.** Buoyant stopped publishing stable Linkerd binaries for orgs >50 employees in February 2024. The 2024 CNCF Annual Survey shows service-mesh adoption fell from 50% to 42% YoY despite Kubernetes climbing to 93%.<sup>[5]</sup> Buoyant's own velocity rebounded (IPv6, Gateway API, post-quantum shipped within 18 months), so the company survived — but the *community funnel* did not. This is the cautionary anchor for any decision to gate features behind the paid tier.
|
|
22
|
+
|
|
23
|
+
For Computer Use specifically: Coder.com (self-hostable workspaces with developer-first DX, then enterprise governance) is the closest live analog and the most relevant funnel shape to copy.<sup>[6]</sup>
|
|
24
|
+
|
|
25
|
+
## Personas for in-perimeter Computer Use platform
|
|
26
|
+
|
|
27
|
+
Ranked by v1 relevance.
|
|
28
|
+
|
|
29
|
+
| Rank | Persona | What they contribute |
|
|
30
|
+
|------|---------|----------------------|
|
|
31
|
+
| 1 | Indie agent builder | Evals, bug reports, novel skill recipes, public writeups that bank InfoSec then forwards internally |
|
|
32
|
+
| 2 | Internal-IT / platform team at non-bank SMB | Real-world deployment friction; same threat model as enterprise just smaller; revenue path via mid-market |
|
|
33
|
+
| 3 | OSS maintainer / contributor | Code, integrations (LangChain/Dify/Haystack adapters), MCP server contributions |
|
|
34
|
+
| 4 | Privacy-focused self-hoster (Nextcloud/Immich crowd)<sup>[7]</sup> | Hardening reports, default-closed advocacy, attack-surface audits — directly aligned with bank threat model |
|
|
35
|
+
| 5 | AI researcher / grad student | Reproducible evals, paper citations, novel agent recipes |
|
|
36
|
+
| — | Solo SaaS founder | DROP. The license forbids competing hosted services — this persona is a license violation by definition |
|
|
37
|
+
|
|
38
|
+
Bank-employed staff engineers exploring at home read as Persona 1 or 4 by behaviour; they sit inside the enterprise funnel by employer.
|
|
39
|
+
|
|
40
|
+
## Domain-expert DX patterns that make OSS docs delightful
|
|
41
|
+
|
|
42
|
+
- **Stripe three-column layout**<sup>[8]</sup>: persistent nav | concept | runnable curl/SDK side-by-side. Hover synchronises prose and code. Result: zero context-switch from "what is this" to "paste this". For our docs: every `getting-started/` page exposes a runnable command in the right gutter; reference docs show the YAML and the CLI invocation together.
|
|
43
|
+
- **Rust Book pull-model teaching**<sup>[9]</sup>: direct "you" address, explicit "skip ahead if you want", deliberate non-compiling examples with the exact compiler error printed. The book teaches *how to read errors*, not how to avoid them. For our docs: include the failure path for every happy path — what the audit log shows when policy denies, what the CLI returns when SCIM fails.
|
|
44
|
+
- **FastAPI auto-generated correctness from types**<sup>[10]</sup>: the OpenAPI spec is generated from Python type hints; docs cannot drift from code because they are the same artifact. For our docs: the Helm `values.yaml` reference, OpenAPI for the broker API, and CLI `--help` are all generated, never hand-edited.
|
|
45
|
+
- **Fly.io EffortPost format**<sup>[11]</sup>: bold lede, 2000+ words, runnable code, claims defended with measurements. Fly is moving away from optimising every post for HN — the format still works for one-shot deep dives (e.g. the threat-model walkthrough, the audit-trail design post).
|
|
46
|
+
- **Tailwind reference docs**<sup>[12]</sup>: every utility documented with the exact CSS it generates and a copy button. Equivalent for us: every NFR scenario in the manifesto shows the measurable target *and* the test command that verifies it.
|
|
47
|
+
|
|
48
|
+
Stripe/Rust/FastAPI/Fly all share one trait that distinguishes them from corporate ISMS docs: prose paragraphs are short, every claim is verifiable, no marketing voice.
|
|
49
|
+
|
|
50
|
+
## Tensions between bank and enthusiast requirements
|
|
51
|
+
|
|
52
|
+
| Tension | Resolution mechanism in v1 |
|
|
53
|
+
|---------|----------------------------|
|
|
54
|
+
| Image tags (mutable `latest` for hacking; pinned + cosign for procurement) | Publish both. `:edge` for enthusiasts, `:vX.Y.Z` + signed digest for banks. Documented in release notes. |
|
|
55
|
+
| IdP (Keycloak/Entra mandatory vs none-at-all) | `auth.mode: local` env flag ships local-only with single admin token; `auth.mode: oidc` enforces SCIM/SAML. Default in Helm chart: `oidc`; default in Compose quickstart: `local`. |
|
|
56
|
+
| Audit sinks (Splunk/QRadar vs filesystem) | `audit.sink` interface with `filesystem`, `syslog`, `splunk-hec`, `qradar` implementations. Filesystem ships with the repo; the rest are integration docs. |
|
|
57
|
+
| Threat-model placement (visible vs hidden) | Diátaxis split absorbs: `docs/architecture/security/threat-model.md` for bank InfoSec; `docs/getting-started/security-defaults.md` for enthusiast (one screen, "these are the defaults that protect you"). |
|
|
58
|
+
| Support model | Bank-only contract. No tension — enthusiasts get GitHub issues + community Discord, banks pay for SLA. State this once in the manifesto, not on every doc page. |
|
|
59
|
+
| Doc voice | Diátaxis quadrant decides voice, not audience. `architecture/` and `compliance/` are reference + explanation (formal, NFR-style). `getting-started/`, `operating/`, `contributing/` are tutorial + how-to (direct "you", runnable). |
|
|
60
|
+
| Default-closed network posture | Default-closed everywhere. The enthusiast tradeoff is a one-line env override (`network.egress.mode: allow-localhost`) documented in `getting-started/local-development.md`. No special build, no soft default. |
|
|
61
|
+
|
|
62
|
+
The mechanism that does *not* work: a single doc that tries to address both audiences in alternating paragraphs.
|
|
63
|
+
|
|
64
|
+
## Cope-check: did anyone die from dual-audience?
|
|
65
|
+
|
|
66
|
+
The Authentik 2024 incident is the live cautionary tale.<sup>[13]</sup> A community PR to add an SSO source was rejected because SAML connections were in the paid tier. The community read this as "SSO is security tablestakes in 2024, you cannot gate it behind enterprise." Authentik responded with a blog post conceding the framing, then shipped SCIM/OAuth/SAML/Plex *source* mappings in 2024.8 to the open-source product. The lesson: *security primitives cannot be the paid moat for an OSS security product*. For Computer Use this means SCIM/SAML, audit-trail integrity, signed releases, and threat-model docs must all live in the OSS product; the moat is operational (managed deployment, paid SLA, certification packs), not capability.
|
|
67
|
+
|
|
68
|
+
Honest read on "dual audience": the constraint is load-bearing for licensing (FSL-1.1-Apache-2.0 only makes sense if enthusiasts can use it) and load-bearing for credibility (banks distrust OSS products with no real community), but it is *not* load-bearing for §01 of the Manifesto. §01 should name the primary buyer cleanly and treat the enthusiast as a downstream consequence of the licensing decision, not a co-equal persona in the buyer document. Treating it as co-equal is the procrastination risk.
|
|
69
|
+
|
|
70
|
+
## Domain-expert failure modes
|
|
71
|
+
|
|
72
|
+
Patterns where projects pretend to serve both audiences and serve neither:
|
|
73
|
+
|
|
74
|
+
1. **Marketing-tone README the bank rejects, dense ADRs the enthusiast skips.** A README opening with "industry-leading, battle-tested, enterprise-grade AI agents" signals to bank InfoSec that the project has no audit posture; signals to enthusiasts that it is vapourware. Banned vocab list in this repo's CLAUDE.md exists for this reason.
|
|
75
|
+
2. **Half-OSS / half-paid security primitives.** Authentik 2024 above. Any project where SSO, audit, or RBAC sits behind paywall loses the OSS community immediately and gains zero bank trust (banks read the same news).
|
|
76
|
+
3. **Quickstart that needs Kafka + Vault + Keycloak.** If the "5-minute getting started" requires the enterprise stack, no enthusiast tries it; the funnel never opens. Counter-pattern: Dify and n8n ship `docker compose up` with sane local defaults.<sup>[14]</sup>
|
|
77
|
+
4. **Threat model written as marketing.** "Defense in depth", "zero trust", "secure by design" with no DFD, no STRIDE table, no measured posture. Bank InfoSec discards on first read; enthusiast cannot tell what the defaults actually do.
|
|
78
|
+
5. **ADRs that mix decision with rationale with implementation.** Nygard format exists for a reason; bank reviewers grep for `Decision:` and bail when they cannot find it.
|
|
79
|
+
|
|
80
|
+
## What this means for Manifesto §01
|
|
81
|
+
|
|
82
|
+
1. State the primary buyer in one sentence: tier-1 US/EU bank InfoSec procuring an in-perimeter Computer Use platform.
|
|
83
|
+
2. State the licensing consequence next: FSL-1.1-Apache-2.0 means anyone can self-host, fork, and modify — therefore an OSS community exists and is a permanent part of the project's surface.
|
|
84
|
+
3. Frame the enthusiast as a *consequence of the license*, not a *co-primary persona*. One paragraph, not a parallel section.
|
|
85
|
+
4. List the four enthusiast contributions §01 expects: evals, hardening reports, MCP/skill contributions, public writeups. Tie each to a measurable feedback channel (GitHub issue label, eval submission, Discord channel).
|
|
86
|
+
5. Hard rule: security primitives (SCIM/SAML, audit integrity, signed releases, default-closed network, threat-model docs) are in the OSS product. The moat is operational, not capability. Cite Authentik 2024 as the anti-pattern. Cite Linkerd 2024 as the funnel-break anti-pattern.
|
|
87
|
+
6. Move audience-specific DX guidance out of §01 into a separate Manifesto entry on documentation discipline (already drafted as banned-vocab list in CLAUDE.md). §01 is "who and why", not "how we write".
|
|
88
|
+
7. Demote the solo SaaS founder persona explicitly — the license forbids that customer. Stating this in §01 prevents a recurring product-design argument.
|
|
89
|
+
8. End §01 with one anti-example: "We will not write a README that opens with marketing adjectives, because both audiences read the same first paragraph and both lose trust differently." This is the single sentence that operationalises dual-audience without giving it a co-equal section.
|
|
90
|
+
|
|
91
|
+
## Sources
|
|
92
|
+
|
|
93
|
+
[1] [Sentry self-serve funnel](https://research.contrary.com/company/sentry); [Sentry FSL licensing](https://open.sentry.io/licensing/)
|
|
94
|
+
[2] [HashiConf 2024 — Terraform migrate, CE to Enterprise](https://www.globenewswire.com/news-release/2024/10/15/2963222/0/en/HashiConf-2024-brings-community-and-customers-together-to-do-cloud-right-with-best-practices-for-cloud-infrastructure-automation.html); [HashiCorp CE→Enterprise strategy](https://medium.com/continuous-insights/from-oss-to-enterprise-when-hashicorp-terraform-and-vault-need-to-grow-with-you-f97d1048b8ef)
|
|
95
|
+
[3] [dbt Labs Snowflake / $100M ARR / source-available](https://www.runtime.news/dbt-labs-source-available-bet-pays-off-at-snowflake/); [dbt Core vs dbt Cloud framing](https://www.getdbt.com/blog/how-we-think-about-dbt-core-and-dbt-cloud)
|
|
96
|
+
[4] [Grafana Labs $6B valuation, 25M users, 5,000+ customers](https://research.contrary.com/company/grafana); [Grafana 2024 year in review](https://grafana.com/blog/open-source-at-grafana-labs-2024-year-in-review/)
|
|
97
|
+
[5] [Linkerd stable-binary policy change Feb 2024](https://www.buoyant.io/linkerd-vs-istio); [Service Mesh at a Crossroads — CNCF survey 50%→42%](https://cloudnativenow.com/features/service-mesh-at-a-crossroads-istios-graduation-and-the-road-ahead/)
|
|
98
|
+
[6] [Coder enterprise AI development infrastructure](https://coder.com/blog/coder-enterprise-grade-platform-for-self-hosted-ai-development); [Coder + Linkerd partner-of-year](https://coder.com/blog/coder-named-hashicorp-integration-partner-of-the-year-for-2024)
|
|
99
|
+
[7] [Immich + Nextcloud self-hoster persona](https://cloudbasedbackup.com/en/blog/nextcloud-vs-immich-choosing-the-right-self-hosted-photo-and-cloud-solution); [self-hoster trade-offs](https://bhaveshmishra.dev/blog/self-host-curse/)
|
|
100
|
+
[8] [Stripe docs teardown — three-column](https://www.moesif.com/blog/best-practices/api-product-management/the-stripe-developer-experience-and-docs-teardown/); [Stripe docs case study](https://ninadpathak.com/marketing-research/stripe-documentation-case-study/)
|
|
101
|
+
[9] [The Rust Programming Language — Introduction](https://doc.rust-lang.org/book/ch00-00-introduction.html); [Why Rust Docs Are the Gold Standard](https://medium.com/@syntaxSavage/why-rust-docs-are-the-gold-standard-and-every-language-should-copy-them-4ec8f1edc14b)
|
|
102
|
+
[10] [FastAPI OpenAPI auto-generation](https://fastapi.tiangolo.com/reference/openapi/docs/); [type-safe SDK generation from FastAPI](https://www.speakeasy.com/openapi/frameworks/fastapi)
|
|
103
|
+
[11] [Fly.io — A Blog, If You Can Keep It (EffortPost retrospective)](https://fly.io/blog/a-blog-if-kept/)
|
|
104
|
+
[12] [Tailwind CSS docs and IntelliSense](https://floatui.com/blog/tailwind-css-documentation-the-essential-guide)
|
|
105
|
+
[13] [Authentik response — Nov 2024](https://goauthentik.io/blog/2024-11-21-if-your-open-source-project-competes-with-your-paid-project/); [Authentik 2024.8 release shipping SCIM/SAML sources to OSS](https://docs.goauthentik.io/releases/2024.8/)
|
|
106
|
+
[14] [Self-hostable AI agent platforms 2025/2026 — n8n, Dify, Haystack](https://www.knowlee.ai/blog/self-hosted-ai-agent-platforms-2026); [Microsoft Agent Governance Toolkit](https://opensource.microsoft.com/blog/2026/04/02/introducing-the-agent-governance-toolkit-open-source-runtime-security-for-ai-agents/)
|