@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
package/Dockerfile
ADDED
|
@@ -0,0 +1,676 @@
|
|
|
1
|
+
# SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 Open Computer Use Contributors
|
|
3
|
+
# AI Computer Use - Dockerfile
|
|
4
|
+
# Based on Ubuntu 24.04 Noble Numbat
|
|
5
|
+
|
|
6
|
+
FROM ubuntu:24.04
|
|
7
|
+
|
|
8
|
+
LABEL maintainer="OpenWebUI Implementation"
|
|
9
|
+
LABEL description="AI Computer Use Environment"
|
|
10
|
+
LABEL version="1.0.0"
|
|
11
|
+
|
|
12
|
+
# Claude Code version. Pinned to 2.1.112 — the last release that ships the
|
|
13
|
+
# package as plain JS (cli.js in the tarball). Starting with 2.1.113 the pkg
|
|
14
|
+
# repackaged to a postinstall loader (install.cjs) that downloads a native
|
|
15
|
+
# claude.exe binary and drops cli.js entirely, which breaks our bun-wrapper
|
|
16
|
+
# shim below ("Module not found .../cli.js"). Do NOT bump to 2.1.113+ without
|
|
17
|
+
# also removing the wrapper and verifying the native binary works under Bun.
|
|
18
|
+
ARG CLAUDE_CODE_VERSION=2.1.112
|
|
19
|
+
|
|
20
|
+
# Codex CLI version. Pinned per RESEARCH STACK.md and Pitfall 6 (CLI version
|
|
21
|
+
# drift breaks adapter contract while tests stay green). Bump only after
|
|
22
|
+
# re-running tests/orchestrator/test_cli_adapters.py against the new release.
|
|
23
|
+
ARG CODEX_VERSION=0.125.0
|
|
24
|
+
|
|
25
|
+
# OpenCode (sst fork — opencode-ai on npm, NOT the unrelated similarly-named
|
|
26
|
+
# package). See RESEARCH STACK.md for fork rationale. The npm package
|
|
27
|
+
# downloads platform binaries from GitHub Releases at install time; pinning
|
|
28
|
+
# the version neutralises URL drift (Pitfall 6).
|
|
29
|
+
ARG OPENCODE_VERSION=1.14.25
|
|
30
|
+
|
|
31
|
+
# Prevent interactive prompts
|
|
32
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
|
33
|
+
|
|
34
|
+
# Set environment variables
|
|
35
|
+
ENV PYTHONUNBUFFERED=1 \
|
|
36
|
+
PIP_ROOT_USER_ACTION=ignore \
|
|
37
|
+
PIP_BREAK_SYSTEM_PACKAGES=1 \
|
|
38
|
+
PYTHONDONTWRITEBYTECODE=1 \
|
|
39
|
+
NODE_PATH=/home/node_modules:/usr/local/lib/node_modules_global/lib/node_modules \
|
|
40
|
+
PATH=/usr/local/lib/node_modules_global/bin:/home/assistant/.local/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
|
|
41
|
+
PLAYWRIGHT_BROWSERS_PATH=/opt/pw-browsers \
|
|
42
|
+
JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 \
|
|
43
|
+
NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt \
|
|
44
|
+
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt \
|
|
45
|
+
SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt \
|
|
46
|
+
GLAB_NO_UPDATE_NOTIFIER=1
|
|
47
|
+
|
|
48
|
+
# Update and install system packages
|
|
49
|
+
RUN apt-get update && apt-get install -y \
|
|
50
|
+
# Build essentials
|
|
51
|
+
build-essential \
|
|
52
|
+
gcc \
|
|
53
|
+
g++ \
|
|
54
|
+
make \
|
|
55
|
+
binutils \
|
|
56
|
+
dpkg-dev \
|
|
57
|
+
# Python
|
|
58
|
+
python3 \
|
|
59
|
+
python3-pip \
|
|
60
|
+
python3-dev \
|
|
61
|
+
python3-venv \
|
|
62
|
+
# Node.js (will install specific version later)
|
|
63
|
+
curl \
|
|
64
|
+
wget \
|
|
65
|
+
ca-certificates \
|
|
66
|
+
gnupg \
|
|
67
|
+
# Git and version control
|
|
68
|
+
git \
|
|
69
|
+
# Compression tools
|
|
70
|
+
zip \
|
|
71
|
+
unzip \
|
|
72
|
+
bzip2 \
|
|
73
|
+
# Text editors
|
|
74
|
+
vim \
|
|
75
|
+
nano \
|
|
76
|
+
# Image processing dependencies
|
|
77
|
+
libmagickwand-dev \
|
|
78
|
+
imagemagick \
|
|
79
|
+
# Graphics libraries
|
|
80
|
+
libcairo2-dev \
|
|
81
|
+
libpango1.0-dev \
|
|
82
|
+
libjpeg-dev \
|
|
83
|
+
libgif-dev \
|
|
84
|
+
librsvg2-dev \
|
|
85
|
+
# OCR dependencies
|
|
86
|
+
tesseract-ocr \
|
|
87
|
+
tesseract-ocr-eng \
|
|
88
|
+
tesseract-ocr-rus \
|
|
89
|
+
# PDF dependencies
|
|
90
|
+
poppler-utils \
|
|
91
|
+
ghostscript \
|
|
92
|
+
qpdf \
|
|
93
|
+
# Document conversion
|
|
94
|
+
pandoc \
|
|
95
|
+
# Video/audio processing
|
|
96
|
+
ffmpeg \
|
|
97
|
+
# Java (for tabula-py and LibreOffice)
|
|
98
|
+
default-jre-headless \
|
|
99
|
+
openjdk-21-jre-headless \
|
|
100
|
+
# LibreOffice (for unoserver)
|
|
101
|
+
libreoffice-writer \
|
|
102
|
+
libreoffice-calc \
|
|
103
|
+
libreoffice-impress \
|
|
104
|
+
# Fonts
|
|
105
|
+
fontconfig \
|
|
106
|
+
fonts-liberation \
|
|
107
|
+
fonts-liberation2 \
|
|
108
|
+
fonts-dejavu \
|
|
109
|
+
fonts-dejavu-core \
|
|
110
|
+
fonts-dejavu-extra \
|
|
111
|
+
fonts-freefont-ttf \
|
|
112
|
+
fonts-noto-cjk \
|
|
113
|
+
fonts-noto-color-emoji \
|
|
114
|
+
# Graphics and rendering
|
|
115
|
+
graphviz \
|
|
116
|
+
# System utilities
|
|
117
|
+
bc \
|
|
118
|
+
file \
|
|
119
|
+
jq \
|
|
120
|
+
dbus \
|
|
121
|
+
# Networking
|
|
122
|
+
socat \
|
|
123
|
+
apt-transport-https \
|
|
124
|
+
libnss3-tools \
|
|
125
|
+
# Terminal sharing (tmux for persistent sessions, ttyd installed separately)
|
|
126
|
+
tmux \
|
|
127
|
+
sudo \
|
|
128
|
+
inotify-tools \
|
|
129
|
+
# Clean up
|
|
130
|
+
&& apt-get clean \
|
|
131
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
132
|
+
|
|
133
|
+
# Install Node.js 22.x via binary distribution (more reliable than nodesource)
|
|
134
|
+
RUN curl -fsSL https://nodejs.org/dist/v22.11.0/node-v22.11.0-linux-x64.tar.xz -o /tmp/node.tar.xz \
|
|
135
|
+
&& tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 \
|
|
136
|
+
&& rm /tmp/node.tar.xz
|
|
137
|
+
|
|
138
|
+
# Install Bun runtime (required for Claude Code)
|
|
139
|
+
RUN curl -fsSL https://bun.sh/install | bash && \
|
|
140
|
+
mv /root/.bun/bin/bun /usr/local/bin/ && \
|
|
141
|
+
rm -rf /root/.bun
|
|
142
|
+
|
|
143
|
+
# Verify versions
|
|
144
|
+
RUN python3 --version && \
|
|
145
|
+
node --version && \
|
|
146
|
+
npm --version
|
|
147
|
+
|
|
148
|
+
# Create python symlink to python3 for compatibility
|
|
149
|
+
# Many scripts and tools expect 'python' command to be available
|
|
150
|
+
RUN ln -s /usr/bin/python3 /usr/bin/python
|
|
151
|
+
|
|
152
|
+
# Create a non-root user with sudo access FIRST
|
|
153
|
+
RUN useradd -m -s /bin/bash assistant && \
|
|
154
|
+
echo "assistant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
|
155
|
+
|
|
156
|
+
# Configure npm global directory and sudo to preserve needed ENV variables
|
|
157
|
+
RUN mkdir -p /usr/local/lib/node_modules_global && \
|
|
158
|
+
chown -R assistant:assistant /usr/local/lib/node_modules_global && \
|
|
159
|
+
echo 'Defaults env_keep += "NODE_PATH PLAYWRIGHT_BROWSERS_PATH PATH JAVA_HOME NODE_EXTRA_CA_CERTS REQUESTS_CA_BUNDLE SSL_CERT_FILE PYTHONUNBUFFERED PIP_ROOT_USER_ACTION PIP_BREAK_SYSTEM_PACKAGES PYTHONDONTWRITEBYTECODE"' >> /etc/sudoers
|
|
160
|
+
|
|
161
|
+
# Copy and install Python dependencies (as root first for system-wide availability)
|
|
162
|
+
COPY requirements.txt /tmp/requirements.txt
|
|
163
|
+
RUN pip install --no-cache-dir --break-system-packages --ignore-installed \
|
|
164
|
+
-r /tmp/requirements.txt
|
|
165
|
+
|
|
166
|
+
# Pre-register Cyrillic and Emoji fonts in reportlab
|
|
167
|
+
# Append font registration to reportlab/__init__.py (runs after full initialization)
|
|
168
|
+
RUN REPORTLAB_INIT=$(python3 -c "import reportlab; print(reportlab.__file__)") && \
|
|
169
|
+
printf '\n# Auto-register Cyrillic and Emoji fonts\ntry:\n from reportlab.pdfbase import pdfmetrics\n from reportlab.pdfbase.ttfonts import TTFont\n from reportlab.pdfbase.pdfmetrics import registerFontFamily\n pdfmetrics.registerFont(TTFont("DejaVuSans", "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"))\n pdfmetrics.registerFont(TTFont("DejaVuSans-Bold", "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"))\n pdfmetrics.registerFont(TTFont("DejaVuSans-Oblique", "/usr/share/fonts/truetype/dejavu/DejaVuSans-Oblique.ttf"))\n pdfmetrics.registerFont(TTFont("DejaVuSans-BoldOblique", "/usr/share/fonts/truetype/dejavu/DejaVuSans-BoldOblique.ttf"))\n registerFontFamily("DejaVuSans", normal="DejaVuSans", bold="DejaVuSans-Bold", italic="DejaVuSans-Oblique", boldItalic="DejaVuSans-BoldOblique")\n pdfmetrics.registerFont(TTFont("NotoEmoji", "/usr/share/fonts/truetype/custom/NotoEmoji-Regular.ttf"))\nexcept Exception:\n pass\n' >> "$REPORTLAB_INIT"
|
|
170
|
+
|
|
171
|
+
# Install Node.js dependencies: global CLI tools + local packages in /home/node_modules
|
|
172
|
+
# Global install: CLI tools (npx mmdc, tsc, tsx) → /usr/local/lib/node_modules_global
|
|
173
|
+
# Local install: /home/node_modules (parent directory trick for ES modules + CommonJS)
|
|
174
|
+
# Volume mounts on /home/assistant → /home/node_modules stays in image layer, shared
|
|
175
|
+
# Node.js resolves: /home/assistant/node_modules (volume) → /home/node_modules (image)
|
|
176
|
+
COPY package.json /tmp/package.json
|
|
177
|
+
RUN chown assistant:assistant /tmp/package.json && \
|
|
178
|
+
cd /tmp && \
|
|
179
|
+
sudo -u assistant bash -c "npm config set prefix '/usr/local/lib/node_modules_global' && npm install -g \$(node -pe \"Object.entries(require('./package.json').dependencies).map(([pkg, ver]) => pkg + '@' + ver).join(' ')\")"
|
|
180
|
+
|
|
181
|
+
# Install packages in /home/node_modules for ES modules import support
|
|
182
|
+
# This is OUTSIDE /home/assistant (volume mount point), so it stays in image layer
|
|
183
|
+
COPY package.json /home/package.json
|
|
184
|
+
RUN mkdir -p /home/node_modules && \
|
|
185
|
+
chown assistant:assistant /home/package.json /home/node_modules && \
|
|
186
|
+
cd /home && \
|
|
187
|
+
sudo -u assistant bash -c "npm install --prefer-offline --no-package-lock" && \
|
|
188
|
+
rm -f /home/package.json
|
|
189
|
+
|
|
190
|
+
# Install Playwright browsers (only once, shared by both Python and Node.js)
|
|
191
|
+
RUN python3 -m playwright install --with-deps chromium && \
|
|
192
|
+
chmod -R 755 /opt/pw-browsers && \
|
|
193
|
+
chown -R assistant:assistant /opt/pw-browsers
|
|
194
|
+
|
|
195
|
+
# Copy and install custom fonts
|
|
196
|
+
COPY fonts/ /usr/share/fonts/truetype/custom/
|
|
197
|
+
RUN fc-cache -f -v
|
|
198
|
+
|
|
199
|
+
# Create directory structure with proper ownership
|
|
200
|
+
RUN mkdir -p /mnt/user-data/uploads \
|
|
201
|
+
/mnt/user-data/outputs \
|
|
202
|
+
/mnt/skills \
|
|
203
|
+
/mnt/transcripts && \
|
|
204
|
+
chown -R root:root /mnt/user-data/uploads /mnt/skills && \
|
|
205
|
+
chown -R assistant:assistant /mnt/user-data/outputs /mnt/transcripts && \
|
|
206
|
+
chmod 755 /mnt/user-data/uploads /mnt/skills && \
|
|
207
|
+
chmod 755 /mnt/user-data/outputs /mnt/transcripts
|
|
208
|
+
|
|
209
|
+
# Install html2pptx from local .tgz file (required for PPTX skill)
|
|
210
|
+
# Copy only the .tgz to avoid invalidating cache when other skills change
|
|
211
|
+
COPY --chown=assistant:assistant ./skills/public/pptx/html2pptx.tgz /tmp/html2pptx.tgz
|
|
212
|
+
RUN sudo -u assistant bash -c "cd /tmp && npm install -g /tmp/html2pptx.tgz" && \
|
|
213
|
+
rm -f /tmp/html2pptx.tgz && \
|
|
214
|
+
ln -s /usr/local/lib/node_modules_global/lib/node_modules/@ant /home/node_modules/@ant
|
|
215
|
+
|
|
216
|
+
# Install glab CLI for GitLab operations
|
|
217
|
+
RUN curl -fsSL https://gitlab.com/gitlab-org/cli/-/releases/v1.52.0/downloads/glab_1.52.0_linux_amd64.tar.gz \
|
|
218
|
+
| tar -xzf - -C /tmp && \
|
|
219
|
+
mv /tmp/bin/glab /usr/local/bin/glab && \
|
|
220
|
+
chmod +x /usr/local/bin/glab && \
|
|
221
|
+
rm -rf /tmp/bin /tmp/LICENSE && \
|
|
222
|
+
sudo -u assistant glab config set check_update false --global
|
|
223
|
+
|
|
224
|
+
# xdg-open wrapper: routes browser-open through playwright-cli (CDP 9222)
|
|
225
|
+
RUN printf '#!/bin/bash\nplaywright-cli open "$1" 2>/dev/null &\n' > /usr/local/bin/xdg-open && \
|
|
226
|
+
chmod +x /usr/local/bin/xdg-open
|
|
227
|
+
|
|
228
|
+
# Install Claude Code CLI from npm registry
|
|
229
|
+
RUN sudo -u assistant bash -c "npm install -g @anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}"
|
|
230
|
+
|
|
231
|
+
# Install Codex CLI from npm registry (Phase 6 — sub-agent runtime alternative).
|
|
232
|
+
# Ships native linux-x64 binary via optionalDependencies; no Bun wrapper needed
|
|
233
|
+
# (unlike claude-code, which repackaged in 2.1.113 — see CLAUDE_CODE_VERSION note).
|
|
234
|
+
# Uses an isolated --cache dir to prevent postinstall scripts from corrupting
|
|
235
|
+
# the shared ~/.npm/_cacache (which would break later installs like @playwright/cli
|
|
236
|
+
# with EEXIST+ENOENT collisions on content-v2/sha512/X/Y shards).
|
|
237
|
+
RUN sudo -u assistant bash -c "mkdir -p /tmp/npm-codex-cache && npm install -g --cache /tmp/npm-codex-cache @openai/codex@${CODEX_VERSION} && rm -rf /tmp/npm-codex-cache"
|
|
238
|
+
|
|
239
|
+
# Install OpenCode CLI from npm registry (sst fork — Phase 6 third runtime).
|
|
240
|
+
# Native binary downloaded at npm-postinstall time from GitHub Releases.
|
|
241
|
+
# Same isolated --cache dir pattern as codex above (and for the same reason).
|
|
242
|
+
RUN sudo -u assistant bash -c "mkdir -p /tmp/npm-opencode-cache && npm install -g --cache /tmp/npm-opencode-cache opencode-ai@${OPENCODE_VERSION} && rm -rf /tmp/npm-opencode-cache /home/assistant/.npm/_cacache"
|
|
243
|
+
|
|
244
|
+
# Install Playwright CLI for browser automation (used by main AI via bash, Claude Code via skills)
|
|
245
|
+
# Version pinned — patch below depends on internal structure
|
|
246
|
+
RUN sudo -u assistant bash -c "npm install -g @playwright/cli@0.1.1" && \
|
|
247
|
+
cd /home/assistant && sudo -u assistant npx @playwright/cli install --skills && \
|
|
248
|
+
# Patch: fixed CDP port 9223 instead of random (for browser viewer on 9222 via socat) \
|
|
249
|
+
FACTORY=$(find /usr/local/lib/node_modules_global/lib/node_modules/@playwright/cli -path "*/mcp/browser/browserContextFactory.js" | head -1) && \
|
|
250
|
+
sed -i 's/browserConfig\.launchOptions\.cdpPort = await findFreePort()/browserConfig.launchOptions.cdpPort = 9223/' "$FACTORY" && \
|
|
251
|
+
grep -q 'cdpPort = 9223' "$FACTORY" || (echo "PATCH FAILED: cdpPort not found in $FACTORY" && exit 1) && \
|
|
252
|
+
echo "Playwright CLI patched: fixed CDP port 9223"
|
|
253
|
+
|
|
254
|
+
# Create wrapper: env config + socat for external CDP access
|
|
255
|
+
# Chromium listens on 127.0.0.1:9223 (patched), socat exposes on 0.0.0.0:9222 for viewer
|
|
256
|
+
# "open <url>" is split into "open" + sleep + "goto <url>" so browser-viewer has time
|
|
257
|
+
# to connect CDP and enable Fetch.authRequired interception before navigation starts
|
|
258
|
+
RUN ORIG=$(which playwright-cli) && \
|
|
259
|
+
mv "$ORIG" "${ORIG}-orig" && \
|
|
260
|
+
printf '#!/bin/bash\nexport PLAYWRIGHT_CLI_CONFIG="${PLAYWRIGHT_CLI_CONFIG:-/home/assistant/playwright-cli.json}"\nif ! pgrep -f "socat.*TCP-LISTEN:9222" >/dev/null 2>&1; then\n socat TCP-LISTEN:9222,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:9223 &\nfi\nif [ "$1" = "open" ] && [ -n "$2" ] && [[ "$2" == http* ]]; then\n URL="$2"\n shift 2\n playwright-cli-orig open "$@"\n sleep 3\n exec playwright-cli-orig goto "$URL"\nfi\nexec playwright-cli-orig "$@"\n' > "$ORIG" && \
|
|
261
|
+
chmod +x "$ORIG"
|
|
262
|
+
|
|
263
|
+
# Install ttyd (WebSocket terminal server) — download binary for reliability
|
|
264
|
+
# Download binary directly from GitHub releases for reliability
|
|
265
|
+
RUN curl -fsSL https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.x86_64 -o /usr/local/bin/ttyd && \
|
|
266
|
+
chmod +x /usr/local/bin/ttyd
|
|
267
|
+
|
|
268
|
+
# CLAUDE.md is written by entrypoint (not here) because /home/assistant is a volume mount
|
|
269
|
+
|
|
270
|
+
# Enable MCP Tool Search — reduces tool context consumption by 85%
|
|
271
|
+
# Without this, 7+ MCP servers consume 50-70% of context on tool definitions
|
|
272
|
+
ENV ENABLE_TOOL_SEARCH=true \
|
|
273
|
+
COLORTERM=truecolor \
|
|
274
|
+
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=50
|
|
275
|
+
|
|
276
|
+
# Create wrapper to run Claude Code with Bun runtime (fixes "Bun is not defined" error)
|
|
277
|
+
RUN mv /usr/local/lib/node_modules_global/bin/claude /usr/local/lib/node_modules_global/bin/claude-node && \
|
|
278
|
+
printf '#!/bin/bash\nexec bun /usr/local/lib/node_modules_global/lib/node_modules/@anthropic-ai/claude-code/cli.js "$@"\n' > /usr/local/lib/node_modules_global/bin/claude && \
|
|
279
|
+
chmod +x /usr/local/lib/node_modules_global/bin/claude
|
|
280
|
+
|
|
281
|
+
# Create entrypoint script that configures git/glab and Claude Code
|
|
282
|
+
# This runs on container start and sets up dynamic configuration based on env vars
|
|
283
|
+
RUN printf '#!/bin/bash\n\
|
|
284
|
+
# Configure GitLab\n\
|
|
285
|
+
if [ -n "$GITLAB_TOKEN" ]; then\n\
|
|
286
|
+
GITLAB_HOST="${GITLAB_HOST:-gitlab.com}"\n\
|
|
287
|
+
git config --global url."https://oauth2:${GITLAB_TOKEN}@${GITLAB_HOST}/".insteadOf "https://${GITLAB_HOST}/"\n\
|
|
288
|
+
echo "Git configured for $GITLAB_HOST with token auth"\n\
|
|
289
|
+
else\n\
|
|
290
|
+
echo "No GITLAB_TOKEN - git/glab will work without auth (public repos only)"\n\
|
|
291
|
+
fi\n\
|
|
292
|
+
\n\
|
|
293
|
+
# Configure Claude Code\n\
|
|
294
|
+
if [ -n "$ANTHROPIC_AUTH_TOKEN" ]; then\n\
|
|
295
|
+
export ANTHROPIC_AUTH_TOKEN\n\
|
|
296
|
+
export ANTHROPIC_BASE_URL="${ANTHROPIC_BASE_URL:-https://api.anthropic.com}"\n\
|
|
297
|
+
if [ -n "$ANTHROPIC_CUSTOM_HEADERS" ]; then\n\
|
|
298
|
+
export ANTHROPIC_CUSTOM_HEADERS\n\
|
|
299
|
+
fi\n\
|
|
300
|
+
echo "Claude Code configured with base URL: $ANTHROPIC_BASE_URL"\n\
|
|
301
|
+
else\n\
|
|
302
|
+
echo "No ANTHROPIC_AUTH_TOKEN - Claude Code will not work"\n\
|
|
303
|
+
fi\n\
|
|
304
|
+
\n\
|
|
305
|
+
# Discoverability: how to escape sub-agent autostart\n\
|
|
306
|
+
echo "Tip: plain bash with NO_AUTOSTART=1 bash OR touch /tmp/.no_autostart"\n\
|
|
307
|
+
\n\
|
|
308
|
+
# Configure Playwright CLI for browser automation\n\
|
|
309
|
+
cat > /home/assistant/playwright-cli.json << PCLIEOF\n\
|
|
310
|
+
{\n\
|
|
311
|
+
"outputDir": "/mnt/user-data/outputs",\n\
|
|
312
|
+
"browser": {\n\
|
|
313
|
+
"launchOptions": {\n\
|
|
314
|
+
"args": [\n\
|
|
315
|
+
"--disable-blink-features=AutomationControlled",\n\
|
|
316
|
+
"--disable-infobars",\n\
|
|
317
|
+
"--no-first-run",\n\
|
|
318
|
+
"--disable-background-timer-throttling",\n\
|
|
319
|
+
"--disable-backgrounding-occluded-windows",\n\
|
|
320
|
+
"--disable-renderer-backgrounding",\n\
|
|
321
|
+
"--disable-dev-shm-usage",\n\
|
|
322
|
+
"--disable-default-apps",\n\
|
|
323
|
+
"--disable-sync",\n\
|
|
324
|
+
"--disable-breakpad",\n\
|
|
325
|
+
"--disable-hang-monitor",\n\
|
|
326
|
+
"--disable-prompt-on-repost",\n\
|
|
327
|
+
"--metrics-recording-only",\n\
|
|
328
|
+
"--no-default-browser-check",\n\
|
|
329
|
+
"--window-size=1920,1080"\n\
|
|
330
|
+
]\n\
|
|
331
|
+
},\n\
|
|
332
|
+
"contextOptions": {\n\
|
|
333
|
+
"navigationTimeout": 300000,\n\
|
|
334
|
+
"extraHTTPHeaders": {\n\
|
|
335
|
+
}\n\
|
|
336
|
+
}\n\
|
|
337
|
+
}\n\
|
|
338
|
+
}\n\
|
|
339
|
+
PCLIEOF\n\
|
|
340
|
+
\n\
|
|
341
|
+
mkdir -p /home/assistant/.claude\n\
|
|
342
|
+
# Write CLAUDE.md (environment info for Claude Code — same for interactive and MCP sub-agent)\n\
|
|
343
|
+
cat > /home/assistant/.claude/CLAUDE.md << CLAUDEMDEOF\n\
|
|
344
|
+
# Environment\n\
|
|
345
|
+
\n\
|
|
346
|
+
## File Locations\n\
|
|
347
|
+
- **Workspace**: /home/assistant (working directory)\n\
|
|
348
|
+
- **User uploads**: /mnt/user-data/uploads (read-only, files from user)\n\
|
|
349
|
+
- **Output files**: /mnt/user-data/outputs (save results here — auto-synced to preview)\n\
|
|
350
|
+
- **Skills**: /mnt/skills/ (read-only, run: cat /mnt/skills/<name>/SKILL.md)\n\
|
|
351
|
+
\n\
|
|
352
|
+
## Output Rules\n\
|
|
353
|
+
- Save ALL user-facing files to /mnt/user-data/outputs/\n\
|
|
354
|
+
- Files in outputs automatically appear in the preview UI under the Files tab\n\
|
|
355
|
+
- When telling the user where to find files, say: open the Files tab in the artifacts panel\n\
|
|
356
|
+
- Workspace /home/assistant is for intermediate files only, not synced\n\
|
|
357
|
+
\n\
|
|
358
|
+
## Plan Mode — MANDATORY\n\
|
|
359
|
+
CRITICAL: You MUST enter plan mode BEFORE writing ANY code or creating files.\n\
|
|
360
|
+
This applies to ALL tasks except single-line fixes (typos, variable renames).\n\
|
|
361
|
+
If you skip plan mode, the user will reject your work.\n\
|
|
362
|
+
If something goes sideways, STOP and re-plan immediately — do not keep pushing.\n\
|
|
363
|
+
Plan must include: what files to create, architecture decisions, verification steps.\n\
|
|
364
|
+
\n\
|
|
365
|
+
## Verification\n\
|
|
366
|
+
Before completing any task:\n\
|
|
367
|
+
1. Verify output files exist in /mnt/user-data/outputs/\n\
|
|
368
|
+
2. Run the code or check the result\n\
|
|
369
|
+
3. If tests exist, run them\n\
|
|
370
|
+
\n\
|
|
371
|
+
## Self-Improvement\n\
|
|
372
|
+
When you make a mistake, update this CLAUDE.md so you do not repeat it.\n\
|
|
373
|
+
\n\
|
|
374
|
+
## Useful Commands\n\
|
|
375
|
+
- ls /mnt/skills/ — list available skills\n\
|
|
376
|
+
- cat /mnt/skills/<name>/SKILL.md — skill instructions\n\
|
|
377
|
+
- ls /mnt/user-data/uploads/ — user-uploaded files\n\
|
|
378
|
+
- GSD (Get Shit Done): /gsd:help in Claude Code for spec-driven workflow commands\n\
|
|
379
|
+
- Superpowers skills: test-driven-development, brainstorming, systematic-debugging, etc.\n\
|
|
380
|
+
\n\
|
|
381
|
+
CLAUDEMDEOF\n\
|
|
382
|
+
cat > /home/assistant/.claude/settings.json << CCEOF\n\
|
|
383
|
+
{\n\
|
|
384
|
+
"permissions": {\n\
|
|
385
|
+
"allow": [\n\
|
|
386
|
+
"Bash(playwright-cli:*)",\n\
|
|
387
|
+
"Bash(*mnt/user-data/outputs*)",\n\
|
|
388
|
+
"Write(/mnt/user-data/outputs/**)",\n\
|
|
389
|
+
"Edit(/mnt/user-data/outputs/**)",\n\
|
|
390
|
+
"Read(/mnt/user-data/outputs/**)",\n\
|
|
391
|
+
"Read(/mnt/user-data/uploads/**)",\n\
|
|
392
|
+
"Read(/mnt/skills/**)",\n\
|
|
393
|
+
"Read(/home/assistant/.claude/**)",\n\
|
|
394
|
+
"Write(/home/assistant/.claude/CLAUDE.md)",\n\
|
|
395
|
+
"Write(/home/assistant/.claude/settings.json)",\n\
|
|
396
|
+
"Edit(/home/assistant/.claude/CLAUDE.md)",\n\
|
|
397
|
+
"Edit(/home/assistant/.claude/settings.json)",\n\
|
|
398
|
+
"Bash(gsd:*)",\n\
|
|
399
|
+
"Bash(ls*)",\n\
|
|
400
|
+
"Bash(cat*)",\n\
|
|
401
|
+
"Bash(mkdir*)",\n\
|
|
402
|
+
"Bash(cp*)",\n\
|
|
403
|
+
"Bash(mv*)"\n\
|
|
404
|
+
]\n\
|
|
405
|
+
},\n\
|
|
406
|
+
"hooks": {\n\
|
|
407
|
+
"SessionStart": [\n\
|
|
408
|
+
{"hooks": [{"type": "command", "command": "[ -f /home/assistant/.claude/hooks/gsd-check-update.js ] && node /home/assistant/.claude/hooks/gsd-check-update.js || true"}]},\n\
|
|
409
|
+
{"hooks": [{"type": "command", "command": "[ -f /home/assistant/.claude/hooks/gsd-session-state.sh ] && bash /home/assistant/.claude/hooks/gsd-session-state.sh || true"}]}\n\
|
|
410
|
+
],\n\
|
|
411
|
+
"PreToolUse": [\n\
|
|
412
|
+
{"matcher": "Write|Edit", "hooks": [{"type": "command", "command": "[ -f /home/assistant/.claude/hooks/gsd-prompt-guard.js ] && node /home/assistant/.claude/hooks/gsd-prompt-guard.js || true", "timeout": 5}]},\n\
|
|
413
|
+
{"matcher": "Read", "hooks": [{"type": "command", "command": "[ -f /home/assistant/.claude/hooks/gsd-read-guard.js ] && node /home/assistant/.claude/hooks/gsd-read-guard.js || true", "timeout": 5}]},\n\
|
|
414
|
+
{"matcher": "Bash", "hooks": [{"type": "command", "command": "[ -f /home/assistant/.claude/hooks/gsd-validate-commit.sh ] && bash /home/assistant/.claude/hooks/gsd-validate-commit.sh || true", "timeout": 5}]},\n\
|
|
415
|
+
{"matcher": "", "hooks": [{"type": "command", "command": "[ -f /home/assistant/.claude/hooks/gsd-workflow-guard.js ] && node /home/assistant/.claude/hooks/gsd-workflow-guard.js || true", "timeout": 5}]}\n\
|
|
416
|
+
],\n\
|
|
417
|
+
"PostToolUse": [\n\
|
|
418
|
+
{"matcher": "Bash|Edit|Write|MultiEdit|Agent|Task", "hooks": [{"type": "command", "command": "[ -f /home/assistant/.claude/hooks/gsd-context-monitor.js ] && node /home/assistant/.claude/hooks/gsd-context-monitor.js || true", "timeout": 10}]},\n\
|
|
419
|
+
{"matcher": "Write|Edit", "hooks": [{"type": "command", "command": "[ -f /home/assistant/.claude/hooks/gsd-phase-boundary.sh ] && bash /home/assistant/.claude/hooks/gsd-phase-boundary.sh || true", "timeout": 5}]}\n\
|
|
420
|
+
]\n\
|
|
421
|
+
}\n\
|
|
422
|
+
}\n\
|
|
423
|
+
CCEOF\n\
|
|
424
|
+
\n\
|
|
425
|
+
# Skip Claude Code onboarding (theme picker, trust dialog)\n\
|
|
426
|
+
# Write for both assistant (production) and root (test/fallback)\n\
|
|
427
|
+
CLAUDE_JSON='"'"'{"hasCompletedOnboarding":true,"lastOnboardingVersion":"99.0.0","projects":{"/home/assistant":{"hasTrustDialogAccepted":true},"/":{"hasTrustDialogAccepted":true}}}'"'"'\n\
|
|
428
|
+
echo "$CLAUDE_JSON" > /home/assistant/.claude.json\n\
|
|
429
|
+
echo "$CLAUDE_JSON" > /root/.claude.json 2>/dev/null\n\
|
|
430
|
+
\n\
|
|
431
|
+
# Symlink each skill individually so Claude Code /skills sees them (flat structure required)\n\
|
|
432
|
+
mkdir -p /home/assistant/.claude/skills\n\
|
|
433
|
+
mkdir -p /root/.claude/skills 2>/dev/null\n\
|
|
434
|
+
for skilldir in /mnt/skills/public/ /mnt/skills/private/ /mnt/skills/user/; do\n\
|
|
435
|
+
for skill in ${skilldir}*/; do\n\
|
|
436
|
+
[ -d "$skill" ] && ln -sf "$skill" /home/assistant/.claude/skills/$(basename "$skill") 2>/dev/null\n\
|
|
437
|
+
[ -d "$skill" ] && ln -sf "$skill" /root/.claude/skills/$(basename "$skill") 2>/dev/null\n\
|
|
438
|
+
done\n\
|
|
439
|
+
done\n\
|
|
440
|
+
\n\
|
|
441
|
+
# External skills (GSD + Superpowers) — SYMLINK into volume to keep /home/assistant small\n\
|
|
442
|
+
# (per-container volume — see commit 934197d "Move npm packages out of volume mount")\n\
|
|
443
|
+
# GSD get-shit-done/ is read-only: cache lives in ~/.cache/gsd/, state in project .planning/\n\
|
|
444
|
+
mkdir -p /home/assistant/.claude/agents /home/assistant/.claude/commands /home/assistant/.claude/hooks\n\
|
|
445
|
+
if [ -d /opt/skills-external/gsd ]; then\n\
|
|
446
|
+
ln -sfn /opt/skills-external/gsd/get-shit-done /home/assistant/.claude/get-shit-done\n\
|
|
447
|
+
for f in /opt/skills-external/gsd/agents/*.md; do\n\
|
|
448
|
+
[ -e "$f" ] && ln -sfn "$f" /home/assistant/.claude/agents/$(basename "$f")\n\
|
|
449
|
+
done\n\
|
|
450
|
+
ln -sfn /opt/skills-external/gsd/commands/gsd /home/assistant/.claude/commands/gsd\n\
|
|
451
|
+
for h in /opt/skills-external/gsd/hooks/*; do\n\
|
|
452
|
+
[ -e "$h" ] && ln -sfn "$h" /home/assistant/.claude/hooks/$(basename "$h")\n\
|
|
453
|
+
done\n\
|
|
454
|
+
fi\n\
|
|
455
|
+
if [ -d /opt/skills-external/superpowers ]; then\n\
|
|
456
|
+
for d in /opt/skills-external/superpowers/skills/*/; do\n\
|
|
457
|
+
name=$(basename "$d")\n\
|
|
458
|
+
[ -e "/home/assistant/.claude/skills/$name" ] || ln -sfn "$d" "/home/assistant/.claude/skills/$name"\n\
|
|
459
|
+
done\n\
|
|
460
|
+
for f in /opt/skills-external/superpowers/commands/*.md; do\n\
|
|
461
|
+
[ -e "$f" ] && [ ! -e "/home/assistant/.claude/commands/$(basename "$f")" ] && ln -sfn "$f" /home/assistant/.claude/commands/$(basename "$f")\n\
|
|
462
|
+
done\n\
|
|
463
|
+
for f in /opt/skills-external/superpowers/agents/*.md; do\n\
|
|
464
|
+
[ -e "$f" ] && [ ! -e "/home/assistant/.claude/agents/$(basename "$f")" ] && ln -sfn "$f" /home/assistant/.claude/agents/$(basename "$f")\n\
|
|
465
|
+
done\n\
|
|
466
|
+
fi\n\
|
|
467
|
+
chown -R --no-dereference $(id -u assistant 2>/dev/null || echo 1000):$(id -g assistant 2>/dev/null || echo 1000) /home/assistant/.claude 2>/dev/null || true\n\
|
|
468
|
+
\n\
|
|
469
|
+
# Copy CLAUDE.md and settings.json for root too\n\
|
|
470
|
+
cp /home/assistant/.claude/CLAUDE.md /root/.claude/CLAUDE.md 2>/dev/null\n\
|
|
471
|
+
cp /home/assistant/.claude/settings.json /root/.claude/settings.json 2>/dev/null\n\
|
|
472
|
+
\n\
|
|
473
|
+
# Phase 6 — render per-CLI config files once per container (marker-gated).\n\
|
|
474
|
+
# Marker is in /tmp (NOT volume) so an env-var change + restart re-renders\n\
|
|
475
|
+
# from scratch (AUTH-04). Distinct from openwebui/init.sh persistent marker.\n\
|
|
476
|
+
if [ ! -f /tmp/.cli-runtime-initialised ]; then\n\
|
|
477
|
+
case "${SUBAGENT_CLI:-claude}" in\n\
|
|
478
|
+
opencode)\n\
|
|
479
|
+
mkdir -p /tmp\n\
|
|
480
|
+
if [ -n "${OPENCODE_CONFIG_EXTRA:-}" ]; then\n\
|
|
481
|
+
printf "%s" "$OPENCODE_CONFIG_EXTRA" > /tmp/opencode.json\n\
|
|
482
|
+
echo "OpenCode config sourced from OPENCODE_CONFIG_EXTRA (operator override; canonical file skipped)"\n\
|
|
483
|
+
elif [ -f /opt/cli-defaults/opencode.json ]; then\n\
|
|
484
|
+
# D-09/D-10: strip _spdx/_copyright underscore-prefixed keys before passing to opencode CLI.\n\
|
|
485
|
+
python3 -c "import json,sys; d=json.load(open('"'"'/opt/cli-defaults/opencode.json'"'"')); [d.pop(k,None) for k in list(d) if k.startswith('"'"'_'"'"')]; json.dump(d,sys.stdout)" > /tmp/opencode.json\n\
|
|
486
|
+
echo "OpenCode config sourced from /opt/cli-defaults/opencode.json (canonical default)"\n\
|
|
487
|
+
else\n\
|
|
488
|
+
echo "FATAL: /opt/cli-defaults/opencode.json missing and OPENCODE_CONFIG_EXTRA unset" >&2\n\
|
|
489
|
+
exit 1\n\
|
|
490
|
+
fi\n\
|
|
491
|
+
export OPENCODE_CONFIG=/tmp/opencode.json\n\
|
|
492
|
+
;;\n\
|
|
493
|
+
codex)\n\
|
|
494
|
+
mkdir -p /home/assistant/.codex\n\
|
|
495
|
+
if [ -n "${OPENAI_BASE_URL:-}" ]; then\n\
|
|
496
|
+
cat > /home/assistant/.codex/config.toml <<CXEOF\n\
|
|
497
|
+
model_provider = "custom"\n\
|
|
498
|
+
\n\
|
|
499
|
+
[model_providers.custom]\n\
|
|
500
|
+
name = "custom-gateway"\n\
|
|
501
|
+
base_url = "${OPENAI_BASE_URL}"\n\
|
|
502
|
+
env_key = "OPENAI_API_KEY"\n\
|
|
503
|
+
wire_api = "responses"\n\
|
|
504
|
+
requires_openai_auth = true\n\
|
|
505
|
+
CXEOF\n\
|
|
506
|
+
echo "Codex config rendered with custom gateway: $OPENAI_BASE_URL"\n\
|
|
507
|
+
elif [ -f /opt/cli-defaults/codex.json ]; then\n\
|
|
508
|
+
# D-09: read canonical JSON, convert to TOML. Empty model_providers baseline = public OpenAI defaults.\n\
|
|
509
|
+
python3 -c "\n\
|
|
510
|
+
import json,sys\n\
|
|
511
|
+
def _to_toml_value(v):\n\
|
|
512
|
+
if v is None:\n\
|
|
513
|
+
raise ValueError('"'"'TOML does not support null values; provider config must omit empty fields'"'"')\n\
|
|
514
|
+
if isinstance(v,dict):\n\
|
|
515
|
+
inner='"'"', '"'"'.join(k+'"'"' = '"'"'+_to_toml_value(val) for k,val in v.items())\n\
|
|
516
|
+
return '"'"'{'"'"'+inner+'"'"'}'"'"'\n\
|
|
517
|
+
return json.dumps(v)\n\
|
|
518
|
+
d=json.load(open('"'"'/opt/cli-defaults/codex.json'"'"'))\n\
|
|
519
|
+
[d.pop(k,None) for k in list(d) if k.startswith('"'"'_'"'"')]\n\
|
|
520
|
+
providers=d.get('"'"'model_providers'"'"',{}) or {}\n\
|
|
521
|
+
default_model=d.get('"'"'default_model'"'"')\n\
|
|
522
|
+
lines=[]\n\
|
|
523
|
+
if default_model:\n\
|
|
524
|
+
lines.append('"'"'model = \"'"'"' + default_model + '"'"'\"'"'"')\n\
|
|
525
|
+
if providers:\n\
|
|
526
|
+
first=next(iter(providers))\n\
|
|
527
|
+
lines.append('"'"'model_provider = \"'"'"' + first + '"'"'\"'"'"')\n\
|
|
528
|
+
lines.append('"'"''"'"')\n\
|
|
529
|
+
for name,cfg in providers.items():\n\
|
|
530
|
+
lines.append('"'"'[model_providers.'"'"' + name + '"'"']'"'"')\n\
|
|
531
|
+
for ck,cv in cfg.items():\n\
|
|
532
|
+
lines.append(ck + '"'"' = '"'"' + _to_toml_value(cv))\n\
|
|
533
|
+
lines.append('"'"''"'"')\n\
|
|
534
|
+
print('"'"'\\n'"'"'.join(lines))\n\
|
|
535
|
+
" > /home/assistant/.codex/config.toml\n\
|
|
536
|
+
echo "Codex config sourced from /opt/cli-defaults/codex.json (canonical default; converted to TOML)"\n\
|
|
537
|
+
else\n\
|
|
538
|
+
: > /home/assistant/.codex/config.toml\n\
|
|
539
|
+
echo "Codex config empty — public OpenAI defaults (no canonical file found)"\n\
|
|
540
|
+
fi\n\
|
|
541
|
+
if [ -n "${CODEX_CONFIG_EXTRA:-}" ]; then\n\
|
|
542
|
+
printf "\\n# === CODEX_CONFIG_EXTRA (operator-supplied) ===\\n%s\\n" "$CODEX_CONFIG_EXTRA" >> /home/assistant/.codex/config.toml\n\
|
|
543
|
+
echo "Codex config extended via CODEX_CONFIG_EXTRA"\n\
|
|
544
|
+
fi\n\
|
|
545
|
+
chown -R assistant:assistant /home/assistant/.codex\n\
|
|
546
|
+
;;\n\
|
|
547
|
+
esac\n\
|
|
548
|
+
touch /tmp/.cli-runtime-initialised\n\
|
|
549
|
+
fi\n\
|
|
550
|
+
\n\
|
|
551
|
+
# Auto-start chosen sub-agent CLI on first interactive bash login (both users).\n\
|
|
552
|
+
# Honours SUBAGENT_CLI (default claude). Escape hatches: NO_AUTOSTART=1 env\n\
|
|
553
|
+
# OR `touch /tmp/.no_autostart` from a second terminal to opt subsequent sessions out.\n\
|
|
554
|
+
# Marker renamed from the old per-CLI name to SUBAGENT_AUTOSTARTED (independent\n\
|
|
555
|
+
# check; existing volumes with the old marker still autostart exactly once on next session).\n\
|
|
556
|
+
AUTOSTART_LINE='"'"'[ -z "$SUBAGENT_AUTOSTARTED" ] && [ -z "$NO_AUTOSTART" ] && [ ! -f /tmp/.no_autostart ] && [ -n "$PS1" ] && export SUBAGENT_AUTOSTARTED=1 && exec "${SUBAGENT_CLI:-claude}"'"'"'\n\
|
|
557
|
+
for rc in /home/assistant/.bashrc /root/.bashrc; do\n\
|
|
558
|
+
if [ ! -f "$rc" ] || ! grep -q SUBAGENT_AUTOSTARTED "$rc" 2>/dev/null; then\n\
|
|
559
|
+
echo "$AUTOSTART_LINE" >> "$rc"\n\
|
|
560
|
+
fi\n\
|
|
561
|
+
done\n\
|
|
562
|
+
\n\
|
|
563
|
+
# Mark volume as active (used by cleanup script to calculate TTL from last use, not creation)\n\
|
|
564
|
+
touch /home/assistant/.last_active\n\
|
|
565
|
+
\n\
|
|
566
|
+
# Skill usage tracking: inotify watcher logs SKILL.md reads to outputs bind mount\n\
|
|
567
|
+
if command -v inotifywait >/dev/null 2>&1 && [ -d /mnt/skills ]; then\n\
|
|
568
|
+
(\n\
|
|
569
|
+
inotifywait -q -e access -m -r /mnt/skills/ --format "%%w%%f" 2>/dev/null |\n\
|
|
570
|
+
while IFS= read -r filepath; do\n\
|
|
571
|
+
if [[ "$filepath" == */SKILL.md ]]; then\n\
|
|
572
|
+
skill=$(basename "$(dirname "$filepath")")\n\
|
|
573
|
+
ts=$(date -u +%%Y-%%m-%%dT%%H:%%M:%%SZ)\n\
|
|
574
|
+
if [ -w /mnt/user-data/outputs ]; then\n\
|
|
575
|
+
echo "{\"ts\":\"$ts\",\"skill\":\"$skill\",\"email\":\"${GIT_AUTHOR_EMAIL:-unknown}\",\"chat_id\":\"${CHAT_ID:-unknown}\"}" >> /mnt/user-data/outputs/.skill-usage.jsonl 2>/dev/null || true\n\
|
|
576
|
+
fi\n\
|
|
577
|
+
fi\n\
|
|
578
|
+
done\n\
|
|
579
|
+
) &\n\
|
|
580
|
+
fi\n\
|
|
581
|
+
\n\
|
|
582
|
+
exec "$@"\n' > /home/assistant/.entrypoint.sh && \
|
|
583
|
+
chmod +x /home/assistant/.entrypoint.sh && \
|
|
584
|
+
chown assistant:assistant /home/assistant/.entrypoint.sh
|
|
585
|
+
|
|
586
|
+
# Configure git defaults (user info)
|
|
587
|
+
RUN printf '[user]\n\
|
|
588
|
+
name = AI Assistant\n\
|
|
589
|
+
email = ai-assistant@open-computer-use.dev\n' > /home/assistant/.gitconfig && \
|
|
590
|
+
chown assistant:assistant /home/assistant/.gitconfig
|
|
591
|
+
|
|
592
|
+
# Clean up caches to minimize /home/assistant size (will be copied to volumes)
|
|
593
|
+
# Keep only essential config files, remove npm/pip caches
|
|
594
|
+
# Create empty package.json so npm install from /home/assistant doesn't traverse
|
|
595
|
+
# to /home/node_modules (parent dir) and corrupt system packages
|
|
596
|
+
RUN rm -rf /home/assistant/.npm /home/assistant/.cache && \
|
|
597
|
+
npm cache clean --force && \
|
|
598
|
+
printf '{"private":true}\n' > /home/assistant/package.json && \
|
|
599
|
+
chown assistant:assistant /home/assistant/package.json && \
|
|
600
|
+
sudo -u assistant npm config delete prefix
|
|
601
|
+
|
|
602
|
+
# Set working directory
|
|
603
|
+
WORKDIR /home/assistant
|
|
604
|
+
|
|
605
|
+
# extract-text CLI: unified plain-text extractor for docx/odt/epub/xlsx/pptx/rtf/html/htm/ipynb
|
|
606
|
+
# Anthropic-built Rust binary (x86_64 ELF, ~2MB). Used by the file-reading and pdf-reading skills.
|
|
607
|
+
# See vendor/extract-text/README.md for licensing and the followup to fetch it at build time.
|
|
608
|
+
COPY --chown=root:root vendor/extract-text/extract-text /usr/local/bin/extract-text
|
|
609
|
+
RUN chmod +x /usr/local/bin/extract-text
|
|
610
|
+
|
|
611
|
+
# Phase 2 D-09: canonical CLI default configs as single source of truth.
|
|
612
|
+
# The sandbox entrypoint reads these instead of inline heredocs.
|
|
613
|
+
COPY computer-use-server/cli-defaults/ /opt/cli-defaults/
|
|
614
|
+
RUN chmod -R a+r /opt/cli-defaults
|
|
615
|
+
|
|
616
|
+
# list-subagent-models — canonical Python tool for the sub-agent skill (REQ-MCP-04)
|
|
617
|
+
COPY --chown=root:root computer-use-server/bin/list-subagent-models /usr/local/bin/list-subagent-models
|
|
618
|
+
RUN chmod +x /usr/local/bin/list-subagent-models
|
|
619
|
+
|
|
620
|
+
# Copy skills into image (available in all containers)
|
|
621
|
+
# Placed late in Dockerfile so skill file changes don't invalidate heavy layers above
|
|
622
|
+
COPY --chown=root:root ./skills /mnt/skills/
|
|
623
|
+
|
|
624
|
+
# ── External skills for Claude Code only: GSD + Superpowers ──────────────────
|
|
625
|
+
# Cloned at build-time from GitHub; laid out under /opt/skills-external/, then
|
|
626
|
+
# symlinked into /home/assistant/.claude/ by entrypoint. NOT exposed to main AI
|
|
627
|
+
# (main AI reads /mnt/skills/, these live only in the Claude Code home volume).
|
|
628
|
+
#
|
|
629
|
+
# Refs are pinned to upstream tags. Tags are mutable (upstream can re-tag);
|
|
630
|
+
# `--branch` accepts only tag/branch names — not raw SHAs. For strict
|
|
631
|
+
# reproducibility, switch the clone strategy to `clone --no-checkout`
|
|
632
|
+
# followed by `git fetch <sha> && git checkout <sha>`. Tracked as a
|
|
633
|
+
# followup in CHANGELOG.md "Known followups". To bump the pinned tags,
|
|
634
|
+
# change the ARGs below and rebuild.
|
|
635
|
+
ARG GSD_REF=v1.9.9
|
|
636
|
+
ARG SUPERPOWERS_REF=v5.0.7
|
|
637
|
+
|
|
638
|
+
# GSD (Get Shit Done) — commands, agents, hooks, engine
|
|
639
|
+
# NOTE: upstream repo has no skills/ dir — gsd-* skills are generated by the
|
|
640
|
+
# official npx installer. Users invoke via /gsd:<cmd> slash-commands instead.
|
|
641
|
+
RUN git clone --depth 1 --branch "${GSD_REF}" https://github.com/gsd-build/get-shit-done.git /tmp/gsd && \
|
|
642
|
+
mkdir -p /opt/skills-external/gsd/get-shit-done \
|
|
643
|
+
/opt/skills-external/gsd/agents \
|
|
644
|
+
/opt/skills-external/gsd/commands \
|
|
645
|
+
/opt/skills-external/gsd/hooks && \
|
|
646
|
+
cp -r /tmp/gsd/get-shit-done/. /opt/skills-external/gsd/get-shit-done/ && \
|
|
647
|
+
cp /tmp/gsd/agents/gsd-*.md /opt/skills-external/gsd/agents/ && \
|
|
648
|
+
cp -r /tmp/gsd/commands/. /opt/skills-external/gsd/commands/ && \
|
|
649
|
+
cp -r /tmp/gsd/hooks/. /opt/skills-external/gsd/hooks/ && \
|
|
650
|
+
git clone --depth 1 --branch "${SUPERPOWERS_REF}" https://github.com/obra/superpowers.git /tmp/superpowers && \
|
|
651
|
+
mkdir -p /opt/skills-external/superpowers && \
|
|
652
|
+
cp -r /tmp/superpowers/skills /opt/skills-external/superpowers/ && \
|
|
653
|
+
cp -r /tmp/superpowers/commands /opt/skills-external/superpowers/ && \
|
|
654
|
+
cp -r /tmp/superpowers/agents /opt/skills-external/superpowers/ && \
|
|
655
|
+
if [ -d /tmp/superpowers/hooks ]; then cp -r /tmp/superpowers/hooks /opt/skills-external/superpowers/; fi && \
|
|
656
|
+
find /opt/skills-external -name .git -type d -exec rm -rf {} + && \
|
|
657
|
+
rm -rf /tmp/gsd /tmp/superpowers && \
|
|
658
|
+
ln -sf /opt/skills-external/gsd/get-shit-done/bin/gsd-tools.cjs /usr/local/bin/gsd && \
|
|
659
|
+
find /opt/skills-external/gsd/hooks -type f \( -name '*.sh' -o -name '*.js' \) -exec chmod +x {} +
|
|
660
|
+
|
|
661
|
+
# Verify installations
|
|
662
|
+
RUN python3 -c "import docx, pptx, openpyxl; print('Python packages OK')" && \
|
|
663
|
+
node -e "console.log('Node.js OK')" && \
|
|
664
|
+
npm list -g --depth=0 && \
|
|
665
|
+
sudo -u assistant bash -c "export PATH=/usr/local/lib/node_modules_global/bin:\$PATH && claude --version" && echo "Claude Code OK" && \
|
|
666
|
+
rm -rf /home/assistant/.bun
|
|
667
|
+
|
|
668
|
+
# Health check
|
|
669
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
|
670
|
+
CMD python3 -c "print('healthy')" || exit 1
|
|
671
|
+
|
|
672
|
+
# Entrypoint: creates .claude.json, CLAUDE.md, settings.json, skills symlinks, git config
|
|
673
|
+
ENTRYPOINT ["/home/assistant/.entrypoint.sh"]
|
|
674
|
+
|
|
675
|
+
# Default command (keepalive for container orchestration)
|
|
676
|
+
CMD ["bash", "-c", "trap 'exit 0' SIGTERM SIGINT; tail -f /dev/null & wait $!"]
|