@37chengshan/ompweb 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +66 -0
- package/.next/build-manifest.json +20 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +189 -0
- package/.next/react-loadable-manifest.json +499 -0
- package/.next/required-server-files.js +364 -0
- package/.next/required-server-files.json +364 -0
- package/.next/routes-manifest.json +513 -0
- package/.next/server/app/_global-error/page.js +31 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +27 -0
- package/.next/server/app/_global-error.rsc +15 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +21 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page.js +1 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +27 -0
- package/.next/server/app/_not-found.rsc +26 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +26 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +27 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +8 -0
- package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -0
- package/.next/server/app/api/agent/[id]/bash-output/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/events/route.js +5 -0
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/route.js +1 -0
- package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/new/route.js +1 -0
- package/.next/server/app/api/agent/new/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/running/events/route.js +3 -0
- package/.next/server/app/api/agent/running/events/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/running/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agents/route.js +1 -0
- package/.next/server/app/api/agents/route.js.nft.json +1 -0
- package/.next/server/app/api/agents/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/app-update/route.js +1 -0
- package/.next/server/app/api/app-update/route.js.nft.json +1 -0
- package/.next/server/app/api/app-update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/all-providers/route.js +1 -0
- package/.next/server/app/api/auth/all-providers/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/all-providers/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/login/[provider]/route.js +3 -0
- package/.next/server/app/api/auth/login/[provider]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/providers/route.js +1 -0
- package/.next/server/app/api/auth/providers/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/browse/route.js +1 -0
- package/.next/server/app/api/cwd/browse/route.js.nft.json +1 -0
- package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/validate/route.js +1 -0
- package/.next/server/app/api/cwd/validate/route.js.nft.json +1 -0
- package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/default-cwd/route.js +1 -0
- package/.next/server/app/api/default-cwd/route.js.nft.json +1 -0
- package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/file-index/route.js +1 -0
- package/.next/server/app/api/file-index/route.js.nft.json +1 -0
- package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/files/[...path]/route.js +49 -0
- package/.next/server/app/api/files/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/diff/route.js +6 -0
- package/.next/server/app/api/git/diff/route.js.nft.json +1 -0
- package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/status/route.js +6 -0
- package/.next/server/app/api/git/status/route.js.nft.json +1 -0
- package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/home/route.js +1 -0
- package/.next/server/app/api/home/route.js.nft.json +1 -0
- package/.next/server/app/api/home/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/route.js +4 -0
- package/.next/server/app/api/mcp/route.js.nft.json +1 -0
- package/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/model-roles/route.js +1 -0
- package/.next/server/app/api/model-roles/route.js.nft.json +1 -0
- package/.next/server/app/api/model-roles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/fetch/route.js +1 -0
- package/.next/server/app/api/models/fetch/route.js.nft.json +1 -0
- package/.next/server/app/api/models/fetch/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/route.js +1 -0
- package/.next/server/app/api/models/route.js.nft.json +1 -0
- package/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/catalog/route.js +1 -0
- package/.next/server/app/api/models-config/catalog/route.js.nft.json +1 -0
- package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/route.js +1 -0
- package/.next/server/app/api/models-config/route.js.nft.json +1 -0
- package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/test/route.js +1 -0
- package/.next/server/app/api/models-config/test/route.js.nft.json +1 -0
- package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/omp-settings/route.js +1 -0
- package/.next/server/app/api/omp-settings/route.js.nft.json +1 -0
- package/.next/server/app/api/omp-settings/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/omp-update/route.js +2 -0
- package/.next/server/app/api/omp-update/route.js.nft.json +1 -0
- package/.next/server/app/api/omp-update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/omp-version/route.js +1 -0
- package/.next/server/app/api/omp-version/route.js.nft.json +1 -0
- package/.next/server/app/api/omp-version/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/plugins/route.js +1 -0
- package/.next/server/app/api/plugins/route.js.nft.json +1 -0
- package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/projects/route.js +2 -0
- package/.next/server/app/api/projects/route.js.nft.json +1 -0
- package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/providers/enable/route.js +1 -0
- package/.next/server/app/api/providers/enable/route.js.nft.json +1 -0
- package/.next/server/app/api/providers/enable/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/reveal/route.js +1 -0
- package/.next/server/app/api/reveal/route.js.nft.json +1 -0
- package/.next/server/app/api/reveal/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/archive/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/archive/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/export/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/plan/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/plan/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/plan/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/subagents/[subagentId]/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/subagents/[subagentId]/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/subagents/[subagentId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/subagents/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/subagents/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/subagents/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/archive/route.js +1 -0
- package/.next/server/app/api/sessions/archive/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/archive/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/import/route.js +1 -0
- package/.next/server/app/api/sessions/import/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/import/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/route.js +1 -0
- package/.next/server/app/api/sessions/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/check/route.js +1 -0
- package/.next/server/app/api/skills/check/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/install/route.js +1 -0
- package/.next/server/app/api/skills/install/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/route.js +4 -0
- package/.next/server/app/api/skills/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/search/route.js +1 -0
- package/.next/server/app/api/skills/search/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/update/route.js +1 -0
- package/.next/server/app/api/skills/update/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/input/route.js +8 -0
- package/.next/server/app/api/terminal/input/route.js.nft.json +1 -0
- package/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/open/route.js +1 -0
- package/.next/server/app/api/terminal/open/route.js.nft.json +1 -0
- package/.next/server/app/api/terminal/open/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/session/route.js +8 -0
- package/.next/server/app/api/terminal/session/route.js.nft.json +1 -0
- package/.next/server/app/api/terminal/session/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/stream/route.js +13 -0
- package/.next/server/app/api/terminal/stream/route.js.nft.json +1 -0
- package/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/web-auth/session/route.js +1 -0
- package/.next/server/app/api/web-auth/session/route.js.nft.json +1 -0
- package/.next/server/app/api/web-auth/session/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/route.js +1 -0
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -0
- package/.next/server/app/favicon.ico/route.js +1 -0
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/favicon.ico.meta +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +21 -0
- package/.next/server/app/index.rsc +29 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +28 -0
- package/.next/server/app/index.segments/_full.segment.rsc +29 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +8 -0
- package/.next/server/app/login/page.js +1 -0
- package/.next/server/app/login/page.js.nft.json +1 -0
- package/.next/server/app/login/page_client-reference-manifest.js +1 -0
- package/.next/server/app/login.html +1 -0
- package/.next/server/app/login.meta +26 -0
- package/.next/server/app/login.rsc +29 -0
- package/.next/server/app/login.segments/_full.segment.rsc +29 -0
- package/.next/server/app/login.segments/_tree.segment.rsc +8 -0
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +28 -0
- package/.next/server/app/manifest.webmanifest/route.js +17 -0
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
- package/.next/server/app/manifest.webmanifest.body +1 -0
- package/.next/server/app/manifest.webmanifest.meta +1 -0
- package/.next/server/app/page.js +1 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +66 -0
- package/.next/server/chunks/1636.js +1 -0
- package/.next/server/chunks/1671.js +1 -0
- package/.next/server/chunks/1813.js +1 -0
- package/.next/server/chunks/2349.js +1 -0
- package/.next/server/chunks/3290.js +4 -0
- package/.next/server/chunks/3294.js +25 -0
- package/.next/server/chunks/3379.js +1 -0
- package/.next/server/chunks/3425.js +163 -0
- package/.next/server/chunks/3798.js +5 -0
- package/.next/server/chunks/4509.js +12 -0
- package/.next/server/chunks/4741.js +165 -0
- package/.next/server/chunks/5309.js +1 -0
- package/.next/server/chunks/6465.js +1 -0
- package/.next/server/chunks/7834.js +5 -0
- package/.next/server/chunks/7839.js +1 -0
- package/.next/server/chunks/8333.js +1 -0
- package/.next/server/functions-config-manifest.json +16 -0
- package/.next/server/instrumentation.js +1 -0
- package/.next/server/instrumentation.js.nft.json +1 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/middleware.js +163 -0
- package/.next/server/middleware.js.nft.json +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +4 -0
- package/.next/server/prefetch-hints.json +53 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/cA3mF_wj2VN78irY68Wcm/_buildManifest.js +1 -0
- package/.next/static/cA3mF_wj2VN78irY68Wcm/_ssgManifest.js +1 -0
- package/.next/static/chunks/103.23142a67b02246a8.js +215 -0
- package/.next/static/chunks/1032.d9a9179233599785.js +1 -0
- package/.next/static/chunks/1063.775c442bdbeef08b.js +1 -0
- package/.next/static/chunks/1133.0f37525b2b215f36.js +1 -0
- package/.next/static/chunks/1327.09252bb80616cc3a.js +1 -0
- package/.next/static/chunks/1708.c3a1896e4cc9f8d9.js +1 -0
- package/.next/static/chunks/1781.9072b4c9586df549.js +1 -0
- package/.next/static/chunks/1ba63609.b2ae90f43319a29e.js +153 -0
- package/.next/static/chunks/202.95416cc0d8e6df0e.js +131 -0
- package/.next/static/chunks/2081.47b6e9391094055f.js +1 -0
- package/.next/static/chunks/2181.ba21239d3ac39f81.js +1 -0
- package/.next/static/chunks/2201.08d1cac24fc438ee.js +1 -0
- package/.next/static/chunks/2258.4defa30121ef44a5.js +1 -0
- package/.next/static/chunks/2325.23caf22075e51aa5.js +1 -0
- package/.next/static/chunks/2356.523277bb8c6bf72a.js +23 -0
- package/.next/static/chunks/2414.8b3662a85cd1b14e.js +1 -0
- package/.next/static/chunks/2418.b5d9e177e10a686e.js +1 -0
- package/.next/static/chunks/2480.cf27ca02e5b19761.js +24 -0
- package/.next/static/chunks/2539.c5a4f2fd8e421c70.js +41 -0
- package/.next/static/chunks/2584-20a03146e1e2db70.js +1 -0
- package/.next/static/chunks/2619.9431a3f48da8eef4.js +1 -0
- package/.next/static/chunks/268.ec500965c1761e26.js +80 -0
- package/.next/static/chunks/2695.b732ef1965253b3f.js +90 -0
- package/.next/static/chunks/2703.495a65ed14b2f094.js +36 -0
- package/.next/static/chunks/2821.934bcf60fbdc28c6.js +1 -0
- package/.next/static/chunks/3251.408c817adb161919.js +1 -0
- package/.next/static/chunks/3308.8e27b5c43a478f0d.js +73 -0
- package/.next/static/chunks/3336.a76f9485fe7cb762.js +1 -0
- package/.next/static/chunks/3606.ddd8065b4a3108bd.js +1 -0
- package/.next/static/chunks/370.8e8f3cf8eb0e29dd.js +1 -0
- package/.next/static/chunks/3716.72bf4c9d7325debd.js +1 -0
- package/.next/static/chunks/3794-d7cddff008311ab3.js +52 -0
- package/.next/static/chunks/394.475e54c848486e3a.js +1 -0
- package/.next/static/chunks/398.ffa02af9062a3950.js +77 -0
- package/.next/static/chunks/3995.eca0f5bef1fc3ae5.js +38 -0
- package/.next/static/chunks/4004.74b9bcf5478b1663.js +160 -0
- package/.next/static/chunks/4202.8440832386f023c7.js +226 -0
- package/.next/static/chunks/4238.6f102dcbcf2ae339.js +141 -0
- package/.next/static/chunks/4405.7a19458960a1058e.js +287 -0
- package/.next/static/chunks/4424.fd0c93a807a333e1.js +1 -0
- package/.next/static/chunks/4559.2e7ed39ea2757280.js +1 -0
- package/.next/static/chunks/484.c74eeb0fca9a9ddf.js +1 -0
- package/.next/static/chunks/4854.b64a1daa15899219.js +1 -0
- package/.next/static/chunks/4866.d1060b4faf2ae1e2.js +1 -0
- package/.next/static/chunks/4970.8a63b4953b0e4946.js +1 -0
- package/.next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js +1 -0
- package/.next/static/chunks/5020.9ac8d0dc8390bb6e.js +1 -0
- package/.next/static/chunks/5137.f163e94c74a94d01.js +1 -0
- package/.next/static/chunks/5165.2681017cd0bd291f.js +1 -0
- package/.next/static/chunks/5242.7b643c6b3394cac1.js +1 -0
- package/.next/static/chunks/5361.afc00ab2626bacbf.js +1 -0
- package/.next/static/chunks/5521.cfdf2cfc6db31407.js +1 -0
- package/.next/static/chunks/5526.ff46471041fdcb79.js +86 -0
- package/.next/static/chunks/5658.600b820420422057.js +1 -0
- package/.next/static/chunks/5681.dd0e66b0de16e54b.js +27 -0
- package/.next/static/chunks/6121.eb9023b1cbc78ee2.js +1 -0
- package/.next/static/chunks/6161.4836cd7d031026bf.js +1 -0
- package/.next/static/chunks/6195.8710aa41b2319dff.js +24 -0
- package/.next/static/chunks/6202.f4317cf0a48876f9.js +1 -0
- package/.next/static/chunks/6294.24f510c0c3e3714c.js +1 -0
- package/.next/static/chunks/6654.41440ef667144967.js +1 -0
- package/.next/static/chunks/6794.57bf1aff78682f3a.js +93 -0
- package/.next/static/chunks/7256.e07cf52d87d40252.js +1 -0
- package/.next/static/chunks/7268.2f59c671f26160f3.js +1 -0
- package/.next/static/chunks/7331.2add3c4e125a2dba.js +104 -0
- package/.next/static/chunks/7543.89f7b805ed0f2901.js +1 -0
- package/.next/static/chunks/8114.8a8fdee4c3b7fd4b.js +1 -0
- package/.next/static/chunks/8200.a36b9f8c983c6b9e.js +5 -0
- package/.next/static/chunks/852.60444b32fcbeb00c.js +1 -0
- package/.next/static/chunks/8673.8f38e67890334c5a.js +1 -0
- package/.next/static/chunks/869.7152372b662e31af.js +1 -0
- package/.next/static/chunks/8863.fa0320ea586efb3b.js +1 -0
- package/.next/static/chunks/8885.d9308c756376780b.js +79 -0
- package/.next/static/chunks/8901.e117d206a917bda0.js +1 -0
- package/.next/static/chunks/90542734.ae439f2382f58c51.js +1 -0
- package/.next/static/chunks/918.6a9bbe564e4a2d0f.js +115 -0
- package/.next/static/chunks/934.9006461bd0548660.js +1 -0
- package/.next/static/chunks/9365.a3e0e5ac101ccd02.js +1 -0
- package/.next/static/chunks/9522.c7c6e9c330f9ba6b.js +1 -0
- package/.next/static/chunks/9614.3221013d7f0af27f.js +64 -0
- package/.next/static/chunks/9698.4d09a99b9d99f3e5.js +148 -0
- package/.next/static/chunks/9705.40a82b97f214e28b.js +1 -0
- package/.next/static/chunks/973.9efc01efd9d768a5.js +8 -0
- package/.next/static/chunks/9754.d67dec946fc871d4.js +25 -0
- package/.next/static/chunks/9764.2669775c6e107a01.js +62 -0
- package/.next/static/chunks/9793.4567af813117ad25.js +1 -0
- package/.next/static/chunks/993e5495.598a97aa1337298f.js +62 -0
- package/.next/static/chunks/9974.9a0f79beca65e8c4.js +34 -0
- package/.next/static/chunks/9981.678c7bcc42f24571.js +1 -0
- package/.next/static/chunks/app/_global-error/page-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/_not-found/page-8753f2eb4b097627.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/agent/running/events/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/agents/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/app-update/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/auth/all-providers/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/cwd/browse/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/cwd/validate/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/file-index/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/git/diff/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/git/status/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/home/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/mcp/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/model-roles/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/models/fetch/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/models/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/models-config/catalog/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/models-config/test/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/omp-settings/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/omp-update/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/omp-version/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/projects/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/providers/enable/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/reveal/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/archive/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/plan/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/state/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/subagents/[subagentId]/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/subagents/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/archive/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/import/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/skills/check/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/skills/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/skills/update/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/terminal/input/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/terminal/open/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/terminal/session/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/terminal/stream/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/web-auth/session/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/error-9ba463bef8c2cf06.js +1 -0
- package/.next/static/chunks/app/global-error-871c4baa96801c4e.js +1 -0
- package/.next/static/chunks/app/layout-347584865a4cd886.js +1 -0
- package/.next/static/chunks/app/login/page-7a5cd8dbc1789d87.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/app/page-833698058d71b603.js +1 -0
- package/.next/static/chunks/bf2ff291.244c8a7c1c14966a.js +122 -0
- package/.next/static/chunks/d3ac728e.7964f816a1ca64e5.js +1 -0
- package/.next/static/chunks/da12927c.476aa688a637649c.js +82 -0
- package/.next/static/chunks/db9d41be.27ee8fcc7bf00d70.js +1 -0
- package/.next/static/chunks/e868780c.0440c4cbaec74878.js +18 -0
- package/.next/static/chunks/framework-b33a8f5d57cd8d87.js +1 -0
- package/.next/static/chunks/main-354b27ede3eb835a.js +5 -0
- package/.next/static/chunks/main-app-14cb310088a8e6b1.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-48788bcdc79e1c9e.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-2a4b77ae5d80a8ba.js +1 -0
- package/.next/static/css/2f46e0db0d4a3aed.css +1 -0
- package/.next/static/css/5fe2a8af79a7efdf.css +1 -0
- package/.next/static/css/921bec6c70de20d4.css +1 -0
- package/.next/static/css/dda9acc8fa0835d6.css +1 -0
- package/.next/static/media/01bdb1c2bb2f530a-s.woff2 +0 -0
- package/.next/static/media/060fd7a2ba6f57dc-s.woff2 +0 -0
- package/.next/static/media/06d755a5cd3e2b96-s.woff2 +0 -0
- package/.next/static/media/09341845bc7215c3-s.woff2 +0 -0
- package/.next/static/media/09d8b46d011a8a55-s.woff2 +0 -0
- package/.next/static/media/0ac3ab6b6a54cd96-s.woff2 +0 -0
- package/.next/static/media/0cb7a0edc360425e-s.woff2 +0 -0
- package/.next/static/media/0de82041d2acf4c3-s.woff2 +0 -0
- package/.next/static/media/1249fbbadbb69451-s.woff2 +0 -0
- package/.next/static/media/15605e25b523335c-s.woff2 +0 -0
- package/.next/static/media/182682366c265526-s.woff2 +0 -0
- package/.next/static/media/1a3dce5cfb5f7760-s.woff2 +0 -0
- package/.next/static/media/1cdd02902f937a18-s.woff2 +0 -0
- package/.next/static/media/246116fa49278f72-s.woff2 +0 -0
- package/.next/static/media/2ad4a039dd2c0f35-s.woff2 +0 -0
- package/.next/static/media/2cd94acf7f6a8cd1-s.woff2 +0 -0
- package/.next/static/media/30af2a5bc088caeb-s.woff2 +0 -0
- package/.next/static/media/3117748ae3be552d-s.woff2 +0 -0
- package/.next/static/media/373befd5a68230ff-s.woff2 +0 -0
- package/.next/static/media/37ae20ae1d329cc2-s.woff2 +0 -0
- package/.next/static/media/3832bef2caf4f297-s.woff2 +0 -0
- package/.next/static/media/3b6ebd4dd223d8c1-s.woff2 +0 -0
- package/.next/static/media/3d165c286d94e27c-s.woff2 +0 -0
- package/.next/static/media/3da25081fc21e3b2-s.woff2 +0 -0
- package/.next/static/media/3eb545844a1630b6-s.woff2 +0 -0
- package/.next/static/media/41870aeb5505be99-s.woff2 +0 -0
- package/.next/static/media/45c8f5377f81d417-s.woff2 +0 -0
- package/.next/static/media/48d86e2f8821c61e-s.woff2 +0 -0
- package/.next/static/media/4957022da3161c6e-s.woff2 +0 -0
- package/.next/static/media/4be71ddc6c749643-s.woff2 +0 -0
- package/.next/static/media/4c4b3b30b6bcb2be-s.woff2 +0 -0
- package/.next/static/media/4dc4381bbf526d04-s.woff2 +0 -0
- package/.next/static/media/4eb0814ea9e22f45-s.woff2 +0 -0
- package/.next/static/media/4f86cf50532e0e9b-s.woff2 +0 -0
- package/.next/static/media/5022b11bb4a81e48-s.woff2 +0 -0
- package/.next/static/media/5080c55e2dccd63d-s.woff2 +0 -0
- package/.next/static/media/5348b1e69a651725-s.woff2 +0 -0
- package/.next/static/media/54c50561be23e605-s.woff2 +0 -0
- package/.next/static/media/567d6f765096ee76-s.woff2 +0 -0
- package/.next/static/media/58045d1f8695a418-s.woff2 +0 -0
- package/.next/static/media/591e43f23f51e5a5-s.woff2 +0 -0
- package/.next/static/media/5a274ddc03d9a5ab-s.woff2 +0 -0
- package/.next/static/media/5feee92221bb8605-s.woff2 +0 -0
- package/.next/static/media/6067d3f78ecc4535-s.woff2 +0 -0
- package/.next/static/media/61a11ca45429493a-s.woff2 +0 -0
- package/.next/static/media/63d030730737efae-s.woff2 +0 -0
- package/.next/static/media/641a7b8a5800ee0e-s.woff2 +0 -0
- package/.next/static/media/6bd056ddce336924-s.woff2 +0 -0
- package/.next/static/media/6dc0bae4a5666821-s.woff2 +0 -0
- package/.next/static/media/7513cc52807669ca-s.woff2 +0 -0
- package/.next/static/media/75ae81fea4aec8c5-s.woff2 +0 -0
- package/.next/static/media/77f6534b6a3eb37a-s.woff2 +0 -0
- package/.next/static/media/782d4006a26041e7-s.woff2 +0 -0
- package/.next/static/media/7c21074d9bafed1b-s.woff2 +0 -0
- package/.next/static/media/7d509f4f988023eb-s.woff2 +0 -0
- package/.next/static/media/7d58f39a50828c68-s.woff2 +0 -0
- package/.next/static/media/7db71cc013812f1c-s.woff2 +0 -0
- package/.next/static/media/7deddc85b7ffd1dc-s.p.woff2 +0 -0
- package/.next/static/media/7eb3f914ae6dd7a0-s.woff2 +0 -0
- package/.next/static/media/8051eb8307aa13c8-s.woff2 +0 -0
- package/.next/static/media/829dca987e1e010e-s.woff2 +0 -0
- package/.next/static/media/842f675c7a332a48-s.woff2 +0 -0
- package/.next/static/media/866e2e7b0cbc2cb4-s.woff2 +0 -0
- package/.next/static/media/86b38dc7f713ddda-s.woff2 +0 -0
- package/.next/static/media/8a3a66ae6bb27151-s.woff2 +0 -0
- package/.next/static/media/8b56b70f6d577d9f-s.woff2 +0 -0
- package/.next/static/media/8d93dbb77672da11-s.woff2 +0 -0
- package/.next/static/media/8f5c2d0a25b8f50c-s.woff2 +0 -0
- package/.next/static/media/916860560b9a2bc2-s.woff2 +0 -0
- package/.next/static/media/966e6d14b6c229fc-s.woff2 +0 -0
- package/.next/static/media/97ac91773d3121b2-s.p.woff2 +0 -0
- package/.next/static/media/9877fefe733dd250-s.woff2 +0 -0
- package/.next/static/media/9c57f4420502d43a-s.woff2 +0 -0
- package/.next/static/media/9cedd2ad7b0bcf3d-s.woff2 +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
- package/.next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
- package/.next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
- package/.next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
- package/.next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
- package/.next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
- package/.next/static/media/a00fb5ef1ca68e5d-s.woff2 +0 -0
- package/.next/static/media/a171b1d72388367c-s.woff2 +0 -0
- package/.next/static/media/a310fb84e6868735-s.woff2 +0 -0
- package/.next/static/media/a53504b22c396db6-s.woff2 +0 -0
- package/.next/static/media/aabb87babcdda375-s.woff2 +0 -0
- package/.next/static/media/afe75c8050c8fd4e-s.woff2 +0 -0
- package/.next/static/media/b201193f76404e13-s.woff2 +0 -0
- package/.next/static/media/b20daecae68a588f-s.p.woff2 +0 -0
- package/.next/static/media/b2574bc564dca98d-s.woff2 +0 -0
- package/.next/static/media/b6a1339c290590d0-s.woff2 +0 -0
- package/.next/static/media/b6fe4b2295863fe4-s.woff2 +0 -0
- package/.next/static/media/bb8ff9c700288292-s.woff2 +0 -0
- package/.next/static/media/bc1ccfae4ae17995-s.woff2 +0 -0
- package/.next/static/media/be15c189f996aeb2-s.woff2 +0 -0
- package/.next/static/media/c0d1f6928a1dbc31-s.woff2 +0 -0
- package/.next/static/media/c36d8bb68a53eb60-s.woff2 +0 -0
- package/.next/static/media/c5db947ee2561e06-s.woff2 +0 -0
- package/.next/static/media/c77ac7f613b44045-s.woff2 +0 -0
- package/.next/static/media/ca73d0c74010e612-s.woff2 +0 -0
- package/.next/static/media/cfbad6ceeeca5c58-s.woff2 +0 -0
- package/.next/static/media/d24aebb82f01e48d-s.woff2 +0 -0
- package/.next/static/media/d2c6107607eb7d44-s.woff2 +0 -0
- package/.next/static/media/d2c7d5e8db7ce20a-s.woff2 +0 -0
- package/.next/static/media/d51f7558abc55aa6-s.woff2 +0 -0
- package/.next/static/media/da718921282f76d0-s.woff2 +0 -0
- package/.next/static/media/dae37106d788c7c9-s.woff2 +0 -0
- package/.next/static/media/e0d4cd45847004a4-s.woff2 +0 -0
- package/.next/static/media/e100c7a7874aebd9-s.woff2 +0 -0
- package/.next/static/media/e26dff18031f4a7e-s.woff2 +0 -0
- package/.next/static/media/e54d16b9f2c4535b-s.woff2 +0 -0
- package/.next/static/media/e5b759c1d5c42d99-s.woff2 +0 -0
- package/.next/static/media/ea21a07081db26d0-s.woff2 +0 -0
- package/.next/static/media/eaee7682c49bd1c2-s.woff2 +0 -0
- package/.next/static/media/ec14413c594b3356-s.p.woff2 +0 -0
- package/.next/static/media/ec408158b9e08aea-s.woff2 +0 -0
- package/.next/static/media/ee5d9aad76ea4c0a-s.woff2 +0 -0
- package/.next/static/media/efdbc7cff3271ee9-s.woff2 +0 -0
- package/.next/static/media/f128be4e72405705-s.woff2 +0 -0
- package/.next/static/media/fb6cfff6119f26e8-s.woff2 +0 -0
- package/.next/static/media/fd516adbc3328c82-s.woff2 +0 -0
- package/LICENSE +21 -0
- package/README.ja.md +139 -0
- package/README.md +194 -0
- package/README.zh-CN.md +177 -0
- package/bin/network-addresses.js +197 -0
- package/bin/node-version.js +35 -0
- package/bin/omp-web-options.js +86 -0
- package/bin/omp-web-security.test.mjs +9 -0
- package/bin/omp-web.js +147 -0
- package/bin/port-availability.js +27 -0
- package/bin/process-lifecycle.js +71 -0
- package/bin/process-lifecycle.test.mjs +83 -0
- package/next.config.ts +94 -0
- package/package.json +83 -0
- package/public/icon.png +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 agegr
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.ja.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# ompweb
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | [简体中文](./README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
コミュニティ:[OMPWEB Discord に参加](https://discord.gg/evqgGzRfM5)
|
|
6
|
+
|
|
7
|
+
[oh-my-pi (omp) コーディングエージェント](https://github.com/can1357/oh-my-pi)のローカル Web UI です。ompweb はローカルの omp セッションファイルを読み込み、セッションの閲覧、リアルタイムチャット、モデル設定、スキル管理、プロジェクトファイルのプレビューを行えるブラウザワークスペースを提供します。
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
<details>
|
|
12
|
+
<summary>スクリーンショット(ライト / ダークテーマ)</summary>
|
|
13
|
+
|
|
14
|
+

|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
</details>
|
|
19
|
+
|
|
20
|
+
## 必要条件
|
|
21
|
+
|
|
22
|
+
- [omp](https://github.com/can1357/oh-my-pi) がインストールされ、`PATH` に含まれていること(または `OMP_WEB_OMP_BIN` でバイナリの場所を指定)
|
|
23
|
+
- Node.js 22.19.0 以降(`node --version`)
|
|
24
|
+
|
|
25
|
+
## クイックスタート
|
|
26
|
+
|
|
27
|
+
**インストールせずに実行:**
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx @kahme247/ompweb@latest
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**またはグローバルにインストール:**
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install -g @kahme247/ompweb
|
|
37
|
+
ompweb
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
続いて [http://127.0.0.1:30177](http://127.0.0.1:30177) を開きます。サーバーの準備が整うと、CLI はブラウザを自動的に開こうとします。ompweb はデフォルトで `127.0.0.1` で待ち受けます。
|
|
41
|
+
|
|
42
|
+
**オプション:**
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
ompweb --port 8080 # カスタムポート
|
|
46
|
+
ompweb --hostname 0.0.0.0 # 信頼できるネットワークに公開
|
|
47
|
+
ompweb -p 8080 -H 0.0.0.0 # オプションを組み合わせる
|
|
48
|
+
ompweb --no-open # ブラウザを自動的に開かない
|
|
49
|
+
|
|
50
|
+
ompweb --password "a-long-random-password" # パスワードのみのサインインを有効化(Windows でも同様)
|
|
51
|
+
|
|
52
|
+
PORT=8080 ompweb # 環境変数にも対応
|
|
53
|
+
OMP_WEB_HOSTNAME=0.0.0.0 ompweb # ネットワーク公開を明示的に有効化
|
|
54
|
+
OMP_WEB_PASSWORD='a-long-random-password' ompweb # 環境変数でも同様(POSIX)
|
|
55
|
+
# Windows: $env:OMP_WEB_PASSWORD="secret"; ompweb
|
|
56
|
+
OMP_WEB_NO_OPEN=1 ompweb # バックグラウンドサービスとして実行する場合に便利
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`OMP_WEB_PASSWORD` を設定すると、テーマに統合されたパスワードのみのサインイン画面で UI とすべての API エンドポイントを保護できます。サインイン後は HTTP-only の署名付きセッションクッキーが 30 日間有効です。未設定なら認証は無効です。リモート利用では、パスワードとセッションクッキーを守るため、信頼できるリバースプロキシまたは VPN 経由の HTTPS が必要です。ompweb をインターネットへ直接公開しないでください。
|
|
60
|
+
|
|
61
|
+
## 機能
|
|
62
|
+
|
|
63
|
+
- **作業をすぐに再開**: ターミナル履歴やセッションパスを探し回らずに、プロジェクトごとに過去の omp の会話を閲覧できます。
|
|
64
|
+
- **別の方向性を安全に試す**: 以前のメッセージから続行するか、セッションをフォークして別ルートに分岐できます。
|
|
65
|
+
- **サイドバーを整理**: 非アクティブなセッションはネイティブな記録を残してアーカイブし、不要になったものは明示的に削除できます。
|
|
66
|
+
- **ブランチをまたいで作業**: サイドバーから Git ワークツリーを切り替えると、新しいセッションとエクスプローラーが選択したチェックアウトに追従します。
|
|
67
|
+
- **プロジェクトを見ながらチャット**: エージェントの作業中に、左側でファイルを閲覧し、右側でソース、ドキュメント、画像、音声、PDF をプレビューできます。
|
|
68
|
+
- **セッション状態をひと目で把握**: コンテキスト使用量、コスト、コンパクション状態、システムプロンプトの詳細をトップバーで確認できます。
|
|
69
|
+
- **ターミナルに頼らない設定**: モデル、ログイン/APIキー、モデルテスト、ネイティブ OMP 制御(アドバイザー、承認、Bash ポリシー、思考、コンパクション、メモリ、自動学習、リトライ/フォールバック)、スキル、プラグイン、プロジェクト MCP サーバーを Web UI から管理できます。
|
|
70
|
+
- **Settings で MCP を管理**: 専用の MCP タブでプロジェクトサーバーの状態(有効 / 無効 / 無効な設定)を表示し、追加、編集、名前変更、検証、削除を行えます。設定エラーはトーストで通知されます。
|
|
71
|
+
- **OMP を最新に保つ**: Settings からインストール済みランタイムを確認・更新し、必要に応じてアクティブなセッションを再起動できます。
|
|
72
|
+
- **完了を見逃さない**: エージェント完了時のブラウザー通知を有効にし、インストール済みスキルの更新を確認できます。
|
|
73
|
+
- **⌘K でどこへでもジャンプ**: セッションの切り替え、新規作成、テーマ切替ができるコマンドパレット(⌘K / Ctrl+K)。
|
|
74
|
+
- **温かみのある紙のようなデザイン**: ライト/ダークの2テーマ、セリフ体のディスプレイ書体、WCAG AA 検証済みのコントラスト。トークン駆動の UI キット(Base UI プリミティブ、cmdk、lucide アイコン)で構築。
|
|
75
|
+
|
|
76
|
+
## 設定
|
|
77
|
+
|
|
78
|
+
| 変数 | 意味 |
|
|
79
|
+
| --- | --- |
|
|
80
|
+
| `PORT` | サーバーポート(デフォルト `30177`。`-p/--port` が優先) |
|
|
81
|
+
| `OMP_WEB_HOSTNAME` | バインドするホスト名(デフォルト `127.0.0.1`。`-H/--hostname` が優先) |
|
|
82
|
+
| `OMP_WEB_PASSWORD` | サインイン画面用の任意のパスワード |
|
|
83
|
+
| `OMP_WEB_NO_OPEN` | `1`/`true` を設定するとブラウザの自動起動をスキップ |
|
|
84
|
+
| `OMP_WEB_OMP_BIN` | `omp` バイナリが `PATH` にない場合の絶対パス |
|
|
85
|
+
| `PI_CODING_AGENT_DIR` | 別の omp エージェントディレクトリを指定(デフォルト `~/.omp/agent`) |
|
|
86
|
+
| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | サーバーサイドリクエスト用の標準プロキシ変数 |
|
|
87
|
+
|
|
88
|
+
## アーキテクチャ
|
|
89
|
+
|
|
90
|
+
ompweb は Node 上でホストされる Next.js アプリで、インストール済みの `omp` バイナリを操作します。エージェント自体は同梱していません:
|
|
91
|
+
|
|
92
|
+
- **ライブセッション**: `omp --mode rpc-ui`(stdio 上の NDJSON)を、アクティブなセッションごとに 1 つの子プロセスとして起動します。そのため、エージェントのバージョンは常にインストールされているものと完全に一致します。
|
|
93
|
+
- **セッション閲覧**: omp のセッションファイル(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`)を直接読み込みます。タイトル変更、アーカイブ、削除は、OMP のライブ書き込みと競合しないよう保護されたネイティブファイルのメンテナンス操作です。
|
|
94
|
+
- **モデルと認証**: omp 子プロセスに対する RPC コマンドを使用します。モデルパネルは omp エージェントディレクトリ内の `models.yml` を編集します。
|
|
95
|
+
- **スキルとプラグイン**: omp のスキルディレクトリ(`~/.omp/agent/skills`、プロジェクトの `.omp/skills`、互換ディレクトリ)をスキャンし、プラグイン管理には `omp plugin` を呼び出します。
|
|
96
|
+
- **ファイルアクセス**: ファイルの閲覧とプレビューは、選択したプロジェクトディレクトリとセッションに現れる作業ディレクトリに限定されます。
|
|
97
|
+
- **フォークとセッション内ブランチの違い**: フォークは新しい `.jsonl` ファイルを作成します。「ここから編集」は同じセッションファイル内に別のブランチを作成します。
|
|
98
|
+
|
|
99
|
+
## 開発
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npm install
|
|
103
|
+
npm run dev
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
ローカル開発サーバーは [http://127.0.0.1:30177](http://127.0.0.1:30177) で動作します。
|
|
107
|
+
|
|
108
|
+
よく使うチェック:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
npx tsc --noEmit # 型チェック
|
|
112
|
+
npm run lint # ESLint(警告ゼロを強制)
|
|
113
|
+
node --test lib/*.test.mjs components/*.test.mjs # テスト実行
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
ローカル開発中は `next build` / `npm run build` の実行を避けてください。`.next/` への書き込みが行われ、開発サーバーに干渉することがあります。ビルドはリリース作業のときだけにしてください。
|
|
117
|
+
|
|
118
|
+
## 国際化
|
|
119
|
+
|
|
120
|
+
ompweb は英語、簡体字中国語(简体中文)、日本語をサポートし、3 言語で UI 全体の翻訳文字列を提供しています。言語は `navigator.language` から自動検出され、トップバーの言語メニューから実行時に切り替えできます。選択はセッション間で永続化されます。
|
|
121
|
+
|
|
122
|
+
- 辞書ファイル: `lib/i18n/locales/{en,zh-CN,ja}.json`
|
|
123
|
+
- フレームワーク: `lib/i18n/index.tsx` — `useSyncExternalStore` ベースの軽量ストア、`{var}` 補間と複数形サポート(`.one`/`.other`)
|
|
124
|
+
- API エラーメッセージは安定したエラーコード(`errors.<code>`)でクライアント側で翻訳
|
|
125
|
+
|
|
126
|
+
## 品質
|
|
127
|
+
|
|
128
|
+
- **アクセシビリティ**: WCAG AA 準拠 — Lighthouse アクセシビリティスコア 100/100、キーボードナビゲーション全面対応、フォーカス可視リング、ARIA ロール
|
|
129
|
+
- **パフォーマンス**: リストコンポーネントのメモ化、RAF によるスクロール/マウスハンドラのスロットリング、デバウンス検索、ストリーミング JSONL リーダー、ETag キャッシュによるセッションリスト
|
|
130
|
+
- **堅牢性**: omp 子プロセスのグレースフルシャットダウン(プロセスグループキル)、エラーバウンダリ、アトミックなセッションファイル書き換え
|
|
131
|
+
- **テスト**: セッション解析、ターミナル入力、Markdown レンダリング、メッセージ表示、ネイティブ設定、MCP 設定をカバーする焦点を絞ったテストスイート
|
|
132
|
+
|
|
133
|
+
## クレジット
|
|
134
|
+
|
|
135
|
+
ompweb は [agegr/pi-web](https://github.com/agegr/pi-web)(MIT)のフォークです。pi-web は [badlogic/pi-mono](https://github.com/badlogic/pi-mono) の pi コーディングエージェント向け Web UI で、これを [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi) 向けに適合させたものです。
|
|
136
|
+
|
|
137
|
+
## ライセンス
|
|
138
|
+
|
|
139
|
+
MIT
|
package/README.md
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# ompweb
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md)
|
|
4
|
+
|
|
5
|
+
Community: [Join the OMPWEB Discord](https://discord.gg/evqgGzRfM5)
|
|
6
|
+
|
|
7
|
+
Local web UI for the [oh-my-pi (omp) coding agent](https://github.com/can1357/oh-my-pi). ompweb reads your local omp session files and gives you a browser workspace for session browsing, real-time chat, model configuration, skill management, and project file preview.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
<details>
|
|
12
|
+
<summary>Screenshots (light / dark)</summary>
|
|
13
|
+
|
|
14
|
+

|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
</details>
|
|
19
|
+
|
|
20
|
+
## 🌟 Enhancements & Optimizations over Upstream (相比上游仓库的优化与增强)
|
|
21
|
+
|
|
22
|
+
This repository ([37chengshan/ompweb](https://github.com/37chengshan/ompweb)) is a feature-rich, hardened fork of [kahme247/ompweb](https://github.com/kahme247/ompweb). Based on actual code implementations, the following key features, architectural upgrades, and performance optimizations have been added:
|
|
23
|
+
|
|
24
|
+
### 1. 🖥️ Interactive Web Terminal (内置交互式终端)
|
|
25
|
+
- **Real PTY Shell Integration (`app/api/terminal/route.ts`, `components/EmbeddedTerminal.tsx`)**: Spawns true pseudo-terminals (`python3 -c "import pty; pty.spawn(...)"`) with ANSI color decoding, bidirectional SSE streaming, serialized inputs, and dynamic window resize (`cols`/`rows`).
|
|
26
|
+
- **Dockable Bottom Panel**: Run Git commands, build scripts, tests, and CLI tools directly within ompweb without leaving the browser. Includes auto session reaping and bounded output ring buffers.
|
|
27
|
+
|
|
28
|
+
### 2. 📂 Native File Manager Integration & Workspace Ordering (文件管理与工作区排序)
|
|
29
|
+
- **Always-Visible Reveal Action (`components/FileExplorer.tsx`, `app/api/files/open/route.ts`)**: Permanent "Reveal in Finder / Explorer / File Manager" quick-actions on workspace headers and file tree nodes (not hover-gated) with cross-platform support (macOS `open`, Windows `explorer.exe`, Linux `xdg-open`).
|
|
30
|
+
- **Workspace Aliases & Custom Ordering (`lib/project-registry.ts`, `lib/project-ordering.ts`)**: Rename workspace display labels (aliases) and customize project sidebar ordering persistently without mutating repository paths on disk.
|
|
31
|
+
|
|
32
|
+
### 3. 🎨 Visual Theme Studio & Motion Controls (主题工作室与动效偏好)
|
|
33
|
+
- **Theme Studio (`components/ThemeStudio.tsx`, `hooks/useTheme.ts`)**: Live preview and customize paper/ember design tokens with WCAG AA contrast verification, instant light/dark/system cycling, and custom color accents.
|
|
34
|
+
- **Motion Accessibility (`hooks/useMotionPrefs.ts`)**: OS `prefers-reduced-motion` integration that instantly disables heavy SVG SMIL animations and replaces smooth-scrolling with instant jumps for users sensitive to motion.
|
|
35
|
+
|
|
36
|
+
### 4. 🧭 Plan Mode Surface & History Traceability (计划看板与压缩前历史追溯)
|
|
37
|
+
- **Interactive Plan Panel (`components/PlanPanel.tsx`, `lib/plan-reader.ts`)**: Live plan document rendering from `<session>/local/*-plan.md`, one-click plan execution, and a dedicated critique/feedback modal (`onRejectPlan`).
|
|
38
|
+
- **Pre-Compaction History Browsing (`lib/session-reader.ts`)**: Toggle and inspect full pre-compaction message history without polluting the active agent context.
|
|
39
|
+
|
|
40
|
+
### 5. ⚡ Frontend Rendering & Viewport Safety (前端渲染极致优化)
|
|
41
|
+
- **Streaming Markdown AST Bypass (`components/MarkdownBody.tsx`)**: Bypasses expensive math regex scans (`normalizeDisplayMath`) and dynamic KaTeX imports during streaming, compiling AST only once on message commit for a smooth 60fps experience.
|
|
42
|
+
- **LRU Memory Caches (`lib/markdown.ts`, `lib/patch.ts`)**: 200-slot LRU cache for display math normalization and 20-slot LRU cache for unified diff parsing (`parseUnifiedPatch`).
|
|
43
|
+
- **DOM Explosion Protection (`components/MessageView.tsx`)**: 800-row limit (`MAX_ROWS = 800`) on Git diff views and 100KB safety caps on thinking/tool outputs.
|
|
44
|
+
- **Component Memoization (`components/PlanPanel.tsx`, `components/MessageView.tsx`)**: `React.memo` wrappers prevent cascading re-renders during active streaming.
|
|
45
|
+
|
|
46
|
+
### 6. 🛡️ Backend Node.js, RPC & File I/O Hardening (后端 RPC 内存安全加固)
|
|
47
|
+
- **Git ProjectRoot Dedup & 5-minute Cache (`lib/worktree.ts`)**: `__piProjectPendingCache` coalesces concurrent `resolveProject` calls into a single Promise and caches results for 5 minutes.
|
|
48
|
+
- **SSE Socket & Memory Leak Prevention (`app/api/agent/[id]/events/route.ts`, `lib/rpc-manager.ts`)**: Emits `session_destroyed` upon session termination to immediately close SSE streams and unregister listeners.
|
|
49
|
+
- **Child Process Dispose Failsafe (`lib/omp/rpc-process.ts`)**: `Promise.race` timeout fallback prevents hanging promises on un-reaped processes; `crlfDelay: Infinity` standardizes NDJSON parsing.
|
|
50
|
+
- **Context Payload Shrinking (`lib/session-reader.ts`, `lib/types.ts`)**: Completely strips deferred `thinking` fields from JSON payloads rather than sending empty strings.
|
|
51
|
+
|
|
52
|
+
### 7. ⚙️ Redesigned MCP Manager & Built-in Agent MCP (MCP 管理器重构与 Agent MCP 集成)
|
|
53
|
+
- **Dual-Mode Visual Form Editor (`components/McpConfig.tsx`)**: Form-based editing (Transport, Command, Args, URL, Enabled switch) + JSON mode with quick templates (`Python stdio`, `NPX stdio`, `Remote HTTP`) and project/global configuration support.
|
|
54
|
+
- **Categorized Accordion & Filter (`components/McpConfig.tsx`)**: Accordion grouping with real-time search for multi-client discovered MCP servers.
|
|
55
|
+
- **Built-in Agent MCP Integration (`vendor/agent-mcp/`)**: Vendored `agent-mcp` (v3.0.0) multi-agent orchestration tools with SQLite tuning (`PRAGMA temp_store=MEMORY`, autocommit mode) and lock-free SSE broadcaster queues.
|
|
56
|
+
|
|
57
|
+
## Requirements
|
|
58
|
+
|
|
59
|
+
- [omp](https://github.com/can1357/oh-my-pi) installed and on your `PATH` (or point `OMP_WEB_OMP_BIN` at the binary)
|
|
60
|
+
- Node.js 22.19.0 (`nvm use`; `node --version`)
|
|
61
|
+
|
|
62
|
+
## Quick Start
|
|
63
|
+
|
|
64
|
+
**Run without installing:**
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npx @kahme247/ompweb@latest
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Or install globally:**
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npm install -g @kahme247/ompweb
|
|
74
|
+
ompweb
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Then open [http://127.0.0.1:30177](http://127.0.0.1:30177). The CLI will try to open the browser automatically after the server is ready. ompweb listens on `127.0.0.1` by default.
|
|
78
|
+
|
|
79
|
+
**Options:**
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
ompweb --port 8080 # custom port
|
|
83
|
+
ompweb --hostname 0.0.0.0 # expose on a trusted network
|
|
84
|
+
ompweb -p 8080 -H 0.0.0.0 # combine options
|
|
85
|
+
ompweb --no-open # do not open the browser automatically
|
|
86
|
+
ompweb --password "a-long-random-password" # password-only sign-in without POSIX inline-env syntax
|
|
87
|
+
|
|
88
|
+
PORT=8080 ompweb # environment variable is also supported
|
|
89
|
+
OMP_WEB_HOSTNAME=0.0.0.0 ompweb # explicit network exposure
|
|
90
|
+
OMP_WEB_PASSWORD='a-long-random-password' ompweb # env-variable form (POSIX: inline or exported)
|
|
91
|
+
OMP_WEB_NO_OPEN=1 ompweb # useful when running as a background service
|
|
92
|
+
|
|
93
|
+
# Windows (PowerShell / CMD)
|
|
94
|
+
# $env:OMP_WEB_PASSWORD="a-long-random-password"; ompweb
|
|
95
|
+
# or
|
|
96
|
+
# ompweb --password "a-long-random-password"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Set `OMP_WEB_PASSWORD` (or pass `--password`) to protect the interface and every API endpoint with a themed, password-only sign-in screen. A successful sign-in creates an HTTP-only signed session cookie for 30 days; changing the configured password invalidates existing sessions. Leaving the variable unset disables authentication. Remote use still requires HTTPS through a trusted reverse proxy or VPN so the password and session cookie cannot be intercepted. On Windows the env-variable syntax is `$env:OMP_WEB_PASSWORD="..."`; `ompweb --password "..."` works in every shell without that extra step.
|
|
100
|
+
|
|
101
|
+
### Security and troubleshooting
|
|
102
|
+
|
|
103
|
+
- The server binds to `127.0.0.1` by default. A non-loopback hostname is an explicit opt-in and should only be used behind a trusted network boundary; ompweb is not safe to expose publicly.
|
|
104
|
+
- File APIs are allow-listed to the selected workspace, its valid Git worktrees, session-referenced directories, and explicitly selected roots. Paths are canonicalized to reject traversal and symlink escapes.
|
|
105
|
+
- `omp` is resolved from `OMP_WEB_OMP_BIN` first, then `PATH`. If live chat cannot start, run `omp --version` in the same terminal or set `OMP_WEB_OMP_BIN` to the executable's absolute path.
|
|
106
|
+
- Session history remains native OMP JSONL. OMP owns live-session writes; ompweb reads the files directly and only performs explicit title, archive, and delete maintenance when it is not racing a live OMP write.
|
|
107
|
+
- Session archive uses OMP's native `archive/sessions/<cwd>/<file>.jsonl.gz` layout and moves sibling artifacts with the transcript; the original JSONL bytes are preserved inside the gzip.
|
|
108
|
+
|
|
109
|
+
## Features
|
|
110
|
+
|
|
111
|
+
- **Pick work back up**: browse previous omp conversations by project without digging through terminal history or session paths.
|
|
112
|
+
- **Try different directions safely**: continue from an earlier message (in-session branches with a branch navigator) or fork a session into a separate route.
|
|
113
|
+
- **Keep the sidebar tidy**: archive an inactive session without deleting its native transcript, or delete it explicitly when it is no longer needed.
|
|
114
|
+
- **Work across branches**: switch Git worktrees from the sidebar so new sessions and the Explorer follow the checkout you choose.
|
|
115
|
+
- **Chat beside the project**: browse files on the left and preview source, docs, images, audio, and PDFs on the right while the agent works.
|
|
116
|
+
- **Watch subagents and plans live**: composer-attached panels show the todo plan and running subagents with per-subagent telemetry; click a chip for the full subagent transcript.
|
|
117
|
+
- **See session state clearly**: context usage, cost, tokens-per-second (reported by omp itself), compaction state and method (with before → after token counts on compaction cards), and system prompt details are visible from the top bar and transcript.
|
|
118
|
+
- **Preview markdown faithfully**: YAML frontmatter renders in a summary card (title + key/value rows), math fences stay aligned inside lists, and CJK ranges like `5~7U` are no longer mangled (GFM now requires `~~` for strikethrough).
|
|
119
|
+
- **Pick projects naturally on Windows**: a drive picker at the filesystem root and a case-folded, symlink-aware project identity keep the sidebar stable across drives and worktrees.
|
|
120
|
+
- **Configure less from the terminal**: manage models, login/API keys, model tests, task agents, native OMP controls (advisor, approval, Bash policy, thinking, compaction, memory, auto-learn, retry/fallback), skills (search, install, update checks), plugins, and project MCP servers from the web UI.
|
|
121
|
+
- **MCP management in Settings**: a dedicated MCP tab lists installed project servers with status (enabled / disabled / invalid), supports add/edit/rename/validate/remove, and surfaces configuration failures as corner toasts.
|
|
122
|
+
- **Slash commands that travel**: `/goal`, `/plan`, `/review`, `/fix`, `/test`, `/explain`, `/simplify`, `/commit`, and `/advisor` expand into well-structured prompts; omp's own commands (skills, `/compact`, …) appear via `available_commands_update`.
|
|
123
|
+
- **Keep OMP current**: check the installed runtime version, update it, and restart active sessions from Settings when needed.
|
|
124
|
+
- **Stay informed**: opt into browser notifications when an agent finishes, play a completion sound, and check installed skills for updates.
|
|
125
|
+
- **Jump anywhere with ⌘K**: a command palette (⌘K / Ctrl+K) for switching sessions, starting new ones, and toggling the theme.
|
|
126
|
+
- **Warm, paper-like design**: light and dark themes with serif display type and WCAG AA-verified contrast, built on a token-driven UI kit (Base UI primitives, cmdk, lucide icons).
|
|
127
|
+
|
|
128
|
+
## Configuration
|
|
129
|
+
|
|
130
|
+
| Variable | Meaning |
|
|
131
|
+
| --- | --- |
|
|
132
|
+
| `PORT` | Server port (default `30177`; `-p/--port` wins) |
|
|
133
|
+
| `OMP_WEB_HOSTNAME` | Bind hostname (default `127.0.0.1`; `-H/--hostname` wins) |
|
|
134
|
+
| `OMP_WEB_PASSWORD` / `--password` | Password for the sign-in screen; `--password` works in every shell (PowerShell/CMD) without ` $env:` syntax |
|
|
135
|
+
| `OMP_WEB_NO_OPEN` | Set to `1`/`true` to skip auto-opening the browser |
|
|
136
|
+
| `OMP_WEB_OMP_BIN` | Absolute path to the `omp` binary when it is not on `PATH` |
|
|
137
|
+
| `PI_CODING_AGENT_DIR` | Point at another omp agent directory (default `~/.omp/agent`) |
|
|
138
|
+
| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | Standard proxy variables for server-side requests |
|
|
139
|
+
|
|
140
|
+
## Architecture
|
|
141
|
+
|
|
142
|
+
ompweb is a Node-hosted Next.js app that drives your installed `omp` binary — it does not embed the agent:
|
|
143
|
+
- **Live sessions**: spawns `omp --mode rpc-ui` (NDJSON over stdio), one child process per active session, so the agent version is always exactly what you have installed. It negotiates RPC v2 when the installed OMP advertises it, uses bounded chunk reassembly for large frames, and falls back to v1 for older versions. Host env (`PORT`, `NEXT_*`, `NODE_ENV`) is stripped before spawn, and shutdown is graceful on both POSIX (process-group) and Windows (`taskkill /t`).
|
|
144
|
+
- **Live state and telemetry**: context usage, queue depth, compaction state, and tokens-per-second are polled from omp's `get_state` RPC and surfaced in the top bar and transcript; compaction cards show the maintenance method and before → after token counts. Subagent transcripts persist beside the parent session's artifacts and are recovered from disk so past runs still show their rosters.
|
|
145
|
+
- **Session browsing**: reads omp's session files (`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`) directly; title, archive, and delete are narrow native-file maintenance operations guarded against live OMP writes. Projects are grouped by a stable `projectKey` (Windows case-folded, symlink-resolved) so the sidebar doesn't jump between drives or worktrees.
|
|
146
|
+
- **Models and auth**: RPC commands against the omp child process with strict payload validation (unknown-shape guards, safe fallbacks); the Models panel edits `models.yml` in the omp agent directory, dropping blank placeholder rows and rejecting ambiguous `enabledModels` entries.
|
|
147
|
+
- **Native settings**: the General/MCP settings panels read and write the allow-listed subset of `~/.omp/agent/config.yml` (or `config.yaml` fallback), preserving unrelated keys and comments. Changes apply to new and restarted sessions.
|
|
148
|
+
- **Skills and plugins**: scans omp's skill directories (`~/.omp/agent/skills`, project `.omp/skills`, and compat dirs) and shells out to `omp plugin` for plugin management.
|
|
149
|
+
- **MCP servers**: project servers are managed through OMP's native locations (`.omp/mcp.json`, then compatibility files) at the git top level, validated against the stdio/http/sse schema and written atomically.
|
|
150
|
+
- **File access**: file browsing and preview are scoped to the selected project directory and working directories that appear in sessions; paths are canonicalized via a single `isWindowsAbsolutePath`/`samePath` helper and symlink escapes are rejected after `realpath` resolution. On Windows the directory picker offers a drive list at the root.
|
|
151
|
+
- **Forks vs in-session branches**: Fork creates a new `.jsonl` file. "Edit from here" creates another branch inside the same session file.
|
|
152
|
+
|
|
153
|
+
## Development
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
npm install
|
|
157
|
+
npm run dev
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The local dev server runs at [http://127.0.0.1:30178](http://127.0.0.1:30178).
|
|
161
|
+
|
|
162
|
+
Common checks:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
npm run typecheck # type check
|
|
166
|
+
npm run lint # ESLint (zero warnings enforced)
|
|
167
|
+
npm test # run test suite
|
|
168
|
+
npm run build # production build
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Avoid running `next build` / `npm run build` during local development. It writes to `.next/` and can interfere with the dev server; leave builds for release work.
|
|
172
|
+
|
|
173
|
+
## Internationalization
|
|
174
|
+
|
|
175
|
+
ompweb supports English, Simplified Chinese (简体中文), and Japanese (日本語) with translated UI strings across all three languages. The language is auto-detected from `navigator.language` and can be switched at runtime via the language menu in the top bar. The choice persists across sessions.
|
|
176
|
+
|
|
177
|
+
- Dictionaries: `lib/i18n/locales/{en,zh-CN,ja}.json`
|
|
178
|
+
- Framework: `lib/i18n/index.tsx` — a lightweight store built on `useSyncExternalStore` with `{var}` interpolation and plural support (`.one`/`.other`)
|
|
179
|
+
- API error messages are translated via stable error codes (`errors.<code>`) looked up client-side
|
|
180
|
+
|
|
181
|
+
## Quality
|
|
182
|
+
|
|
183
|
+
- **Accessibility**: WCAG AA compliant — Lighthouse a11y score 100/100, keyboard navigation throughout, focus-visible rings, ARIA roles
|
|
184
|
+
- **Performance**: memoized list components, RAF-gated scroll/mouse handlers, debounced search, streaming JSONL reader, ETag-cached session listing
|
|
185
|
+
- **Resilience**: graceful shutdown of spawned omp processes (process-group kill), error boundaries, atomic session file rewrites
|
|
186
|
+
- **Tests**: a focused suite covering session parsing, RPC frame chunking, subagent history, markdown rendering, message display, native settings, and MCP configuration — run with `npm test`
|
|
187
|
+
|
|
188
|
+
## Credits
|
|
189
|
+
|
|
190
|
+
ompweb is a fork of [agegr/pi-web](https://github.com/agegr/pi-web) (MIT), the web UI for the [earendil/pi-mono](https://github.com/earendil-works/pi) pi coding agent, adapted for [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi).
|
|
191
|
+
|
|
192
|
+
## License
|
|
193
|
+
|
|
194
|
+
MIT
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# ompweb
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | [日本語](./README.ja.md)
|
|
4
|
+
|
|
5
|
+
社区:[加入 OMPWEB Discord](https://discord.gg/evqgGzRfM5)
|
|
6
|
+
|
|
7
|
+
[oh-my-pi (omp) 编程智能体](https://github.com/can1357/oh-my-pi)的本地 Web UI。ompweb 读取本机的 omp 会话文件,在浏览器中提供一个工作区,支持会话浏览、实时对话、模型配置、技能管理和项目文件预览。
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
<d## 🌟 相比上游仓库的优化与增强 (Optimizations & Enhancements)
|
|
12
|
+
|
|
13
|
+
本仓库([37chengshan/ompweb](https://github.com/37chengshan/ompweb))是基于 [kahme247/ompweb](https://github.com/kahme247/ompweb) 的功能增强与深度调优版本。基于实际代码实现,包含了以下关键特性新增、架构升级与性能优化:
|
|
14
|
+
|
|
15
|
+
### 1. 🖥️ 内置交互式 Web 终端 (Interactive Web Terminal)
|
|
16
|
+
- **真 PTY 伪终端支持 (`app/api/terminal/route.ts`, `components/EmbeddedTerminal.tsx`)**:利用 `python3 -c "import pty; pty.spawn(...)"` 生成原生 PTY,支持 ANSI 全彩高亮解析、双向 SSE 流式传输、有序输入序列化与终端窗口动态缩放(`cols`/`rows`)。
|
|
17
|
+
- **底部可停靠面板**:直接在 Web 界面执行 Git 命令、调试脚本和运行测试,自带超时会话自动回收与环形缓冲区溢出保护。
|
|
18
|
+
|
|
19
|
+
### 2. 📂 系统原生文件管理器联动与工作区排序 (File Explorer & Workspace Alias)
|
|
20
|
+
- **常驻「在文件管理器中显示」快捷键 (`components/FileExplorer.tsx`, `app/api/files/open/route.ts`)**:工作区卡片与文件树节点提供常驻快捷按钮(无需 hover 悬停),跨平台调用系统原生文件管理器(macOS `open`、Windows `explorer.exe`、Linux `xdg-open`)。
|
|
21
|
+
- **工作区别名与自定义排序 (`lib/project-registry.ts`, `lib/project-ordering.ts`)**:支持为工作区设置显示别名(Alias)并在侧边栏持久化自定义排序,不破坏磁盘目录结构。
|
|
22
|
+
|
|
23
|
+
### 3. 🎨 视觉主题工作室与无障碍动效控制 (Theme Studio & Motion Controls)
|
|
24
|
+
- **主题调色工作室 (`components/ThemeStudio.tsx`, `hooks/useTheme.ts`)**:支持自定义纸感/余烬设计系统 Token,所有色彩均通过 WCAG AA 对比度验证,提供浅色/深色/跟随系统一键轮转与个性化强调色调节。
|
|
25
|
+
- **动效无障碍支持 (`hooks/useMotionPrefs.ts`)**:自动适配系统 `prefers-reduced-motion` 偏好,立即禁用耗性能的 SVG SMIL 动效并将平滑滚动转换为瞬时跳跃,保障低配设备流畅度。
|
|
26
|
+
|
|
27
|
+
### 4. 🧭 计划模式看板与压缩前历史追溯 (Plan Mode & History Traceability)
|
|
28
|
+
- **交互式计划看板 (`components/PlanPanel.tsx`, `lib/plan-reader.ts`)**:实时同步并渲染 `<session>/local/*-plan.md` 计划草稿,支持一键执行计划与弹窗提交结构化修改意见(`onRejectPlan`)。
|
|
29
|
+
- **压缩前历史追溯 (`lib/session-reader.ts`)**:允许用户在顶栏展开浏览上下文压缩前的全部原始历史记录,不污染当前活跃上下文。
|
|
30
|
+
|
|
31
|
+
### 5. ⚡ 前端渲染引擎与视口安全防御 (UI & React Rendering)
|
|
32
|
+
- **流式 Markdown 增量绕过 (`components/MarkdownBody.tsx`)**:Token 流式输出期间跳过全文公式正则扫描(`normalizeDisplayMath`)与 KaTeX 插件动态加载,仅在消息提交时执行一次 AST 构建,保持 60fps 丝滑渲染。
|
|
33
|
+
- **内存级 LRU 缓存加速 (`lib/markdown.ts`, `lib/patch.ts`)**:公式标准化内置 200 条容量 LRU 缓存,Unified Diff 解析内置 20 条容量 LRU 缓存(`patchCache`),消除重复计算。
|
|
34
|
+
- **DOM 防雪崩与极端输出截断保护 (`components/MessageView.tsx`)**:Git Diff 视图设置 800 行硬上限(`MAX_ROWS = 800`),超长思考与 ToolResult 设置 100KB 防崩保护。
|
|
35
|
+
- **组件细粒度 Memo 包装 (`components/PlanPanel.tsx`, `components/MessageView.tsx`)**:`React.memo` 阻断非必要级联重渲染。
|
|
36
|
+
|
|
37
|
+
### 6. 🛡️ 后端 Node.js、RPC 进程与文件 I/O 加固 (Backend & Process Safety)
|
|
38
|
+
- **Git 根目录内存持久缓存 + 并发去重 (`lib/worktree.ts`)**:延长 `PROJECT_CACHE_TTL_MS` 至 5 分钟,加入 `__piProjectPendingCache` 全局 Map 合并并行 Promise,杜绝重复 `git rev-parse` 进程风暴。
|
|
39
|
+
- **SSE 僵尸连接彻底清理 (`app/api/agent/[id]/events/route.ts`, `lib/rpc-manager.ts`)**:会话终结或销毁时主动派发 `session_destroyed` 事件并安全关闭 `ReadableStream`,杜绝文件描述符与内存泄漏。
|
|
40
|
+
- **子进程 Dispose 熔断保护 (`lib/omp/rpc-process.ts`)**:`RpcProcess.dispose()` 加入 `Promise.race` 熔断锁防止僵死进程挂起,`crlfDelay: Infinity` 标准化流式行解析。
|
|
41
|
+
- **`deferThinking` 载荷瘦身 (`lib/session-reader.ts`, `lib/types.ts`)**:在延迟加载模式下直接从 JSON 结构中解构移除 thinking 字段,显著降低网络传输体积。
|
|
42
|
+
|
|
43
|
+
### 7. ⚙️ MCP 管理器体验重构与内置 Agent MCP
|
|
44
|
+
- **双模式可视化表单编辑器 (`components/McpConfig.tsx`)**:提供「可视化表单(协议、命令/URL、参数、启用开关)」与「JSON 代码」双模式,内置 `Python stdio`、`NPX stdio`、`Remote HTTP` 一键模板,支持项目与全局(`~/.omp/agent/mcp.json`)配置自由切换。
|
|
45
|
+
- **多源分类折叠手风琴 (`components/McpConfig.tsx`)**:对跨客户端自动发现的 50+ 个服务端按来源折叠并支持实时搜索。
|
|
46
|
+
- **内置 Agent MCP 预设与微调 (`vendor/agent-mcp/`)**:自带多 Agent 编排工具库,配合 SQLite 高并发优化(`PRAGMA temp_store=MEMORY`、autocommit 事务无锁化)、SSE 广播队列无锁化原子置换与指数退避等待算法。
|
|
47
|
+
|
|
48
|
+
## 环境要求�会话终结或销毁时主动派发 `session_destroyed` 事件,SSE 流监听到后立即关闭 `ReadableStream` 并注销监听器,杜绝文件描述符与内存泄漏。
|
|
49
|
+
- **子进程 Dispose 熔断保护 (`lib/omp/rpc-process.ts`)**:在 `RpcProcess.dispose()` 中加入 `Promise.race` 熔断定时器,即使操作系统偶发未能回收僵死进程,也能安全 resolve,防止 Promise 永久挂起;以 `crlfDelay: Infinity` 标准化流式行解析。
|
|
50
|
+
- **原子文件操作异常清理 (`lib/omp/mcp-config.ts`)**:在原子写入中使用 `try ... finally { try { unlinkSync(temp); } catch {} }`,防止异常时残留 `.tmp-*` 孤儿文件。
|
|
51
|
+
- **`deferThinking` 载荷瘦身 (`lib/session-reader.ts`, `lib/types.ts`)**:将 `ThinkingContent.thinking` 改为可选字段,在延迟加载模式下直接从 JSON 结构中解构移除该 key 而非返回空字符串,显著降低会话上下文网络传输开销。
|
|
52
|
+
|
|
53
|
+
### 3. ⚙️ MCP 管理器重构与内置 Agent MCP
|
|
54
|
+
- **双模式可视化表单编辑器 (`components/McpConfig.tsx`)**:提供「可视化表单(协议、命令/URL、参数、启用开关)」与「JSON 代码」双模式,内置 `Python stdio`、`NPX stdio`、`Remote HTTP` 一键模板,并支持在项目与全局配置(`~/.omp/agent/mcp.json`)之间无缝切换。
|
|
55
|
+
- **多源分类折叠手风琴 (`components/McpConfig.tsx`)**:对跨客户端自动发现的 50+ 个服务端按来源折叠并支持实时搜索,彻底解决卡片溢出和遮挡问题。
|
|
56
|
+
- **内置 Agent MCP 编排引擎**:内嵌 `agent-mcp` (v3.0.0) 预设与工具,配合 SQLite 高并发优化(`PRAGMA temp_store=MEMORY`、`isolation_level=None` autocommit 事务无锁化)、SSE 广播队列无锁化原子引用置换与指数退避等待算法。
|
|
57
|
+
|
|
58
|
+
## 环境要求
|
|
59
|
+
|
|
60
|
+
- 已安装 [omp](https://github.com/can1357/oh-my-pi) 且在 `PATH` 中(或通过 `OMP_WEB_OMP_BIN` 指向其二进制文件)
|
|
61
|
+
- Node.js 22.19.0 或更高版本(`node --version`)
|
|
62
|
+
|
|
63
|
+
## 快速开始
|
|
64
|
+
|
|
65
|
+
**免安装直接运行:**
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npx @kahme247/ompweb@latest
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**或全局安装:**
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npm install -g @kahme247/ompweb
|
|
75
|
+
ompweb
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
然后打开 [http://127.0.0.1:30177](http://127.0.0.1:30177)。服务器就绪后,CLI 会尝试自动打开浏览器。ompweb 默认监听 `127.0.0.1`。
|
|
79
|
+
|
|
80
|
+
**选项:**
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
ompweb --port 8080 # 自定义端口
|
|
84
|
+
ompweb --hostname 0.0.0.0 # 在可信网络中暴露服务
|
|
85
|
+
ompweb -p 8080 -H 0.0.0.0 # 组合使用
|
|
86
|
+
ompweb --no-open # 不自动打开浏览器
|
|
87
|
+
|
|
88
|
+
ompweb --password "a-long-random-password" # 启用仅密码登录(Windows 同样适用)
|
|
89
|
+
|
|
90
|
+
PORT=8080 ompweb # 也支持环境变量
|
|
91
|
+
OMP_WEB_HOSTNAME=0.0.0.0 ompweb # 显式暴露到网络
|
|
92
|
+
OMP_WEB_PASSWORD='a-long-random-password' ompweb # 环境变量形式(POSIX)
|
|
93
|
+
# Windows: $env:OMP_WEB_PASSWORD="secret"; ompweb
|
|
94
|
+
OMP_WEB_NO_OPEN=1 ompweb # 作为后台服务运行时很有用
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
设置 `OMP_WEB_PASSWORD` 可通过与主题集成的仅密码登录页面保护界面和所有 API 端点。登录成功后,会创建有效期为 30 天的 HTTP-only 签名会话 Cookie;留空则关闭认证。远程访问仍需通过受信任反向代理或 VPN 提供 HTTPS,以保护密码和会话 Cookie。默认仅监听 `127.0.0.1`;不要将 ompweb 直接暴露到互联网。
|
|
98
|
+
|
|
99
|
+
## 功能特性
|
|
100
|
+
|
|
101
|
+
- **随时接续之前的工作**:按项目浏览以往的 omp 对话,不必翻找终端历史或会话文件路径。
|
|
102
|
+
- **放心尝试不同方向**:从更早的消息继续,或将会话分叉为一条独立路线。
|
|
103
|
+
- **整理侧边栏**:归档不活跃会话而不删除原生记录,或在不再需要时明确删除。
|
|
104
|
+
- **跨分支工作**:在侧边栏切换 Git 工作树,新会话和资源管理器都会跟随你选择的检出。
|
|
105
|
+
- **边看项目边聊天**:左侧浏览文件,右侧预览源码、文档、图片、音频和 PDF,同时智能体继续工作。
|
|
106
|
+
- **清晰掌握会话状态**:上下文用量、费用、压缩上下文状态和系统提示词详情都显示在顶栏。
|
|
107
|
+
- **减少对终端配置的依赖**:在 Web UI 中管理模型、登录/API 密钥、模型测试、原生 OMP 控制(顾问、审批、Bash 策略、思考、压缩、记忆、自动学习、重试/回退)、技能、插件和项目 MCP 服务器。
|
|
108
|
+
- **在设置中管理 MCP**:专用 MCP 标签页显示项目服务器状态(已启用 / 已禁用 / 无效),支持添加、编辑、重命名、校验和删除,并通过角落提示显示配置失败。
|
|
109
|
+
- **保持 OMP 为最新版本**:可在设置中检查已安装运行时、更新它,并按需重启活动会话。
|
|
110
|
+
- **及时获知完成状态**:可选择在智能体完成时接收浏览器通知,并检查已安装技能的更新。
|
|
111
|
+
- **⌘K 随处跳转**:命令面板(⌘K / Ctrl+K)支持切换会话、新建会话和切换主题。
|
|
112
|
+
- **温暖的纸感设计**:浅色/深色双主题,衬线展示字体,对比度经 WCAG AA 验证,基于令牌驱动的 UI 套件(Base UI 基元、cmdk、lucide 图标)构建。
|
|
113
|
+
|
|
114
|
+
## 配置
|
|
115
|
+
|
|
116
|
+
| 变量 | 含义 |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| `PORT` | 服务器端口(默认 `30177`;`-p/--port` 优先) |
|
|
119
|
+
| `OMP_WEB_HOSTNAME` | 绑定主机名(默认 `127.0.0.1`;`-H/--hostname` 优先) |
|
|
120
|
+
| `OMP_WEB_PASSWORD` | 登录页面使用的可选密码 |
|
|
121
|
+
| `OMP_WEB_NO_OPEN` | 设为 `1`/`true` 可跳过自动打开浏览器 |
|
|
122
|
+
| `OMP_WEB_OMP_BIN` | `omp` 不在 `PATH` 中时,指向其二进制文件的绝对路径 |
|
|
123
|
+
| `PI_CODING_AGENT_DIR` | 指向其他 omp agent 目录(默认 `~/.omp/agent`) |
|
|
124
|
+
| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | 服务器端请求使用的标准代理变量 |
|
|
125
|
+
|
|
126
|
+
## 架构
|
|
127
|
+
|
|
128
|
+
ompweb 是一个由 Node 托管的 Next.js 应用,驱动你已安装的 `omp` 二进制文件——它并不内嵌智能体:
|
|
129
|
+
|
|
130
|
+
- **实时会话**:启动 `omp --mode rpc-ui`(基于 stdio 的 NDJSON),每个活动会话对应一个子进程,因此智能体版本始终与你安装的完全一致。
|
|
131
|
+
- **会话浏览**:直接读取 omp 的会话文件(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`);标题、归档和删除是受保护的原生文件维护操作,不会与 OMP 的实时写入竞争。
|
|
132
|
+
- **模型与认证**:通过 RPC 命令与 omp 子进程交互;模型面板编辑 omp agent 目录中的 `models.yml`。
|
|
133
|
+
- **技能与插件**:扫描 omp 的技能目录(`~/.omp/agent/skills`、项目内 `.omp/skills` 及兼容目录),并调用 `omp plugin` 进行插件管理。
|
|
134
|
+
- **文件访问**:文件浏览与预览仅限于所选项目目录以及会话中出现过的工作目录。
|
|
135
|
+
- **分叉与会话内分支**:分叉会创建新的 `.jsonl` 文件;“从此处编辑”则在同一会话文件内创建另一个分支。
|
|
136
|
+
|
|
137
|
+
## 开发
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
npm install
|
|
141
|
+
npm run dev
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
本地开发服务器运行在 [http://127.0.0.1:30177](http://127.0.0.1:30177)。
|
|
145
|
+
|
|
146
|
+
常用检查:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npx tsc --noEmit # 类型检查
|
|
150
|
+
npm run lint # ESLint(零警告)
|
|
151
|
+
node --test lib/*.test.mjs components/*.test.mjs # 运行测试
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
本地开发时请避免运行 `next build` / `npm run build`。它会写入 `.next/`,可能干扰开发服务器;构建请留到发布阶段。
|
|
155
|
+
|
|
156
|
+
## 多语言支持
|
|
157
|
+
|
|
158
|
+
ompweb 支持英语、简体中文和日本語,三种语言均覆盖整个界面的翻译字符串。语言从 `navigator.language` 自动检测,可通过顶栏的语言菜单在运行时切换。选择会跨会话持久化。
|
|
159
|
+
|
|
160
|
+
- 字典文件:`lib/i18n/locales/{en,zh-CN,ja}.json`
|
|
161
|
+
- 框架:`lib/i18n/index.tsx` — 基于 `useSyncExternalStore` 的轻量 store,支持 `{var}` 插值和复数形式(`.one`/`.other`)
|
|
162
|
+
- API 错误消息通过稳定的错误码(`errors.<code>`)在客户端翻译
|
|
163
|
+
|
|
164
|
+
## 质量
|
|
165
|
+
|
|
166
|
+
- **可访问性**:符合 WCAG AA 标准 — Lighthouse 可访问性评分 100/100,全键盘导航,焦点可见环,ARIA 角色
|
|
167
|
+
- **性能**:列表组件 memo 化、RAF 节流滚动/鼠标处理、防抖搜索、流式 JSONL 读取器、ETag 缓存会话列表
|
|
168
|
+
- **健壮性**:优雅关闭 omp 子进程(进程组杀死)、错误边界、原子化会话文件重写
|
|
169
|
+
- **测试**:聚焦的测试套件覆盖会话解析、终端输入、Markdown 渲染、消息展示、原生设置和 MCP 配置
|
|
170
|
+
|
|
171
|
+
## 致谢
|
|
172
|
+
|
|
173
|
+
ompweb 分叉自 [agegr/pi-web](https://github.com/agegr/pi-web)(MIT)——[badlogic/pi-mono](https://github.com/badlogic/pi-mono) pi 编程智能体的 Web UI,并针对 [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi) 进行了适配。
|
|
174
|
+
|
|
175
|
+
## 许可证
|
|
176
|
+
|
|
177
|
+
MIT
|