openwork-server 0.18.48 → 0.18.50
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/README.md +30 -0
- package/bin/openwork-server.mjs +3 -1
- package/dist/bin/openwork-server +2 -2
- package/dist/opencode-plugins/agent-instruction-compose.js +81 -0
- package/dist/opencode-plugins/gmail-attachment-fulfillment.js +199 -0
- package/dist/opencode-plugins/managed-policy-client.js +39 -0
- package/dist/opencode-plugins/managed-policy-next.js +13894 -0
- package/dist/opencode-plugins/managed-policy.js +100 -0
- package/dist/opencode-plugins/openwork-anthropic-adaptive-thinking.js +83 -0
- package/dist/opencode-plugins/openwork-anthropic-tool-schema.js +154 -0
- package/dist/opencode-plugins/openwork-capabilities-knowledge.js +13842 -0
- package/dist/opencode-plugins/openwork-chrome-devtools.js +13690 -0
- package/dist/opencode-plugins/openwork-extensions-preview-steering.js +295 -0
- package/dist/opencode-plugins/openwork-extensions-preview.js +16067 -0
- package/dist/opencode-plugins/openwork-gateway-quota-v2.js +13805 -0
- package/dist/opencode-plugins/openwork-gateway-quota.js +14130 -0
- package/dist/opencode-plugins/openwork-office-attachments.js +3008 -0
- package/dist/opencode-plugins/openwork-pdf-attachments.js +23811 -0
- package/dist/opencode-plugins/openwork-provider-adapters.js +292 -0
- package/dist/opencode-plugins/openwork-spreadsheets.js +16448 -0
- package/dist/opencode-plugins/openwork-title-recovery.js +255 -0
- package/dist/opencode-plugins/openwork-ui-bridge.js +81 -0
- package/dist/opencode-plugins/pdfium.wasm +0 -0
- package/dist/opencode-plugins/session-activity.js +45 -0
- package/dist/opencode-plugins/workspace-file-identity.js +162 -0
- package/package.json +1 -1
- package/web/apple-touch-icon.png +0 -0
- package/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/web/assets/abap-BdImnpbu.js +1 -0
- package/web/assets/abnfDiagram-VCTEODGH-BgnyE_Jl.js +1 -0
- package/web/assets/actionscript-3-CoDkCxhg.js +1 -0
- package/web/assets/ada-bCR0ucgS.js +1 -0
- package/web/assets/andromeeda-C4gqWexZ.js +1 -0
- package/web/assets/angular-html-DA-rfuFy.js +1 -0
- package/web/assets/angular-ts-BrjP3tb8.js +1 -0
- package/web/assets/apache-Pmp26Uib.js +1 -0
- package/web/assets/apex-D8_7TLub.js +1 -0
- package/web/assets/apl-CORt7UWP.js +1 -0
- package/web/assets/app-CyCqD289.js +2581 -0
- package/web/assets/app-DOrYoP_4.css +32 -0
- package/web/assets/applescript-Co6uUVPk.js +1 -0
- package/web/assets/ara-BRHolxvo.js +1 -0
- package/web/assets/arc-jSgX49-e.js +1 -0
- package/web/assets/architectureDiagram-5GKGNRK7-DD_aGn4v.js +36 -0
- package/web/assets/artifact-code-view-DFIq0k-c.js +1906 -0
- package/web/assets/artifact-spreadsheet-editor-DFVCYrL7.js +11 -0
- package/web/assets/artifact-text-editor-DBngc6bx.js +34 -0
- package/web/assets/asciidoc-Ve4PFQV2.js +1 -0
- package/web/assets/asm-D_Q5rh1f.js +1 -0
- package/web/assets/astro-HNnZUWAn.js +1 -0
- package/web/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/web/assets/awk-DMzUqQB5.js +1 -0
- package/web/assets/ayu-dark-DYE7WIF3.js +1 -0
- package/web/assets/ayu-light-BA47KaF1.js +1 -0
- package/web/assets/ayu-mirage-32ctXXKs.js +1 -0
- package/web/assets/ballerina-BFfxhgS-.js +1 -0
- package/web/assets/bat-BkioyH1T.js +1 -0
- package/web/assets/beancount-k_qm7-4y.js +1 -0
- package/web/assets/berry-uYugtg8r.js +1 -0
- package/web/assets/bibtex-CHM0blh-.js +1 -0
- package/web/assets/bicep-Bmn6On1c.js +1 -0
- package/web/assets/bird2-BIv1doCn.js +1 -0
- package/web/assets/blade-BjGOyj-B.js +1 -0
- package/web/assets/blockDiagram-OSKFZWR5-CBcZLjLp.js +129 -0
- package/web/assets/bsl-BO_Y6i37.js +1 -0
- package/web/assets/c-BIGW1oBm.js +1 -0
- package/web/assets/c3-eo99z4R2.js +1 -0
- package/web/assets/c4Diagram-7LVT6UL2-DMrhFCLj.js +38 -0
- package/web/assets/cadence-Bv_4Rxtq.js +1 -0
- package/web/assets/cairo-KRGpt6FW.js +1 -0
- package/web/assets/catppuccin-frappe-DFWUc33u.js +1 -0
- package/web/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
- package/web/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
- package/web/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
- package/web/assets/channel-BE8JEd1U.js +1 -0
- package/web/assets/chunk-2Q5K7J3B-Ce1X-FJQ.js +1 -0
- package/web/assets/chunk-5VM5RSS4-BS48ZtVI.js +15 -0
- package/web/assets/chunk-F27PBJKO-COdFZJ-M.js +1 -0
- package/web/assets/chunk-HLEWEB6X-Cdw4ABX3.js +206 -0
- package/web/assets/chunk-JWPE2WC7-FVVDYZmE.js +1 -0
- package/web/assets/chunk-POPQ4Y6H-C7acdUF3.js +1 -0
- package/web/assets/chunk-SVP7TREG-BUun0UWD.js +88 -0
- package/web/assets/chunk-XXDRQBXY-DLgpJmat.js +1 -0
- package/web/assets/chunk-ZLD2IHE6-BdMQ5Cr0.js +231 -0
- package/web/assets/clarity-D53aC0YG.js +1 -0
- package/web/assets/classDiagram-CYGNFDIV-Cy8V0GW-.js +1 -0
- package/web/assets/classDiagram-v2-TLXNO2FR-Cy8V0GW-.js +1 -0
- package/web/assets/clojure-P80f7IUj.js +1 -0
- package/web/assets/cmake-D1j8_8rp.js +1 -0
- package/web/assets/cobol-nBiQ_Alo.js +1 -0
- package/web/assets/codeowners-Bp6g37R7.js +1 -0
- package/web/assets/codeql-DsOJ9woJ.js +1 -0
- package/web/assets/coffee-Ch7k5sss.js +1 -0
- package/web/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/web/assets/coq-DkFqJrB1.js +1 -0
- package/web/assets/cose-bilkent-JH36ORCC-CqWy3Swy.js +1 -0
- package/web/assets/cpp-CofmeUqb.js +1 -0
- package/web/assets/crystal-DNxU26gB.js +1 -0
- package/web/assets/csharp-COcwbKMJ.js +1 -0
- package/web/assets/css-CLj8gQPS.js +1 -0
- package/web/assets/csv-fuZLfV_i.js +1 -0
- package/web/assets/cue-D82EKSYY.js +1 -0
- package/web/assets/cynefin-OW5HDTMX-DslesE5Y.js +178 -0
- package/web/assets/cynefinDiagram-5FMLGOSQ-B54uZJn_.js +62 -0
- package/web/assets/cypher-COkxafJQ.js +1 -0
- package/web/assets/cytoscape.esm-CNiYdHpY.js +331 -0
- package/web/assets/d-85-TOEBH.js +1 -0
- package/web/assets/dagre-OS7QT2EB-Bkahh4gZ.js +4 -0
- package/web/assets/dark-plus-C3mMm8J8.js +1 -0
- package/web/assets/dart-bE4Kk8sk.js +1 -0
- package/web/assets/dax-CEL-wOlO.js +1 -0
- package/web/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/web/assets/desktop-BmXAJ9_W.js +1 -0
- package/web/assets/diagram-S7CK7UJ4-CXQl7SfF.js +30 -0
- package/web/assets/diagram-UQ7AKVKN-BA0V8tjK.js +41 -0
- package/web/assets/diagram-VSXAHHWV-DlcR8qeO.js +3 -0
- package/web/assets/diagram-VX7I27RA-ewm16zDI.js +24 -0
- package/web/assets/diagram-Z3DM3KII-Bc2lRc88.js +24 -0
- package/web/assets/diff-D97Zzqfu.js +1 -0
- package/web/assets/docker-BcOcwvcX.js +1 -0
- package/web/assets/dotenv-Da5cRb03.js +1 -0
- package/web/assets/dracula-BzJJZx-M.js +1 -0
- package/web/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/web/assets/dream-maker-BtqSS_iP.js +1 -0
- package/web/assets/ebnfDiagram-PWID7BFC-JwCaf6cT.js +1 -0
- package/web/assets/edge-FbVlp4U3.js +1 -0
- package/web/assets/elixir-CkH2-t6x.js +1 -0
- package/web/assets/elm-DbKCFpqz.js +1 -0
- package/web/assets/emacs-lisp-CXvaQtF9.js +1 -0
- package/web/assets/erDiagram-2YWLMYGG-DOqO-9Yf.js +99 -0
- package/web/assets/erb-BYCe7drp.js +1 -0
- package/web/assets/erlang-DsQrWhSR.js +1 -0
- package/web/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/web/assets/everforest-light-C8M2exoo.js +1 -0
- package/web/assets/fennel-BYunw83y.js +1 -0
- package/web/assets/fish-BvzEVeQv.js +1 -0
- package/web/assets/flowDiagram-T62WH6J4-CCZxvIjW.js +168 -0
- package/web/assets/fluent-C4IJs8-o.js +1 -0
- package/web/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/web/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/web/assets/fsharp-CXgrBDvD.js +1 -0
- package/web/assets/ganttDiagram-EL5Y4UJY-BczG7RIu.js +292 -0
- package/web/assets/gdresource-BOOCDP_w.js +1 -0
- package/web/assets/gdscript-C5YyOfLZ.js +1 -0
- package/web/assets/gdshader-DkwncUOv.js +1 -0
- package/web/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/web/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/web/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/web/assets/genie-D0YGMca9.js +1 -0
- package/web/assets/gherkin-DyxjwDmM.js +1 -0
- package/web/assets/git-commit-F4YmCXRG.js +1 -0
- package/web/assets/git-rebase-r7XF79zn.js +1 -0
- package/web/assets/gitGraphDiagram-WWUBYQGX-GOecDN3g.js +106 -0
- package/web/assets/github-dark-DHJKELXO.js +1 -0
- package/web/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/web/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/web/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/web/assets/github-light-DAi9KRSo.js +1 -0
- package/web/assets/github-light-default-D7oLnXFd.js +1 -0
- package/web/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/web/assets/gleam-BspZqrRM.js +1 -0
- package/web/assets/glimmer-js-ByusRIyA.js +1 -0
- package/web/assets/glimmer-ts-BfAWNZQY.js +1 -0
- package/web/assets/glsl-DplSGwfg.js +1 -0
- package/web/assets/gn-n2N0HUVH.js +1 -0
- package/web/assets/gnuplot-DdkO51Og.js +1 -0
- package/web/assets/go-C27-OAKa.js +1 -0
- package/web/assets/graphql-ChdNCCLP.js +1 -0
- package/web/assets/groovy-gcz8RCvz.js +1 -0
- package/web/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/web/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/web/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/web/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/web/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/web/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/web/assets/hack-i7_Ulhet.js +1 -0
- package/web/assets/haml-D5jkg6IW.js +1 -0
- package/web/assets/handlebars-BpdQsYii.js +1 -0
- package/web/assets/haskell-Df6bDoY_.js +1 -0
- package/web/assets/haxe-CzTSHFRz.js +1 -0
- package/web/assets/hcl-BWvSN4gD.js +1 -0
- package/web/assets/hjson-D5-asLiD.js +1 -0
- package/web/assets/hlsl-D3lLCCz7.js +1 -0
- package/web/assets/horizon-BUw7H-hv.js +1 -0
- package/web/assets/horizon-bright-CUuTKBJd.js +1 -0
- package/web/assets/houston-DnULxvSX.js +1 -0
- package/web/assets/html-derivative-DlHx6ybY.js +1 -0
- package/web/assets/html-pp8916En.js +1 -0
- package/web/assets/http-jrhK8wxY.js +1 -0
- package/web/assets/hurl-irOxFIW8.js +1 -0
- package/web/assets/hxml-Bvhsp5Yf.js +1 -0
- package/web/assets/hy-DFXneXwc.js +1 -0
- package/web/assets/ibm-plex-sans-cyrillic-ext-wght-normal-d45eAU9y.woff2 +0 -0
- package/web/assets/ibm-plex-sans-cyrillic-wght-normal-BAAhND-U.woff2 +0 -0
- package/web/assets/ibm-plex-sans-greek-wght-normal-CmyJS8uq.woff2 +0 -0
- package/web/assets/ibm-plex-sans-latin-ext-wght-normal-CIII54If.woff2 +0 -0
- package/web/assets/ibm-plex-sans-latin-wght-normal-IvpUvPa2.woff2 +0 -0
- package/web/assets/ibm-plex-sans-vietnamese-wght-normal-Dg1JeJN0.woff2 +0 -0
- package/web/assets/imba-DGztddWO.js +1 -0
- package/web/assets/index-BZgplq0g.css +1 -0
- package/web/assets/index-_gYIQM_z.js +49 -0
- package/web/assets/infoDiagram-FKFFQAWI-BbgIVsQp.js +2 -0
- package/web/assets/ini-BEwlwnbL.js +1 -0
- package/web/assets/init-Gi6I4Gst.js +1 -0
- package/web/assets/ishikawaDiagram-5VMMS53U-xutQo5Ip.js +70 -0
- package/web/assets/java-CylS5w8V.js +1 -0
- package/web/assets/javascript-wDzz0qaB.js +1 -0
- package/web/assets/jinja-f2NsQr07.js +1 -0
- package/web/assets/jison-wvAkD_A8.js +1 -0
- package/web/assets/journeyDiagram-EYS64GPL-BIbzPGaa.js +139 -0
- package/web/assets/json-Cp-IABpG.js +1 -0
- package/web/assets/json5-C9tS-k6U.js +1 -0
- package/web/assets/jsonc-Des-eS-w.js +1 -0
- package/web/assets/jsonl-DcaNXYhu.js +1 -0
- package/web/assets/jsonnet-DFQXde-d.js +1 -0
- package/web/assets/jssm-C2t-YnRu.js +1 -0
- package/web/assets/jsx-g9-lgVsj.js +1 -0
- package/web/assets/julia-CxzCAyBv.js +1 -0
- package/web/assets/just-VxiPbLrw.js +1 -0
- package/web/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/web/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/web/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/web/assets/kanban-definition-UXKFOSKX-BCTiRzck.js +89 -0
- package/web/assets/katex-HP8lGamR.js +257 -0
- package/web/assets/kdl-DV7GczEv.js +1 -0
- package/web/assets/kotlin-BdnUsdx6.js +1 -0
- package/web/assets/kusto-wEQ09or8.js +1 -0
- package/web/assets/laserwave-DUszq2jm.js +1 -0
- package/web/assets/latex-CWtU0Tv5.js +1 -0
- package/web/assets/layout-Wpfi54TB.js +1 -0
- package/web/assets/lean-BZvkOJ9d.js +1 -0
- package/web/assets/less-B1dDrJ26.js +1 -0
- package/web/assets/light-plus-B7mTdjB0.js +1 -0
- package/web/assets/linear-DLJHPikh.js +1 -0
- package/web/assets/liquid-C0sCDyMI.js +1 -0
- package/web/assets/llvm-DjAJT7YJ.js +1 -0
- package/web/assets/log-2UxHyX5q.js +1 -0
- package/web/assets/logo-BtOb2qkB.js +1 -0
- package/web/assets/lua-BaeVxFsk.js +1 -0
- package/web/assets/luau-C-HG3fhB.js +1 -0
- package/web/assets/make-CHLpvVh8.js +1 -0
- package/web/assets/markdown-Cvjx9yec.js +1 -0
- package/web/assets/marko-DjSrsDqO.js +1 -0
- package/web/assets/material-theme-D5KoaKCx.js +1 -0
- package/web/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/web/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/web/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/web/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/web/assets/matlab-D7o27uSR.js +1 -0
- package/web/assets/mdc-DTYItulj.js +1 -0
- package/web/assets/mdx-Cmh6b_Ma.js +1 -0
- package/web/assets/mermaid-mWjccvbQ.js +1 -0
- package/web/assets/mermaid.core-CDRJkis7.js +310 -0
- package/web/assets/min-dark-CafNBF8u.js +1 -0
- package/web/assets/min-light-CTRr51gU.js +1 -0
- package/web/assets/mindmap-definition-THT77NOG-DtphSFs_.js +96 -0
- package/web/assets/mipsasm-CKIfxQSi.js +1 -0
- package/web/assets/mojo-rZm6bMo-.js +1 -0
- package/web/assets/monokai-D4h5O-jR.js +1 -0
- package/web/assets/moonbit-_H4v1dQx.js +1 -0
- package/web/assets/move-IF9eRakj.js +1 -0
- package/web/assets/narrat-DRg8JJMk.js +1 -0
- package/web/assets/nextflow-C-mBbutL.js +1 -0
- package/web/assets/nextflow-groovy-vE_lwT2v.js +1 -0
- package/web/assets/nginx-BpAMiNFr.js +1 -0
- package/web/assets/night-owl-C39BiMTA.js +1 -0
- package/web/assets/night-owl-light-CMTm3GFP.js +1 -0
- package/web/assets/nim-BIad80T-.js +1 -0
- package/web/assets/nix-CwoSXNpI.js +1 -0
- package/web/assets/nord-Ddv68eIx.js +1 -0
- package/web/assets/nushell-Cz2AlsmD.js +1 -0
- package/web/assets/objective-c-DXmwc3jG.js +1 -0
- package/web/assets/objective-cpp-CLxacb5B.js +1 -0
- package/web/assets/ocaml-C0hk2d4L.js +1 -0
- package/web/assets/odin-BBf5iR-q.js +1 -0
- package/web/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/web/assets/one-light-C3Wv6jpd.js +1 -0
- package/web/assets/openscad-C4EeE6gA.js +1 -0
- package/web/assets/ordinal-Cboi1Yqb.js +1 -0
- package/web/assets/overlay-zA9qjYXH.js +1 -0
- package/web/assets/pascal-D93ZcfNL.js +1 -0
- package/web/assets/pegDiagram-XKGWAZYB-CzbjpqK7.js +1 -0
- package/web/assets/perl-NvoQZIq0.js +1 -0
- package/web/assets/php-R6g_5hLQ.js +1 -0
- package/web/assets/pieDiagram-E7YTZNPT-tjxtWWT7.js +39 -0
- package/web/assets/pierre-dark-CyvmCCZW.js +1 -0
- package/web/assets/pierre-dark-protanopia-deuteranopia-Rgc0TwpF.js +1 -0
- package/web/assets/pierre-dark-soft-BHGpRqa4.js +1 -0
- package/web/assets/pierre-dark-tritanopia-Beq2gCRQ.js +1 -0
- package/web/assets/pierre-dark-vibrant-BWBVywrn.js +1 -0
- package/web/assets/pierre-light-480U9XYS.js +1 -0
- package/web/assets/pierre-light-protanopia-deuteranopia-CaVOBURG.js +1 -0
- package/web/assets/pierre-light-soft-CVdyfjmI.js +1 -0
- package/web/assets/pierre-light-tritanopia-B4_gpKOM.js +1 -0
- package/web/assets/pierre-light-vibrant-DdTDNdfJ.js +1 -0
- package/web/assets/pkl-u5AG7uiY.js +1 -0
- package/web/assets/plastic-3e1v2bzS.js +1 -0
- package/web/assets/plsql-ChMvpjG-.js +1 -0
- package/web/assets/po-BTJTHyun.js +1 -0
- package/web/assets/poimandres-CS3Unz2-.js +1 -0
- package/web/assets/polar-C0HS_06l.js +1 -0
- package/web/assets/postcss-CXtECtnM.js +1 -0
- package/web/assets/powerquery-CEu0bR-o.js +1 -0
- package/web/assets/powershell-Dpen1YoG.js +1 -0
- package/web/assets/prisma-Dd19v3D-.js +1 -0
- package/web/assets/prolog-CbFg5uaA.js +1 -0
- package/web/assets/proto-C7zT0LnQ.js +1 -0
- package/web/assets/pug-DKIMFp6K.js +1 -0
- package/web/assets/puppet-BMWR74SV.js +1 -0
- package/web/assets/purescript-CklMAg4u.js +1 -0
- package/web/assets/python-B6aJPvgy.js +1 -0
- package/web/assets/qml-3beO22l8.js +1 -0
- package/web/assets/qmldir-C8lEn-DE.js +1 -0
- package/web/assets/qss-IeuSbFQv.js +1 -0
- package/web/assets/quadrantDiagram-AXDQQJYC-CFC1qey-.js +7 -0
- package/web/assets/r-Dspwwk_N.js +1 -0
- package/web/assets/racket-BqYA7rlc.js +1 -0
- package/web/assets/railroadDiagram-O6MQD6OU-73_BXhNP.js +1 -0
- package/web/assets/raku-DXvB9xmW.js +1 -0
- package/web/assets/razor-BDqjjVU7.js +1 -0
- package/web/assets/red-bN70gL4F.js +1 -0
- package/web/assets/reg-C-SQnVFl.js +1 -0
- package/web/assets/regexp-CDVJQ6XC.js +1 -0
- package/web/assets/rel-C3B-1QV4.js +1 -0
- package/web/assets/requirementDiagram-IS5BZ75X-B8i4BL2A.js +84 -0
- package/web/assets/riscv-BM1_JUlF.js +1 -0
- package/web/assets/ron-D8l8udqQ.js +1 -0
- package/web/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
- package/web/assets/rose-pine-moon-D4_iv3hh.js +1 -0
- package/web/assets/rose-pine-qdsjHGoJ.js +1 -0
- package/web/assets/rosmsg-BJDFO7_C.js +1 -0
- package/web/assets/rst-CRjBmOyv.js +1 -0
- package/web/assets/ruby-Wjq7vjNf.js +1 -0
- package/web/assets/rust-B1yitclQ.js +1 -0
- package/web/assets/sankeyDiagram-P5KCCOFB-Dll4Naj0.js +40 -0
- package/web/assets/sas-cz2c8ADy.js +1 -0
- package/web/assets/sass-Cj5Yp3dK.js +1 -0
- package/web/assets/scala-C151Ov-r.js +1 -0
- package/web/assets/scheme-C98Dy4si.js +1 -0
- package/web/assets/scss-D5BDwBP9.js +1 -0
- package/web/assets/sdbl-DVxCFoDh.js +1 -0
- package/web/assets/sequenceDiagram-WJ2MYXX4-B8Rvjhb5.js +162 -0
- package/web/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/web/assets/shellscript-Yzrsuije.js +1 -0
- package/web/assets/shellsession-BADoaaVG.js +1 -0
- package/web/assets/sizeCapture-INFHLROL-h8YDF-c3.js +1 -0
- package/web/assets/slack-dark-BthQWCQV.js +1 -0
- package/web/assets/slack-ochin-DqwNpetd.js +1 -0
- package/web/assets/smalltalk-BERRCDM3.js +1 -0
- package/web/assets/snazzy-light-Bw305WKR.js +1 -0
- package/web/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/web/assets/solarized-light-L9t79GZl.js +1 -0
- package/web/assets/solidity-rGO070M0.js +1 -0
- package/web/assets/soy-8wufbnw4.js +1 -0
- package/web/assets/sparql-rVzFXLq3.js +1 -0
- package/web/assets/splunk-BtCnVYZw.js +1 -0
- package/web/assets/sql-BLtJtn59.js +1 -0
- package/web/assets/ssh-config-_ykCGR6B.js +1 -0
- package/web/assets/stata-BH5u7GGu.js +1 -0
- package/web/assets/stateDiagram-XQSTLZYL-COorU6Ga.js +1 -0
- package/web/assets/stateDiagram-v2-IH3M54BS-BAu05WuT.js +1 -0
- package/web/assets/stylus-BEDo0Tqx.js +1 -0
- package/web/assets/surrealql-Bq5Q-fJD.js +1 -0
- package/web/assets/svelte-Cy7k_4gC.js +1 -0
- package/web/assets/swift-D82vCrfD.js +1 -0
- package/web/assets/swimlanes-V6O3JKXN-CAghInFw.js +1 -0
- package/web/assets/swimlanesDiagram-JKAHXJPX-CpJNl3pn.js +8 -0
- package/web/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/web/assets/system-verilog-CnnmHF94.js +1 -0
- package/web/assets/systemd-4A_iFExJ.js +1 -0
- package/web/assets/talonscript-CkByrt1z.js +1 -0
- package/web/assets/tasl-QIJgUcNo.js +1 -0
- package/web/assets/tcl-dwOrl1Do.js +1 -0
- package/web/assets/templ-DhtptRzy.js +1 -0
- package/web/assets/terraform-BETggiCN.js +1 -0
- package/web/assets/tex-idrVyKtj.js +1 -0
- package/web/assets/timeline-definition-24CTP7MA-Dum2N-ex.js +120 -0
- package/web/assets/tokyo-night-hegEt444.js +1 -0
- package/web/assets/toml-vGWfd6FD.js +1 -0
- package/web/assets/ts-tags-DQrlYJgV.js +1 -0
- package/web/assets/tsv-B_m7g4N7.js +1 -0
- package/web/assets/tsx-COt5Ahok.js +1 -0
- package/web/assets/turtle-BsS91CYL.js +1 -0
- package/web/assets/twig-xg9kU7Mw.js +1 -0
- package/web/assets/typescript-BPQ3VLAy.js +1 -0
- package/web/assets/typespec-CAFt9gP4.js +1 -0
- package/web/assets/typst-DHCkPAjA.js +1 -0
- package/web/assets/v-BcVCzyr7.js +1 -0
- package/web/assets/vala-CsfeWuGM.js +1 -0
- package/web/assets/vb-D17OF-Vu.js +1 -0
- package/web/assets/vennDiagram-4TSXK5OY-D-JeJumX.js +34 -0
- package/web/assets/verilog-BQ8w6xss.js +1 -0
- package/web/assets/vesper-DU1UobuO.js +1 -0
- package/web/assets/vhdl-CeAyd5Ju.js +1 -0
- package/web/assets/viml-CJc9bBzg.js +1 -0
- package/web/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/web/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/web/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/web/assets/vue-D2xRrEX4.js +1 -0
- package/web/assets/vue-html-AaS7Mt5G.js +1 -0
- package/web/assets/vue-vine-BoDAl6tE.js +1 -0
- package/web/assets/vyper-CDx5xZoG.js +1 -0
- package/web/assets/wardleyDiagram-VM6X3IG4-d99FKQIG.js +78 -0
- package/web/assets/wasm-CG6Dc4jp.js +1 -0
- package/web/assets/wasm-MzD3tlZU.js +1 -0
- package/web/assets/wenyan-BV7otONQ.js +1 -0
- package/web/assets/wgsl-Dx-B1_4e.js +1 -0
- package/web/assets/wikitext-BhOHFoWU.js +1 -0
- package/web/assets/wit-5i3qLPDT.js +1 -0
- package/web/assets/wolfram-lXgVvXCa.js +1 -0
- package/web/assets/workspace-file-tree-CAuhntUr.js +1278 -0
- package/web/assets/xml-sdJ4AIDG.js +1 -0
- package/web/assets/xsl-CtQFsRM5.js +1 -0
- package/web/assets/xychartDiagram-S5SC5T6Z-DdmevfkD.js +7 -0
- package/web/assets/yaml-Buea-lGh.js +1 -0
- package/web/assets/zenscript-DVFEvuxE.js +1 -0
- package/web/assets/zig-VOosw3JB.js +1 -0
- package/web/ext-context7.svg +1 -0
- package/web/ext-google-workspace.svg +6 -0
- package/web/ext-linear.svg +1 -0
- package/web/ext-notion.svg +1 -0
- package/web/ext-ollama.svg +1 -0
- package/web/ext-openai.svg +1 -0
- package/web/ext-sentry.svg +1 -0
- package/web/ext-stripe.svg +1 -0
- package/web/favicon-16x16.png +0 -0
- package/web/favicon-32x32.png +0 -0
- package/web/grain-art/extension/extension-001.png +0 -0
- package/web/grain-art/extension/extension-002.png +0 -0
- package/web/grain-art/extension/extension-003.png +0 -0
- package/web/grain-art/extension/extension-004.png +0 -0
- package/web/grain-art/extension/extension-005.png +0 -0
- package/web/grain-art/extension/extension-006.png +0 -0
- package/web/grain-art/extension/extension-007.png +0 -0
- package/web/grain-art/extension/extension-008.png +0 -0
- package/web/grain-art/extension/extension-009.png +0 -0
- package/web/grain-art/extension/extension-010.png +0 -0
- package/web/grain-art/extension/extension-011.png +0 -0
- package/web/grain-art/extension/extension-012.png +0 -0
- package/web/grain-art/extension/extension-013.png +0 -0
- package/web/grain-art/extension/extension-014.png +0 -0
- package/web/grain-art/extension/extension-015.png +0 -0
- package/web/grain-art/extension/extension-016.png +0 -0
- package/web/grain-art/extension/extension-017.png +0 -0
- package/web/grain-art/extension/extension-018.png +0 -0
- package/web/grain-art/extension/extension-019.png +0 -0
- package/web/grain-art/extension/extension-020.png +0 -0
- package/web/grain-art/extension/extension-021.png +0 -0
- package/web/grain-art/extension/extension-022.png +0 -0
- package/web/grain-art/extension/extension-023.png +0 -0
- package/web/grain-art/extension/extension-024.png +0 -0
- package/web/grain-art/extension/extension-025.png +0 -0
- package/web/grain-art/extension/extension-026.png +0 -0
- package/web/grain-art/extension/extension-027.png +0 -0
- package/web/grain-art/extension/extension-028.png +0 -0
- package/web/grain-art/extension/extension-029.png +0 -0
- package/web/grain-art/extension/extension-030.png +0 -0
- package/web/grain-art/extension/extension-031.png +0 -0
- package/web/grain-art/extension/extension-032.png +0 -0
- package/web/grain-art/fallback/fallback-001.png +0 -0
- package/web/grain-art/fallback/fallback-002.png +0 -0
- package/web/grain-art/fallback/fallback-003.png +0 -0
- package/web/grain-art/fallback/fallback-004.png +0 -0
- package/web/grain-art/fallback/fallback-005.png +0 -0
- package/web/grain-art/fallback/fallback-006.png +0 -0
- package/web/grain-art/fallback/fallback-007.png +0 -0
- package/web/grain-art/fallback/fallback-008.png +0 -0
- package/web/grain-art/fallback/fallback-009.png +0 -0
- package/web/grain-art/fallback/fallback-010.png +0 -0
- package/web/grain-art/fallback/fallback-011.png +0 -0
- package/web/grain-art/fallback/fallback-012.png +0 -0
- package/web/grain-art/fallback/fallback-013.png +0 -0
- package/web/grain-art/fallback/fallback-014.png +0 -0
- package/web/grain-art/fallback/fallback-015.png +0 -0
- package/web/grain-art/fallback/fallback-016.png +0 -0
- package/web/grain-art/fallback/fallback-017.png +0 -0
- package/web/grain-art/fallback/fallback-018.png +0 -0
- package/web/grain-art/fallback/fallback-019.png +0 -0
- package/web/grain-art/fallback/fallback-020.png +0 -0
- package/web/grain-art/fallback/fallback-021.png +0 -0
- package/web/grain-art/fallback/fallback-022.png +0 -0
- package/web/grain-art/fallback/fallback-023.png +0 -0
- package/web/grain-art/fallback/fallback-024.png +0 -0
- package/web/grain-art/fallback/fallback-025.png +0 -0
- package/web/grain-art/fallback/fallback-026.png +0 -0
- package/web/grain-art/fallback/fallback-027.png +0 -0
- package/web/grain-art/fallback/fallback-028.png +0 -0
- package/web/grain-art/fallback/fallback-029.png +0 -0
- package/web/grain-art/fallback/fallback-030.png +0 -0
- package/web/grain-art/fallback/fallback-031.png +0 -0
- package/web/grain-art/fallback/fallback-032.png +0 -0
- package/web/grain-art/mcps/mcps-001.png +0 -0
- package/web/grain-art/mcps/mcps-002.png +0 -0
- package/web/grain-art/mcps/mcps-003.png +0 -0
- package/web/grain-art/mcps/mcps-004.png +0 -0
- package/web/grain-art/mcps/mcps-005.png +0 -0
- package/web/grain-art/mcps/mcps-006.png +0 -0
- package/web/grain-art/mcps/mcps-007.png +0 -0
- package/web/grain-art/mcps/mcps-008.png +0 -0
- package/web/grain-art/mcps/mcps-009.png +0 -0
- package/web/grain-art/mcps/mcps-010.png +0 -0
- package/web/grain-art/mcps/mcps-011.png +0 -0
- package/web/grain-art/mcps/mcps-012.png +0 -0
- package/web/grain-art/mcps/mcps-013.png +0 -0
- package/web/grain-art/mcps/mcps-014.png +0 -0
- package/web/grain-art/mcps/mcps-015.png +0 -0
- package/web/grain-art/mcps/mcps-016.png +0 -0
- package/web/grain-art/mcps/mcps-017.png +0 -0
- package/web/grain-art/mcps/mcps-018.png +0 -0
- package/web/grain-art/mcps/mcps-019.png +0 -0
- package/web/grain-art/mcps/mcps-020.png +0 -0
- package/web/grain-art/mcps/mcps-021.png +0 -0
- package/web/grain-art/mcps/mcps-022.png +0 -0
- package/web/grain-art/mcps/mcps-023.png +0 -0
- package/web/grain-art/mcps/mcps-024.png +0 -0
- package/web/grain-art/mcps/mcps-025.png +0 -0
- package/web/grain-art/mcps/mcps-026.png +0 -0
- package/web/grain-art/mcps/mcps-027.png +0 -0
- package/web/grain-art/mcps/mcps-028.png +0 -0
- package/web/grain-art/mcps/mcps-029.png +0 -0
- package/web/grain-art/mcps/mcps-030.png +0 -0
- package/web/grain-art/mcps/mcps-031.png +0 -0
- package/web/grain-art/mcps/mcps-032.png +0 -0
- package/web/grain-art/plugins/plugins-001.png +0 -0
- package/web/grain-art/plugins/plugins-002.png +0 -0
- package/web/grain-art/plugins/plugins-003.png +0 -0
- package/web/grain-art/plugins/plugins-004.png +0 -0
- package/web/grain-art/plugins/plugins-005.png +0 -0
- package/web/grain-art/plugins/plugins-006.png +0 -0
- package/web/grain-art/plugins/plugins-007.png +0 -0
- package/web/grain-art/plugins/plugins-008.png +0 -0
- package/web/grain-art/plugins/plugins-009.png +0 -0
- package/web/grain-art/plugins/plugins-010.png +0 -0
- package/web/grain-art/plugins/plugins-011.png +0 -0
- package/web/grain-art/plugins/plugins-012.png +0 -0
- package/web/grain-art/plugins/plugins-013.png +0 -0
- package/web/grain-art/plugins/plugins-014.png +0 -0
- package/web/grain-art/plugins/plugins-015.png +0 -0
- package/web/grain-art/plugins/plugins-016.png +0 -0
- package/web/grain-art/plugins/plugins-017.png +0 -0
- package/web/grain-art/plugins/plugins-018.png +0 -0
- package/web/grain-art/plugins/plugins-019.png +0 -0
- package/web/grain-art/plugins/plugins-020.png +0 -0
- package/web/grain-art/plugins/plugins-021.png +0 -0
- package/web/grain-art/plugins/plugins-022.png +0 -0
- package/web/grain-art/plugins/plugins-023.png +0 -0
- package/web/grain-art/plugins/plugins-024.png +0 -0
- package/web/grain-art/plugins/plugins-025.png +0 -0
- package/web/grain-art/plugins/plugins-026.png +0 -0
- package/web/grain-art/plugins/plugins-027.png +0 -0
- package/web/grain-art/plugins/plugins-028.png +0 -0
- package/web/grain-art/plugins/plugins-029.png +0 -0
- package/web/grain-art/plugins/plugins-030.png +0 -0
- package/web/grain-art/plugins/plugins-031.png +0 -0
- package/web/grain-art/plugins/plugins-032.png +0 -0
- package/web/grain-art/skills/skills-001.png +0 -0
- package/web/grain-art/skills/skills-002.png +0 -0
- package/web/grain-art/skills/skills-003.png +0 -0
- package/web/grain-art/skills/skills-004.png +0 -0
- package/web/grain-art/skills/skills-005.png +0 -0
- package/web/grain-art/skills/skills-006.png +0 -0
- package/web/grain-art/skills/skills-007.png +0 -0
- package/web/grain-art/skills/skills-008.png +0 -0
- package/web/grain-art/skills/skills-009.png +0 -0
- package/web/grain-art/skills/skills-010.png +0 -0
- package/web/grain-art/skills/skills-011.png +0 -0
- package/web/grain-art/skills/skills-012.png +0 -0
- package/web/grain-art/skills/skills-013.png +0 -0
- package/web/grain-art/skills/skills-014.png +0 -0
- package/web/grain-art/skills/skills-015.png +0 -0
- package/web/grain-art/skills/skills-016.png +0 -0
- package/web/grain-art/skills/skills-017.png +0 -0
- package/web/grain-art/skills/skills-018.png +0 -0
- package/web/grain-art/skills/skills-019.png +0 -0
- package/web/grain-art/skills/skills-020.png +0 -0
- package/web/grain-art/skills/skills-021.png +0 -0
- package/web/grain-art/skills/skills-022.png +0 -0
- package/web/grain-art/skills/skills-023.png +0 -0
- package/web/grain-art/skills/skills-024.png +0 -0
- package/web/grain-art/skills/skills-025.png +0 -0
- package/web/grain-art/skills/skills-026.png +0 -0
- package/web/grain-art/skills/skills-027.png +0 -0
- package/web/grain-art/skills/skills-028.png +0 -0
- package/web/grain-art/skills/skills-029.png +0 -0
- package/web/grain-art/skills/skills-030.png +0 -0
- package/web/grain-art/skills/skills-031.png +0 -0
- package/web/grain-art/skills/skills-032.png +0 -0
- package/web/grain-art/workspaces/workspaces-001.png +0 -0
- package/web/grain-art/workspaces/workspaces-002.png +0 -0
- package/web/grain-art/workspaces/workspaces-003.png +0 -0
- package/web/grain-art/workspaces/workspaces-004.png +0 -0
- package/web/grain-art/workspaces/workspaces-005.png +0 -0
- package/web/grain-art/workspaces/workspaces-006.png +0 -0
- package/web/grain-art/workspaces/workspaces-007.png +0 -0
- package/web/grain-art/workspaces/workspaces-008.png +0 -0
- package/web/grain-art/workspaces/workspaces-009.png +0 -0
- package/web/grain-art/workspaces/workspaces-010.png +0 -0
- package/web/grain-art/workspaces/workspaces-011.png +0 -0
- package/web/grain-art/workspaces/workspaces-012.png +0 -0
- package/web/grain-art/workspaces/workspaces-013.png +0 -0
- package/web/grain-art/workspaces/workspaces-014.png +0 -0
- package/web/grain-art/workspaces/workspaces-015.png +0 -0
- package/web/grain-art/workspaces/workspaces-016.png +0 -0
- package/web/grain-art/workspaces/workspaces-017.png +0 -0
- package/web/grain-art/workspaces/workspaces-018.png +0 -0
- package/web/grain-art/workspaces/workspaces-019.png +0 -0
- package/web/grain-art/workspaces/workspaces-020.png +0 -0
- package/web/grain-art/workspaces/workspaces-021.png +0 -0
- package/web/grain-art/workspaces/workspaces-022.png +0 -0
- package/web/grain-art/workspaces/workspaces-023.png +0 -0
- package/web/grain-art/workspaces/workspaces-024.png +0 -0
- package/web/grain-art/workspaces/workspaces-025.png +0 -0
- package/web/grain-art/workspaces/workspaces-026.png +0 -0
- package/web/grain-art/workspaces/workspaces-027.png +0 -0
- package/web/grain-art/workspaces/workspaces-028.png +0 -0
- package/web/grain-art/workspaces/workspaces-029.png +0 -0
- package/web/grain-art/workspaces/workspaces-030.png +0 -0
- package/web/grain-art/workspaces/workspaces-031.png +0 -0
- package/web/grain-art/workspaces/workspaces-032.png +0 -0
- package/web/index.html +129 -0
- package/web/manifest.webmanifest +22 -0
- package/web/openwork-logo-square.svg +2 -0
- package/web/openwork-logo.svg +1 -0
- package/web/openwork-mark.svg +16 -0
- package/web/openwork-sidebar-mark.svg +17 -0
- package/web/overlay.html +29 -0
package/README.md
CHANGED
|
@@ -11,6 +11,36 @@ openwork-server --workspace /path/to/workspace --approval auto
|
|
|
11
11
|
|
|
12
12
|
`openwork-server` ships as a compiled binary, so Bun is not required at runtime.
|
|
13
13
|
|
|
14
|
+
### Self-hosted web UI
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install -g openwork-server
|
|
18
|
+
cd /path/to/workspace
|
|
19
|
+
openwork-server web --open
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`openwork-server web` serves the OpenWork web UI and API from one origin and
|
|
23
|
+
runs a server-managed OpenCode engine. The npm package bundles the UI and the
|
|
24
|
+
OpenCode plugins; on first run it downloads the exact OpenCode version this
|
|
25
|
+
release was tested with into `~/.openwork/openwork-server/engines/` and reuses
|
|
26
|
+
it afterwards. Updating is `npm i -g openwork-server@latest`; the server prints
|
|
27
|
+
a hint on boot when a newer release exists (`OPENWORK_NO_UPDATE_CHECK=1` to
|
|
28
|
+
silence).
|
|
29
|
+
|
|
30
|
+
Defaults in `web` mode: bind `127.0.0.1`, approval `auto`, workspace = current
|
|
31
|
+
directory, and the browser is signed in automatically via a bootstrap token
|
|
32
|
+
(pass `--no-bootstrap-token` to require pasting the client token). Tokens are
|
|
33
|
+
persisted in `~/.openwork/openwork-server/web-tokens.json` so they survive
|
|
34
|
+
restarts; `--token`/`--host-token` or `OPENWORK_TOKEN`/`OPENWORK_HOST_TOKEN`
|
|
35
|
+
override them.
|
|
36
|
+
|
|
37
|
+
To reach it from other machines, keep the server on `127.0.0.1` and put a TLS
|
|
38
|
+
proxy in front (e.g. `tailscale serve --bg --https=8787 http://127.0.0.1:8787`).
|
|
39
|
+
Browsers require a secure context for the UI on any non-localhost origin.
|
|
40
|
+
Set `OPENWORK_OPENCODE_BIN` to use your own OpenCode install instead of the
|
|
41
|
+
managed download; `/health` reports both the pinned `opencodeVersion` and the
|
|
42
|
+
`opencodeInstalledVersion` actually running.
|
|
43
|
+
|
|
14
44
|
Or from source:
|
|
15
45
|
|
|
16
46
|
```bash
|
package/bin/openwork-server.mjs
CHANGED
|
@@ -14,7 +14,9 @@ const builtCli = fileURLToPath(new URL("./dist/cli.js", `${new URL("../", import
|
|
|
14
14
|
const sourceCli = fileURLToPath(new URL("./src/cli.ts", `${new URL("../", import.meta.url)}`));
|
|
15
15
|
|
|
16
16
|
function run(command, commandArgs) {
|
|
17
|
-
|
|
17
|
+
// Lets `openwork-server web` find the bundled web UI and plugins next to this launcher.
|
|
18
|
+
const env = { ...process.env, OPENWORK_PACKAGE_ROOT: process.env.OPENWORK_PACKAGE_ROOT ?? packageRoot };
|
|
19
|
+
const result = spawnSync(command, commandArgs, { stdio: "inherit", env });
|
|
18
20
|
if (result.error) {
|
|
19
21
|
if (result.error.code === "ENOENT") {
|
|
20
22
|
console.error(`Missing runtime dependency: ${command}`);
|
package/dist/bin/openwork-server
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/dist/bin/openwork-server
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 107054076 bytes
|
|
4
|
+
sha256: dcc228940a40da8e36e1b949c5d01041c0602c4c0185de6f1d8990e3bbdda1e0
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kent-style instruction primitives for OpenWork system-prompt composition.
|
|
3
|
+
*
|
|
4
|
+
* create — build one named section
|
|
5
|
+
* combine — merge sections in order, one id wins (first non-empty)
|
|
6
|
+
* delete — drop a section by id
|
|
7
|
+
* expand — replace a section body with derived text when present
|
|
8
|
+
* compose — combine sections and return their prompt bodies
|
|
9
|
+
*
|
|
10
|
+
* Sections are the unit of overlap control: routing/tools/skills/session each
|
|
11
|
+
* own one id so transforms stop stacking contradictory brochure text.
|
|
12
|
+
*/
|
|
13
|
+
export function createInstructionSection(id, body) {
|
|
14
|
+
return { id, body: body.trim() };
|
|
15
|
+
}
|
|
16
|
+
export function combineInstructionSections(...groups) {
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
const combined = [];
|
|
19
|
+
for (const group of groups) {
|
|
20
|
+
if (!group)
|
|
21
|
+
continue;
|
|
22
|
+
const sections = Array.isArray(group) ? group : [group];
|
|
23
|
+
for (const section of sections) {
|
|
24
|
+
if (!section.body || seen.has(section.id))
|
|
25
|
+
continue;
|
|
26
|
+
seen.add(section.id);
|
|
27
|
+
combined.push(section);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return combined;
|
|
31
|
+
}
|
|
32
|
+
export function deleteInstructionSection(sections, id) {
|
|
33
|
+
return sections.filter((section) => section.id !== id);
|
|
34
|
+
}
|
|
35
|
+
export function expandInstructionSection(sections, id, expand) {
|
|
36
|
+
return sections.map((section) => (section.id === id
|
|
37
|
+
? { ...section, body: expand(section.body).trim() }
|
|
38
|
+
: section)).filter((section) => section.body.length > 0);
|
|
39
|
+
}
|
|
40
|
+
export function composeAgentInstructions(...groups) {
|
|
41
|
+
const seen = new Set();
|
|
42
|
+
const instructions = [];
|
|
43
|
+
for (const group of groups) {
|
|
44
|
+
if (!group)
|
|
45
|
+
continue;
|
|
46
|
+
const sections = Array.isArray(group) ? group : [group];
|
|
47
|
+
for (const section of sections) {
|
|
48
|
+
if (seen.has(section.id))
|
|
49
|
+
continue;
|
|
50
|
+
const body = section.body;
|
|
51
|
+
if (!body)
|
|
52
|
+
continue;
|
|
53
|
+
seen.add(section.id);
|
|
54
|
+
instructions.push(body);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return instructions;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extend the engine's system prompt in place from an
|
|
61
|
+
* `experimental.chat.system.transform` hook.
|
|
62
|
+
*
|
|
63
|
+
* OpenCode sends every entry of `system` as its own `role: "system"` message.
|
|
64
|
+
* Several chat templates behind OpenAI-compatible endpoints reject any system
|
|
65
|
+
* message after the first ("System message must be at the beginning."), so
|
|
66
|
+
* OpenWork folds its instructions into the existing entry instead of pushing a
|
|
67
|
+
* second one. The engine alone sends a single system message; this keeps that
|
|
68
|
+
* shape intact. Sections are separated by a blank line so each heading starts
|
|
69
|
+
* its own paragraph instead of trailing the previous sentence.
|
|
70
|
+
*/
|
|
71
|
+
export function appendAgentInstructions(system, ...groups) {
|
|
72
|
+
const body = composeAgentInstructions(...groups).join("\n\n");
|
|
73
|
+
if (!body)
|
|
74
|
+
return;
|
|
75
|
+
const last = system.length - 1;
|
|
76
|
+
if (last < 0) {
|
|
77
|
+
system.push(body);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
system[last] = system[last] ? `${system[last]}\n\n${body}` : body;
|
|
81
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const draftSchema = z.object({
|
|
3
|
+
to: z.string().trim().min(3).max(320),
|
|
4
|
+
cc: z.string().trim().min(3).max(1_000).optional(),
|
|
5
|
+
bcc: z.string().trim().min(3).max(1_000).optional(),
|
|
6
|
+
subject: z.string().trim().min(1).max(500),
|
|
7
|
+
body: z.string().min(1).max(50_000),
|
|
8
|
+
threadId: z.string().trim().min(1).max(512).optional(),
|
|
9
|
+
attachments: z.array(z.string().min(1).refine((path) => path.trim().length > 0 && !path.includes("\0"))).min(1).max(10),
|
|
10
|
+
}).strict().refine((draft) => !/^\s*(re|fwd?)\s*:/i.test(draft.subject) || !!draft.threadId);
|
|
11
|
+
const markerSchema = z.object({
|
|
12
|
+
ok: z.literal(false),
|
|
13
|
+
error: z.literal("file_input_requires_host"),
|
|
14
|
+
created: z.literal(false),
|
|
15
|
+
message: z.string(),
|
|
16
|
+
}).strict();
|
|
17
|
+
// Strip unexpected fields so neither inline bytes nor action descriptors can
|
|
18
|
+
// leak from a transport response into the model-visible draft receipt.
|
|
19
|
+
const receiptSchema = z.object({
|
|
20
|
+
ok: z.literal(true),
|
|
21
|
+
draftId: z.string().trim().min(1),
|
|
22
|
+
messageId: z.string().nullable().optional(),
|
|
23
|
+
draftUrl: z.string().nullable().optional(),
|
|
24
|
+
threadUrl: z.string().nullable().optional(),
|
|
25
|
+
to: z.string().optional(),
|
|
26
|
+
subject: z.string().optional(),
|
|
27
|
+
threadId: z.string().nullable().optional(),
|
|
28
|
+
quotedHistoryIncluded: z.boolean().optional(),
|
|
29
|
+
attachments: z.array(z.object({
|
|
30
|
+
filename: z.string(),
|
|
31
|
+
mimeType: z.string(),
|
|
32
|
+
size: z.number().int().nonnegative(),
|
|
33
|
+
})).optional(),
|
|
34
|
+
});
|
|
35
|
+
function isRecord(value) {
|
|
36
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
37
|
+
}
|
|
38
|
+
function normalizeJson(value) {
|
|
39
|
+
if (typeof value !== "string")
|
|
40
|
+
return value;
|
|
41
|
+
const text = value.trim();
|
|
42
|
+
if (!text.startsWith("{") && !text.startsWith("["))
|
|
43
|
+
return value;
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(text);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const UNKNOWN_OUTCOME = "Gmail draft creation outcome unknown; verify drafts before retrying. Do not retry automatically or create a draft without attachments.";
|
|
52
|
+
const CANCELLED_BEFORE_UPLOAD = "Gmail attachment upload cancelled before dispatch; no draft created.";
|
|
53
|
+
const NATIVE_GMAIL = /^native:(google-workspace|emc_[A-Za-z0-9]+):postCapabilitiesGoogleWorkspaceGmailDrafts$/;
|
|
54
|
+
// These exact code/status pairs are returned before draft creation. In
|
|
55
|
+
// particular, never classify google_api_error, a 5xx, or a lost response here.
|
|
56
|
+
const LOCAL_NO_WRITE = new Set([
|
|
57
|
+
"invalid_payload:400", "file_not_found:404", "file_too_large:413", "files_too_large:413",
|
|
58
|
+
"cloud_not_connected:409", "cloud_endpoint_invalid:409", "gmail_host_unavailable:409",
|
|
59
|
+
"unauthorized:401", "forbidden:403", "gmail_attachment_cancelled:499",
|
|
60
|
+
]);
|
|
61
|
+
const CLOUD_NO_WRITE = new Set([
|
|
62
|
+
"invalid_request:400", "invalid_request:413", "missing_thread_id:400",
|
|
63
|
+
"needs_connection:409", "unauthorized:401", "forbidden:403", "policy_blocked:403",
|
|
64
|
+
"missing_mcp_token:401", "invalid_mcp_token:401", "wrong_token_use:401", "wrong_mcp_resource:401",
|
|
65
|
+
"missing_mcp_principal:401", "mcp_grant_revoked:401", "mcp_session_required:401", "mcp_session_revoked:401",
|
|
66
|
+
"insufficient_mcp_scope:403", "mcp_membership_revoked:403",
|
|
67
|
+
]);
|
|
68
|
+
function noWriteMessage(error) {
|
|
69
|
+
if (!isRecord(error) || typeof error.message !== "string")
|
|
70
|
+
return;
|
|
71
|
+
if (LOCAL_NO_WRITE.has(`${error.code}:${error.status}`))
|
|
72
|
+
return `${error.message} No draft created.`;
|
|
73
|
+
if (error.code === "cloud_upload_failed" && isRecord(error.details)
|
|
74
|
+
&& CLOUD_NO_WRITE.has(`${error.details.upstreamCode}:${error.status}`)) {
|
|
75
|
+
return `${error.message} No draft created.`;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function createGmailAttachmentFulfillment(dependencies, factoryContext = {}) {
|
|
79
|
+
// Retain invocation guards until disposal, including cancelled preflights.
|
|
80
|
+
// A later busy event must not revive a previous call's cancelled controller.
|
|
81
|
+
const calls = new Map();
|
|
82
|
+
const idleSessions = new Set();
|
|
83
|
+
let disposed = false;
|
|
84
|
+
function invocation(sessionID, callID) {
|
|
85
|
+
const key = JSON.stringify([sessionID, callID]);
|
|
86
|
+
const existing = calls.get(key);
|
|
87
|
+
if (existing)
|
|
88
|
+
return existing;
|
|
89
|
+
const call = { sessionID, controller: new AbortController(), attempted: false };
|
|
90
|
+
if (disposed || idleSessions.has(sessionID))
|
|
91
|
+
call.controller.abort();
|
|
92
|
+
calls.set(key, call);
|
|
93
|
+
return call;
|
|
94
|
+
}
|
|
95
|
+
const fulfill = async (input, output) => {
|
|
96
|
+
// OpenCode 1.18.18 McpCatalog.toolName preserves hyphens in server names.
|
|
97
|
+
if (!isRecord(input) || input.tool !== "openwork-cloud_execute_capability")
|
|
98
|
+
return;
|
|
99
|
+
if (!isRecord(input.args) || typeof input.args.name !== "string")
|
|
100
|
+
return;
|
|
101
|
+
const native = NATIVE_GMAIL.exec(input.args.name);
|
|
102
|
+
const connectionId = native?.[1];
|
|
103
|
+
if (!connectionId || !isRecord(output) || output.isError === true)
|
|
104
|
+
return;
|
|
105
|
+
// Only the whole native preflight payload is a marker, never embedded text
|
|
106
|
+
// or a nested descriptor from an external MCP. Conflicting projections fail closed.
|
|
107
|
+
if (!Array.isArray(output.content) || output.content.length !== 1)
|
|
108
|
+
return;
|
|
109
|
+
const part = output.content[0];
|
|
110
|
+
if (!isRecord(part) || part.type !== "text" || typeof part.text !== "string")
|
|
111
|
+
return;
|
|
112
|
+
if (!markerSchema.safeParse(normalizeJson(part.text)).success)
|
|
113
|
+
return;
|
|
114
|
+
if (output.structuredContent !== undefined && !markerSchema.safeParse(output.structuredContent).success)
|
|
115
|
+
return;
|
|
116
|
+
const draft = draftSchema.safeParse(normalizeJson(input.args.body));
|
|
117
|
+
if (!draft.success)
|
|
118
|
+
throw new Error("Invalid Gmail attachment draft arguments; no upload attempted.");
|
|
119
|
+
if (typeof input.sessionID !== "string" || !input.sessionID.trim()
|
|
120
|
+
|| typeof input.callID !== "string" || !input.callID.trim()) {
|
|
121
|
+
throw new Error("Gmail attachment fulfillment requires invocation sessionID and callID; no upload attempted.");
|
|
122
|
+
}
|
|
123
|
+
const call = invocation(input.sessionID, input.callID);
|
|
124
|
+
if (call.attempted)
|
|
125
|
+
throw new Error(`Gmail attachment invocation already attempted. ${UNKNOWN_OUTCOME}`);
|
|
126
|
+
if (call.controller.signal.aborted)
|
|
127
|
+
throw new Error(CANCELLED_BEFORE_UPLOAD);
|
|
128
|
+
call.attempted = true;
|
|
129
|
+
const { attachments, ...fields } = draft.data;
|
|
130
|
+
let result;
|
|
131
|
+
try {
|
|
132
|
+
result = await dependencies.callExtension({
|
|
133
|
+
extensionId: "openwork-cloud-uploads",
|
|
134
|
+
action: "gmail_create_draft_with_attachments",
|
|
135
|
+
args: { ...fields, paths: attachments, connectionId },
|
|
136
|
+
context: { ...factoryContext, sessionId: input.sessionID, callId: input.callID },
|
|
137
|
+
}, call.controller.signal);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const message = noWriteMessage(error);
|
|
141
|
+
if (message)
|
|
142
|
+
throw new Error(message);
|
|
143
|
+
// A lost response cannot prove that Gmail did not create the draft.
|
|
144
|
+
throw new Error(UNKNOWN_OUTCOME);
|
|
145
|
+
}
|
|
146
|
+
if (call.controller.signal.aborted)
|
|
147
|
+
throw new Error(UNKNOWN_OUTCOME);
|
|
148
|
+
if (isRecord(result) && result.ok === false) {
|
|
149
|
+
throw new Error(UNKNOWN_OUTCOME);
|
|
150
|
+
}
|
|
151
|
+
const receipt = receiptSchema.safeParse(result);
|
|
152
|
+
if (!receipt.success)
|
|
153
|
+
throw new Error(UNKNOWN_OUTCOME);
|
|
154
|
+
const text = JSON.stringify(receipt.data);
|
|
155
|
+
// The pinned engine projects content AFTER this hook, not output. Keep
|
|
156
|
+
// both consistent for consumers that already have a text projection.
|
|
157
|
+
output.content = [{ type: "text", text }];
|
|
158
|
+
output.structuredContent = receipt.data;
|
|
159
|
+
if ("output" in output)
|
|
160
|
+
output.output = text;
|
|
161
|
+
output.isError = false;
|
|
162
|
+
delete output._meta;
|
|
163
|
+
};
|
|
164
|
+
return Object.assign(fulfill, {
|
|
165
|
+
before: async (input, output) => {
|
|
166
|
+
if (!isRecord(input) || input.tool !== "openwork-cloud_execute_capability"
|
|
167
|
+
|| typeof input.sessionID !== "string" || typeof input.callID !== "string"
|
|
168
|
+
|| !isRecord(output) || !isRecord(output.args) || typeof output.args.name !== "string"
|
|
169
|
+
|| !NATIVE_GMAIL.test(output.args.name))
|
|
170
|
+
return;
|
|
171
|
+
const body = normalizeJson(output.args.body);
|
|
172
|
+
if (isRecord(body) && Array.isArray(body.attachments))
|
|
173
|
+
invocation(input.sessionID, input.callID);
|
|
174
|
+
},
|
|
175
|
+
event: async (input) => {
|
|
176
|
+
// OpenCode 1.18.18 Runner.cancel -> onIdle -> SessionStatus.set;
|
|
177
|
+
// Plugin.event receives { event: { type, properties } }. No input.abort exists.
|
|
178
|
+
if (!isRecord(input) || !isRecord(input.event) || input.event.type !== "session.status")
|
|
179
|
+
return;
|
|
180
|
+
const props = input.event.properties;
|
|
181
|
+
if (!isRecord(props) || typeof props.sessionID !== "string" || !isRecord(props.status))
|
|
182
|
+
return;
|
|
183
|
+
if (props.status.type === "busy")
|
|
184
|
+
idleSessions.delete(props.sessionID);
|
|
185
|
+
if (props.status.type !== "idle")
|
|
186
|
+
return;
|
|
187
|
+
idleSessions.add(props.sessionID);
|
|
188
|
+
for (const call of calls.values()) {
|
|
189
|
+
if (call.sessionID === props.sessionID)
|
|
190
|
+
call.controller.abort();
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
dispose: async () => {
|
|
194
|
+
disposed = true;
|
|
195
|
+
for (const call of calls.values())
|
|
196
|
+
call.controller.abort();
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
function isRecord(value) {
|
|
2
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
function record(value) { return isRecord(value) ? value : {}; }
|
|
5
|
+
export async function checkManagedTool(tool, raw, evaluate = check) {
|
|
6
|
+
const input = record(raw);
|
|
7
|
+
let action;
|
|
8
|
+
if (tool === "bash" || tool === "shell")
|
|
9
|
+
action = "shell";
|
|
10
|
+
else if (["write", "edit", "apply_patch", "patch"].includes(tool))
|
|
11
|
+
action = "file_write";
|
|
12
|
+
else if (tool === "webfetch" || tool === "websearch")
|
|
13
|
+
action = tool;
|
|
14
|
+
else if (tool === "browser_navigate" || tool === "browser_open")
|
|
15
|
+
action = "browser";
|
|
16
|
+
else if (tool === "openwork_execute") {
|
|
17
|
+
if (input.id === "browser.open_url")
|
|
18
|
+
return evaluate("browser", record(input.args));
|
|
19
|
+
if (typeof input.id === "string" && /^(?:plugin|skill|mcp)\.(?:install|add|update|remove)/.test(input.id))
|
|
20
|
+
action = "extensions";
|
|
21
|
+
}
|
|
22
|
+
// Even read-only tools synchronize policy, so unknown identities cannot keep
|
|
23
|
+
// running with a previous member's loaded configuration.
|
|
24
|
+
await evaluate(action ?? "sync", input);
|
|
25
|
+
}
|
|
26
|
+
export async function check(action, input) {
|
|
27
|
+
const base = process.env.OPENWORK_SERVER_URL;
|
|
28
|
+
const token = process.env.OPENWORK_POLICY_TOKEN;
|
|
29
|
+
if (!base || !token)
|
|
30
|
+
throw new Error("OpenWork policy service is unavailable.");
|
|
31
|
+
const response = await fetch(`${base}/managed-policy/evaluate`, {
|
|
32
|
+
method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
|
|
33
|
+
body: JSON.stringify({ action, input }), signal: AbortSignal.timeout(15_000),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const payload = record(await response.json());
|
|
37
|
+
throw new Error(typeof payload.message === "string" ? payload.message : "Your organization blocked this action.");
|
|
38
|
+
}
|
|
39
|
+
}
|