@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.
Files changed (769) hide show
  1. package/.coderabbit.yaml +25 -0
  2. package/.dockerignore +95 -0
  3. package/.env.example +137 -0
  4. package/.githooks/pre-commit +68 -0
  5. package/.github/CODEOWNERS +125 -0
  6. package/.github/ISSUE_TEMPLATE/adr-proposal.md +41 -0
  7. package/.github/ISSUE_TEMPLATE/bug-report.md +49 -0
  8. package/.github/ISSUE_TEMPLATE/component-proposal.md +38 -0
  9. package/.github/ISSUE_TEMPLATE/config.yml +15 -0
  10. package/.github/ISSUE_TEMPLATE/dependency-proposal.md +59 -0
  11. package/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
  12. package/.github/ISSUE_TEMPLATE/nfr-proposal.md +44 -0
  13. package/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  14. package/.github/codeql/codeql-config.yml +11 -0
  15. package/.github/codeql/extensions/security-models/python-sanitizers.model.yml +17 -0
  16. package/.github/codeql/extensions/security-models/qlpack.yml +7 -0
  17. package/.github/dependabot.yml +23 -0
  18. package/.github/security-exceptions.yml +23 -0
  19. package/.github/workflows/build.yml +420 -0
  20. package/.github/workflows/codeql.yml +33 -0
  21. package/.github/workflows/contracts-lint.yml +90 -0
  22. package/.github/workflows/docs-lint.yml +151 -0
  23. package/.github/workflows/helm.yml +131 -0
  24. package/.github/workflows/identity-lint.yml +30 -0
  25. package/.github/workflows/release-chart.yml +177 -0
  26. package/.github/workflows/release.yml +95 -0
  27. package/.github/workflows/security.yml +332 -0
  28. package/.github/workflows/stale.yml +31 -0
  29. package/.github/workflows/supply-chain.yml +242 -0
  30. package/.gitleaks.toml +53 -0
  31. package/.markdownlint.yaml +51 -0
  32. package/.semgrepignore +85 -0
  33. package/.vale/styles/Architecture/ap13-data-class-substrate.yml +12 -0
  34. package/.vale/styles/Architecture/banned-phrases.yml +23 -0
  35. package/.vale/styles/Architecture/banned-vocab.yml +23 -0
  36. package/.vale/styles/Architecture/marketing-tone.yml +19 -0
  37. package/.vale.ini +18 -0
  38. package/CHANGELOG.md +411 -0
  39. package/CLAUDE.md +218 -0
  40. package/CONTRIBUTING.md +82 -0
  41. package/Dockerfile +676 -0
  42. package/LICENSE +98 -0
  43. package/LICENSE-APACHE +202 -0
  44. package/LICENSE-MIT +21 -0
  45. package/NOTICE +36 -0
  46. package/README.md +516 -0
  47. package/SECURITY.md +45 -0
  48. package/THIRD-PARTY-LICENSES.md +14 -0
  49. package/apt-packages.txt +108 -0
  50. package/computer-use-server/.dockerignore +13 -0
  51. package/computer-use-server/Dockerfile +44 -0
  52. package/computer-use-server/README.md +84 -0
  53. package/computer-use-server/app.py +1544 -0
  54. package/computer-use-server/bin/list-subagent-models +449 -0
  55. package/computer-use-server/cli-defaults/README.md +31 -0
  56. package/computer-use-server/cli-defaults/codex.json +7 -0
  57. package/computer-use-server/cli-defaults/opencode.json +18 -0
  58. package/computer-use-server/cli_adapters/__init__.py +46 -0
  59. package/computer-use-server/cli_adapters/claude.py +163 -0
  60. package/computer-use-server/cli_adapters/codex.py +163 -0
  61. package/computer-use-server/cli_adapters/opencode.py +169 -0
  62. package/computer-use-server/cli_adapters/result.py +34 -0
  63. package/computer-use-server/cli_runtime.py +316 -0
  64. package/computer-use-server/context_vars.py +24 -0
  65. package/computer-use-server/docker_manager.py +1100 -0
  66. package/computer-use-server/docs_html.py +12 -0
  67. package/computer-use-server/mcp_resources.py +170 -0
  68. package/computer-use-server/mcp_tools.py +1430 -0
  69. package/computer-use-server/requirements.txt +17 -0
  70. package/computer-use-server/security.py +50 -0
  71. package/computer-use-server/skill_manager.py +664 -0
  72. package/computer-use-server/static/browser-viewer.js +445 -0
  73. package/computer-use-server/static/chart.umd.js +14 -0
  74. package/computer-use-server/static/docs.html +203 -0
  75. package/computer-use-server/static/github-dark.min.css +10 -0
  76. package/computer-use-server/static/github.min.css +10 -0
  77. package/computer-use-server/static/highlight.min.js +1213 -0
  78. package/computer-use-server/static/highlightjs-line-numbers.min.js +1 -0
  79. package/computer-use-server/static/icons.js +74 -0
  80. package/computer-use-server/static/jszip.min.js +13 -0
  81. package/computer-use-server/static/katex/auto-render.min.js +1 -0
  82. package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.ttf +0 -0
  83. package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
  84. package/computer-use-server/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  85. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  86. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  87. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  88. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  89. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  90. package/computer-use-server/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  91. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  92. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  93. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  94. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  95. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  96. package/computer-use-server/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  97. package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.ttf +0 -0
  98. package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff +0 -0
  99. package/computer-use-server/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  100. package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  101. package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  102. package/computer-use-server/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  103. package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.ttf +0 -0
  104. package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff +0 -0
  105. package/computer-use-server/static/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  106. package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.ttf +0 -0
  107. package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff +0 -0
  108. package/computer-use-server/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  109. package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  110. package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  111. package/computer-use-server/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  112. package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.ttf +0 -0
  113. package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff +0 -0
  114. package/computer-use-server/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  115. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  116. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  117. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  118. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  119. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  120. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  121. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  122. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  123. package/computer-use-server/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  124. package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.ttf +0 -0
  125. package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff +0 -0
  126. package/computer-use-server/static/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  127. package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.ttf +0 -0
  128. package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
  129. package/computer-use-server/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  130. package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.ttf +0 -0
  131. package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
  132. package/computer-use-server/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  133. package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.ttf +0 -0
  134. package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
  135. package/computer-use-server/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  136. package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.ttf +0 -0
  137. package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
  138. package/computer-use-server/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  139. package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  140. package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  141. package/computer-use-server/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  142. package/computer-use-server/static/katex/katex.min.css +1 -0
  143. package/computer-use-server/static/katex/katex.min.js +1 -0
  144. package/computer-use-server/static/locale.js +242 -0
  145. package/computer-use-server/static/mammoth.browser.min.js +21 -0
  146. package/computer-use-server/static/marked.min.js +6 -0
  147. package/computer-use-server/static/mermaid.min.js +2811 -0
  148. package/computer-use-server/static/pdf.min.js +22 -0
  149. package/computer-use-server/static/pdf.worker.min.js +22 -0
  150. package/computer-use-server/static/pptxviewjs.min.js +1 -0
  151. package/computer-use-server/static/preact-htm.min.js +1 -0
  152. package/computer-use-server/static/preview.css +1030 -0
  153. package/computer-use-server/static/preview.js +1522 -0
  154. package/computer-use-server/static/xlsx.full.min.js +22 -0
  155. package/computer-use-server/static/xterm-addon-fit.min.js +2 -0
  156. package/computer-use-server/static/xterm-addon-web-links.min.js +2 -0
  157. package/computer-use-server/static/xterm.css +218 -0
  158. package/computer-use-server/static/xterm.min.js +2 -0
  159. package/computer-use-server/system_prompt.py +761 -0
  160. package/computer-use-server/uploads.py +82 -0
  161. package/contracts/README.md +53 -0
  162. package/contracts/audit/audit-fanin.asyncapi.yaml +407 -0
  163. package/contracts/exec/exec-channel.schema.json +240 -0
  164. package/contracts/mcp/2025-06-18/ocu-constraints.schema.json +178 -0
  165. package/contracts/storage/file-artifact-api.schema.json +390 -0
  166. package/contracts/storage/file-ops.schema.json +217 -0
  167. package/contracts/storage/mount-config.schema.json +197 -0
  168. package/cron/Dockerfile +15 -0
  169. package/cron/cleanup-quick.sh +21 -0
  170. package/cron/cleanup.sh +127 -0
  171. package/data/outputs/.gitkeep +0 -0
  172. package/data/uploads/.gitkeep +0 -0
  173. package/docker-compose.test.yml +54 -0
  174. package/docker-compose.webui.yml +77 -0
  175. package/docker-compose.yml +96 -0
  176. package/docs/CLOUD.md +29 -0
  177. package/docs/COMPARISON.md +128 -0
  178. package/docs/DOCKER.md +469 -0
  179. package/docs/DYNAMIC-SKILLS.md +77 -0
  180. package/docs/FEATURES.md +100 -0
  181. package/docs/INSTALL.md +111 -0
  182. package/docs/KNOWN-BUGS.md +86 -0
  183. package/docs/MCP.md +320 -0
  184. package/docs/SCREENSHOTS.md +39 -0
  185. package/docs/SKILLS-USER-GUIDE.md +86 -0
  186. package/docs/SKILLS.md +483 -0
  187. package/docs/TERMINAL-TAB.md +56 -0
  188. package/docs/architecture/02-trust-boundaries.md +224 -0
  189. package/docs/architecture/03-c4-context.md +61 -0
  190. package/docs/architecture/04-bounded-contexts.md +119 -0
  191. package/docs/architecture/05-c4-container.md +88 -0
  192. package/docs/architecture/06-threat-model.md +172 -0
  193. package/docs/architecture/08-contracts.md +105 -0
  194. package/docs/architecture/MANIFESTO.md +38 -0
  195. package/docs/architecture/PROCESS.md +64 -0
  196. package/docs/architecture/README.md +37 -0
  197. package/docs/architecture/adr/0000-template.md +65 -0
  198. package/docs/architecture/adr/0001-layer-0-gate-legacy-exclusion.md +75 -0
  199. package/docs/architecture/adr/0002-session-view-descriptor.md +57 -0
  200. package/docs/architecture/adr/0003-sandbox-runtime-tier-ladder.md +63 -0
  201. package/docs/architecture/adr/0004-operator-authentication-substrate.md +63 -0
  202. package/docs/architecture/adr/0005-egress-credential-delivery-envoy-sds.md +62 -0
  203. package/docs/architecture/adr/0006-egress-forward-proxy-substrate.md +65 -0
  204. package/docs/architecture/adr/0007-egress-auth-mechanism.md +72 -0
  205. package/docs/architecture/adr/0008-session-egress-attribution.md +59 -0
  206. package/docs/architecture/adr/0009-audit-pipeline-pluggable-by-contract.md +76 -0
  207. package/docs/architecture/adr/0010-storage-backend-pluggable-adapter.md +60 -0
  208. package/docs/architecture/adr/0011-storage-egress-lane.md +67 -0
  209. package/docs/architecture/adr/0012-implementation-language.md +67 -0
  210. package/docs/architecture/adr/0020-sandbox-image-provisioning.md +82 -0
  211. package/docs/architecture/adr/README.md +53 -0
  212. package/docs/architecture/compliance/.gitkeep +0 -0
  213. package/docs/architecture/components/00-overview.md +42 -0
  214. package/docs/architecture/components/0000-template.md +50 -0
  215. package/docs/architecture/components/01-mcp-gateway.md +80 -0
  216. package/docs/architecture/components/02-control-operator-api.md +80 -0
  217. package/docs/architecture/components/04-storage-broker.md +104 -0
  218. package/docs/architecture/components/05-session-sandbox.md +93 -0
  219. package/docs/architecture/components/06-egress-trust-edge.md +95 -0
  220. package/docs/architecture/components/07-audit-pipeline.md +110 -0
  221. package/docs/architecture/diagrams/.gitkeep +0 -0
  222. package/docs/architecture/diagrams/02-trust-boundaries.mmd +111 -0
  223. package/docs/architecture/diagrams/06-threat-model.mmd +41 -0
  224. package/docs/architecture/diagrams/08-contracts.mmd +47 -0
  225. package/docs/architecture/diagrams/c4-container.mmd +59 -0
  226. package/docs/architecture/diagrams/c4-context.mmd +46 -0
  227. package/docs/architecture/glossary.md +172 -0
  228. package/docs/architecture/manifesto/.gitkeep +0 -0
  229. package/docs/architecture/manifesto/01-audience-and-buyer.md +57 -0
  230. package/docs/architecture/manifesto/02-nfrs.md +325 -0
  231. package/docs/architecture/manifesto/03-non-negotiables.md +35 -0
  232. package/docs/architecture/manifesto/04-non-goals.md +23 -0
  233. package/docs/architecture/manifesto/05-licensing-posture.md +61 -0
  234. package/docs/architecture/manifesto/06-starter-mode-policy.md +49 -0
  235. package/docs/architecture/manifesto/07-governance.md +60 -0
  236. package/docs/architecture/primitives-backlog.md +51 -0
  237. package/docs/architecture.svg +117 -0
  238. package/docs/claude-code-gateway.md +173 -0
  239. package/docs/cli-config-templates.md +240 -0
  240. package/docs/data-flow.svg +72 -0
  241. package/docs/demo-landing-page.gif +0 -0
  242. package/docs/demo-qwen-trending.gif +0 -0
  243. package/docs/dynamic-skills.svg +77 -0
  244. package/docs/file-flow.svg +126 -0
  245. package/docs/future-architecture/README.md +152 -0
  246. package/docs/future-architecture/adr/0001-control-plane-language-go.md +80 -0
  247. package/docs/future-architecture/adr/0002-guest-agent-language-go.md +84 -0
  248. package/docs/future-architecture/adr/0003-docker-poc-first-then-k8s.md +37 -0
  249. package/docs/future-architecture/adr/0004-pluggable-runtime-via-runtimeclass.md +34 -0
  250. package/docs/future-architecture/adr/0005-mcp-as-control-plane-gateway.md +34 -0
  251. package/docs/future-architecture/adr/0006-no-agpl-no-bsl-dependencies.md +41 -0
  252. package/docs/future-architecture/adr/0007-superseded-by-future-architecture.md +37 -0
  253. package/docs/future-architecture/adr/0008-internal-grpc-external-rest-mcp.md +106 -0
  254. package/docs/future-architecture/adr/0009-external-protocol-dialects.md +94 -0
  255. package/docs/future-architecture/adr/0010-lambda-as-inspiration-not-runtime.md +86 -0
  256. package/docs/future-architecture/adr/0011-kata-as-first-class-dind-runtime.md +84 -0
  257. package/docs/future-architecture/antipatterns.md +552 -0
  258. package/docs/future-architecture/architecture/01-layers.md +109 -0
  259. package/docs/future-architecture/architecture/02-layer4-control-plane.md +122 -0
  260. package/docs/future-architecture/architecture/03-layer3-providers.md +174 -0
  261. package/docs/future-architecture/architecture/04-layer2-runtimes.md +114 -0
  262. package/docs/future-architecture/architecture/04b-credential-broker.md +153 -0
  263. package/docs/future-architecture/architecture/05-layer1-guest-agent.md +138 -0
  264. package/docs/future-architecture/architecture/06-storage.md +134 -0
  265. package/docs/future-architecture/architecture/07-security.md +194 -0
  266. package/docs/future-architecture/architecture/08-networking.md +149 -0
  267. package/docs/future-architecture/architecture/09-templates.md +122 -0
  268. package/docs/future-architecture/architecture/10-observability.md +121 -0
  269. package/docs/future-architecture/design-notes.md +72 -0
  270. package/docs/future-architecture/gaps.md +281 -0
  271. package/docs/future-architecture/phase-template.md +123 -0
  272. package/docs/future-architecture/references.md +225 -0
  273. package/docs/future-architecture/research/01-kata-containers.md +100 -0
  274. package/docs/future-architecture/research/02-e2b-infra.md +133 -0
  275. package/docs/future-architecture/research/03-coder.md +115 -0
  276. package/docs/future-architecture/research/04-cloud-hypervisor.md +99 -0
  277. package/docs/future-architecture/research/05-firecracker.md +114 -0
  278. package/docs/future-architecture/research/06-agent-sandbox.md +142 -0
  279. package/docs/future-architecture/research/07-chromedp.md +78 -0
  280. package/docs/future-architecture/research/08-microsandbox.md +78 -0
  281. package/docs/future-architecture/research/09-agentbox.md +135 -0
  282. package/docs/future-architecture/research/10-sysbox.md +100 -0
  283. package/docs/future-architecture/research/11-firecracker-containerd.md +93 -0
  284. package/docs/future-architecture/research/12-docker-socket-proxy.md +59 -0
  285. package/docs/future-architecture/research/14-e2b-desktop-and-surf.md +107 -0
  286. package/docs/future-architecture/research/18-open-webui-terminals-observed.md +135 -0
  287. package/docs/future-architecture/research/bank-buyer.md +96 -0
  288. package/docs/future-architecture/research/enthusiast-audience.md +106 -0
  289. package/docs/future-architecture/research/proof-uipath-anthropic-2026-05.md +76 -0
  290. package/docs/future-architecture/research/widemoat-thesis-advisor.md +124 -0
  291. package/docs/future-architecture/roadmap.md +438 -0
  292. package/docs/kata-runtime.md +267 -0
  293. package/docs/kubernetes.md +86 -0
  294. package/docs/logo.png +0 -0
  295. package/docs/multi-cli.md +161 -0
  296. package/docs/openwebui-filter.md +134 -0
  297. package/docs/roadmap/implementation-roadmap.md +104 -0
  298. package/docs/sandbox-contents.svg +229 -0
  299. package/docs/screenshots/01-create-document.png +0 -0
  300. package/docs/screenshots/02-file-preview.png +0 -0
  301. package/docs/screenshots/03-browser-viewer.png +0 -0
  302. package/docs/screenshots/04-sub-agent-terminal.png +0 -0
  303. package/docs/screenshots/05-chat-overview.png +0 -0
  304. package/docs/screenshots/06-sub-agent-dashboard.png +0 -0
  305. package/docs/screenshots/07-frontend-design-skill.png +0 -0
  306. package/docs/screenshots/08-pptx-skill.png +0 -0
  307. package/docs/screenshots/09-skill-creator.png +0 -0
  308. package/docs/screenshots/10-data-chart.png +0 -0
  309. package/docs/shared-browser.svg +102 -0
  310. package/docs/system-prompt.md +113 -0
  311. package/docs/terminal-flow.svg +69 -0
  312. package/examples/helm/README.md +20 -0
  313. package/examples/helm/standalone/values.yaml +49 -0
  314. package/examples/helm/with-open-webui/README.md +99 -0
  315. package/examples/helm/with-open-webui/values-computer-use.yaml +32 -0
  316. package/examples/helm/with-open-webui/values-open-webui.yaml +67 -0
  317. package/fonts/NotoEmoji-Regular.ttf +0 -0
  318. package/helm/computer-use-server/.helmignore +17 -0
  319. package/helm/computer-use-server/Chart.yaml +32 -0
  320. package/helm/computer-use-server/README.md +211 -0
  321. package/helm/computer-use-server/templates/NOTES.txt +66 -0
  322. package/helm/computer-use-server/templates/_helpers.tpl +115 -0
  323. package/helm/computer-use-server/templates/configmap-dind-init.yaml +82 -0
  324. package/helm/computer-use-server/templates/configmap.yaml +18 -0
  325. package/helm/computer-use-server/templates/deployment.yaml +248 -0
  326. package/helm/computer-use-server/templates/ingress.yaml +38 -0
  327. package/helm/computer-use-server/templates/networkpolicy.yaml +50 -0
  328. package/helm/computer-use-server/templates/pdb.yaml +16 -0
  329. package/helm/computer-use-server/templates/pvc-data.yaml +20 -0
  330. package/helm/computer-use-server/templates/pvc-skills-cache.yaml +20 -0
  331. package/helm/computer-use-server/templates/pvc-user-data.yaml +20 -0
  332. package/helm/computer-use-server/templates/pvc-var-lib-docker.yaml +27 -0
  333. package/helm/computer-use-server/templates/secret.yaml +23 -0
  334. package/helm/computer-use-server/templates/service.yaml +22 -0
  335. package/helm/computer-use-server/templates/serviceaccount.yaml +15 -0
  336. package/helm/computer-use-server/templates/tests/test-health.yaml +23 -0
  337. package/helm/computer-use-server/values.schema.json +183 -0
  338. package/helm/computer-use-server/values.yaml +297 -0
  339. package/lychee.toml +36 -0
  340. package/openwebui/Dockerfile +52 -0
  341. package/openwebui/README.md +38 -0
  342. package/openwebui/functions/README.md +48 -0
  343. package/openwebui/functions/computer_link_filter.py +487 -0
  344. package/openwebui/init.sh +305 -0
  345. package/openwebui/patches/README.md +44 -0
  346. package/openwebui/patches/fix_artifacts_auto_show.py +441 -0
  347. package/openwebui/patches/fix_attached_files_position.py +87 -0
  348. package/openwebui/patches/fix_large_tool_args.py +156 -0
  349. package/openwebui/patches/fix_large_tool_results.py +289 -0
  350. package/openwebui/patches/fix_preview_url_detection.py +230 -0
  351. package/openwebui/patches/fix_skip_embedding_chat_files.py +229 -0
  352. package/openwebui/patches/fix_skip_rag_files_native_fc.py +100 -0
  353. package/openwebui/patches/fix_tool_loop_errors.py +510 -0
  354. package/package.json +39 -0
  355. package/requirements.txt +112 -0
  356. package/scripts/check-config.sh +141 -0
  357. package/scripts/docs-lint/ai-slop-detector.sh +202 -0
  358. package/scripts/docs-lint/architecture-tree-whitelist.sh +131 -0
  359. package/scripts/docs-lint/ascii-diagram-detector.sh +58 -0
  360. package/scripts/docs-lint/front-matter-validator.sh +97 -0
  361. package/scripts/docs-lint/gitignored-ref-detector.sh +122 -0
  362. package/scripts/docs-lint/identity-email-detector.sh +48 -0
  363. package/scripts/docs-lint/test-linters.sh +354 -0
  364. package/scripts/docs-lint/wc-budget.sh +61 -0
  365. package/scripts/githooks/pre-push +75 -0
  366. package/server.json +13 -0
  367. package/settings-wrapper/Dockerfile +9 -0
  368. package/settings-wrapper/README.md +119 -0
  369. package/settings-wrapper/app.py +113 -0
  370. package/settings-wrapper/requirements.txt +2 -0
  371. package/settings-wrapper/skills.json +25 -0
  372. package/skills/README.md +46 -0
  373. package/skills/examples/algorithmic-art/SKILL.md +405 -0
  374. package/skills/examples/algorithmic-art/templates/generator_template.js +223 -0
  375. package/skills/examples/algorithmic-art/templates/viewer.html +601 -0
  376. package/skills/examples/artifacts-builder/SKILL.md +74 -0
  377. package/skills/examples/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  378. package/skills/examples/artifacts-builder/scripts/init-artifact.sh +322 -0
  379. package/skills/examples/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  380. package/skills/examples/canvas-design/LICENSE.txt +202 -0
  381. package/skills/examples/canvas-design/SKILL.md +130 -0
  382. package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  383. package/skills/examples/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  384. package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  385. package/skills/examples/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  386. package/skills/examples/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  387. package/skills/examples/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  388. package/skills/examples/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  389. package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  390. package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  391. package/skills/examples/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  392. package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  393. package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  394. package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  395. package/skills/examples/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  396. package/skills/examples/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  397. package/skills/examples/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  398. package/skills/examples/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  399. package/skills/examples/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  400. package/skills/examples/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  401. package/skills/examples/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  402. package/skills/examples/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  403. package/skills/examples/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  404. package/skills/examples/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  405. package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  406. package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  407. package/skills/examples/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  408. package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  409. package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  410. package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  411. package/skills/examples/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  412. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  413. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  414. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  415. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  416. package/skills/examples/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  417. package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  418. package/skills/examples/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  419. package/skills/examples/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  420. package/skills/examples/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  421. package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  422. package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  423. package/skills/examples/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  424. package/skills/examples/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  425. package/skills/examples/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  426. package/skills/examples/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  427. package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  428. package/skills/examples/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  429. package/skills/examples/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  430. package/skills/examples/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  431. package/skills/examples/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  432. package/skills/examples/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  433. package/skills/examples/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  434. package/skills/examples/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  435. package/skills/examples/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  436. package/skills/examples/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  437. package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  438. package/skills/examples/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  439. package/skills/examples/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  440. package/skills/examples/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  441. package/skills/examples/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  442. package/skills/examples/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  443. package/skills/examples/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  444. package/skills/examples/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  445. package/skills/examples/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  446. package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  447. package/skills/examples/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  448. package/skills/examples/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  449. package/skills/examples/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  450. package/skills/examples/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  451. package/skills/examples/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  452. package/skills/examples/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  453. package/skills/examples/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  454. package/skills/examples/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  455. package/skills/examples/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  456. package/skills/examples/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  457. package/skills/examples/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  458. package/skills/examples/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  459. package/skills/examples/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  460. package/skills/examples/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  461. package/skills/examples/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  462. package/skills/examples/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  463. package/skills/examples/copy-editing/SKILL.md +447 -0
  464. package/skills/examples/copy-editing/evals/evals.json +89 -0
  465. package/skills/examples/copy-editing/references/plain-english-alternatives.md +394 -0
  466. package/skills/examples/internal-comms/LICENSE.txt +202 -0
  467. package/skills/examples/internal-comms/SKILL.md +32 -0
  468. package/skills/examples/internal-comms/examples/3p-updates.md +47 -0
  469. package/skills/examples/internal-comms/examples/company-newsletter.md +65 -0
  470. package/skills/examples/internal-comms/examples/faq-answers.md +30 -0
  471. package/skills/examples/internal-comms/examples/general-comms.md +16 -0
  472. package/skills/examples/mcp-builder/SKILL.md +328 -0
  473. package/skills/examples/mcp-builder/reference/evaluation.md +602 -0
  474. package/skills/examples/mcp-builder/reference/mcp_best_practices.md +915 -0
  475. package/skills/examples/mcp-builder/reference/node_mcp_server.md +916 -0
  476. package/skills/examples/mcp-builder/reference/python_mcp_server.md +752 -0
  477. package/skills/examples/mcp-builder/scripts/connections.py +151 -0
  478. package/skills/examples/mcp-builder/scripts/evaluation.py +373 -0
  479. package/skills/examples/mcp-builder/scripts/example_evaluation.xml +22 -0
  480. package/skills/examples/mcp-builder/scripts/requirements.txt +2 -0
  481. package/skills/examples/product-marketing-context/SKILL.md +241 -0
  482. package/skills/examples/product-marketing-context/evals/evals.json +85 -0
  483. package/skills/examples/single-cell-rna-qc/SKILL.md +175 -0
  484. package/skills/examples/single-cell-rna-qc/references/scverse_qc_guidelines.md +186 -0
  485. package/skills/examples/single-cell-rna-qc/scripts/qc_analysis.py +232 -0
  486. package/skills/examples/single-cell-rna-qc/scripts/qc_core.py +233 -0
  487. package/skills/examples/single-cell-rna-qc/scripts/qc_plotting.py +235 -0
  488. package/skills/examples/skill-creator/SKILL.md +355 -0
  489. package/skills/examples/skill-creator/references/output-patterns.md +82 -0
  490. package/skills/examples/skill-creator/references/workflows.md +28 -0
  491. package/skills/examples/skill-creator/scripts/init_skill.py +303 -0
  492. package/skills/examples/skill-creator/scripts/package_skill.py +110 -0
  493. package/skills/examples/skill-creator/scripts/quick_validate.py +95 -0
  494. package/skills/examples/slack-gif-creator/SKILL.md +254 -0
  495. package/skills/examples/slack-gif-creator/core/easing.py +234 -0
  496. package/skills/examples/slack-gif-creator/core/frame_composer.py +176 -0
  497. package/skills/examples/slack-gif-creator/core/gif_builder.py +269 -0
  498. package/skills/examples/slack-gif-creator/core/validators.py +136 -0
  499. package/skills/examples/slack-gif-creator/requirements.txt +4 -0
  500. package/skills/examples/social-content/SKILL.md +278 -0
  501. package/skills/examples/social-content/evals/evals.json +92 -0
  502. package/skills/examples/social-content/references/platforms.md +170 -0
  503. package/skills/examples/social-content/references/post-templates.md +177 -0
  504. package/skills/examples/social-content/references/reverse-engineering.md +195 -0
  505. package/skills/examples/theme-factory/SKILL.md +59 -0
  506. package/skills/examples/theme-factory/theme-showcase.pdf +0 -0
  507. package/skills/examples/theme-factory/themes/arctic-frost.md +19 -0
  508. package/skills/examples/theme-factory/themes/botanical-garden.md +19 -0
  509. package/skills/examples/theme-factory/themes/desert-rose.md +19 -0
  510. package/skills/examples/theme-factory/themes/forest-canopy.md +19 -0
  511. package/skills/examples/theme-factory/themes/golden-hour.md +19 -0
  512. package/skills/examples/theme-factory/themes/midnight-galaxy.md +19 -0
  513. package/skills/examples/theme-factory/themes/modern-minimalist.md +19 -0
  514. package/skills/examples/theme-factory/themes/ocean-depths.md +19 -0
  515. package/skills/examples/theme-factory/themes/sunset-boulevard.md +19 -0
  516. package/skills/examples/theme-factory/themes/tech-innovation.md +19 -0
  517. package/skills/examples/web-artifacts-builder/LICENSE.txt +202 -0
  518. package/skills/examples/web-artifacts-builder/SKILL.md +74 -0
  519. package/skills/examples/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  520. package/skills/examples/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  521. package/skills/examples/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  522. package/skills/examples/writing-skills/SKILL.md +655 -0
  523. package/skills/examples/writing-skills/anthropic-best-practices.md +1150 -0
  524. package/skills/examples/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  525. package/skills/examples/writing-skills/graphviz-conventions.dot +172 -0
  526. package/skills/examples/writing-skills/persuasion-principles.md +187 -0
  527. package/skills/examples/writing-skills/render-graphs.js +168 -0
  528. package/skills/examples/writing-skills/testing-skills-with-subagents.md +384 -0
  529. package/skills/public/describe-image/SKILL.md +105 -0
  530. package/skills/public/describe-image/scripts/describe.py +389 -0
  531. package/skills/public/doc-coauthoring/SKILL.md +375 -0
  532. package/skills/public/docx/LICENSE.txt +30 -0
  533. package/skills/public/docx/SKILL.md +199 -0
  534. package/skills/public/docx/docx-js.md +350 -0
  535. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  536. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  537. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  538. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  539. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  540. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  541. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  542. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  543. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  544. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  545. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  546. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  547. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  548. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  549. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  550. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  551. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  552. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  553. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  554. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  555. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  556. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  557. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  558. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  559. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  560. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  561. package/skills/public/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  562. package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  563. package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  564. package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  565. package/skills/public/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  566. package/skills/public/docx/ooxml/schemas/mce/mc.xsd +75 -0
  567. package/skills/public/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  568. package/skills/public/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  569. package/skills/public/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  570. package/skills/public/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  571. package/skills/public/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  572. package/skills/public/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  573. package/skills/public/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  574. package/skills/public/docx/ooxml/scripts/pack.py +159 -0
  575. package/skills/public/docx/ooxml/scripts/unpack.py +29 -0
  576. package/skills/public/docx/ooxml/scripts/validate.py +69 -0
  577. package/skills/public/docx/ooxml/scripts/validation/__init__.py +15 -0
  578. package/skills/public/docx/ooxml/scripts/validation/base.py +951 -0
  579. package/skills/public/docx/ooxml/scripts/validation/docx.py +274 -0
  580. package/skills/public/docx/ooxml/scripts/validation/pptx.py +315 -0
  581. package/skills/public/docx/ooxml/scripts/validation/redlining.py +279 -0
  582. package/skills/public/docx/ooxml.md +632 -0
  583. package/skills/public/docx/scripts/__init__.py +1 -0
  584. package/skills/public/docx/scripts/document.py +1292 -0
  585. package/skills/public/docx/scripts/templates/comments.xml +3 -0
  586. package/skills/public/docx/scripts/templates/commentsExtended.xml +3 -0
  587. package/skills/public/docx/scripts/templates/commentsExtensible.xml +3 -0
  588. package/skills/public/docx/scripts/templates/commentsIds.xml +3 -0
  589. package/skills/public/docx/scripts/templates/people.xml +3 -0
  590. package/skills/public/docx/scripts/utilities.py +374 -0
  591. package/skills/public/file-reading/LICENSE.txt +30 -0
  592. package/skills/public/file-reading/SKILL.md +350 -0
  593. package/skills/public/frontend-design/LICENSE.txt +177 -0
  594. package/skills/public/frontend-design/SKILL.md +42 -0
  595. package/skills/public/gitlab-explorer/SKILL.md +174 -0
  596. package/skills/public/gitlab-explorer/references/git-commands.md +323 -0
  597. package/skills/public/gitlab-explorer/references/glab-commands.md +282 -0
  598. package/skills/public/gitlab-explorer/scripts/check_gitlab_auth.sh +109 -0
  599. package/skills/public/pdf/FORMS.md +205 -0
  600. package/skills/public/pdf/REFERENCE.md +612 -0
  601. package/skills/public/pdf/SKILL.md +364 -0
  602. package/skills/public/pdf/scripts/check_bounding_boxes.py +70 -0
  603. package/skills/public/pdf/scripts/check_bounding_boxes_test.py +226 -0
  604. package/skills/public/pdf/scripts/check_fillable_fields.py +12 -0
  605. package/skills/public/pdf/scripts/convert_pdf_to_images.py +35 -0
  606. package/skills/public/pdf/scripts/create_validation_image.py +41 -0
  607. package/skills/public/pdf/scripts/extract_form_field_info.py +152 -0
  608. package/skills/public/pdf/scripts/fill_fillable_fields.py +114 -0
  609. package/skills/public/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  610. package/skills/public/pdf-reading/LICENSE.txt +30 -0
  611. package/skills/public/pdf-reading/REFERENCE.md +196 -0
  612. package/skills/public/pdf-reading/SKILL.md +305 -0
  613. package/skills/public/playwright-cli/SKILL.md +278 -0
  614. package/skills/public/playwright-cli/references/request-mocking.md +87 -0
  615. package/skills/public/playwright-cli/references/running-code.md +232 -0
  616. package/skills/public/playwright-cli/references/session-management.md +169 -0
  617. package/skills/public/playwright-cli/references/storage-state.md +275 -0
  618. package/skills/public/playwright-cli/references/test-generation.md +88 -0
  619. package/skills/public/playwright-cli/references/tracing.md +139 -0
  620. package/skills/public/playwright-cli/references/video-recording.md +43 -0
  621. package/skills/public/pptx/LICENSE.txt +30 -0
  622. package/skills/public/pptx/SKILL.md +484 -0
  623. package/skills/public/pptx/css.md +335 -0
  624. package/skills/public/pptx/html2pptx.md +893 -0
  625. package/skills/public/pptx/html2pptx.tgz +0 -0
  626. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  627. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  628. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  629. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  630. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  631. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  632. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  633. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  634. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  635. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  636. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  637. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  638. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  639. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  640. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  641. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  642. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  643. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  644. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  645. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  646. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  647. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  648. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  649. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  650. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  651. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  652. package/skills/public/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  653. package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  654. package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  655. package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  656. package/skills/public/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  657. package/skills/public/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  658. package/skills/public/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  659. package/skills/public/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  660. package/skills/public/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  661. package/skills/public/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  662. package/skills/public/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  663. package/skills/public/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  664. package/skills/public/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  665. package/skills/public/pptx/ooxml/scripts/pack.py +159 -0
  666. package/skills/public/pptx/ooxml/scripts/unpack.py +29 -0
  667. package/skills/public/pptx/ooxml/scripts/validate.py +69 -0
  668. package/skills/public/pptx/ooxml/scripts/validation/__init__.py +15 -0
  669. package/skills/public/pptx/ooxml/scripts/validation/base.py +951 -0
  670. package/skills/public/pptx/ooxml/scripts/validation/docx.py +274 -0
  671. package/skills/public/pptx/ooxml/scripts/validation/pptx.py +315 -0
  672. package/skills/public/pptx/ooxml/scripts/validation/redlining.py +279 -0
  673. package/skills/public/pptx/ooxml.md +427 -0
  674. package/skills/public/pptx/scripts/inventory.py +1020 -0
  675. package/skills/public/pptx/scripts/rearrange.py +231 -0
  676. package/skills/public/pptx/scripts/replace.py +385 -0
  677. package/skills/public/pptx/scripts/thumbnail.py +450 -0
  678. package/skills/public/skill-creator/SKILL.md +356 -0
  679. package/skills/public/skill-creator/references/output-patterns.md +82 -0
  680. package/skills/public/skill-creator/references/workflows.md +28 -0
  681. package/skills/public/skill-creator/scripts/init_skill.py +303 -0
  682. package/skills/public/skill-creator/scripts/package_skill.py +110 -0
  683. package/skills/public/skill-creator/scripts/quick_validate.py +95 -0
  684. package/skills/public/sub-agent/SKILL.md +186 -0
  685. package/skills/public/sub-agent/references/security-review.md +153 -0
  686. package/skills/public/sub-agent/references/usage.md +207 -0
  687. package/skills/public/sub-agent/scripts/list_subagent_models.sh +22 -0
  688. package/skills/public/test-driven-development/SKILL.md +371 -0
  689. package/skills/public/test-driven-development/testing-anti-patterns.md +299 -0
  690. package/skills/public/webapp-testing/LICENSE.txt +202 -0
  691. package/skills/public/webapp-testing/SKILL.md +96 -0
  692. package/skills/public/webapp-testing/examples/console_logging.py +35 -0
  693. package/skills/public/webapp-testing/examples/element_discovery.py +40 -0
  694. package/skills/public/webapp-testing/examples/static_html_automation.py +33 -0
  695. package/skills/public/webapp-testing/scripts/with_server.py +106 -0
  696. package/skills/public/xlsx/LICENSE.txt +30 -0
  697. package/skills/public/xlsx/SKILL.md +316 -0
  698. package/skills/public/xlsx/preview_data.py +93 -0
  699. package/skills/public/xlsx/recalc.py +178 -0
  700. package/tests/README.md +42 -0
  701. package/tests/fixtures/cli/claude_v0.9.2.0_argv.json +46 -0
  702. package/tests/fixtures/cli/claude_v0.9.2.0_stdout.json +32 -0
  703. package/tests/fixtures/cli/codex_run.jsonl +4 -0
  704. package/tests/fixtures/cli/opencode_run.jsonl +6 -0
  705. package/tests/integration/README.md +56 -0
  706. package/tests/integration/conftest.py +280 -0
  707. package/tests/integration/pytest.ini +13 -0
  708. package/tests/integration/test_mcp_auth.py +85 -0
  709. package/tests/integration/test_mcp_tools.py +101 -0
  710. package/tests/integration/test_workspace_lifecycle.py +125 -0
  711. package/tests/orchestrator/mock_llm_server.py +343 -0
  712. package/tests/orchestrator/test_cli_adapters.py +566 -0
  713. package/tests/orchestrator/test_cli_adapters_live.py +527 -0
  714. package/tests/orchestrator/test_cli_runtime.py +451 -0
  715. package/tests/orchestrator/test_docker_manager.py +302 -0
  716. package/tests/orchestrator/test_dynamic_instructions.py +69 -0
  717. package/tests/orchestrator/test_mcp_resources.py +140 -0
  718. package/tests/orchestrator/test_mcp_tools.py +224 -0
  719. package/tests/orchestrator/test_passthrough_isolation.py +201 -0
  720. package/tests/orchestrator/test_readme_in_container.py +76 -0
  721. package/tests/orchestrator/test_render_cache.py +84 -0
  722. package/tests/orchestrator/test_runtime_cli_endpoint.py +108 -0
  723. package/tests/orchestrator/test_single_user_mode.py +212 -0
  724. package/tests/orchestrator/test_startup_warnings.py +123 -0
  725. package/tests/orchestrator/test_sub_agent_dispatch.py +327 -0
  726. package/tests/orchestrator/test_subagent_claude_compat.py +367 -0
  727. package/tests/orchestrator/test_system_prompt_endpoint.py +191 -0
  728. package/tests/orchestrator/test_tool_descriptions.py +52 -0
  729. package/tests/orchestrator/test_view_image.py +201 -0
  730. package/tests/patches/conftest.py +30 -0
  731. package/tests/patches/fixtures/__init__.py +10 -0
  732. package/tests/patches/fixtures/middleware_v0.9.1.py +5057 -0
  733. package/tests/patches/fixtures/middleware_v0.9.2.py +5120 -0
  734. package/tests/patches/fixtures/retrieval_v0.9.1.py +2684 -0
  735. package/tests/patches/fixtures/retrieval_v0.9.2.py +2700 -0
  736. package/tests/patches/test_fix_attached_files_position.py +118 -0
  737. package/tests/patches/test_fix_large_tool_args.py +130 -0
  738. package/tests/patches/test_fix_large_tool_results.py +531 -0
  739. package/tests/patches/test_fix_skip_embedding_chat_files.py +160 -0
  740. package/tests/patches/test_fix_skip_rag_files_native_fc.py +120 -0
  741. package/tests/patches/test_fix_tool_loop_errors.py +128 -0
  742. package/tests/security/test_path_traversal_app.py +132 -0
  743. package/tests/security/test_path_traversal_docker.py +36 -0
  744. package/tests/security/test_path_traversal_settings.py +87 -0
  745. package/tests/security/test_safe_path_util.py +166 -0
  746. package/tests/security/test_xss_preview.py +46 -0
  747. package/tests/test-default-model-resolution.py +136 -0
  748. package/tests/test-docker-image.sh +358 -0
  749. package/tests/test-list-subagent-models.sh +421 -0
  750. package/tests/test-mcp-endpoint-live.sh +92 -0
  751. package/tests/test-mcp-native-surface.sh +213 -0
  752. package/tests/test-no-cyrillic.sh +135 -0
  753. package/tests/test-opencode-error-mapping.py +130 -0
  754. package/tests/test-pr88-skills.sh +305 -0
  755. package/tests/test-project-structure.sh +202 -0
  756. package/tests/test-single-user-mode.sh +269 -0
  757. package/tests/test-skill-no-hardcoded-models.sh +65 -0
  758. package/tests/test-subagent-cli-surface.py +137 -0
  759. package/tests/test-subagent-runtime.sh +109 -0
  760. package/tests/test_codex_toml_converter.py +204 -0
  761. package/tests/test_default_resolver_no_legacy_global.py +159 -0
  762. package/tests/test_filter.py +648 -0
  763. package/tests/test_init_sh_unchanged.sh +49 -0
  764. package/tests/test_opencode_alias_map_drop.py +144 -0
  765. package/tests/test_requirements.py +91 -0
  766. package/tests/test_subagent_docstring.py +193 -0
  767. package/tests/test_tools.py +34 -0
  768. package/vendor/extract-text/README.md +46 -0
  769. 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 $!"]