octop 0.1.0.dev0__py3-none-any.whl
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.
- octop/__init__.py +5 -0
- octop/__main__.py +8 -0
- octop/api/__init__.py +1 -0
- octop/api/app.py +204 -0
- octop/api/common/__init__.py +1 -0
- octop/api/common/agent.py +45 -0
- octop/api/common/validators.py +49 -0
- octop/api/common/workspace.py +57 -0
- octop/api/deps.py +144 -0
- octop/api/middleware/__init__.py +1 -0
- octop/api/middleware/jwt_auth.py +40 -0
- octop/api/middleware/setup_lockdown.py +41 -0
- octop/api/openapi_meta.py +145 -0
- octop/api/routers/__init__.py +1 -0
- octop/api/routers/acp.py +301 -0
- octop/api/routers/admin.py +81 -0
- octop/api/routers/agent_files.py +236 -0
- octop/api/routers/agents.py +277 -0
- octop/api/routers/auth.py +101 -0
- octop/api/routers/backup.py +166 -0
- octop/api/routers/browser/__init__.py +16 -0
- octop/api/routers/browser/harness.py +170 -0
- octop/api/routers/browser/sessions.py +607 -0
- octop/api/routers/browser/stream.py +279 -0
- octop/api/routers/channels.py +810 -0
- octop/api/routers/chat/__init__.py +16 -0
- octop/api/routers/chat/history.py +245 -0
- octop/api/routers/chat/models.py +124 -0
- octop/api/routers/chat/routes.py +93 -0
- octop/api/routers/chat/serialize.py +496 -0
- octop/api/routers/chat/sse.py +32 -0
- octop/api/routers/chat/turn.py +228 -0
- octop/api/routers/chat/ws.py +144 -0
- octop/api/routers/connectors.py +651 -0
- octop/api/routers/cron.py +168 -0
- octop/api/routers/envs.py +70 -0
- octop/api/routers/experts.py +167 -0
- octop/api/routers/health.py +23 -0
- octop/api/routers/i18n.py +28 -0
- octop/api/routers/internal_mcp.py +147 -0
- octop/api/routers/mbti.py +764 -0
- octop/api/routers/observability.py +84 -0
- octop/api/routers/ollama_download_store.py +130 -0
- octop/api/routers/ollama_models.py +227 -0
- octop/api/routers/plugins.py +152 -0
- octop/api/routers/preferences.py +41 -0
- octop/api/routers/providers.py +317 -0
- octop/api/routers/security.py +193 -0
- octop/api/routers/setup.py +276 -0
- octop/api/routers/skills.py +758 -0
- octop/api/routers/slash.py +74 -0
- octop/api/routers/storage_backends.py +213 -0
- octop/api/routers/terminal.py +368 -0
- octop/api/routers/tls.py +112 -0
- octop/api/routers/update.py +198 -0
- octop/api/routers/update_store.py +69 -0
- octop/api/routers/usage.py +94 -0
- octop/api/routers/users.py +129 -0
- octop/api/routers/voice.py +234 -0
- octop/api/routers/workspace.py +374 -0
- octop/cli/__init__.py +1 -0
- octop/cli/_chat_render.py +330 -0
- octop/cli/_chat_turn.py +13 -0
- octop/cli/_cli_db.py +154 -0
- octop/cli/_client.py +194 -0
- octop/cli/_ctx.py +59 -0
- octop/cli/_feishu_creator.py +83 -0
- octop/cli/_prompts.py +54 -0
- octop/cli/_qr.py +167 -0
- octop/cli/_repl_session.py +58 -0
- octop/cli/_repl_toolbar.py +17 -0
- octop/cli/_state.py +35 -0
- octop/cli/_stub.py +24 -0
- octop/cli/acp_cmd.py +63 -0
- octop/cli/admin_cmd.py +127 -0
- octop/cli/agent_cmd.py +221 -0
- octop/cli/backup_cmd.py +80 -0
- octop/cli/channel_cmd.py +511 -0
- octop/cli/chat_cmd.py +30 -0
- octop/cli/chats_cmd.py +354 -0
- octop/cli/clean_cmd.py +42 -0
- octop/cli/completion_cmd.py +58 -0
- octop/cli/config_cmd.py +39 -0
- octop/cli/cron_cmd.py +121 -0
- octop/cli/init_cmd.py +121 -0
- octop/cli/main.py +121 -0
- octop/cli/models_cmd.py +297 -0
- octop/cli/plugin_cmd.py +72 -0
- octop/cli/provider_cmd.py +120 -0
- octop/cli/run_cmd.py +131 -0
- octop/cli/server_cmd.py +48 -0
- octop/cli/skills_cmd.py +146 -0
- octop/cli/update_cmd.py +68 -0
- octop/cli/user_cmd.py +160 -0
- octop/cli/version_cmd.py +17 -0
- octop/config.py +296 -0
- octop/dashboard/apple-touch-icon.png +0 -0
- octop/dashboard/assets/CardSkeleton.30rAhKS-.js +1 -0
- octop/dashboard/assets/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
- octop/dashboard/assets/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
- octop/dashboard/assets/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
- octop/dashboard/assets/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
- octop/dashboard/assets/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
- octop/dashboard/assets/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
- octop/dashboard/assets/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
- octop/dashboard/assets/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
- octop/dashboard/assets/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
- octop/dashboard/assets/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
- octop/dashboard/assets/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
- octop/dashboard/assets/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
- octop/dashboard/assets/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
- octop/dashboard/assets/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
- octop/dashboard/assets/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
- octop/dashboard/assets/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
- octop/dashboard/assets/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
- octop/dashboard/assets/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
- octop/dashboard/assets/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
- octop/dashboard/assets/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
- octop/dashboard/assets/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
- octop/dashboard/assets/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
- octop/dashboard/assets/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
- octop/dashboard/assets/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
- octop/dashboard/assets/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
- octop/dashboard/assets/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Script-Regular.D5yQViql.woff +0 -0
- octop/dashboard/assets/KaTeX_Size1-Regular.C195tn64.woff +0 -0
- octop/dashboard/assets/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
- octop/dashboard/assets/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
- octop/dashboard/assets/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
- octop/dashboard/assets/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
- octop/dashboard/assets/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
- octop/dashboard/assets/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
- octop/dashboard/assets/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
- octop/dashboard/assets/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
- octop/dashboard/assets/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
- octop/dashboard/assets/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
- octop/dashboard/assets/PageShell.CKvKZwMf.css +1 -0
- octop/dashboard/assets/PageShell.CYa_9Pj-.js +1 -0
- octop/dashboard/assets/anthropic.hp89qtrg.png +0 -0
- octop/dashboard/assets/arc.Cl2HwFRm.js +1 -0
- octop/dashboard/assets/architectureDiagram-3BPJPVTR.eadRtRG0.js +36 -0
- octop/dashboard/assets/band.CudBVStT.js +1 -0
- octop/dashboard/assets/blockDiagram-GPEHLZMM.CFzZeQPP.js +132 -0
- octop/dashboard/assets/c4Diagram-AAUBKEIU.glG-rBlj.js +10 -0
- octop/dashboard/assets/channel.Tnvc-QZR.js +1 -0
- octop/dashboard/assets/chunk-2J33WTMH.QcG8AiHb.js +1 -0
- octop/dashboard/assets/chunk-4BX2VUAB.CzTG6JmE.js +1 -0
- octop/dashboard/assets/chunk-55IACEB6.HStMUyMv.js +1 -0
- octop/dashboard/assets/chunk-727SXJPM.CJwn-iid.js +206 -0
- octop/dashboard/assets/chunk-AQP2D5EJ.A9Nrnth_.js +231 -0
- octop/dashboard/assets/chunk-FMBD7UC4.CMSPrfxF.js +15 -0
- octop/dashboard/assets/chunk-ND2GUHAM.DH3iHwHo.js +1 -0
- octop/dashboard/assets/chunk-QZHKN3VN.BcGnwoJl.js +1 -0
- octop/dashboard/assets/classDiagram-4FO5ZUOK.CG3lADpb.js +1 -0
- octop/dashboard/assets/classDiagram-v2-Q7XG4LA2.CG3lADpb.js +1 -0
- octop/dashboard/assets/codebuddy.CQQPq5E1.png +0 -0
- octop/dashboard/assets/constants.BYIQ2ClJ.js +1 -0
- octop/dashboard/assets/cose-bilkent-S5V4N54A.G3gINKU0.js +1 -0
- octop/dashboard/assets/cytoscape.esm.DqnC6J6I.js +331 -0
- octop/dashboard/assets/dagre-BM42HDAG.Znv6Zq9M.js +4 -0
- octop/dashboard/assets/dashscope.ClgxyOUM.png +0 -0
- octop/dashboard/assets/deepseek.BfIKgrKz.png +0 -0
- octop/dashboard/assets/defaultLocale.CcTwRAjA.js +1 -0
- octop/dashboard/assets/diagram-2AECGRRQ.3XVe1v0y.js +43 -0
- octop/dashboard/assets/diagram-5GNKFQAL.7YvbeyUl.js +10 -0
- octop/dashboard/assets/diagram-KO2AKTUF.CdUJQsTu.js +3 -0
- octop/dashboard/assets/diagram-LMA3HP47.DST4MQVG.js +24 -0
- octop/dashboard/assets/diagram-OG6HWLK6.D6zja04U.js +24 -0
- octop/dashboard/assets/erDiagram-TEJ5UH35.DgVn-Uwb.js +85 -0
- octop/dashboard/assets/feishu.yzJIGqLk.svg +1 -0
- octop/dashboard/assets/fileTreeIcon.acLzE26c.js +1 -0
- octop/dashboard/assets/flowDiagram-I6XJVG4X.D0MjS4p8.js +162 -0
- octop/dashboard/assets/ganttDiagram-6RSMTGT7.D8CQYZm_.js +292 -0
- octop/dashboard/assets/gitGraphDiagram-PVQCEYII.DX4yW5qz.js +106 -0
- octop/dashboard/assets/graph.Bad5vU0y.js +1 -0
- octop/dashboard/assets/groq.DxjL3oyr.png +0 -0
- octop/dashboard/assets/index.4xI3byn0.js +2 -0
- octop/dashboard/assets/index.B1fbxz08.js +1 -0
- octop/dashboard/assets/index.BAjo2GUc.css +1 -0
- octop/dashboard/assets/index.BG_6T3dn.css +1 -0
- octop/dashboard/assets/index.BdNZdymJ.js +5 -0
- octop/dashboard/assets/index.Bl7ZGsUK.css +1 -0
- octop/dashboard/assets/index.Bnrw5Sb2.js +1 -0
- octop/dashboard/assets/index.BpVsbwuO.css +1 -0
- octop/dashboard/assets/index.Btz3EUg4.css +1 -0
- octop/dashboard/assets/index.C0urAYZ6.css +1 -0
- octop/dashboard/assets/index.CASf_0TK.css +1 -0
- octop/dashboard/assets/index.CEWg4gyY.css +1 -0
- octop/dashboard/assets/index.CGtg8EsR.js +2 -0
- octop/dashboard/assets/index.CHqnSOwi.js +9 -0
- octop/dashboard/assets/index.CLJms_eO.css +1 -0
- octop/dashboard/assets/index.CNewRfr0.js +1 -0
- octop/dashboard/assets/index.COrVJkIe.js +11 -0
- octop/dashboard/assets/index.CP8dlkp_.js +1 -0
- octop/dashboard/assets/index.Ch36pMuX.js +1 -0
- octop/dashboard/assets/index.CimF3E3G.js +2 -0
- octop/dashboard/assets/index.CulANnwd.css +1 -0
- octop/dashboard/assets/index.D239sZTY.js +57 -0
- octop/dashboard/assets/index.D9qLDt6I.js +1 -0
- octop/dashboard/assets/index.DCLNobHW.css +1 -0
- octop/dashboard/assets/index.D_ph3bZl.css +1 -0
- octop/dashboard/assets/index.DheamfNW.js +5 -0
- octop/dashboard/assets/index.DjvK7nUh.css +1 -0
- octop/dashboard/assets/index.Dlve_rSO.js +93 -0
- octop/dashboard/assets/index.DxZfFW_G.js +6 -0
- octop/dashboard/assets/index.Rlfcrogd.js +1 -0
- octop/dashboard/assets/index.TprDt3nU.js +1 -0
- octop/dashboard/assets/index.VmfrCmRb.js +1 -0
- octop/dashboard/assets/index.aF0t2U6g.js +1 -0
- octop/dashboard/assets/index.cis3wmyt.css +1 -0
- octop/dashboard/assets/index.kFsyBpab.js +1 -0
- octop/dashboard/assets/index.module.CXlCdyLH.js +1 -0
- octop/dashboard/assets/index.module.D-vNudb_.js +1 -0
- octop/dashboard/assets/index.smnqylM0.js +1 -0
- octop/dashboard/assets/index.te6A7T69.css +1 -0
- octop/dashboard/assets/infoDiagram-5YYISTIA.cRdgBzuF.js +2 -0
- octop/dashboard/assets/init.DDlSWoZO.js +1 -0
- octop/dashboard/assets/ishikawaDiagram-YF4QCWOH.CiMYHEHO.js +70 -0
- octop/dashboard/assets/journeyDiagram-JHISSGLW.BDtXEn5s.js +139 -0
- octop/dashboard/assets/kanban-definition-UN3LZRKU.BNa2MaBb.js +89 -0
- octop/dashboard/assets/layout.CYcqwDbi.js +1 -0
- octop/dashboard/assets/linear.CWEflT9X.js +1 -0
- octop/dashboard/assets/markdown.B5dQ-dwW.js +1 -0
- octop/dashboard/assets/mermaid.core.58x0H9Is.js +309 -0
- octop/dashboard/assets/mimo.pbhfe3Fd.svg +17 -0
- octop/dashboard/assets/mindmap-definition-RKZ34NQL.ZufY01A0.js +96 -0
- octop/dashboard/assets/minimax.B0Eo-1V9.png +0 -0
- octop/dashboard/assets/modelscope.CJyewHiF.png +0 -0
- octop/dashboard/assets/moonshot.DRX5773U.webp +0 -0
- octop/dashboard/assets/mqtt.IKSdJE9d.png +0 -0
- octop/dashboard/assets/octop.tjp5Yqxl.svg +113 -0
- octop/dashboard/assets/ollama.BiKnEc5r.png +0 -0
- octop/dashboard/assets/openai.-2_yMGcs.png +0 -0
- octop/dashboard/assets/openrouter.CT0jBAsT.png +0 -0
- octop/dashboard/assets/ordinal.djD5ulR0.js +1 -0
- octop/dashboard/assets/pieDiagram-4H26LBE5.C2YofDJz.js +30 -0
- octop/dashboard/assets/quadrantDiagram-W4KKPZXB.oAfFXx_t.js +7 -0
- octop/dashboard/assets/requirementDiagram-4Y6WPE33.DbEggKHD.js +84 -0
- octop/dashboard/assets/sankeyDiagram-5OEKKPKP.BdVKDd9W.js +40 -0
- octop/dashboard/assets/sequenceDiagram-3UESZ5HK.BejYSZeY.js +162 -0
- octop/dashboard/assets/stateDiagram-AJRCARHV.B9DhiTvi.js +1 -0
- octop/dashboard/assets/stateDiagram-v2-BHNVJYJU.DTGniJVN.js +1 -0
- octop/dashboard/assets/step.2vt-w7iF.js +1 -0
- octop/dashboard/assets/sw-register.CCP-LE6W.js +1 -0
- octop/dashboard/assets/tencent-ima.DBik34z0.png +0 -0
- octop/dashboard/assets/tencent-lexiang.DQ8U6HGW.png +0 -0
- octop/dashboard/assets/time.D3fWl3Po.js +1 -0
- octop/dashboard/assets/timeline-definition-PNZ67QCA.DTgOcay1.js +120 -0
- octop/dashboard/assets/useStorageBackends.CedKppyD.js +1 -0
- octop/dashboard/assets/vendor-antd.BsSrZIW6.js +441 -0
- octop/dashboard/assets/vendor-icons.CE8oId9T.js +676 -0
- octop/dashboard/assets/vendor-markdown.CGehU_hi.js +297 -0
- octop/dashboard/assets/vendor-markdown.DVjVcbQd.css +1 -0
- octop/dashboard/assets/vendor-react.C7arMZQ3.js +51 -0
- octop/dashboard/assets/vendor-utils.eg3kvSM3.js +9 -0
- octop/dashboard/assets/vendor-xterm.BnL5uhB6.js +9 -0
- octop/dashboard/assets/vendor-xterm.DYP7pi_n.css +32 -0
- octop/dashboard/assets/vennDiagram-CIIHVFJN.CPbmYMe4.js +34 -0
- octop/dashboard/assets/wardley-L42UT6IY.DowHOmdw.js +173 -0
- octop/dashboard/assets/wardleyDiagram-YWT4CUSO.BSJG-6Ts.js +78 -0
- octop/dashboard/assets/xiaoyi.sDsAd89K.png +0 -0
- octop/dashboard/assets/xychartDiagram-2RQKCTM6.R6aKT3E4.js +7 -0
- octop/dashboard/assets/zhipu.CFgqzqwQ.png +0 -0
- octop/dashboard/fonts/FSPixelSansUnicode-Regular.ttf +0 -0
- octop/dashboard/index.html +47 -0
- octop/dashboard/lightclaw-symbol-blue.png +0 -0
- octop/dashboard/lightclaw-symbol.png +0 -0
- octop/dashboard/lightclaw_name.png +0 -0
- octop/dashboard/lightclaw_name_dark.png +0 -0
- octop/dashboard/logo.png +0 -0
- octop/dashboard/manifest.json +39 -0
- octop/dashboard/octop-symbol-blue.png +0 -0
- octop/dashboard/octop-symbol.png +0 -0
- octop/dashboard/octop_name.png +0 -0
- octop/dashboard/octop_name_dark.png +0 -0
- octop/dashboard/offline.html +74 -0
- octop/dashboard/pcm-processor.js +67 -0
- octop/dashboard/pwa-192.png +0 -0
- octop/dashboard/pwa-512.png +0 -0
- octop/dashboard/sw.js +1 -0
- octop/dashboard/workbox-bdb082da.js +1 -0
- octop/i18n/__init__.py +32 -0
- octop/i18n/domains/__init__.py +18 -0
- octop/i18n/domains/channel.py +16 -0
- octop/i18n/domains/errors.py +12 -0
- octop/i18n/domains/slash.py +23 -0
- octop/i18n/domains/tls.py +9 -0
- octop/i18n/domains/tools.py +28 -0
- octop/i18n/en.json +345 -0
- octop/i18n/loader.py +64 -0
- octop/i18n/zh.json +345 -0
- octop/infra/__init__.py +21 -0
- octop/infra/agents/acp_settings.py +117 -0
- octop/infra/agents/connectors/__init__.py +12 -0
- octop/infra/agents/connectors/baidu_token.py +90 -0
- octop/infra/agents/connectors/builder.py +352 -0
- octop/infra/agents/connectors/catalog.py +289 -0
- octop/infra/agents/connectors/crypto.py +28 -0
- octop/infra/agents/connectors/gateway/__init__.py +11 -0
- octop/infra/agents/connectors/gateway/adapters/__init__.py +1 -0
- octop/infra/agents/connectors/gateway/adapters/qq_mail.py +169 -0
- octop/infra/agents/connectors/gateway/adapters/tencent_ima.py +144 -0
- octop/infra/agents/connectors/gateway/adapters/tencent_news.py +65 -0
- octop/infra/agents/connectors/gateway/adapters/wechat_reading.py +85 -0
- octop/infra/agents/connectors/gateway/langchain.py +108 -0
- octop/infra/agents/connectors/gateway/protocol.py +78 -0
- octop/infra/agents/connectors/gateway/registry.py +49 -0
- octop/infra/agents/connectors/oauth/__init__.py +31 -0
- octop/infra/agents/connectors/oauth/baidu.py +239 -0
- octop/infra/agents/connectors/oauth/builtin.py +42 -0
- octop/infra/agents/connectors/oauth/mcp.py +162 -0
- octop/infra/agents/connectors/oauth/pkce.py +14 -0
- octop/infra/agents/connectors/oauth/registry.py +291 -0
- octop/infra/agents/connectors/probe.py +261 -0
- octop/infra/agents/connectors/service.py +129 -0
- octop/infra/agents/context_breakdown.py +251 -0
- octop/infra/agents/experts/catalog.py +185 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/HEARTBEAT.md +225 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/IDENTITY.md +48 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/SOUL.md +123 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/manifest.json +318 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/API.md +167 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/AUDIT-INDEX.txt +171 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/AUDIT-REPORT-2026-05-09.md +410 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/AUDIT-SUMMARY.txt +270 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/COMMAND-SAMPLING-AUDIT.txt +175 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/README.md +161 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/SKILL.md +457 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_archived/SKILL-v1-original.md.bak +1136 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_archived/SKILL-v3-lean.md +420 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_backup/00-quick-reference.md +186 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_backup/00-scenario-index.md +1251 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_backup/disk-smart.md +573 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_backup/hardware-other.md +943 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_backup/resource-saturation.md +848 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_backup/system-logs.md +709 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/_backup/time-sync.md +675 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/cli-seeders/ai-clis.md +3 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/cli-seeders/evaltools.md +7 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/local-ai/audit-local-ai-packages.md +97 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/local-ai/comfyui/setup-comfyui.md +75 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/local-ai/gpu-ai-ml-assessment.md +441 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/local-ai/ollama/prune-ollama.md +14 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/local-ai/ollama/setup-ollama.md +57 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/local-ai/ollama/suggest-ollama-models.md +78 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/mcp/manage-mcp-servers.md +104 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/ai/stt/setup-speech-to-text.md +112 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/audio/mic-always-100.md +5 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/audio/set-as-default-mic.md +2 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/backup/identify-backup-targets.md +109 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/bluetooth/reset-bluetooth.md +330 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/bluetooth/troubleshoot-bluetooth.md +300 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/configuration/bash/add-bash-alias.md +9 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/configuration/bash/validate-bashrc.md +99 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/configuration/check-path.md +209 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/configuration/git/check-git-config.md +103 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/configuration/git/check-global-gitignore.md +145 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/configuration/permissions/debug-folder-permissions.md +234 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/configuration/ssh/list-ssh-connections.md +91 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/configuration/ssh/manage-ssh-keys.md +91 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/debugging/boot/check-boot-logs.md +43 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/debugging/boot/failed-boot-services.md +7 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/debugging/boot/review-boot.md +75 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/debugging/diagnose-crash.md +157 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/debugging/diagnose-slowdown.md +155 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/docker/setup-docker.md +258 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/ides/optimize-vscode-installation.md +131 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/node/node-version-check.md +1 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/node/npm-install.md +1 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/python/conda/manage-conda-environments.md +368 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/python/conda/setup-conda-data-analysis.md +88 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/python/conda/setup-conda-llm-finetune.md +108 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/python/conda/setup-conda-rocm.md +86 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/python/conda/setup-conda-stt-finetune.md +103 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/python/identify-python-environments.md +89 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/python/pyenv/setup-pyenv.md +52 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/sdks/sdk-check.md +2 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/suggest-ides.md +115 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/yadm/check-yadm.md +51 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/dev-tools/yadm/manually-update-yadm.md +49 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/display/capture-current-config.md +8 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/display/list-connected-displays.md +72 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/display/optimize-display-scaling.md +135 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/display/setup-multi-monitor.md +90 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/display/switch-display-profile.md +172 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fonts/install-google-fonts.md +80 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fonts/list-fonts.md +79 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fs-optimisation/chunk/chunk-this-dir.md +5 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fs-optimisation/consolidate/consolidate-folders.md +46 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fs-optimisation/flatten/flatten.md +7 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fs-optimisation/idate/suggest-folder-structure.md +52 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fs-optimisation/separate/separate-by-filetype.md +3 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fs-optimisation/separate/separate-photos-and-video.md +5 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fs-optimisation/tidy-up/desktop-tidy.md +9 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/fs-optimisation/tidy-up/organize-loose-files.md +32 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/check-gpu-os-optimization.md +84 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/evaluate-wake-devices.md +75 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/hardware-profilers/by-component/profile-cpu.md +420 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/hardware-profilers/by-component/profile-gpu.md +357 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/hardware-profilers/by-component/profile-motherboard.md +456 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/hardware-profilers/by-component/profile-ram.md +278 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/hardware-profilers/hardware-identity.md +139 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/hardware-profilers/hardware-profile.md +245 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/hardware/review-gpu-settings.md +104 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/clis/install-brew.md +123 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/clis/install-gh-cli.md +309 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/clis/install-pipx.md +321 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/clis/install-sdkman.md +180 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/clis/install-yadm.md +111 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/clis/setup-aws-cli.md +40 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/clis/setup-b2-cli.md +40 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/clis/setup-rclone.md +41 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/guis/input-remapper.md +1 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/install-from-gh.md +7 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/installation/install-this.md +3 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/kde/backup-kde-settings.md +248 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/kde/list-kde-shortcuts.md +291 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/kde/optimize-kde-performance.md +288 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/kde/reset-plasma-config.md +249 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/logging/analyze-journal-errors.md +118 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/logging/check-failed-units.md +204 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/logging/monitor-system-resources.md +139 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/logging/tail-system-logs.md +115 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/media/check-codecs.md +89 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/network/diagnose-network-issues.md +87 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/network/lan/diagnose-lan-connectivity.md +80 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/network/lan/lan-ssh-setup.md +11 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/network/lan/scan-lan.md +47 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/network/lan/smart-arp.md +17 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/optimisation/large-files.md +7 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/optimisation/optimize-boot-speed.md +73 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/package-management/check-apt-health.md +183 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/package-management/check-third-party-repos.md +54 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/package-management/configure-auto-updates.md +186 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/package-management/evaluate-installed-software.md +50 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/package-management/identify-unused-packages.md +55 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/package-management/install-brew.md +1 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/peripherals/evtest.md +3 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/peripherals/list-usb-devices.md +277 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/power-mgmt/hibernation.md +1 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/power-mgmt/wol-setup.md +14 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/program-management/install-github-program.md +50 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/repositories/delete-old-repos.md +15 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/repositories/organise-repos.md +17 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/security/audits/probe-vulnerabilities.md +59 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/security/audits/write-audit.md +13 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/security/auth/yubi-setup.md +7 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/security/av/install-clamav.md +89 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/security/detect-spyware.md +62 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/security/firewall/analyze-firewall.md +286 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/security/posture-diagnostics/security-posture-check.md +98 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/storage/health-checks/btrfs-snapper-health.md +41 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/storage/health-checks/check-drive-health.md +117 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/storage/health-checks/smart-status.md +43 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/storage/network-mounts/setup-nfs-mounts.md +154 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/storage/network-mounts/setup-smb-mounts.md +201 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/storage/raid/check-raid-config.md +54 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/storage/storage-deep-dive.md +88 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/system-health/optimize-pipewire.md +57 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/system-health/review-startup-services.md +102 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/system-health/system-health-checkup.md +118 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/system-health/system-upgrade.md +21 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/utilities/diagnose-printers.md +54 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/video/codecs.md +1 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/commands/virtualization/check-virtualization.md +318 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/docs/architecture.md +409 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/docs/cvm-doctor-report.html +851 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/docs/scenario-decision-guide.md +302 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/docs/scenario-index-maintenance.md +208 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/examples/cron-job-spec.json +34 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/00-scenario-index.md +457 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/cluster-deep-analysis.md +463 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/cluster-discovery.md +169 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/cluster-health-score.md +173 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/cluster-quick-check.md +230 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/cluster-remediation.md +215 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/cvm-self-diagnosis-repair.md +219 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/disk-smart-deep.md +209 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/disk-smart-quick.md +145 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/hardware-health-deep.md +276 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/hardware-health-quick.md +236 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/resource-saturation-deep-combined.md +345 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/resource-saturation-deep-cpu.md +278 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/resource-saturation-deep-disk.md +343 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/resource-saturation-deep-memory.md +282 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/resource-saturation-deep-network.md +297 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/resource-saturation-quick.md +342 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/skill-collaboration-tencentcloud.md +276 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/skill-collaboration.md +223 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/system-logs-deep-auth.md +111 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/system-logs-deep-fs.md +106 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/system-logs-deep-kernel.md +196 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/system-logs-deep-oom.md +176 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/system-logs-deep-service.md +102 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/system-logs-quick.md +327 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/references/time-sync.md +675 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/README.md +141 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/analyze_stats.sh +287 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_deep_cpu.sh +55 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_deep_disk.sh +56 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_deep_memory.sh +50 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_deep_network.sh +58 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_deep_ssh.sh +53 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_os_snapshot.sh +39 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_patrol_record.py +171 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_patrol_server.py +226 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/cluster_score.sh +292 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/combined_analysis.sh +259 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/deep_scan.sh +452 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/generate_promo.py +53 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/log_stats.sh +36 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/patrol.sh +453 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/patrol_server.py +139 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/quick_scan.ps1 +182 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/quick_scan.sh +415 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/serve_dashboard.sh +57 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/setup-lightclaw-cron.sh +199 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/scripts/sync_skill.sh +136 -0
- octop/infra/agents/experts/library/cvm-ai-doctor/skills/cvm-ai-doctor/version.ini +12 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/HEARTBEAT.md +221 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/IDENTITY.md +53 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/SOUL.md +151 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/manifest.json +333 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/SKILL.md +557 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/_meta.json +6 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/references/auto-check-resource.md +90 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/references/cbs-bindto-cvm.md +437 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/references/cloud-service-healthcheck.md +688 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/references/cvm-security-check.md +192 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/references/lighthouse-app-deploy.md +516 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/references/lighthouse-openclaw-setup.md +154 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/references/lighthouse-website-setup.md +308 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/scripts/tccli-oauth-helper.py +361 -0
- octop/infra/agents/experts/library/cvm-cluster-doctor/skills/tencentcloud-infra/scripts/whoami.sh +17 -0
- octop/infra/agents/experts/library/default/IDENTITY.md +48 -0
- octop/infra/agents/experts/library/default/SOUL.md +48 -0
- octop/infra/agents/experts/library/default/manifest.json +21 -0
- octop/infra/agents/experts/library/general-assistant/MEMORY.md +2 -0
- octop/infra/agents/experts/library/general-assistant/SOUL.md +10 -0
- octop/infra/agents/experts/library/general-assistant/manifest.json +107 -0
- octop/infra/agents/experts/library/general-assistant/meta.yaml +4 -0
- octop/infra/agents/experts/library/general-assistant/skills/octop-assistant/SKILL.md +510 -0
- octop/infra/agents/experts/library/general-assistant/skills.json +1 -0
- octop/infra/agents/experts/library/news-trend/BOOTSTRAP.md +0 -0
- octop/infra/agents/experts/library/news-trend/HEARTBEAT.md +38 -0
- octop/infra/agents/experts/library/news-trend/IDENTITY.md +53 -0
- octop/infra/agents/experts/library/news-trend/SOUL.md +314 -0
- octop/infra/agents/experts/library/news-trend/manifest.json +70 -0
- octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/SKILL.md +247 -0
- octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/references/api-formats.md +105 -0
- octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/references/dailyhot-api.md +183 -0
- octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/references/sources.md +640 -0
- octop/infra/agents/experts/library/news-trend/skills/daily-hot-news/scripts/fetch_dailyhot.mjs +41 -0
- octop/infra/agents/experts/library/office-automation/IDENTITY.md +38 -0
- octop/infra/agents/experts/library/office-automation/SOUL.md +23 -0
- octop/infra/agents/experts/library/office-automation/manifest.json +253 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/LICENSE.txt +30 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/SKILL.md +487 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/__init__.py +1 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/accept_changes.py +134 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/comment.py +317 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/helpers/__init__.py +0 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/helpers/merge_runs.py +192 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/helpers/simplify_redlines.py +196 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/pack.py +155 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/soffice.py +218 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/unpack.py +131 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/validate.py +113 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/validators/__init__.py +15 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/validators/base.py +797 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/validators/docx.py +418 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/validators/pptx.py +262 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/office/validators/redlining.py +240 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/templates/comments.xml +3 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/templates/commentsIds.xml +3 -0
- octop/infra/agents/experts/library/office-automation/skills/docx/scripts/templates/people.xml +3 -0
- octop/infra/agents/experts/library/office-automation/skills/file_reader/SKILL.md +58 -0
- octop/infra/agents/experts/library/office-automation/skills/news/SKILL.md +47 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/LICENSE.txt +30 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/SKILL.md +329 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/forms.md +298 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/reference.md +612 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/scripts/check_bounding_boxes.py +71 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/scripts/check_fillable_fields.py +11 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/scripts/convert_pdf_to_images.py +31 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/scripts/create_validation_image.py +37 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/scripts/extract_form_field_info.py +128 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/scripts/extract_form_structure.py +116 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/scripts/fill_fillable_fields.py +102 -0
- octop/infra/agents/experts/library/office-automation/skills/pdf/scripts/fill_pdf_form_with_annotations.py +105 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/LICENSE.txt +30 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/SKILL.md +238 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/editing.md +209 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/pptxgenjs.md +420 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/__init__.py +0 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/add_slide.py +198 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/clean.py +279 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/helpers/__init__.py +0 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/helpers/merge_runs.py +192 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/helpers/simplify_redlines.py +196 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/pack.py +155 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/soffice.py +216 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/unpack.py +131 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/validate.py +113 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/validators/__init__.py +15 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/validators/base.py +797 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/validators/docx.py +418 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/validators/pptx.py +262 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/office/validators/redlining.py +240 -0
- octop/infra/agents/experts/library/office-automation/skills/pptx/scripts/thumbnail.py +302 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/LICENSE.txt +30 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/SKILL.md +306 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/helpers/merge_runs.py +192 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/helpers/simplify_redlines.py +196 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/pack.py +155 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/soffice.py +216 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/unpack.py +131 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/validate.py +113 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/validators/base.py +797 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/validators/docx.py +418 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/validators/pptx.py +262 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/office/validators/redlining.py +240 -0
- octop/infra/agents/experts/library/office-automation/skills/xlsx/scripts/recalc.py +197 -0
- octop/infra/agents/experts/library/ops-engineer/IDENTITY.md +20 -0
- octop/infra/agents/experts/library/ops-engineer/SOUL.md +9 -0
- octop/infra/agents/experts/library/ops-engineer/manifest.json +65 -0
- octop/infra/agents/experts/library/parenting-companion/AGENTS.md +168 -0
- octop/infra/agents/experts/library/parenting-companion/BOOTSTRAP.md +98 -0
- octop/infra/agents/experts/library/parenting-companion/HEARTBEAT.md +127 -0
- octop/infra/agents/experts/library/parenting-companion/IDENTITY.md +59 -0
- octop/infra/agents/experts/library/parenting-companion/SOUL.md +33 -0
- octop/infra/agents/experts/library/parenting-companion/manifest.json +69 -0
- octop/infra/agents/experts/library/parenting-companion/scripts/check_memory_freshness.sh +81 -0
- octop/infra/agents/experts/library/stock-assistant/HEARTBEAT.md +79 -0
- octop/infra/agents/experts/library/stock-assistant/IDENTITY.md +37 -0
- octop/infra/agents/experts/library/stock-assistant/SOUL.md +252 -0
- octop/infra/agents/experts/library/stock-assistant/manifest.json +69 -0
- octop/infra/agents/experts/library/stock-assistant/skills/stock-info/SKILL.md +154 -0
- octop/infra/agents/experts/library/stock-assistant/skills/stock-info/references/examples.md +65 -0
- octop/infra/agents/experts/library/stock-assistant/skills/stock-info/references/known-issues.md +35 -0
- octop/infra/agents/experts/library/wechat-ops/IDENTITY.md +62 -0
- octop/infra/agents/experts/library/wechat-ops/SOUL.md +39 -0
- octop/infra/agents/experts/library/wechat-ops/manifest.json +72 -0
- octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/IDENTITY.md +45 -0
- octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/SKILL.md +443 -0
- octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/SOUL.md +39 -0
- octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/manifest.yaml +11 -0
- octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/scripts/setup_server.sh +112 -0
- octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/scripts/wechat_publish.py +1080 -0
- octop/infra/agents/experts/library/wechat-ops/skills/publisher-multi-platform/scripts/xhs_publish.py +592 -0
- octop/infra/agents/langfuse.py +166 -0
- octop/infra/agents/manager.py +1275 -0
- octop/infra/agents/mbti_profiles.py +596 -0
- octop/infra/agents/persona.py +109 -0
- octop/infra/agents/plugins/__init__.py +5 -0
- octop/infra/agents/plugins/manager.py +162 -0
- octop/infra/agents/providers/__init__.py +0 -0
- octop/infra/agents/providers/preset_expansion.py +542 -0
- octop/infra/agents/security.py +45 -0
- octop/infra/agents/tool_guard_rules.py +61 -0
- octop/infra/agents/tools/__init__.py +0 -0
- octop/infra/backend/__init__.py +17 -0
- octop/infra/backend/adapter.py +108 -0
- octop/infra/backend/browse.py +56 -0
- octop/infra/backend/probe.py +89 -0
- octop/infra/backend/resolver.py +74 -0
- octop/infra/backup/__init__.py +29 -0
- octop/infra/backup/manifest.py +75 -0
- octop/infra/backup/snapshot.py +49 -0
- octop/infra/backup/store.py +81 -0
- octop/infra/backup/system_archive.py +207 -0
- octop/infra/backup/workspace_archive.py +152 -0
- octop/infra/cron/__init__.py +1 -0
- octop/infra/cron/job.py +109 -0
- octop/infra/cron/manager.py +236 -0
- octop/infra/cron/tools.py +190 -0
- octop/infra/cron/trigger.py +35 -0
- octop/infra/db/__init__.py +1 -0
- octop/infra/db/factory.py +28 -0
- octop/infra/db/migrate.py +45 -0
- octop/infra/db/migrations/001_initial.sql +242 -0
- octop/infra/db/pool.py +55 -0
- octop/infra/db/repos/__init__.py +1 -0
- octop/infra/db/repos/_base.py +79 -0
- octop/infra/db/repos/agents.py +167 -0
- octop/infra/db/repos/audit.py +76 -0
- octop/infra/db/repos/backends.py +152 -0
- octop/infra/db/repos/channels.py +113 -0
- octop/infra/db/repos/connectors.py +219 -0
- octop/infra/db/repos/cron.py +162 -0
- octop/infra/db/repos/providers.py +148 -0
- octop/infra/db/repos/secrets.py +41 -0
- octop/infra/db/repos/sessions.py +231 -0
- octop/infra/db/repos/settings.py +38 -0
- octop/infra/db/repos/threads.py +126 -0
- octop/infra/db/repos/usage.py +279 -0
- octop/infra/db/repos/users.py +110 -0
- octop/infra/db/repos/voice_providers.py +140 -0
- octop/infra/db/services.py +138 -0
- octop/infra/errors.py +133 -0
- octop/infra/gateway/__init__.py +1 -0
- octop/infra/gateway/backend_files.py +436 -0
- octop/infra/gateway/bot_creators/__init__.py +1 -0
- octop/infra/gateway/bot_creators/feishu_bot_creator.py +1482 -0
- octop/infra/gateway/bot_creators/yuanbao_bot_creator.py +480 -0
- octop/infra/gateway/gateway.py +473 -0
- octop/infra/gateway/host_paths.py +96 -0
- octop/infra/gateway/media.py +70 -0
- octop/infra/gateway/process/__init__.py +30 -0
- octop/infra/gateway/process/agent_resolve.py +35 -0
- octop/infra/gateway/process/harness_request.py +213 -0
- octop/infra/gateway/process/message_keys.py +48 -0
- octop/infra/gateway/process/processor.py +475 -0
- octop/infra/gateway/process/slash_ctx.py +5 -0
- octop/infra/gateway/process/stream_project.py +121 -0
- octop/infra/gateway/process/usage_record.py +77 -0
- octop/infra/gateway/processor.py +25 -0
- octop/infra/gateway/slash/__init__.py +17 -0
- octop/infra/gateway/slash/catalog.py +268 -0
- octop/infra/gateway/slash/ctx.py +145 -0
- octop/infra/gateway/slash/dispatcher.py +88 -0
- octop/infra/gateway/slash/formatting.py +52 -0
- octop/infra/gateway/slash/handlers/__init__.py +24 -0
- octop/infra/gateway/slash/handlers/composite.py +252 -0
- octop/infra/gateway/slash/handlers/platform.py +150 -0
- octop/infra/gateway/slash/handlers/session.py +163 -0
- octop/infra/gateway/slash/help.py +25 -0
- octop/infra/gateway/slash/runner.py +44 -0
- octop/infra/gateway/slash/runtime_bridge.py +70 -0
- octop/infra/gateway/slash/types.py +17 -0
- octop/infra/gateway/threads.py +327 -0
- octop/infra/gateway/tool_media.py +581 -0
- octop/infra/gateway/ws/__init__.py +14 -0
- octop/infra/gateway/ws/ws_channel.py +164 -0
- octop/infra/gateway/ws/ws_hub.py +53 -0
- octop/infra/metrics.py +37 -0
- octop/infra/server.py +195 -0
- octop/infra/setup/__init__.py +1 -0
- octop/infra/setup/password_file.py +63 -0
- octop/infra/setup/wizard_tokens.py +67 -0
- octop/infra/tls/__init__.py +7 -0
- octop/infra/tls/acme_issue.py +134 -0
- octop/infra/tls/challenge.py +28 -0
- octop/infra/tls/http_companion.py +43 -0
- octop/infra/tls/listeners.py +62 -0
- octop/infra/tls/manager.py +257 -0
- octop/infra/tls/modes.py +54 -0
- octop/infra/tls/preflight.py +215 -0
- octop/infra/tls/renewal.py +88 -0
- octop/infra/tls/store.py +95 -0
- octop/infra/users/__init__.py +9 -0
- octop/infra/users/identity.py +28 -0
- octop/infra/users/manager.py +202 -0
- octop/infra/users/password.py +21 -0
- octop/infra/utils/__init__.py +1 -0
- octop/infra/utils/browser_media.py +44 -0
- octop/infra/utils/env_file.py +73 -0
- octop/infra/utils/locale.py +83 -0
- octop/infra/utils/ollama_manager.py +178 -0
- octop/infra/utils/paths.py +86 -0
- octop/infra/utils/subprocess_io.py +85 -0
- octop/infra/utils/ulid.py +44 -0
- octop/infra/voice/__init__.py +1 -0
- octop/infra/voice/adapters.py +277 -0
- octop/infra/voice/manager.py +175 -0
- octop/infra/voice/presets.py +54 -0
- octop/infra/voice/tencent_sign.py +57 -0
- octop/launch.py +115 -0
- octop-0.1.0.dev0.dist-info/METADATA +299 -0
- octop-0.1.0.dev0.dist-info/RECORD +915 -0
- octop-0.1.0.dev0.dist-info/WHEEL +4 -0
- octop-0.1.0.dev0.dist-info/entry_points.txt +2 -0
- octop-0.1.0.dev0.dist-info/licenses/LICENSE +21 -0
octop/__init__.py
ADDED
octop/__main__.py
ADDED
octop/api/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
octop/api/app.py
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"""FastAPI app factory."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from collections.abc import Sequence
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from fastapi import FastAPI, HTTPException, Request
|
|
12
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
13
|
+
from fastapi.responses import FileResponse, HTMLResponse, JSONResponse, PlainTextResponse
|
|
14
|
+
from scalar_fastapi import get_scalar_api_reference
|
|
15
|
+
|
|
16
|
+
from octop.api.middleware.jwt_auth import install as install_jwt_auth
|
|
17
|
+
from octop.api.middleware.setup_lockdown import install as install_setup_lockdown
|
|
18
|
+
from octop.api.openapi_meta import API_DESCRIPTION, OPENAPI_TAGS, configure_openapi
|
|
19
|
+
from octop.infra.errors import ErrorCode, OctopError
|
|
20
|
+
from octop.infra.server import OctopServer
|
|
21
|
+
from octop.infra.utils.locale import resolve_request_locale
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass(frozen=True)
|
|
27
|
+
class _RouterMount:
|
|
28
|
+
router: Any
|
|
29
|
+
prefix: str
|
|
30
|
+
tags: Sequence[str]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _mount_routers(app: FastAPI, mounts: Sequence[_RouterMount]) -> None:
|
|
34
|
+
for spec in mounts:
|
|
35
|
+
app.include_router(spec.router, prefix=spec.prefix, tags=list(spec.tags))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _install_exception_handlers(app: FastAPI) -> None:
|
|
39
|
+
@app.exception_handler(OctopError)
|
|
40
|
+
async def _octop(request: Request, exc: OctopError) -> JSONResponse:
|
|
41
|
+
locale = resolve_request_locale(request)
|
|
42
|
+
return JSONResponse(status_code=exc.status, content=exc.to_envelope(locale=locale))
|
|
43
|
+
|
|
44
|
+
@app.exception_handler(Exception)
|
|
45
|
+
async def _unhandled(request: Request, exc: Exception) -> JSONResponse:
|
|
46
|
+
logger.exception("unhandled exception in %s", request.url.path)
|
|
47
|
+
locale = resolve_request_locale(request)
|
|
48
|
+
err = OctopError.localized(ErrorCode.INTERNAL_ERROR, locale)
|
|
49
|
+
return JSONResponse(status_code=err.status, content=err.to_envelope())
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def build_app(server: OctopServer) -> FastAPI:
|
|
53
|
+
cfg = server.services.config if server.services else None
|
|
54
|
+
enable_dashboard = cfg.enable_dashboard if cfg else True
|
|
55
|
+
enable_api_docs = cfg.enable_api_docs if cfg else False
|
|
56
|
+
|
|
57
|
+
app = FastAPI(
|
|
58
|
+
title="Octop API",
|
|
59
|
+
version="0.1.0",
|
|
60
|
+
description=API_DESCRIPTION,
|
|
61
|
+
openapi_url="/api/openapi.json" if enable_api_docs else None,
|
|
62
|
+
openapi_tags=OPENAPI_TAGS,
|
|
63
|
+
)
|
|
64
|
+
configure_openapi(app)
|
|
65
|
+
app.state.octop_server = server
|
|
66
|
+
_install_exception_handlers(app)
|
|
67
|
+
|
|
68
|
+
if cfg and cfg.cors_origins:
|
|
69
|
+
app.add_middleware(
|
|
70
|
+
CORSMiddleware,
|
|
71
|
+
allow_origins=cfg.cors_origins,
|
|
72
|
+
allow_credentials=True,
|
|
73
|
+
allow_methods=["*"],
|
|
74
|
+
allow_headers=["*"],
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
install_jwt_auth(app, server)
|
|
78
|
+
install_setup_lockdown(app, server)
|
|
79
|
+
|
|
80
|
+
from octop.infra.tls.challenge import challenge_store
|
|
81
|
+
|
|
82
|
+
@app.get("/.well-known/acme-challenge/{token}", include_in_schema=False)
|
|
83
|
+
async def acme_http01_challenge(token: str) -> PlainTextResponse:
|
|
84
|
+
body = challenge_store.get(token)
|
|
85
|
+
if body is None:
|
|
86
|
+
raise HTTPException(status_code=404, detail="challenge not found")
|
|
87
|
+
return PlainTextResponse(body)
|
|
88
|
+
|
|
89
|
+
from octop.api.routers import (
|
|
90
|
+
acp,
|
|
91
|
+
admin,
|
|
92
|
+
agent_files,
|
|
93
|
+
agents,
|
|
94
|
+
auth,
|
|
95
|
+
backup,
|
|
96
|
+
browser,
|
|
97
|
+
channels,
|
|
98
|
+
chat,
|
|
99
|
+
connectors,
|
|
100
|
+
cron,
|
|
101
|
+
envs,
|
|
102
|
+
experts,
|
|
103
|
+
health,
|
|
104
|
+
i18n,
|
|
105
|
+
internal_mcp,
|
|
106
|
+
mbti,
|
|
107
|
+
ollama_models,
|
|
108
|
+
plugins,
|
|
109
|
+
preferences,
|
|
110
|
+
providers,
|
|
111
|
+
setup,
|
|
112
|
+
skills,
|
|
113
|
+
slash,
|
|
114
|
+
terminal,
|
|
115
|
+
update,
|
|
116
|
+
usage,
|
|
117
|
+
users,
|
|
118
|
+
voice,
|
|
119
|
+
workspace,
|
|
120
|
+
)
|
|
121
|
+
from octop.api.routers.observability import router as observability_router
|
|
122
|
+
from octop.api.routers.providers import admin_router as admin_providers_router
|
|
123
|
+
from octop.api.routers.security import router as security_router
|
|
124
|
+
from octop.api.routers.storage_backends import admin_router as admin_storage_router
|
|
125
|
+
from octop.api.routers.storage_backends import user_router as storage_backends_user_router
|
|
126
|
+
from octop.api.routers.tls import router as tls_router
|
|
127
|
+
from octop.api.routers.voice import admin_router as admin_voice_router
|
|
128
|
+
|
|
129
|
+
_mount_routers(
|
|
130
|
+
app,
|
|
131
|
+
[
|
|
132
|
+
_RouterMount(setup.router, "/api", ["setup"]),
|
|
133
|
+
_RouterMount(auth.router, "/api/auth", ["auth"]),
|
|
134
|
+
_RouterMount(preferences.router, "/api", ["auth"]),
|
|
135
|
+
_RouterMount(i18n.router, "/api", ["i18n"]),
|
|
136
|
+
_RouterMount(health.router, "/api/health", ["health"]),
|
|
137
|
+
_RouterMount(users.router, "/api/users", ["users"]),
|
|
138
|
+
_RouterMount(agents.router, "/api/agents", ["agents"]),
|
|
139
|
+
_RouterMount(acp.router, "/api", ["agents"]),
|
|
140
|
+
_RouterMount(chat.router, "/api", ["chat"]),
|
|
141
|
+
_RouterMount(slash.router, "/api", ["slash"]),
|
|
142
|
+
_RouterMount(connectors.router, "/api", ["connectors"]),
|
|
143
|
+
_RouterMount(internal_mcp.router, "/api", ["internal-mcp"]),
|
|
144
|
+
_RouterMount(channels.router, "/api", ["channels"]),
|
|
145
|
+
_RouterMount(cron.router, "/api", ["cron"]),
|
|
146
|
+
_RouterMount(envs.router, "/api", ["envs"]),
|
|
147
|
+
_RouterMount(providers.router, "/api/providers", ["providers"]),
|
|
148
|
+
_RouterMount(voice.router, "/api/voice", ["voice"]),
|
|
149
|
+
_RouterMount(admin.router, "/api/admin", ["admin"]),
|
|
150
|
+
_RouterMount(backup.router, "/api/admin", ["admin"]),
|
|
151
|
+
_RouterMount(admin_providers_router, "/api/admin/providers", ["admin"]),
|
|
152
|
+
_RouterMount(admin_voice_router, "/api/admin/voice/providers", ["admin"]),
|
|
153
|
+
_RouterMount(observability_router, "/api/admin/observability", ["observability"]),
|
|
154
|
+
_RouterMount(tls_router, "/api/admin/tls", ["tls"]),
|
|
155
|
+
_RouterMount(security_router, "/api/admin/security", ["security"]),
|
|
156
|
+
_RouterMount(admin_storage_router, "/api/admin/storage-backends", ["admin"]),
|
|
157
|
+
_RouterMount(
|
|
158
|
+
storage_backends_user_router, "/api/storage-backends", ["storage-backends"]
|
|
159
|
+
),
|
|
160
|
+
_RouterMount(mbti.router, "/api", ["mbti"]),
|
|
161
|
+
_RouterMount(experts.router, "/api", ["experts"]),
|
|
162
|
+
_RouterMount(workspace.router, "/api", ["workspace"]),
|
|
163
|
+
_RouterMount(agent_files.router, "/api", ["agent_files"]),
|
|
164
|
+
_RouterMount(usage.router, "/api", ["usage"]),
|
|
165
|
+
_RouterMount(usage.admin_router, "/api/admin", ["admin"]),
|
|
166
|
+
_RouterMount(skills.router, "/api", ["skills"]),
|
|
167
|
+
_RouterMount(terminal.router, "/api", ["terminal"]),
|
|
168
|
+
_RouterMount(update.router, "/api", ["update"]),
|
|
169
|
+
_RouterMount(browser.router, "/api", ["browser"]),
|
|
170
|
+
_RouterMount(ollama_models.router, "/api", ["ollama"]),
|
|
171
|
+
_RouterMount(plugins.router, "/api", ["plugins"]),
|
|
172
|
+
],
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
if enable_api_docs:
|
|
176
|
+
|
|
177
|
+
@app.get("/api/docs", include_in_schema=False)
|
|
178
|
+
async def api_docs() -> HTMLResponse:
|
|
179
|
+
return get_scalar_api_reference(
|
|
180
|
+
openapi_url=app.openapi_url,
|
|
181
|
+
title="Octop API",
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
if enable_dashboard:
|
|
185
|
+
dashboard_dir = Path(__file__).parent.parent / "dashboard"
|
|
186
|
+
index_file = dashboard_dir / "index.html"
|
|
187
|
+
if index_file.exists():
|
|
188
|
+
|
|
189
|
+
@app.get("/{full_path:path}", include_in_schema=False)
|
|
190
|
+
async def spa_fallback(full_path: str) -> FileResponse:
|
|
191
|
+
if full_path.startswith(("api/", "ws/")):
|
|
192
|
+
raise HTTPException(status_code=404, detail="Not Found")
|
|
193
|
+
|
|
194
|
+
if full_path:
|
|
195
|
+
candidate = (dashboard_dir / full_path).resolve()
|
|
196
|
+
try:
|
|
197
|
+
candidate.relative_to(dashboard_dir.resolve())
|
|
198
|
+
except ValueError:
|
|
199
|
+
return FileResponse(index_file)
|
|
200
|
+
if candidate.is_file():
|
|
201
|
+
return FileResponse(candidate)
|
|
202
|
+
return FileResponse(index_file)
|
|
203
|
+
|
|
204
|
+
return app
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Shared router helpers — agent access, workspace glue, request validation."""
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Shared agent ownership / existence checks for HTTP routers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from octop.infra.errors import ErrorCode, OctopError
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def assert_agent_owner(row: Any, user: Any) -> None:
|
|
11
|
+
"""Raise if the user may not access this agent row (admin bypasses)."""
|
|
12
|
+
if user.is_admin:
|
|
13
|
+
return
|
|
14
|
+
if row.user_id is not None and row.user_id != user.id:
|
|
15
|
+
raise OctopError(ErrorCode.FORBIDDEN, "agent not owned by user")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def require_agent_row(
|
|
19
|
+
agent_id: str,
|
|
20
|
+
*,
|
|
21
|
+
user: Any,
|
|
22
|
+
as_user: int | None,
|
|
23
|
+
server: Any,
|
|
24
|
+
) -> Any:
|
|
25
|
+
"""Load an agent row after owner / shared-agent / admin ``as_user`` checks."""
|
|
26
|
+
assert server.app_runtime is not None
|
|
27
|
+
row = server.app_runtime.agent_registry.get_row(agent_id)
|
|
28
|
+
if row is None:
|
|
29
|
+
raise OctopError(ErrorCode.AGENT_NOT_FOUND, f"agent {agent_id!r} not found")
|
|
30
|
+
if as_user is not None and as_user != user.id:
|
|
31
|
+
if not user.is_admin:
|
|
32
|
+
raise OctopError(ErrorCode.FORBIDDEN, "as_user requires admin")
|
|
33
|
+
target = server.user_manager.get_by_id(as_user)
|
|
34
|
+
if target is None:
|
|
35
|
+
raise OctopError(ErrorCode.NOT_FOUND, f"user {as_user} not found")
|
|
36
|
+
if row.user_id is not None and row.user_id != as_user:
|
|
37
|
+
raise OctopError(ErrorCode.FORBIDDEN, "agent not owned by as_user")
|
|
38
|
+
else:
|
|
39
|
+
assert_agent_owner(row, user)
|
|
40
|
+
return row
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def assert_agent_access(server: Any, agent_id: str, user: Any) -> None:
|
|
44
|
+
"""Ensure agent exists and is accessible to the current user."""
|
|
45
|
+
require_agent_row(agent_id, user=user, as_user=None, server=server)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Cross-router request validation helpers (no FastAPI route definitions)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from octop.infra.errors import ErrorCode, OctopError
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
async def validate_chat_mcp_servers(
|
|
11
|
+
server: Any,
|
|
12
|
+
*,
|
|
13
|
+
user_id: int,
|
|
14
|
+
names: list[str] | None,
|
|
15
|
+
) -> list[str] | None:
|
|
16
|
+
if not names:
|
|
17
|
+
return None
|
|
18
|
+
repo = server.services.repos.connector_repo
|
|
19
|
+
try:
|
|
20
|
+
return list(repo.validate_mcp_servers_for_user(user_id, names))
|
|
21
|
+
except ValueError as exc:
|
|
22
|
+
raise OctopError(ErrorCode.CONNECTOR_NOT_BOUND, str(exc)) from exc
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def validate_chat_skills(
|
|
26
|
+
server: Any,
|
|
27
|
+
*,
|
|
28
|
+
agent_id: str,
|
|
29
|
+
user: Any,
|
|
30
|
+
names: list[str] | None,
|
|
31
|
+
) -> list[str] | None:
|
|
32
|
+
"""Validate per-turn skill filter for chat.
|
|
33
|
+
|
|
34
|
+
``None`` leaves the full skill set; ``[]`` disables all skills.
|
|
35
|
+
"""
|
|
36
|
+
if names is None:
|
|
37
|
+
return None
|
|
38
|
+
assert server.app_runtime is not None
|
|
39
|
+
allowed: set[str] = set()
|
|
40
|
+
for summary in await server.app_runtime.agent_registry.list_skill_summaries(agent_id):
|
|
41
|
+
if summary.get("enabled"):
|
|
42
|
+
allowed.add(str(summary["name"]))
|
|
43
|
+
bad = [n for n in names if n not in allowed]
|
|
44
|
+
if bad:
|
|
45
|
+
raise OctopError(
|
|
46
|
+
ErrorCode.NOT_FOUND,
|
|
47
|
+
f"skill(s) not found or disabled: {', '.join(bad)}",
|
|
48
|
+
)
|
|
49
|
+
return list(names)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Shared workspace backend helpers (not route handlers)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from octop.api.common.agent import require_agent_row
|
|
8
|
+
|
|
9
|
+
# deepagents.backends.utils.EMPTY_CONTENT_WARNING — shown to LLM tools, not humans.
|
|
10
|
+
_DEEPAGENTS_EMPTY_WARNING = "System reminder: File exists but has empty contents"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def coerce_read_content(content: Any) -> str:
|
|
14
|
+
"""Normalize backend read payloads for the dashboard file viewer."""
|
|
15
|
+
if content is None:
|
|
16
|
+
return ""
|
|
17
|
+
if isinstance(content, list):
|
|
18
|
+
content = "\n".join(str(line) for line in content)
|
|
19
|
+
text = str(content)
|
|
20
|
+
if text == _DEEPAGENTS_EMPTY_WARNING:
|
|
21
|
+
return ""
|
|
22
|
+
return text
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def resolve_agent_backend(
|
|
26
|
+
agent_id: str,
|
|
27
|
+
*,
|
|
28
|
+
user: Any,
|
|
29
|
+
as_user: int | None,
|
|
30
|
+
server: Any,
|
|
31
|
+
) -> Any:
|
|
32
|
+
"""Get the harness workspace backend for file operations."""
|
|
33
|
+
require_agent_row(agent_id, user=user, as_user=as_user, server=server)
|
|
34
|
+
assert server.app_runtime is not None
|
|
35
|
+
return await server.app_runtime.agent_registry.resolve_harness_backend(agent_id)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def file_info_to_dict(info: Any) -> dict[str, Any]:
|
|
39
|
+
"""Coerce a ``FileInfo`` TypedDict into a JSON-friendly dict."""
|
|
40
|
+
if isinstance(info, dict):
|
|
41
|
+
path = info.get("path")
|
|
42
|
+
is_dir = info.get("is_dir")
|
|
43
|
+
size = info.get("size")
|
|
44
|
+
modified_at = info.get("modified_at")
|
|
45
|
+
else:
|
|
46
|
+
path = getattr(info, "path", None)
|
|
47
|
+
is_dir = getattr(info, "is_dir", None)
|
|
48
|
+
size = getattr(info, "size", None)
|
|
49
|
+
modified_at = getattr(info, "modified_at", None)
|
|
50
|
+
out: dict[str, Any] = {"path": path}
|
|
51
|
+
if is_dir is not None:
|
|
52
|
+
out["is_dir"] = bool(is_dir)
|
|
53
|
+
if size is not None:
|
|
54
|
+
out["size"] = int(size)
|
|
55
|
+
if modified_at is not None:
|
|
56
|
+
out["modified_at"] = modified_at
|
|
57
|
+
return out
|
octop/api/deps.py
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"""FastAPI Depends, JWT helpers, and auth routing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
7
|
+
|
|
8
|
+
import jwt
|
|
9
|
+
from fastapi import Depends, Header, Query, Request
|
|
10
|
+
|
|
11
|
+
from octop.infra.errors import ErrorCode, OctopError
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from octop.infra.server import OctopServer
|
|
15
|
+
from octop.infra.users.identity import User
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class InvalidToken(Exception): ...
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TokenExpired(InvalidToken): ...
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def sign_token(
|
|
25
|
+
secret: bytes,
|
|
26
|
+
*,
|
|
27
|
+
sub: int,
|
|
28
|
+
uname: str,
|
|
29
|
+
role: str,
|
|
30
|
+
ttl_seconds: int = 86400,
|
|
31
|
+
) -> str:
|
|
32
|
+
now = int(time.time())
|
|
33
|
+
payload = {
|
|
34
|
+
"sub": str(sub),
|
|
35
|
+
"uname": uname,
|
|
36
|
+
"role": role,
|
|
37
|
+
"iat": now,
|
|
38
|
+
"exp": now + ttl_seconds,
|
|
39
|
+
}
|
|
40
|
+
return jwt.encode(payload, secret, algorithm="HS256")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def decode_token(secret: bytes, token: str) -> dict[str, Any]:
|
|
44
|
+
try:
|
|
45
|
+
payload = jwt.decode(token, secret, algorithms=["HS256"])
|
|
46
|
+
if "sub" in payload:
|
|
47
|
+
payload["sub"] = int(payload["sub"])
|
|
48
|
+
return payload
|
|
49
|
+
except jwt.ExpiredSignatureError as exc:
|
|
50
|
+
raise TokenExpired() from exc
|
|
51
|
+
except jwt.InvalidTokenError as exc:
|
|
52
|
+
raise InvalidToken(str(exc)) from exc
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# Paths that bypass JWT middleware (setup wizard, health, login).
|
|
56
|
+
_JWT_EXEMPT_PREFIXES = (
|
|
57
|
+
"/api/setup/",
|
|
58
|
+
"/api/health/",
|
|
59
|
+
"/api/i18n/",
|
|
60
|
+
"/api/connectors/oauth/callback",
|
|
61
|
+
"/api/internal/mcp/",
|
|
62
|
+
)
|
|
63
|
+
_JWT_EXEMPT_EXACT = (
|
|
64
|
+
"/api/health",
|
|
65
|
+
"/api/auth/login",
|
|
66
|
+
"/api/docs",
|
|
67
|
+
"/api/openapi.json",
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def is_jwt_exempt_path(path: str) -> bool:
|
|
72
|
+
return path in _JWT_EXEMPT_EXACT or any(path.startswith(p) for p in _JWT_EXEMPT_PREFIXES)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_server(request: Request) -> OctopServer:
|
|
76
|
+
server: OctopServer = request.app.state.octop_server
|
|
77
|
+
if server.services is None or server.app_runtime is None:
|
|
78
|
+
raise OctopError(ErrorCode.INTERNAL_ERROR, "server not started")
|
|
79
|
+
return server
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def extract_raw_token(
|
|
83
|
+
*,
|
|
84
|
+
authorization: str | None = None,
|
|
85
|
+
access_token: str | None = None,
|
|
86
|
+
) -> str | None:
|
|
87
|
+
if authorization and authorization.lower().startswith("bearer "):
|
|
88
|
+
return authorization[7:].strip()
|
|
89
|
+
if access_token:
|
|
90
|
+
return access_token
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _decode(server: OctopServer, token: str) -> dict[str, Any]:
|
|
95
|
+
assert server.services is not None
|
|
96
|
+
secret = server.services.secret_repo.get("jwt")
|
|
97
|
+
if secret is None:
|
|
98
|
+
raise OctopError(ErrorCode.INTERNAL_ERROR, "jwt secret missing")
|
|
99
|
+
try:
|
|
100
|
+
return decode_token(secret, token)
|
|
101
|
+
except TokenExpired as exc:
|
|
102
|
+
raise OctopError(ErrorCode.TOKEN_EXPIRED, "token expired") from exc
|
|
103
|
+
except InvalidToken as exc:
|
|
104
|
+
raise OctopError(ErrorCode.AUTH_FAILED, "invalid token") from exc
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def resolve_user_from_token(server: OctopServer, token: str) -> User:
|
|
108
|
+
payload = _decode(server, token)
|
|
109
|
+
assert server.user_manager is not None
|
|
110
|
+
user = server.user_manager.get_by_id(int(payload["sub"]))
|
|
111
|
+
if user is None:
|
|
112
|
+
raise OctopError(ErrorCode.USER_DISABLED, "user not active")
|
|
113
|
+
return user
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def authenticate_request(request: Request, server: OctopServer) -> User:
|
|
117
|
+
raw = extract_raw_token(
|
|
118
|
+
authorization=request.headers.get("authorization"),
|
|
119
|
+
access_token=request.query_params.get("access_token"),
|
|
120
|
+
)
|
|
121
|
+
if not raw:
|
|
122
|
+
raise OctopError(ErrorCode.AUTH_FAILED, "missing credentials")
|
|
123
|
+
return resolve_user_from_token(server, raw)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
async def current_user(
|
|
127
|
+
request: Request,
|
|
128
|
+
server: OctopServer = Depends(get_server),
|
|
129
|
+
authorization: str | None = Header(None),
|
|
130
|
+
access_token: str | None = Query(None),
|
|
131
|
+
) -> User:
|
|
132
|
+
cached = getattr(request.state, "octop_user", None)
|
|
133
|
+
if cached is not None:
|
|
134
|
+
return cast("User", cached)
|
|
135
|
+
raw = extract_raw_token(authorization=authorization, access_token=access_token)
|
|
136
|
+
if not raw:
|
|
137
|
+
raise OctopError(ErrorCode.AUTH_FAILED, "missing credentials")
|
|
138
|
+
return resolve_user_from_token(server, raw)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
async def current_admin(user: User = Depends(current_user)) -> User:
|
|
142
|
+
if not user.is_admin:
|
|
143
|
+
raise OctopError(ErrorCode.FORBIDDEN, "admin required")
|
|
144
|
+
return user
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""ASGI middlewares for octop."""
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Require JWT for all /api/* routes except an explicit allowlist.
|
|
2
|
+
|
|
3
|
+
Validated users are cached on ``request.state.octop_user`` so route-level
|
|
4
|
+
``Depends(current_user)`` can reuse the result without re-decoding.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Awaitable, Callable
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from fastapi import Request
|
|
13
|
+
from fastapi.responses import JSONResponse
|
|
14
|
+
|
|
15
|
+
from octop.api.deps import authenticate_request, is_jwt_exempt_path
|
|
16
|
+
from octop.infra.errors import OctopError
|
|
17
|
+
|
|
18
|
+
_INSTALL_ATTR = "_octop_jwt_auth_installed"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def install(app: Any, server: Any) -> None:
|
|
22
|
+
if getattr(app, _INSTALL_ATTR, False):
|
|
23
|
+
return
|
|
24
|
+
setattr(app, _INSTALL_ATTR, True)
|
|
25
|
+
|
|
26
|
+
@app.middleware("http") # type: ignore[untyped-decorator]
|
|
27
|
+
async def _jwt_auth(
|
|
28
|
+
request: Request,
|
|
29
|
+
call_next: Callable[[Request], Awaitable[Any]],
|
|
30
|
+
) -> Any:
|
|
31
|
+
path = request.url.path
|
|
32
|
+
if not path.startswith("/api/") or is_jwt_exempt_path(path):
|
|
33
|
+
return await call_next(request)
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
request.state.octop_user = authenticate_request(request, server)
|
|
37
|
+
except OctopError as exc:
|
|
38
|
+
return JSONResponse(status_code=exc.status, content=exc.to_envelope())
|
|
39
|
+
|
|
40
|
+
return await call_next(request)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Lock down all non-/setup endpoints while no users exist.
|
|
2
|
+
|
|
3
|
+
Returns ``503 {"setup_required": true}`` so the SPA can hard-redirect
|
|
4
|
+
to ``/setup``.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Awaitable, Callable
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from fastapi import Request
|
|
13
|
+
from fastapi.responses import JSONResponse
|
|
14
|
+
|
|
15
|
+
_OPEN_PREFIXES = (
|
|
16
|
+
"/api/setup/",
|
|
17
|
+
"/api/health/",
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def install(app: Any, server: Any) -> None:
|
|
22
|
+
@app.middleware("http")
|
|
23
|
+
async def _lockdown(
|
|
24
|
+
request: Request,
|
|
25
|
+
call_next: Callable[[Request], Awaitable[Any]],
|
|
26
|
+
) -> Any:
|
|
27
|
+
path = request.url.path
|
|
28
|
+
if not path.startswith("/api/"):
|
|
29
|
+
return await call_next(request)
|
|
30
|
+
cfg = server.services.config if server.services else None
|
|
31
|
+
open_exact = ["/api/health"]
|
|
32
|
+
if cfg and cfg.enable_api_docs:
|
|
33
|
+
open_exact.extend(("/api/docs", "/api/openapi.json"))
|
|
34
|
+
if path in open_exact or any(path.startswith(p) for p in _OPEN_PREFIXES):
|
|
35
|
+
return await call_next(request)
|
|
36
|
+
if server.user_manager is None or server.user_manager.count() == 0:
|
|
37
|
+
return JSONResponse(
|
|
38
|
+
status_code=503,
|
|
39
|
+
content={"setup_required": True},
|
|
40
|
+
)
|
|
41
|
+
return await call_next(request)
|