ompgui 0.7.1 → 0.7.3
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 -1
- package/.next/app-path-routes-manifest.json +9 -8
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +4 -4
- package/.next/react-loadable-manifest.json +14 -7
- package/.next/required-server-files.js +2 -2
- package/.next/required-server-files.json +2 -2
- package/.next/routes-manifest.json +6 -0
- package/.next/server/app/_global-error/page.js +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +2 -2
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
- package/.next/server/app/api/agent/[id]/events/route.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js +1 -1
- package/.next/server/app/api/agent/new/route.js +1 -1
- package/.next/server/app/api/agent/running/events/route.js +2 -2
- package/.next/server/app/api/agents/[name]/route.js +1 -1
- package/.next/server/app/api/agents/route.js +1 -1
- package/.next/server/app/api/agents/unpack/route.js +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/auth/all-providers/route.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/providers/route.js +1 -1
- package/.next/server/app/api/cwd/browse/route.js +1 -1
- package/.next/server/app/api/cwd/validate/route.js +2 -2
- package/.next/server/app/api/daemon/route.js +1 -0
- package/.next/server/app/api/daemon/route.js.nft.json +1 -0
- package/.next/server/app/api/daemon/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/default-cwd/route.js +1 -1
- package/.next/server/app/api/file-index/route.js +1 -1
- package/.next/server/app/api/files/[...path]/route.js +1 -1
- package/.next/server/app/api/git/diff/route.js +2 -2
- package/.next/server/app/api/git/status/route.js +2 -2
- package/.next/server/app/api/home/route.js +1 -1
- package/.next/server/app/api/mcp/route.js +2 -2
- package/.next/server/app/api/model-roles/route.js +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/api/models-config/catalog/route.js +1 -1
- package/.next/server/app/api/models-config/route.js +1 -1
- package/.next/server/app/api/models-config/test/route.js +1 -1
- package/.next/server/app/api/omp-settings/route.js +1 -1
- package/.next/server/app/api/omp-update/route.js +2 -2
- package/.next/server/app/api/omp-version/route.js +1 -1
- package/.next/server/app/api/plugins/route.js +1 -1
- package/.next/server/app/api/projects/route.js +1 -1
- package/.next/server/app/api/providers/enable/route.js +1 -1
- package/.next/server/app/api/relay/devices/[id]/route.js +1 -1
- package/.next/server/app/api/relay/devices/route.js +1 -1
- package/.next/server/app/api/relay/pair/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/archive/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/media/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/subagents/[subagentId]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/subagents/route.js +1 -1
- package/.next/server/app/api/sessions/archive/route.js +1 -1
- package/.next/server/app/api/sessions/import/route.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/skills/check/route.js +1 -1
- package/.next/server/app/api/skills/install/route.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/search/route.js +1 -1
- package/.next/server/app/api/skills/update/route.js +1 -1
- package/.next/server/app/api/usage/route.js +1 -1
- package/.next/server/app/api/web-auth/session/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/apple-icon.png/route.js +1 -1
- package/.next/server/app/favicon.ico/route.js +1 -1
- package/.next/server/app/icon.svg/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +4 -4
- package/.next/server/app/login.segments/_full.segment.rsc +4 -4
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pair/page.js +1 -1
- package/.next/server/app/pair/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pair.html +1 -1
- package/.next/server/app/pair.rsc +4 -4
- package/.next/server/app/pair.segments/_full.segment.rsc +4 -4
- package/.next/server/app/pair.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/pair.segments/pair/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/relay/route.js +1 -1
- package/.next/server/app-paths-manifest.json +9 -8
- package/.next/server/chunks/5318.js +1 -1
- package/.next/server/chunks/714.js +1 -1
- package/.next/server/chunks/795.js +9 -9
- package/.next/server/chunks/8834.js +1 -1
- package/.next/server/chunks/933.js +1 -1
- package/.next/server/functions-config-manifest.json +1 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/middleware.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/-e2ns-fZZm-4SQeI3H4-N/_buildManifest.js +1 -0
- package/.next/static/chunks/{1012.2a9e89fd82a08863.js → 1012.1393cfb59d12bb81.js} +1 -1
- package/.next/static/chunks/1941.66c3a0942c0c3e5d.js +1 -0
- package/.next/static/chunks/{2201.e6bbfc26ce87920c.js → 2201.46326eb058826eb2.js} +1 -1
- package/.next/static/chunks/{3274.4cdcf3a52b884856.js → 3274.2a04ea2716225057.js} +1 -1
- package/.next/static/chunks/3944.6215b78f025077b3.js +1 -0
- package/.next/static/chunks/4315-142781649334beb2.js +1 -0
- package/.next/static/chunks/4906-7dff29185f63f908.js +1 -0
- package/.next/static/chunks/587-c973123b3c9a5b80.js +1 -0
- package/.next/static/chunks/{7488.42415d6f1b86c86b.js → 7488.1403755f69bda581.js} +1 -1
- package/.next/static/chunks/app/_global-error/page-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/agent/running/events/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/agents/[name]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/agents/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/agents/unpack/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/app-update/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/auth/all-providers/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/cwd/browse/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/cwd/validate/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/daemon/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/file-index/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/git/diff/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/git/status/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/home/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/mcp/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/model-roles/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/models/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/models-config/catalog/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/models-config/test/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/omp-settings/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/omp-update/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/omp-version/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/projects/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/providers/enable/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/relay/devices/[id]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/relay/devices/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/relay/pair/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/archive/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/media/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/state/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/subagents/[subagentId]/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/subagents/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/archive/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/import/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/skills/check/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/skills/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/skills/update/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/usage/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/web-auth/session/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/login/page-a54174ed920300f7.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/app/{page-dcb62803f94d0c1c.js → page-fe40fe42b5ca1207.js} +1 -1
- package/.next/static/chunks/app/pair/page-d72423ffc5654e29.js +1 -0
- package/.next/static/chunks/app/relay/route-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-710453b8adcf7d31.js +1 -0
- package/.next/static/chunks/webpack-d6e3c46873419a16.js +1 -0
- package/.next/static/css/63b622301ba107de.css +3 -0
- package/README.ja.md +28 -3
- package/README.ko.md +28 -3
- package/README.md +28 -3
- package/README.zh-CN.md +28 -3
- package/bin/ompgui-options.js +9 -2
- package/bin/ompgui-service.js +223 -0
- package/bin/ompgui-update.js +85 -22
- package/bin/ompgui.js +7 -0
- package/package.json +2 -1
- package/.next/static/QFUZ5E_wgec_DUeAoDxrb/_buildManifest.js +0 -1
- package/.next/static/chunks/1108.1f1e4661b6e402fb.js +0 -1
- package/.next/static/chunks/3065-24b6f2111fc740ea.js +0 -1
- package/.next/static/chunks/4315-bd1069a88334f3a3.js +0 -1
- package/.next/static/chunks/9090-6ce028ffeafe2aee.js +0 -1
- package/.next/static/chunks/app/_global-error/page-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/events/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/agent/new/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/agent/running/events/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/agents/[name]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/agents/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/agents/unpack/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/app-update/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/auth/all-providers/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/auth/login/[provider]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/auth/providers/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/cwd/browse/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/cwd/validate/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/default-cwd/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/file-index/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/files/[...path]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/git/diff/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/git/status/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/home/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/mcp/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/model-roles/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/models/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/models-config/catalog/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/models-config/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/models-config/test/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/omp-settings/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/omp-update/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/omp-version/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/plugins/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/projects/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/providers/enable/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/relay/devices/[id]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/relay/devices/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/relay/pair/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/archive/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/context/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/media/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/export/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/state/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/subagents/[subagentId]/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/subagents/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/archive/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/import/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/skills/check/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/skills/install/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/skills/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/skills/search/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/skills/update/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/usage/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/web-auth/session/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/login/page-76b98ef41947c31b.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/app/pair/page-e1ad2578491903a8.js +0 -1
- package/.next/static/chunks/app/relay/route-2900441d61e06609.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-2900441d61e06609.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-2900441d61e06609.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-2900441d61e06609.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2900441d61e06609.js +0 -1
- package/.next/static/chunks/webpack-789dbb5c37af2dc8.js +0 -1
- package/.next/static/css/d4456801cd2ff0da.css +0 -3
- /package/.next/static/{QFUZ5E_wgec_DUeAoDxrb → -e2ns-fZZm-4SQeI3H4-N}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const fs = require("node:fs");
|
|
4
|
+
const os = require("node:os");
|
|
5
|
+
const path = require("node:path");
|
|
6
|
+
const { spawn, spawnSync } = require("node:child_process");
|
|
7
|
+
const LABEL = "com.hanbinnoh.ompgui";
|
|
8
|
+
const POLL_WAIT = new Int32Array(new SharedArrayBuffer(4));
|
|
9
|
+
const ACTIONS = new Set(["install", "repair", "start", "stop", "restart", "status", "uninstall", "remove", "enable", "disable"]);
|
|
10
|
+
const escapeXml = (value) => String(value).replace(/[<>&"']/g, (char) => ({ "<": "<", ">": ">", "&": "&", '"': """, "'": "'" })[char]);
|
|
11
|
+
function plistValue(value) {
|
|
12
|
+
if (typeof value === "boolean") return value ? "<true/>" : "<false/>";
|
|
13
|
+
if (Array.isArray(value)) return `<array>${value.map(plistValue).join("")}</array>`;
|
|
14
|
+
if (value && typeof value === "object") return `<dict>${Object.entries(value).map(([key, entry]) => `<key>${escapeXml(key)}</key>${plistValue(entry)}`).join("")}</dict>`;
|
|
15
|
+
return `<string>${escapeXml(value)}</string>`;
|
|
16
|
+
}
|
|
17
|
+
function createServiceManager({ processAlive = (pid) => {
|
|
18
|
+
try { process.kill(pid, 0); return true; } catch (error) { if (error.code === "ESRCH") return false; throw error; }
|
|
19
|
+
}, now = Date.now, pause = (milliseconds) => Atomics.wait(POLL_WAIT, 0, 0, milliseconds), label = LABEL, platform = process.platform, home = os.homedir(), uid = process.getuid?.(), env = process.env, execPath = process.execPath, cliPath = path.join(__dirname, "ompgui.js"), portAvailable = (port, hostname) => {
|
|
20
|
+
const probe = spawnSync(process.execPath, [__filename, "--check-port", String(port), hostname], { encoding: "utf8", timeout: 5000 });
|
|
21
|
+
if (probe.status === 0) return true;
|
|
22
|
+
if (probe.status === 2) return false;
|
|
23
|
+
throw new Error("Could not check service port availability");
|
|
24
|
+
}, run = (command, args) => spawnSync(command, args, { encoding: "utf8", timeout: 10000 }) } = {}) {
|
|
25
|
+
// Internal dependency-injection seam only; CLI and HTTP never accept a label override.
|
|
26
|
+
if (typeof label !== "string" || !/^com\.hanbinnoh\.ompgui(?:\.verify[A-Za-z0-9-]+)?$/.test(label)) throw new Error("Invalid ompgui service label");
|
|
27
|
+
const plistPath = path.join(home, "Library", "LaunchAgents", `${label}.plist`);
|
|
28
|
+
const logPath = path.join(home, "Library", "Logs", "ompgui", "service.log");
|
|
29
|
+
const domain = `gui/${uid}`;
|
|
30
|
+
const target = `${domain}/${label}`;
|
|
31
|
+
function command(args, allowMissing = false) {
|
|
32
|
+
const result = run("/bin/launchctl", args);
|
|
33
|
+
if (result.error || result.status !== 0) {
|
|
34
|
+
// launchctl's missing-service exit status is 113; never hide permission/domain errors.
|
|
35
|
+
if (allowMissing && result.status === 113) return null;
|
|
36
|
+
throw new Error(`launchctl ${args[0]} failed${result.error ? `: ${result.error.code || "execution error"}` : ` (exit ${result.status})`}`);
|
|
37
|
+
}
|
|
38
|
+
return result.stdout || "";
|
|
39
|
+
}
|
|
40
|
+
function ownedExecutable(args) {
|
|
41
|
+
if (!Array.isArray(args) || args.length < 2 || typeof args[0] !== "string" || typeof args[1] !== "string" || !path.isAbsolute(args[0]) || !path.isAbsolute(args[1]) || path.basename(args[0]) !== "node") return false;
|
|
42
|
+
try {
|
|
43
|
+
const resolved = fs.realpathSync(args[1]);
|
|
44
|
+
if (path.basename(resolved) !== "ompgui.js" || path.basename(path.dirname(resolved)) !== "bin") return false;
|
|
45
|
+
return JSON.parse(fs.readFileSync(path.join(path.dirname(resolved), "..", "package.json"), "utf8")).name === "ompgui";
|
|
46
|
+
} catch { return false; }
|
|
47
|
+
}
|
|
48
|
+
function readInstalled() {
|
|
49
|
+
let stat;
|
|
50
|
+
try { stat = fs.lstatSync(plistPath); } catch (error) { if (error.code === "ENOENT") return null; throw error; }
|
|
51
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.uid !== uid || (stat.mode & 0o022) !== 0) throw new Error("Refusing unmanaged or foreign-owned LaunchAgent");
|
|
52
|
+
const result = run("/usr/bin/plutil", ["-convert", "json", "-o", "-", plistPath]);
|
|
53
|
+
if (result.error || result.status !== 0) throw new Error("Cannot read LaunchAgent configuration");
|
|
54
|
+
let config;
|
|
55
|
+
try { config = JSON.parse(result.stdout); } catch { throw new Error("Invalid LaunchAgent configuration"); }
|
|
56
|
+
if (config.Label !== label || !ownedExecutable(config.ProgramArguments) || config.Program) throw new Error("Refusing LaunchAgent not owned by ompgui");
|
|
57
|
+
return config;
|
|
58
|
+
}
|
|
59
|
+
function inspect() {
|
|
60
|
+
const state = { supported: platform === "darwin", installed: false, running: false, autoStart: false, label, pid: null, logPath: null };
|
|
61
|
+
if (!state.supported) return { ...state, error: "Service management is supported only on macOS." };
|
|
62
|
+
const config = readInstalled();
|
|
63
|
+
state.installed = Boolean(config);
|
|
64
|
+
state.logPath = typeof config?.StandardOutPath === "string" ? config.StandardOutPath : null;
|
|
65
|
+
const printed = command(["print", target], true);
|
|
66
|
+
if (printed !== null) {
|
|
67
|
+
const source = printed.match(/^\s*path = (.+)$/m)?.[1]?.trim();
|
|
68
|
+
if (!config || source !== plistPath) throw new Error("Refusing loaded service with unverified ownership");
|
|
69
|
+
const pid = printed.match(/^\s*pid = (\d+)\s*$/m);
|
|
70
|
+
state.pid = pid ? Number(pid[1]) : null;
|
|
71
|
+
state.running = /\bstate = running\b/.test(printed) && state.pid !== null;
|
|
72
|
+
if (!state.running) state.pid = null;
|
|
73
|
+
}
|
|
74
|
+
const disabled = command(["print-disabled", domain]);
|
|
75
|
+
const explicitlyDisabled = new RegExp(`"${label.replaceAll(".", "\\.")}"\\s*=>\\s*(?:true|disabled)\\b`).test(disabled);
|
|
76
|
+
state.autoStart = Boolean(config && config.RunAtLoad !== false && !explicitlyDisabled);
|
|
77
|
+
return { ...state, loaded: printed !== null, explicitlyDisabled };
|
|
78
|
+
}
|
|
79
|
+
function status() {
|
|
80
|
+
try { const state = inspect(); delete state.loaded; delete state.explicitlyDisabled; return state; }
|
|
81
|
+
catch (error) { return { supported: platform === "darwin", installed: fs.existsSync(plistPath), running: false, autoStart: false, label, pid: null, logPath: null, error: error.message }; }
|
|
82
|
+
}
|
|
83
|
+
function validate(action) {
|
|
84
|
+
if (!ACTIONS.has(action)) throw new Error(`Unknown service action: ${action}`);
|
|
85
|
+
if (platform !== "darwin") throw new Error("Service management is supported only on macOS.");
|
|
86
|
+
const state = inspect();
|
|
87
|
+
if (["start", "restart", "enable", "disable"].includes(action) && !state.installed) throw new Error("Service is not installed. Run ompgui service install first.");
|
|
88
|
+
return state;
|
|
89
|
+
}
|
|
90
|
+
function execute(action, options = {}) {
|
|
91
|
+
if (action === "status") return status();
|
|
92
|
+
const before = validate(action);
|
|
93
|
+
if (action === "remove") action = "uninstall";
|
|
94
|
+
if (action === "repair") action = before.installed ? "restart" : "install";
|
|
95
|
+
if (["install", "start", "restart"].includes(action) && !before.running) {
|
|
96
|
+
const installed = before.installed ? readInstalled() : null;
|
|
97
|
+
const launch = installed ? require("./ompgui-options").parseLaunchOptions(installed.ProgramArguments.slice(2), installed.EnvironmentVariables || {}) : options;
|
|
98
|
+
const port = launch.port || "30177";
|
|
99
|
+
const hostname = launch.hostname || "127.0.0.1";
|
|
100
|
+
if (!portAvailable(port, hostname)) throw new Error(`Port ${port} on ${hostname} is already in use. Stop the foreground server or other listener, then run ompgui service ${before.installed ? "start" : "install"}. No service configuration was changed.`);
|
|
101
|
+
}
|
|
102
|
+
if (action === "install" && !before.installed) {
|
|
103
|
+
const realCli = fs.realpathSync(cliPath);
|
|
104
|
+
const packageDir = path.resolve(path.dirname(realCli), "..");
|
|
105
|
+
if (!ownedExecutable([execPath, realCli]) || fs.existsSync(path.join(packageDir, ".git")) || !fs.existsSync(path.join(packageDir, ".next", "BUILD_ID"))) throw new Error("Install the published ompgui package before installing its service; development checkouts are not supported.");
|
|
106
|
+
const persistentEnv = {};
|
|
107
|
+
for (const [key, value] of Object.entries(env)) {
|
|
108
|
+
if ((/^(OMP_|OMPGUI_|OMP_WEB_)/.test(key) || ["PATH", "HOME", "SHELL", "LANG", "LC_ALL", "PI_CODING_AGENT_DIR", "PI_PROFILE"].includes(key)) && typeof value === "string" && !/(?:PACKAGE_DIR|LAUNCHER_PID)$/.test(key)) persistentEnv[key] = value;
|
|
109
|
+
}
|
|
110
|
+
persistentEnv.OMPGUI_NO_OPEN = "1";
|
|
111
|
+
if (options.password) { persistentEnv.OMPGUI_PASSWORD = options.password; persistentEnv.OMP_WEB_PASSWORD = options.password; }
|
|
112
|
+
if (options.relayUrl) persistentEnv.OMPGUI_RELAY_URL = options.relayUrl;
|
|
113
|
+
const config = { Label: label, ProgramArguments: [execPath, realCli, "--port", String(options.port || "30177"), "--hostname", options.hostname || "127.0.0.1", "--no-open"], WorkingDirectory: home, EnvironmentVariables: persistentEnv, RunAtLoad: true, KeepAlive: true, StandardOutPath: logPath, StandardErrorPath: logPath };
|
|
114
|
+
fs.mkdirSync(path.dirname(plistPath), { recursive: true, mode: 0o700 });
|
|
115
|
+
fs.mkdirSync(path.dirname(logPath), { recursive: true, mode: 0o700 });
|
|
116
|
+
const temporary = `${plistPath}.${process.pid}.${require("node:crypto").randomUUID()}.tmp`;
|
|
117
|
+
try {
|
|
118
|
+
fs.writeFileSync(temporary, `<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">${plistValue(config)}</plist>\n`, { mode: 0o600, flag: "wx" });
|
|
119
|
+
fs.renameSync(temporary, plistPath);
|
|
120
|
+
} finally { fs.rmSync(temporary, { force: true }); }
|
|
121
|
+
}
|
|
122
|
+
if (["enable", "disable"].includes(action)) {
|
|
123
|
+
if (!before.installed) throw new Error("Service is not installed. Run ompgui service install first.");
|
|
124
|
+
command([action, target]);
|
|
125
|
+
return status();
|
|
126
|
+
}
|
|
127
|
+
if (["stop", "uninstall"].includes(action)) {
|
|
128
|
+
if (before.loaded) {
|
|
129
|
+
command(["bootout", target]);
|
|
130
|
+
// The launcher allows 5 seconds before forcing its Next child to exit.
|
|
131
|
+
const deadline = now() + 10000;
|
|
132
|
+
while (command(["print", target], true) !== null) {
|
|
133
|
+
if (now() >= deadline) throw new Error("Service is still stopping. Configuration was preserved; wait, check ompgui status, and retry the action.");
|
|
134
|
+
pause(100);
|
|
135
|
+
}
|
|
136
|
+
while (before.pid !== null && processAlive(before.pid)) {
|
|
137
|
+
if (now() >= deadline) throw new Error("Service process is still exiting. Configuration was preserved; wait, check ompgui status, and retry the action.");
|
|
138
|
+
pause(100);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (action === "uninstall" && before.installed) fs.unlinkSync(plistPath);
|
|
142
|
+
} else {
|
|
143
|
+
if (!before.installed && action !== "install") throw new Error("Service is not installed. Run ompgui service install first.");
|
|
144
|
+
if (action === "install") command(["enable", target]);
|
|
145
|
+
if (!before.loaded) {
|
|
146
|
+
const restoreDisabled = action !== "install" && before.explicitlyDisabled;
|
|
147
|
+
if (restoreDisabled) command(["enable", target]);
|
|
148
|
+
try {
|
|
149
|
+
command(["bootstrap", domain, plistPath]);
|
|
150
|
+
command(["kickstart", target]);
|
|
151
|
+
}
|
|
152
|
+
finally { if (restoreDisabled) command(["disable", target]); }
|
|
153
|
+
} else if (action === "restart") command(["kickstart", "-k", target]);
|
|
154
|
+
else if (!before.running) command(["kickstart", target]);
|
|
155
|
+
}
|
|
156
|
+
return status();
|
|
157
|
+
}
|
|
158
|
+
function updateSnapshot(packageDir) {
|
|
159
|
+
if (platform !== "darwin") return null;
|
|
160
|
+
const before = inspect();
|
|
161
|
+
if (!before.installed || !before.running) return null;
|
|
162
|
+
const config = readInstalled();
|
|
163
|
+
const packagePath = path.resolve(path.dirname(fs.realpathSync(config.ProgramArguments[1])), "..");
|
|
164
|
+
if (packagePath !== fs.realpathSync(packageDir)) throw new Error("Running ompgui service belongs to another installation; update that installation instead.");
|
|
165
|
+
const contents = fs.readFileSync(plistPath);
|
|
166
|
+
const launch = require("./ompgui-options").parseLaunchOptions(config.ProgramArguments.slice(2), config.EnvironmentVariables || {});
|
|
167
|
+
return {
|
|
168
|
+
packagePath, port: launch.port, hostname: launch.hostname,
|
|
169
|
+
verify() {
|
|
170
|
+
const current = inspect();
|
|
171
|
+
if (!current.installed || !fs.readFileSync(plistPath).equals(contents) || current.explicitlyDisabled !== before.explicitlyDisabled) throw new Error("Service configuration changed during update; refusing automatic restart.");
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return { status, execute, validate, updateSnapshot, plistPath };
|
|
176
|
+
}
|
|
177
|
+
async function runServiceCli(options) {
|
|
178
|
+
const action = options.command === "service" ? options.extraPositionals[0] || "repair" : options.command;
|
|
179
|
+
if (options.extraPositionals.length > (options.command === "service" ? 1 : 0)) throw new Error("Unexpected service arguments");
|
|
180
|
+
const manager = createServiceManager();
|
|
181
|
+
let result;
|
|
182
|
+
try {
|
|
183
|
+
if (options.defer) {
|
|
184
|
+
if (!["stop", "restart", "uninstall"].includes(action)) throw new Error("Only stop, restart, and uninstall can be deferred");
|
|
185
|
+
manager.validate(action);
|
|
186
|
+
const child = spawn(process.execPath, [__filename, action], { detached: true, stdio: "ignore", env: process.env });
|
|
187
|
+
const spawned = Promise.withResolvers();
|
|
188
|
+
child.once("spawn", spawned.resolve);
|
|
189
|
+
child.once("error", spawned.reject);
|
|
190
|
+
await spawned.promise;
|
|
191
|
+
child.unref();
|
|
192
|
+
result = { ...manager.status(), accepted: true };
|
|
193
|
+
} else result = manager.execute(action, options);
|
|
194
|
+
} catch (error) { result = { ...manager.status(), error: error.message }; }
|
|
195
|
+
if (options.json) console.log(JSON.stringify(result));
|
|
196
|
+
else {
|
|
197
|
+
console.log(`ompgui service: ${result.running ? `running (PID ${result.pid})` : "stopped"}; ${result.installed ? "installed" : "not installed"}; login auto-start ${result.autoStart ? "enabled" : "disabled"}`);
|
|
198
|
+
if (result.logPath) console.log(`Logs: ${result.logPath}`);
|
|
199
|
+
if (result.error) console.error(result.error);
|
|
200
|
+
}
|
|
201
|
+
if (result.error) process.exitCode = 1;
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
if (require.main === module) {
|
|
205
|
+
const action = process.argv[2];
|
|
206
|
+
if (["stop", "restart", "uninstall"].includes(action) && process.argv.length === 3) setTimeout(() => {
|
|
207
|
+
const manager = createServiceManager();
|
|
208
|
+
const before = manager.status();
|
|
209
|
+
try {
|
|
210
|
+
const result = manager.execute(action);
|
|
211
|
+
if (result.error) throw new Error(result.error);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
process.exitCode = 1;
|
|
214
|
+
if (before.logPath) {
|
|
215
|
+
try { fs.appendFileSync(before.logPath, `${new Date().toISOString()} Deferred service ${action} failed: ${error.message}\n`, { mode: 0o600 }); } catch { /* No alternate secret-bearing output destination. */ }
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}, 1200);
|
|
219
|
+
else if (action === "--check-port" && process.argv.length === 5) {
|
|
220
|
+
require("./port-availability").isPortAvailable(process.argv[3], process.argv[4]).then((available) => { process.exitCode = available ? 0 : 2; }).catch(() => { process.exitCode = 1; });
|
|
221
|
+
} else process.exitCode = 1;
|
|
222
|
+
}
|
|
223
|
+
module.exports = { LABEL, createServiceManager, runServiceCli };
|
package/bin/ompgui-update.js
CHANGED
|
@@ -4,6 +4,18 @@ const { spawn } = require("child_process");
|
|
|
4
4
|
const fs = require("fs");
|
|
5
5
|
const os = require("os");
|
|
6
6
|
const path = require("path");
|
|
7
|
+
const { createServiceManager } = require("./ompgui-service");
|
|
8
|
+
const { setTimeout: sleep } = require("node:timers/promises");
|
|
9
|
+
|
|
10
|
+
async function checkReady({ hostname, port }) {
|
|
11
|
+
const host = hostname === "0.0.0.0" ? "127.0.0.1" : hostname === "::" ? "::1" : hostname;
|
|
12
|
+
const authority = host.includes(":") ? `[${host}]` : host;
|
|
13
|
+
try {
|
|
14
|
+
const response = await fetch(`http://${authority}:${port}/`, { signal: AbortSignal.timeout(1000), redirect: "manual" });
|
|
15
|
+
await response.body?.cancel();
|
|
16
|
+
return response.ok || response.status === 307 || response.status === 308;
|
|
17
|
+
} catch { return false; }
|
|
18
|
+
}
|
|
7
19
|
|
|
8
20
|
function normalizePath(value, platform) {
|
|
9
21
|
const normalized = path.normalize(value).replaceAll("\\", path.sep);
|
|
@@ -35,39 +47,46 @@ function findNpmCli(nodePath = process.execPath, exists = fs.existsSync) {
|
|
|
35
47
|
}) ?? null;
|
|
36
48
|
}
|
|
37
49
|
|
|
38
|
-
function getInstallCommand(method, platform = process.platform, nodePath = process.execPath, resolveNpmCli = findNpmCli) {
|
|
50
|
+
function getInstallCommand(method, platform = process.platform, nodePath = process.execPath, resolveNpmCli = findNpmCli, packageDir) {
|
|
51
|
+
const paths = platform === "win32" ? path.win32 : path;
|
|
52
|
+
const modules = packageDir && paths.dirname(packageDir);
|
|
53
|
+
if (packageDir && (paths.basename(packageDir) !== "ompgui" || paths.basename(modules) !== "node_modules")) {
|
|
54
|
+
throw new Error("Cannot safely update this installation layout. Reinstall ompgui with npm or Bun first.");
|
|
55
|
+
}
|
|
39
56
|
if (method === "bun") {
|
|
40
|
-
|
|
57
|
+
const target = packageDir ? ["--global-dir", paths.dirname(modules), "--global-bin-dir", platform === "win32" ? paths.join(paths.dirname(modules), ".bin") : paths.resolve(modules, "../../../bin")] : [];
|
|
58
|
+
return { command: platform === "win32" ? "bun.exe" : "bun", args: ["add", "--global", ...target, "ompgui@latest"] };
|
|
41
59
|
}
|
|
60
|
+
const parent = packageDir && paths.dirname(modules);
|
|
61
|
+
const global = !packageDir || platform === "win32" || paths.basename(parent) === "lib";
|
|
62
|
+
const target = packageDir ? ["--prefix", global && platform !== "win32" ? paths.dirname(parent) : parent] : [];
|
|
63
|
+
const args = ["install", ...(global ? ["--global"] : ["--no-save"]), ...target, "ompgui@latest"];
|
|
42
64
|
if (platform === "win32") {
|
|
43
65
|
const npmCli = resolveNpmCli(nodePath);
|
|
44
66
|
if (!npmCli) throw new Error("Could not locate npm-cli.js beside the active Node.js installation.");
|
|
45
|
-
return { command: nodePath, args: [npmCli,
|
|
67
|
+
return { command: nodePath, args: [npmCli, ...args] };
|
|
46
68
|
}
|
|
47
|
-
return { command: "npm", args
|
|
69
|
+
return { command: "npm", args };
|
|
48
70
|
}
|
|
49
71
|
|
|
50
72
|
function readInstalledVersion(packageDir) {
|
|
51
73
|
try {
|
|
52
74
|
const packageJson = JSON.parse(fs.readFileSync(path.join(packageDir, "package.json"), "utf8"));
|
|
53
|
-
return typeof packageJson.version === "string" ? packageJson.version : null;
|
|
75
|
+
return packageJson.name === "ompgui" && typeof packageJson.version === "string" && /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(packageJson.version) ? packageJson.version : null;
|
|
54
76
|
} catch {
|
|
55
77
|
return null;
|
|
56
78
|
}
|
|
57
79
|
}
|
|
58
80
|
|
|
59
81
|
function runInstaller(command, args, env = process.env) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
reject(new Error(signal ? `${command} was terminated by ${signal}` : `${command} exited with code ${code ?? "unknown"}`));
|
|
69
|
-
});
|
|
82
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
83
|
+
const child = spawn(command, args, { env, stdio: "inherit", windowsHide: true });
|
|
84
|
+
child.once("error", reject);
|
|
85
|
+
child.once("exit", (code, signal) => {
|
|
86
|
+
if (code === 0) resolve();
|
|
87
|
+
else reject(new Error(signal ? `${command} was terminated by ${signal}` : `${command} exited with code ${code ?? "unknown"}`));
|
|
70
88
|
});
|
|
89
|
+
return promise;
|
|
71
90
|
}
|
|
72
91
|
|
|
73
92
|
async function updateOmpGui({
|
|
@@ -77,18 +96,62 @@ async function updateOmpGui({
|
|
|
77
96
|
homeDir = os.homedir(),
|
|
78
97
|
install = runInstaller,
|
|
79
98
|
stdout = process.stdout,
|
|
99
|
+
serviceManager = createServiceManager({ platform, home: homeDir, env }),
|
|
100
|
+
ready = checkReady,
|
|
101
|
+
pause = sleep,
|
|
102
|
+
now = Date.now,
|
|
103
|
+
readinessTimeout = 30000,
|
|
80
104
|
} = {}) {
|
|
81
105
|
if (!packageDir) throw new Error("The ompgui package directory is unavailable.");
|
|
82
106
|
|
|
83
107
|
const beforeVersion = readInstalledVersion(packageDir);
|
|
84
108
|
const method = detectInstallMethod(packageDir, env, homeDir, platform);
|
|
85
|
-
const { command, args } = getInstallCommand(method, platform);
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
109
|
+
const { command, args } = getInstallCommand(method, platform, process.execPath, findNpmCli, packageDir);
|
|
110
|
+
const snapshot = platform === "darwin" ? serviceManager.updateSnapshot(packageDir) : null;
|
|
111
|
+
async function startAndWait() {
|
|
112
|
+
snapshot.verify();
|
|
113
|
+
const started = await serviceManager.execute("start");
|
|
114
|
+
if (started.error) throw new Error(started.error);
|
|
115
|
+
const deadline = now() + readinessTimeout;
|
|
116
|
+
while (now() < deadline) {
|
|
117
|
+
const state = serviceManager.status();
|
|
118
|
+
if (state.error) throw new Error(state.error);
|
|
119
|
+
if (state.running && await ready(snapshot)) {
|
|
120
|
+
snapshot.verify();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
await pause(Math.min(100, Math.max(0, deadline - now())));
|
|
124
|
+
}
|
|
125
|
+
throw new Error("Service did not become ready before the deadline. Check ompgui status and service logs.");
|
|
126
|
+
}
|
|
127
|
+
if (snapshot) {
|
|
128
|
+
stdout.write("Stopping the running ompgui service before updating...\n");
|
|
129
|
+
const stopped = await serviceManager.execute("stop");
|
|
130
|
+
if (stopped.error) throw new Error(stopped.error);
|
|
131
|
+
snapshot.verify();
|
|
132
|
+
}
|
|
133
|
+
let afterVersion;
|
|
134
|
+
try {
|
|
135
|
+
stdout.write(`Updating ompgui${beforeVersion ? ` v${beforeVersion}` : ""} with ${method}...\n`);
|
|
136
|
+
await install(command, args, env);
|
|
137
|
+
afterVersion = readInstalledVersion(packageDir);
|
|
138
|
+
if (!afterVersion) throw new Error("The package manager finished, but the installed ompgui version could not be verified.");
|
|
139
|
+
} catch (error) {
|
|
140
|
+
if (snapshot) {
|
|
141
|
+
stdout.write("Update failed; attempting to start the available ompgui installation (no rollback was performed)...\n");
|
|
142
|
+
try {
|
|
143
|
+
await startAndWait();
|
|
144
|
+
stdout.write("The available ompgui service is running again.\n");
|
|
145
|
+
} catch (recoveryError) {
|
|
146
|
+
throw new AggregateError([error, recoveryError], `${error.message} Recovery start also failed: ${recoveryError.message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
if (snapshot) {
|
|
152
|
+
stdout.write("Starting the updated ompgui service...\n");
|
|
153
|
+
await startAndWait();
|
|
154
|
+
stdout.write("The ompgui service is ready.\n");
|
|
92
155
|
}
|
|
93
156
|
if (beforeVersion && afterVersion && beforeVersion === afterVersion) {
|
|
94
157
|
stdout.write(`ompgui v${afterVersion} is already up to date.\n`);
|
package/bin/ompgui.js
CHANGED
|
@@ -10,6 +10,13 @@ const pkgDir = path.join(__dirname, "..");
|
|
|
10
10
|
const options = parseLaunchOptions();
|
|
11
11
|
if (options.help || options.version) process.exit(0);
|
|
12
12
|
if (options.command) {
|
|
13
|
+
if (["service", "start", "stop", "restart", "status"].includes(options.command)) {
|
|
14
|
+
require("./ompgui-service").runServiceCli(options).catch((error) => {
|
|
15
|
+
console.error(error.message);
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
});
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
13
20
|
if (options.command === "update") {
|
|
14
21
|
if (options.extraPositionals.length) {
|
|
15
22
|
console.error(`Unknown ompgui command: ${[options.command, ...options.extraPositionals].join(" ")}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ompgui",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3",
|
|
4
4
|
"description": "Web UI & Browser GUI for the oh-my-pi (omp) coding agent",
|
|
5
5
|
"homepage": "https://github.com/dbc-hbin/ompgui#readme",
|
|
6
6
|
"repository": {
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"files": [
|
|
23
23
|
"bin/ompgui.js",
|
|
24
24
|
"bin/ompgui-update.js",
|
|
25
|
+
"bin/ompgui-service.js",
|
|
25
26
|
"bin/ompgui-pair.js",
|
|
26
27
|
"bin/omp-web.js",
|
|
27
28
|
"bin/ompgui-options.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:49,errorRate:1e-4,numBits:940,numHashes:14,bitArray:[1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1,1,0,0,0,1,0,1,1,0,1,0,1,1,0,1,0,0,0,0,0,1,1,1,0,1,1,0,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,0,1,1,0,1,0,0,1,0,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,0,0,1,0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,1,1,0,0,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,1,1,1,0,1,1,0,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,0,1,0,0,0,0,1,0,0,1,0,0,1,1,1,0,1,0,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,1,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,0,1,1,1,0,0,0,1,0,1,1,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,1,0,0,1,0,0,1,0,1,1,1,1,0,0,1,0,1,0,1,0,1,1,1,0,1,1,0,0,0,1,1,0,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,1,1,1,0,1,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,1,0,1,1,0,0,1,0,1,1,1,1,0,0,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,1,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,0,0,1,0,1,0,1,1,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,0,1,1,0,1,1,0,1,0,1,0,0,1,0,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,0,1,1,0,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,1,0]},__routerFilterDynamic:{numItems:8,errorRate:1e-4,numBits:154,numHashes:14,bitArray:[1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,1,0,1,0,0,0,0,1,0,1,1,0,1,0,1,1,0,1,0,0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,0,1,1,0,0,1,0,0,0,1,1,0,0,1,1,0,1,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,0,0,1,1,0,0,0,1,0]},sortedPages:["/_app"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1108],{12651:(e,t,i)=>{i.d(t,{A:()=>n});let n=(0,i(99537).A)("cpu",[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]])},25182:(e,t,i)=>{i.d(t,{A:()=>n});let n=(0,i(99537).A)("eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]])},34140:(e,t,i)=>{i.d(t,{NN:()=>a,RJ:()=>o});let n="ompgui-sound-enabled",s="omp-sound-enabled";function a(){try{let e=function(){let e=window.localStorage,t=e.getItem(n);if(null!==t)return t;let i=e.getItem(s);if(null===i)return null;if("true"===i||"false"===i)try{return e.setItem(n,i),e.removeItem(s),i}catch{return null}try{e.removeItem(s)}catch{}return null}();return null===e||"true"===e}catch{return!0}}function o(e){try{window.localStorage.setItem(n,String(e))}catch{}}},35893:(e,t,i)=>{i.d(t,{t_:()=>o,vR:()=>r,vz:()=>a});let n="omp-web:submit-during-run",s="ompgui:submit-during-run-change";function a(){try{let e=window.localStorage.getItem(n);if("steer"===e||"queue"===e)return e}catch{}return"steer"}function o(e){try{window.localStorage.setItem(n,e),window.dispatchEvent(new Event(s))}catch{}}function r(e){let t=t=>{t.key===n&&e()};return window.addEventListener(s,e),window.addEventListener("storage",t),()=>{window.removeEventListener(s,e),window.removeEventListener("storage",t)}}},50981:(e,t,i)=>{i.d(t,{A:()=>n});let n=(0,i(99537).A)("shield-check",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},70299:(e,t,i)=>{i.d(t,{A:()=>n});let n=(0,i(99537).A)("monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]])},77194:(e,t,i)=>{i.r(t),i.d(t,{SettingsConfig:()=>ee});var n=i(95155),s=i(12115),a=i(35893),o=i(37206),r=i(65377),l=i(70299),d=i(47603),c=i(78890),p=i(86272),g=i(82749),u=i(99314),f=i(92298),b=i(99537);let x=(0,b.A)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);var h=i(31590),m=i(30808),v=i(69090),y=i(66763),C=i(50981),k=i(12651);let w=(0,b.A)("key-round",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);var j=i(90710);let S=(0,b.A)("cable",[["path",{d:"M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z",key:"trhst0"}],["path",{d:"M17 21v-2",key:"ds4u3f"}],["path",{d:"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10",key:"1mo9zo"}],["path",{d:"M21 21v-2",key:"eo0ou"}],["path",{d:"M3 5V3",key:"1k5hjh"}],["path",{d:"M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z",key:"1dd30t"}],["path",{d:"M7 5V3",key:"1t1388"}]]);var A=i(4315);let M=[{id:"general",label:"Interface & Behavior",description:"UI preferences, completion sound, submission mode",Icon:y.A},{id:"safety",label:"Safety & Approvals",description:"Tool safety rules, YOLO mode, terminal permissions",Icon:C.A},{id:"models",label:"AI Model Defaults",description:"Reasoning budget, verbosity, personality, scratchpad",Icon:k.A},{id:"providers",label:"API Keys & Providers",description:"Connected OAuth accounts, API keys, and model registry",Icon:w},{id:"intelligence",label:"Agent & Intelligence",description:"Advisor, memory, autolearn, compaction and retry",Icon:p.A},{id:"agents",label:"Agents & Subagents",description:"Configured subagents, model routing, prewalk, and advisor",Icon:j.A},{id:"extensions",label:"Extensions & Tools",description:"Optional tools, MCP servers, managed skills, and OMP plugins",Icon:S},{id:"system",label:"System & Updates",description:"App updates, runtime version, and active session restart",Icon:g.A}],R=[{id:"tools",label:"Optional Tools",description:"Toggle optional built-in tool capabilities"},{id:"mcp",label:"MCP Servers",description:"Configure global and project MCP servers"},{id:"skills",label:"Skills",description:"Manage reusable workspace skills"},{id:"plugins",label:"Plugins",description:"Manage OMP plugins for this workspace"}],D=e=>"tools"===e||"mcp"===e||"skills"===e||"plugins"===e||"extensions"===e?"extensions":e;function T({active:e,onSelect:t,layout:i="vertical"}){let{t:s}=(0,A.s9)(),a=D(e),o=(e,i)=>{let n=M.findIndex(e=>e.id===i);if(n<0||0===M.length)return;let s=null;("ArrowRight"===e.key||"ArrowDown"===e.key)&&(s=(n+1)%M.length),("ArrowLeft"===e.key||"ArrowUp"===e.key)&&(s=(n-1+M.length)%M.length),"Home"===e.key&&(s=0),"End"===e.key&&(s=M.length-1),null!==s&&(e.preventDefault(),t(M[s].id))};return"vertical"===i?(0,n.jsx)("nav",{"aria-label":"Settings sections",role:"tablist","aria-orientation":"vertical",style:{display:"flex",flexDirection:"column",gap:4,padding:"12px 8px",width:230,flexShrink:0,borderRight:"1px solid var(--border)",background:"var(--bg-panel)",overflowY:"auto"},children:M.map(({id:e,label:i,description:r,Icon:l})=>{let d=e===a,c=s(`settingsTabs.${e}`)||i,p=s(`settingsTabs.${e}Desc`)||r;return(0,n.jsxs)("button",{type:"button",role:"tab",id:`settings-tab-${e}`,"aria-selected":d,"aria-controls":`settings-panel-${e}`,tabIndex:d?0:-1,onClick:()=>t(e),onKeyDown:t=>o(t,e),style:{display:"flex",alignItems:"flex-start",gap:10,minHeight:"var(--control-touch, 44px)",padding:"8px 10px",border:d?"1px solid var(--accent)":"1px solid transparent",borderRadius:"var(--radius-control)",background:d?"var(--bg-selected)":"transparent",color:d?"var(--text)":"var(--text-muted)",cursor:"pointer",textAlign:"left",transition:"background var(--dur-fast) var(--ease-out-warm), color var(--dur-fast) var(--ease-out-warm), border-color var(--dur-fast) var(--ease-out-warm)",width:"100%",boxSizing:"border-box",touchAction:"manipulation"},children:[(0,n.jsx)(l,{size:16,"aria-hidden":"true",style:{marginTop:2,flexShrink:0,color:d?"var(--accent)":"currentColor"}}),(0,n.jsxs)("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:2},children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-base)",fontWeight:d?600:500,lineHeight:1.3,color:d?"var(--text)":"inherit"},children:c}),(0,n.jsx)("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-dim)",lineHeight:1.3,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:p})]})]},e)})}):(0,n.jsx)("nav",{"aria-label":"Settings sections",role:"tablist",style:{display:"flex",gap:6,padding:"8px 12px",borderBottom:"1px solid var(--border)",background:"var(--bg-panel)",flexShrink:0,overflowX:"auto",WebkitOverflowScrolling:"touch"},children:M.map(({id:e,label:i,description:r,Icon:l})=>{let d=e===a,c=s(`settingsTabs.${e}`)||i,p=s(`settingsTabs.${e}Desc`)||r;return(0,n.jsxs)("button",{type:"button",role:"tab",id:`settings-tab-${e}`,"aria-selected":d,"aria-controls":`settings-panel-${e}`,"aria-label":`${c}: ${p}`,title:p,tabIndex:d?0:-1,onClick:()=>t(e),onKeyDown:t=>o(t,e),style:{display:"inline-flex",alignItems:"flex-start",gap:7,minHeight:"var(--control-touch, 44px)",padding:"6px 10px",border:d?"1px solid var(--accent)":"1px solid var(--border)",borderRadius:"var(--radius-control)",background:d?"var(--bg-selected)":"var(--bg)",color:d?"var(--text)":"var(--text-muted)",fontWeight:d?600:500,cursor:"pointer",fontSize:"var(--text-sm)",whiteSpace:"nowrap",textAlign:"left",flexShrink:0,boxSizing:"border-box",touchAction:"manipulation",transition:"all var(--dur-fast) var(--ease-out-warm)"},children:[(0,n.jsx)(l,{size:14,"aria-hidden":"true",style:{marginTop:2,flexShrink:0,color:d?"var(--accent)":"currentColor"}}),(0,n.jsxs)("span",{style:{display:"flex",flexDirection:"column",gap:1,minWidth:0},children:[(0,n.jsx)("span",{style:{fontWeight:d?600:500,fontSize:"var(--text-base)",color:d?"var(--text)":"inherit"},children:c}),(0,n.jsx)("span",{style:{fontSize:"var(--text-sm)",color:"var(--text-dim)",lineHeight:1.25,maxWidth:180,overflow:"hidden",textOverflow:"ellipsis"},children:p})]})]},e)})})}function z({active:e,onSelect:t}){let{t:i}=(0,A.s9)(),s=Math.max(0,R.findIndex(t=>t.id===e)),a=e=>{let i=null;("ArrowRight"===e.key||"ArrowDown"===e.key)&&(i=(s+1)%R.length),("ArrowLeft"===e.key||"ArrowUp"===e.key)&&(i=(s-1+R.length)%R.length),"Home"===e.key&&(i=0),"End"===e.key&&(i=R.length-1),null!==i&&(e.preventDefault(),t(R[i].id))};return(0,n.jsx)("div",{role:"tablist","aria-label":i("settingsConfig.extensionsTabsAria"),"aria-orientation":"horizontal",style:{display:"flex",gap:4,padding:4,border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg-panel)",alignSelf:"flex-start",maxWidth:"100%",overflowX:"auto"},children:R.map(s=>{let o=s.id===e,r=i(`settingsConfig.extensionsTab.${s.id}`)||s.label,l=i(`settingsConfig.extensionsTab.${s.id}Desc`)||s.description;return(0,n.jsx)("button",{type:"button",role:"tab",id:`settings-extension-tab-${s.id}`,"aria-selected":o,"aria-controls":`settings-extension-panel-${s.id}`,"aria-label":`${r}: ${l}`,tabIndex:o?0:-1,onClick:()=>t(s.id),onKeyDown:a,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",minHeight:"var(--control-touch, 44px)",padding:"6px 12px",border:o?"1px solid var(--accent)":"1px solid transparent",borderRadius:"calc(var(--radius-control) - var(--space-1))",background:o?"var(--bg-selected)":"transparent",color:o?"var(--text)":"var(--text-muted)",fontSize:"var(--text-sm)",fontWeight:o?600:500,cursor:"pointer",whiteSpace:"nowrap",boxSizing:"border-box",touchAction:"manipulation",transition:"all var(--dur-fast) var(--ease-out-warm)"},children:r},s.id)})})}var I=i(7834),N=i(96793),P=i(34140),O=i(90071);function L(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function W(e){return Object.assign({},e)}function F(e){return e.mounted&&e.requestGeneration===e.latestGeneration}let E=()=>(0,n.jsx)("div",{role:"status",style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:"Loading settings…"}),U=(0,o.default)(()=>i.e(7488).then(i.bind(i,47488)).then(e=>e.BuiltInToolsConfig),{loadableGenerated:{webpack:()=>[47488]},loading:E}),$=(0,o.default)(()=>Promise.all([i.e(1441),i.e(3274)]).then(i.bind(i,33274)).then(e=>e.ModelsConfig),{loadableGenerated:{webpack:()=>[33274]},loading:E}),H=(0,o.default)(()=>i.e(9981).then(i.bind(i,99981)).then(e=>e.SkillsConfig),{loadableGenerated:{webpack:()=>[99981]},loading:E}),q=(0,o.default)(()=>i.e(2201).then(i.bind(i,42201)).then(e=>e.PluginsConfig),{loadableGenerated:{webpack:()=>[42201]},loading:E}),B=(0,o.default)(()=>i.e(4473).then(i.bind(i,24473)).then(e=>e.McpConfig),{loadableGenerated:{webpack:()=>[24473]},loading:E}),V=(0,o.default)(()=>i.e(9668).then(i.bind(i,79668)).then(e=>e.AgentsConfig),{loadableGenerated:{webpack:()=>[79668]},ssr:!1}),G=["default","smol","slow","vision","plan","designer","commit","tiny","task","advisor"],K=Array.from({length:21},(e,t)=>t),_={fontSize:"var(--text-xs)",padding:"1px 6px",borderRadius:"calc(var(--radius-control) / 2)",background:"var(--bg-subtle)",color:"var(--text-muted)",fontWeight:500};function Y(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}let J=(0,s.createContext)(null),Q=[{tab:"general",section:"Appearance",label:"Color mode",description:"Choose between light, dark, or system color mode.",scope:"UI"},{tab:"general",section:"Appearance",label:"Theme palette",description:"Select warm paper/ember or canonical OMP birch/graphite palette.",scope:"UI"},{tab:"general",section:"Interface & Behavior",label:"Keep tool calls collapsed",description:"Show only compact headers while tools execute.",scope:"UI"},{tab:"general",section:"Interface & Behavior",label:"Completion sound",description:"Play a tone when the agent completes a run.",scope:"UI"},{tab:"general",section:"Interface & Behavior",label:"Message during active run",description:"What composer does on submit while agent runs. Steer interrupts; Queue follow-up delivers after finish.",scope:"UI"},{tab:"safety",section:"Tool Safety & Approvals",label:"Approval Mode",description:"Choose when OMP asks before tool calls.",scope:"New sessions"},{tab:"safety",section:"Tool Safety & Approvals",label:"Bash Override",description:"Override default approval policy specifically for terminal commands.",scope:"New sessions"},{tab:"safety",section:"Tool Safety & Approvals",label:"Extension Tool Requests",description:"Automatically approve extension tool authorization requests.",scope:"New sessions"},{tab:"models",section:"AI Model Defaults",label:"Reasoning",description:"Default effort level for thinking-capable models.",scope:"New sessions"},{tab:"models",section:"AI Model Defaults",label:"Verbosity",description:"Response detail level for supporting providers.",scope:"New sessions"},{tab:"models",section:"AI Model Defaults",label:"Personality",description:"Style included in OMP's system prompt.",scope:"New sessions"},{tab:"models",section:"AI Model Defaults",label:"Thinking Blocks",description:"Hide model reasoning from output view.",scope:"New sessions"},{tab:"models",section:"AI Model Defaults",label:"External Thinking",description:"Private scratchpad reasoning via think tool.",scope:"New sessions"},{tab:"intelligence",section:"Advisor Review",label:"Enable Advisor",description:"Enable Advisor for new sessions with the advisor role.",scope:"New sessions"},{tab:"intelligence",section:"Advisor Review",label:"Advisor Backlog",description:"Wait briefly when advisor falls behind.",scope:"New sessions"},{tab:"intelligence",section:"Advisor Review",label:"Review Subagents",description:"Apply Advisor passive review to subagent tasks.",scope:"New sessions"},{tab:"intelligence",section:"Context Compaction",label:"Automatic Compaction",description:"Compact context before model context limit is hit.",scope:"New sessions"},{tab:"intelligence",section:"Context Compaction",label:"Continue After Compaction",description:"Resume task execution after compaction completes.",scope:"New sessions"},{tab:"intelligence",section:"Context Compaction",label:"Maintenance Strategy",description:"Select algorithm used to reduce context pressure.",scope:"New sessions"},{tab:"intelligence",section:"Context Compaction",label:"Compact Mid-Turn",description:"Check context limits between tool execution steps.",scope:"New sessions"},{tab:"intelligence",section:"Memory & Auto-Learn",label:"Memory Backend",description:"Where durable knowledge is stored across sessions.",scope:"New sessions"},{tab:"intelligence",section:"Memory & Auto-Learn",label:"Enable Auto-Learn",description:"Capture reusable lessons after completed runs.",scope:"New sessions"},{tab:"intelligence",section:"Memory & Auto-Learn",label:"Private Capture Turn",description:"Run private lesson-capture turn at completion.",scope:"New sessions"},{tab:"intelligence",section:"Memory & Auto-Learn",label:"Memory Scope",description:"Scoping for Mnemopi knowledge storage.",scope:"New sessions"},{tab:"intelligence",section:"Memory & Auto-Learn",label:"Recall on Session Start",description:"Load relevant memories into first turn.",scope:"New sessions"},{tab:"intelligence",section:"Memory & Auto-Learn",label:"Retain Completed Turns",description:"Store completed conversation turns in memory.",scope:"New sessions"},{tab:"intelligence",section:"Automatic Retry",label:"Automatic Retry",description:"Retry failed turns automatically.",scope:"New sessions"},{tab:"intelligence",section:"Automatic Retry",label:"Max Attempts",description:"Retry limit before giving up.",scope:"New sessions"},{tab:"intelligence",section:"Automatic Retry",label:"Model Fallback",description:"Fall back to alternative model when retries exhaust.",scope:"New sessions"},{tab:"intelligence",section:"Automatic Retry",label:"Return to primary",description:"Choose when OMP should leave a fallback model after its cooldown.",scope:"New sessions"},{tab:"intelligence",section:"Automatic Retry",label:"Fallback chain",description:"Choose ordered fallback models for each native model role.",scope:"New sessions"},{tab:"mcp",section:"Extensions & Tools",label:"Load Project MCP Servers",description:"Allow project-root MCP configuration to be discovered.",scope:"New sessions"},{tab:"mcp",section:"Extensions & Tools",label:"Render MCP Markdown",description:"Render non-JSON MCP results as Markdown in transcript.",scope:"New sessions"},{tab:"mcp",section:"Extensions & Tools",label:"MCP Resource Updates",description:"Inject server resource updates into conversation.",scope:"New sessions"},{tab:"system",section:"System & Updates",label:"Active session system prompt",description:"Inspect the system prompt used by the active session.",labelKey:"settingsConfig.sessionSystemPrompt",descriptionKey:"settingsConfig.sessionSystemPromptDescription",sectionKey:"settingsConfig.systemUpdates"}];function X({results:e,query:t,onSelect:i}){return(0,n.jsxs)("div",{style:{flex:1,minHeight:0,overflowY:"auto",background:"var(--bg)",padding:16,display:"flex",flexDirection:"column",gap:10},children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-base)",color:"var(--text-muted)"},children:0===e.length?`No settings match “${t}”.`:`${e.length} result${1===e.length?"":"s"} for “${t}”.`}),e.map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>i(e),style:{textAlign:"left",display:"flex",flexDirection:"column",gap:4,padding:"10px 12px",border:"1px solid var(--border)",borderRadius:"var(--radius-card)",background:"var(--bg-panel)",color:"var(--text)",cursor:"pointer",transition:"border-color var(--dur-fast) var(--ease-out-warm), background var(--dur-fast) var(--ease-out-warm)"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,n.jsx)("span",{style:{fontSize:"var(--text-base)",fontWeight:600},children:e.label}),"category"===e.kind&&(0,n.jsx)("span",{style:_,children:"Section"}),e.scope&&(0,n.jsx)("span",{style:_,children:e.scope})]}),(0,n.jsx)("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)",lineHeight:1.45},children:e.description}),e.section&&(0,n.jsx)("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-dim)"},children:e.section})]},e.id))]})}function Z({label:e,description:t,scope:i,compact:a=!1,hideDescription:o=!1,children:r}){let{t:l}=(0,A.s9)(),d=(0,s.useRef)(null),c=(0,s.useContext)(J),p=null!==c&&c===Y(e);return(0,s.useEffect)(()=>{p&&d.current&&d.current.scrollIntoView({behavior:"smooth",block:"center"})},[p]),(0,n.jsxs)("div",{ref:d,"data-search-id":Y(e),style:{minWidth:0,padding:a?"8px 10px":"12px 14px",border:"1px solid var(--border)",borderRadius:"var(--radius-card)",background:"var(--bg-panel)",display:"flex",flexDirection:"column",gap:a?4:8,transition:"box-shadow var(--dur-fast) var(--ease-out-warm), border-color var(--dur-fast) var(--ease-out-warm)",...p?{borderColor:"var(--accent)",boxShadow:"0 0 0 2px var(--accent)"}:{}},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:10,flexWrap:"wrap"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,n.jsx)("span",{style:{fontSize:"var(--text-base)",fontWeight:600,color:"var(--text)"},children:e}),i&&(0,n.jsx)("span",{style:_,children:"New sessions"===i?l("settingsConfig.newSessions"):i})]}),(0,n.jsx)("span",{style:{flexShrink:0},children:r})]}),!o&&(0,n.jsx)("span",{style:{color:"var(--text-muted)",fontSize:"var(--text-sm)",lineHeight:a?1.3:1.45},children:t})]})}function ee({activeTab:e,advisorEnabled:t,onAdvisorChange:i,toolCallsDefaultCollapsed:o,onToolCallsDefaultCollapsedChange:b,cwd:y,sessionId:C,systemPrompt:k,systemPromptLoading:w,onLoadSystemPrompt:j,onModelsSaved:S,onPluginsReloaded:R,onOmpSessionsRestarted:E,onOmpUpdateAvailabilityChange:et,onAppUpdateAvailabilityChange:ei,onSelectTab:en,onClose:es,runtimeReady:ea}){let{t:eo}=(0,A.s9)(),er=(0,h.a)(),[el,ed]=(0,s.useState)(D(e)),[ec,ep]=(0,s.useState)(()=>"mcp"===e||"skills"===e||"plugins"===e?e:"tools"),[eg,eu]=(0,s.useState)(()=>new Set([D(e)])),[ef,eb]=(0,s.useState)(!1),[ex,eh]=(0,s.useState)(null),[em,ev]=(0,s.useState)(!1),[ey,eC]=(0,s.useState)(0),[ek,ew]=(0,s.useState)(null),[ej,eS]=(0,s.useState)(!1),[eA,eM]=(0,s.useState)(null),[eR,eD]=(0,s.useState)(!1),[eT,ez]=(0,s.useState)(!1),[eI,eN]=(0,s.useState)(null),[eP,eO]=(0,s.useState)(!1),eL=(0,s.useRef)(0),eW=(0,s.useRef)(0),eF=(0,s.useRef)(!1),eE=(0,s.useRef)(!1),[eU,e$]=(0,s.useState)(null),[eH,eq]=(0,s.useState)(!1),[eB,eV]=(0,s.useState)("steer"),[eG,eK]=(0,s.useState)(""),[e_,eY]=(0,s.useState)(null),[eJ,eQ]=(0,s.useState)([]),[eX,eZ]=(0,s.useState)("default"),[e0,e1]=(0,s.useState)(""),{preference:e2,setTheme:e4,palette:e6,setPalette:e5}=(0,N.DP)(),e9=(0,s.useRef)({}),e8=(0,s.useRef)(0),e7=(0,s.useRef)(!0),e3=(0,s.useRef)(Promise.resolve()),te=(0,s.useRef)(null),tt=(0,s.useCallback)(async()=>{let e=e8.current;try{let t=await fetch("/api/omp-settings");if(!t.ok)return;let i=await t.json();if(!F({mounted:e7.current,requestGeneration:e,latestGeneration:e8.current}))return;let n=i.settings??{};e9.current=n,e$(n)}catch{}},[]);(0,s.useEffect)(()=>(e7.current=!0,()=>{e7.current=!1,te.current&&(clearTimeout(te.current),te.current=null)}),[]),(0,s.useEffect)(()=>{tt()},[tt]),(0,s.useEffect)(()=>{eq((0,P.NN)()),eV((0,a.vz)())},[]),(0,s.useEffect)(()=>{let e=!1;return(async()=>{try{let t=await (0,O.aQ)();if(e)return;let i=t.modelList.map(e=>({id:e.id,provider:e.provider,name:e.name}));eQ(i)}catch{}})(),()=>{e=!0}},[]);let ti=(0,s.useCallback)(async e=>{let t=function(e,t){let i=W(e);for(let[e,n]of Object.entries(t))if(void 0!==n)if(L(n)){let t=i[e],s=L(t)?W(t):{},a={...s,...n};if("tools"===e&&L(n.approval)){let e=L(s.approval)?s.approval:{};a.approval=0===Object.keys(n.approval).length?{}:{...e,...n.approval}}i[e]=a}else i[e]=n;return i}(e9.current,e);e9.current=t,e$(t);let i=++e8.current,n=!1;return e3.current=e3.current.then(async()=>{if(e7.current)try{let e=await fetch("/api/omp-settings",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:e9.current})});if(!e.ok)return;let t=await e.json();if(n=!0,!F({mounted:e7.current,requestGeneration:i,latestGeneration:e8.current}))return;t.settings&&(e9.current=t.settings,e$(t.settings)),t.application?.restartRequired&&eN(eo("settingsConfig.restartPrompt"))}catch{n=!1}}),await e3.current,n},[eo]),tn=(0,s.useCallback)((e,t)=>ti({[e]:t}),[ti]),ts=(0,s.useCallback)(e=>ti({tools:{approval:e}}),[ti]),ta=(0,s.useMemo)(()=>eU?.retry??{},[eU?.retry]),to=(0,s.useMemo)(()=>ta.fallbackChains??{},[ta.fallbackChains]),tr=(0,s.useMemo)(()=>to[eX]??[],[to,eX]),tl=(0,s.useMemo)(()=>{let e=new Set;for(let t of eJ)t.id&&e.add(t.id),t.provider&&t.id&&e.add(`${t.provider}/${t.id}`);return Array.from(e).sort((e,t)=>e.localeCompare(t))},[eJ]),td=(0,s.useCallback)(e=>{let t={...e9.current.retry?.fallbackChains??{}};return 0===e.length?delete t[eX]:t[eX]=e,tn("retry",{fallbackChains:t})},[eX,tn]),tc=(0,s.useCallback)(e=>{if(ef){eh(()=>e),ev(!0);return}e()},[ef]),tp=(0,s.useCallback)(()=>{tc(()=>{es()})},[es,tc]),tg=(0,s.useCallback)(e=>{"tools"===e||"mcp"===e||"skills"===e||"plugins"===e?tc(()=>{ed("extensions"),ep(e),eu(e=>new Set([...e,"extensions"])),en(e)}):tc(()=>{let t=D(e);ed(t),eu(e=>new Set([...e,t])),en(t)})},[en,tc]),tu=(0,s.useCallback)(()=>{eb(!1),eC(e=>e+1),ev(!1),eh(null),ex&&ex()},[ex]);(0,s.useEffect)(()=>{let t=D(e);ed(t),("tools"===e||"mcp"===e||"skills"===e||"plugins"===e)&&ep(e),eu(e=>new Set([...e,t]))},[e]);let tf=(0,s.useCallback)(async(e=!1)=>{if(!e&&eF.current)return;let t=++eL.current;eF.current=!0,eS(!0),e&&eN(null);try{let e=await fetch("/api/omp-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check"})});if(!e.ok)throw Error("Failed to check OMP updates");let i=await e.json();if(t!==eL.current||!e7.current)return;ew(i),et&&"boolean"==typeof i.updateAvailable&&et(i.updateAvailable),i.updateAvailable||eN(eo("settingsConfig.upToDate",{version:i.currentVersion??"current"}))}catch{if(t!==eL.current||!e7.current)return;eN(eo("settingsConfig.updateCheckFailed"))}finally{t===eL.current&&(eF.current=!1,e7.current&&eS(!1))}},[et,eo]),tb=(0,s.useCallback)(async(e=!1)=>{if(!e&&eE.current)return;let t=++eW.current;eE.current=!0,eD(!0),e&&(eN(null),eO(!1));try{let i=await fetch(e?"/api/app-update?force=1":"/api/app-update");if(!i.ok)throw Error("Failed to check ompgui updates");let n=await i.json();if(t!==eW.current||!e7.current)return;if(eM(n),n.lookupFailed){e&&(eO(!0),eN(eo("settingsConfig.appUpdateCheckFailed")));return}ei&&"boolean"==typeof n.updateAvailable&&ei(n.updateAvailable),eO(!1),e&&(n.updateAvailable?eN(null):eN(eo("settingsConfig.upToDate",{version:n.currentVersion??"current"})))}catch{if(t!==eW.current||!e7.current)return;e&&(eO(!0),eN(eo("settingsConfig.appUpdateCheckFailed")))}finally{t===eW.current&&(eE.current=!1,e7.current&&eD(!1))}},[ei,eo]);(0,s.useEffect)(()=>{"system"===el&&(tf(),tb(!1))},[el,tf,tb]);let tx=(0,s.useCallback)(async()=>{ez(!0),eN(null);try{if(!(await fetch("/api/omp-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"restart"})})).ok)throw Error("Failed to restart sessions");eN(eo("settingsConfig.sessionsRestarted")),E()}catch{eN(eo("settingsConfig.restartFailed"))}finally{ez(!1)}},[E,eo]),th=(0,s.useMemo)(()=>{let e=eG.trim().toLowerCase();if(!e)return[];let t=[];for(let i of M){let n=eo(`settingsTabs.${i.id}`)||i.label,s=eo(`settingsTabs.${i.id}Desc`)||i.description;(n.toLowerCase().includes(e)||s.toLowerCase().includes(e)||i.id.toLowerCase().includes(e))&&t.push({id:`cat-${i.id}`,kind:"category",tab:i.id,label:n,description:s})}for(let i of Q){let n=(i.labelKey?eo(i.labelKey):null)||i.label,s=(i.descriptionKey?eo(i.descriptionKey):null)||i.description,a=(i.sectionKey?eo(i.sectionKey):null)||i.section;(n.toLowerCase().includes(e)||s.toLowerCase().includes(e)||a.toLowerCase().includes(e))&&t.push({id:`setting-${i.tab}-${Y(i.label)}`,kind:"setting",tab:i.tab,label:n,description:s,scope:i.scope,section:a})}return t},[eG,eo]),tm=(0,s.useCallback)(e=>{eK(""),tg(e.tab),"setting"===e.kind&&(eY(Y(e.label)),te.current&&clearTimeout(te.current),te.current=setTimeout(()=>{te.current=null,eY(null)},2500))},[tg]);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(m.lG,{open:!0,onOpenChange:e=>{e||tp()},children:(0,n.jsxs)(m.Cf,{ariaLabel:eo("settingsConfig.title"),style:{width:860,maxWidth:"96vw",height:er?"92dvh":"80vh",maxHeight:"92dvh",display:"flex",flexDirection:"column",overflow:"hidden",padding:0,borderRadius:"var(--radius-modal)",boxShadow:"var(--shadow-modal)",background:"var(--bg)"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:er?"12px 14px":"16px 20px",borderBottom:"1px solid var(--border)",background:"var(--bg-panel)",gap:12},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,minWidth:0},children:[(0,n.jsx)(m.L3,{style:{margin:0,fontSize:"var(--text-lg)",fontWeight:650,whiteSpace:"nowrap"},children:eo("settingsConfig.title")}),ef&&(0,n.jsx)("span",{style:{fontSize:"var(--text-xs)",padding:"2px 6px",borderRadius:"calc(var(--radius-control) / 2)",background:"var(--status-warning-bg)",color:"var(--status-warning)",border:"1px solid var(--status-warning-border)"},children:eo("settingsConfig.unsavedChanges")})]}),(0,n.jsxs)("div",{style:{position:"relative",flex:1,maxWidth:280,minWidth:120},children:[(0,n.jsx)(r.A,{size:13,"aria-hidden":"true",style:{position:"absolute",left:9,top:"50%",transform:"translateY(-50%)",color:"var(--text-dim)",pointerEvents:"none"}}),(0,n.jsx)("input",{type:"search",value:eG,onChange:e=>eK(e.target.value),placeholder:eo("settingsConfig.searchPlaceholder"),"aria-label":eo("settingsConfig.searchPlaceholder"),style:{width:"100%",height:28,padding:"0 8px 0 28px",borderRadius:"var(--radius-control)",border:"1px solid var(--border)",background:"var(--bg)",color:"var(--text)",fontSize:"var(--text-sm)",outline:"none",boxSizing:"border-box"}})]})]}),(0,n.jsx)("div",{style:{display:"flex",flex:1,minHeight:0,flexDirection:er?"column":"row"},children:eG.trim()?(0,n.jsx)(X,{results:th,query:eG.trim(),onSelect:tm}):(0,n.jsxs)(J.Provider,{value:e_,children:[(0,n.jsx)(T,{active:el,onSelect:tg,layout:er?"horizontal":"vertical"}),(0,n.jsxs)("div",{style:{flex:1,minWidth:0,overflowY:"auto",display:"flex",flexDirection:"column"},children:["general"===el&&(0,n.jsxs)("div",{role:"tabpanel",id:"settings-panel-general","aria-labelledby":"settings-tab-general",style:{padding:er?"12px 14px":20,display:"flex",flexDirection:"column",gap:16},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{style:{fontSize:"var(--text-base)",fontWeight:600,margin:0},children:eo("settingsConfig.generalTitle")}),(0,n.jsx)("p",{style:{margin:"4px 0 0",fontSize:"var(--text-sm)",color:"var(--text-muted)"},children:eo("settingsConfig.generalDescription")})]}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.themeMode"),description:eo("settingsConfig.themeModeDesc"),scope:"UI",children:(0,n.jsx)("div",{style:{display:"inline-flex",padding:2,background:"var(--bg)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",gap:2},children:["system","light","dark"].map(e=>{let t=e2===e,i="system"===e?l.A:"light"===e?d.A:c.A,s="system"===e?eo("settingsConfig.themeModeSystem"):"light"===e?eo("settingsConfig.themeModeLight"):eo("settingsConfig.themeModeDark");return(0,n.jsxs)("button",{type:"button","aria-label":s,"aria-pressed":t,onClick:()=>e4(e),title:s,className:"ui-focus-ring",style:{display:"inline-flex",alignItems:"center",gap:4,height:24,padding:"0 8px",border:"none",borderRadius:"calc(var(--radius-control) - var(--space-1))",background:t?"var(--bg-selected)":"transparent",color:t?"var(--text)":"var(--text-muted)",fontWeight:t?600:500,fontSize:"var(--text-sm)",cursor:"pointer",transition:"background var(--dur-fast) var(--ease-out-warm), color var(--dur-fast) var(--ease-out-warm)"},children:[(0,n.jsx)(i,{size:12,"aria-hidden":"true"}),(0,n.jsx)("span",{children:s})]},e)})})}),(0,n.jsx)(Z,{label:eo("settingsConfig.themePalette"),description:eo("settingsConfig.themePaletteDesc"),scope:"UI",children:(0,n.jsx)("div",{style:{display:"inline-flex",padding:2,background:"var(--bg)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",gap:2},children:["warm","omp"].map(e=>{let t=e6===e,i="warm"===e?eo("settingsConfig.paletteWarm"):eo("settingsConfig.paletteOmp");return(0,n.jsxs)("button",{type:"button","aria-label":i,"aria-pressed":t,onClick:()=>e5(e),title:i,className:"ui-focus-ring",style:{display:"inline-flex",alignItems:"center",gap:5,height:24,padding:"0 8px",border:"none",borderRadius:"calc(var(--radius-control) - var(--space-1))",background:t?"var(--bg-selected)":"transparent",color:t?"var(--text)":"var(--text-muted)",fontWeight:t?600:500,fontSize:"var(--text-sm)",cursor:"pointer",transition:"background var(--dur-fast) var(--ease-out-warm), color var(--dur-fast) var(--ease-out-warm)"},children:[(0,n.jsxs)("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",gap:2.5,padding:"2px 3px",borderRadius:"calc(var(--radius-control) / 2)",background:"var(--bg-subtle)",flexShrink:0},children:[(0,n.jsx)("span",{style:{width:6,height:6,borderRadius:"50%",background:`var(--palette-${e}-preview-bg)`,border:"1px solid var(--border)",flexShrink:0}}),(0,n.jsx)("span",{style:{width:6,height:6,borderRadius:"50%",background:`var(--palette-${e}-preview-panel)`,border:"1px solid var(--border)",flexShrink:0}}),(0,n.jsx)("span",{style:{width:6,height:6,borderRadius:"50%",background:`var(--palette-${e}-preview-accent)`,flexShrink:0}})]}),(0,n.jsx)("span",{children:i})]},e)})})})]}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.toolCallsCollapsed"),description:eo("settingsConfig.toolCallsCollapsedDesc"),scope:"UI",children:(0,n.jsx)(v.dO,{checked:o,onChange:e=>b(e),"aria-label":eo("settingsConfig.toolCallsCollapsed")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.completionSound"),description:eo("settingsConfig.completionSoundDesc"),scope:"UI",children:(0,n.jsx)(v.dO,{checked:eH,onChange:e=>{eq(e),(0,P.RJ)(e),window.dispatchEvent(new CustomEvent("omp-sound-pref-change",{detail:e}))},"aria-label":eo("settingsConfig.completionSound")})})]}),(0,n.jsx)(Z,{label:eo("settingsConfig.submitBehavior"),description:eo("settingsConfig.submitBehaviorDesc"),scope:"UI",children:(0,n.jsx)(v.l6,{value:eB,onChange:e=>{(0,a.t_)(e),eV(e)},required:!0,options:[{value:"steer",label:eo("settingsConfig.steerCurrent")},{value:"queue",label:eo("settingsConfig.queueFollowUp")}],"aria-label":eo("settingsConfig.submitBehavior")})})]}),"agents"===el&&(0,n.jsxs)("div",{role:"tabpanel",id:"settings-panel-agents","aria-labelledby":"settings-tab-agents",style:{padding:er?"12px 14px":20,display:"flex",flexDirection:"column",gap:16,minHeight:0},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.preferTaskDelegation"),description:eo("settingsConfig.preferTaskDelegationDesc"),scope:"New sessions",compact:!0,hideDescription:er,children:(0,n.jsx)(v.l6,{value:eU?.task?.eager??"default",onChange:e=>tn("task",{eager:e}),required:!0,options:[{value:"default",label:eo("settingsConfig.delegationDefault")},{value:"preferred",label:eo("settingsConfig.delegationPreferred")},{value:"always",label:eo("settingsConfig.delegationAlways")}],"aria-label":eo("settingsConfig.preferTaskDelegation")})}),(0,n.jsx)(V,{cwd:y??void 0,onSaved:S})]}),"safety"===el&&(0,n.jsxs)("div",{role:"tabpanel",id:"settings-panel-safety","aria-labelledby":"settings-tab-safety",style:{padding:er?"12px 14px":20,display:"flex",flexDirection:"column",gap:16},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{style:{fontSize:"var(--text-base)",fontWeight:600,margin:0},children:eo("settingsConfig.safetyTitle")}),(0,n.jsx)("p",{style:{margin:"4px 0 0",fontSize:"var(--text-sm)",color:"var(--text-muted)"},children:eo("settingsConfig.safetyDescription")})]}),(0,n.jsx)(Z,{label:eo("settingsConfig.approvalMode"),description:eo("settingsConfig.approvalModeDesc"),scope:"New sessions",compact:!0,hideDescription:er,children:(0,n.jsx)(v.l6,{value:eU?.tools?.approvalMode??"yolo",onChange:e=>tn("tools",{approvalMode:e}),required:!0,options:[{value:"always-ask",label:eo("settingsConfig.approvalAlwaysAsk")},{value:"write",label:eo("settingsConfig.approvalWrite")},{value:"yolo",label:eo("settingsConfig.approvalYolo")}],"aria-label":eo("settingsConfig.approvalMode")})}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.bashApproval"),description:eo("settingsConfig.bashApprovalDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.tools?.approval?.bash??"prompt",onChange:e=>ts({bash:e}),required:!0,options:[{value:"allow",label:eo("settingsConfig.allow")},{value:"prompt",label:eo("settingsConfig.alwaysAsk")},{value:"deny",label:eo("settingsConfig.deny")}],"aria-label":eo("settingsConfig.bashApproval")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.extensionApproval"),description:eo("settingsConfig.extensionApprovalDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.tools?.approval?.extension??"prompt",onChange:e=>ts({extension:e}),required:!0,options:[{value:"prompt",label:eo("settingsConfig.askEveryTime")},{value:"allow",label:eo("settingsConfig.autoApprove")}],"aria-label":eo("settingsConfig.extensionApproval")})})]})]}),"models"===el&&(0,n.jsxs)("div",{role:"tabpanel",id:"settings-panel-models","aria-labelledby":"settings-tab-models",style:{padding:20,display:"flex",flexDirection:"column",gap:16},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{style:{fontSize:"var(--text-base)",fontWeight:600,margin:0},children:eo("settingsConfig.modelsTitle")}),(0,n.jsx)("p",{style:{margin:"4px 0 0",fontSize:"var(--text-sm)",color:"var(--text-muted)"},children:eo("settingsConfig.modelsDescription")})]}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.reasoning"),description:eo("settingsConfig.reasoningDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.defaultThinkingLevel??"high",onChange:e=>ti({defaultThinkingLevel:e}),required:!0,options:["auto","minimal","low","medium","high","xhigh","max"],"aria-label":eo("settingsConfig.reasoning")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.verbosity"),description:eo("settingsConfig.verbosityDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.textVerbosity??"medium",onChange:e=>ti({textVerbosity:e}),required:!0,options:["low","medium","high"],"aria-label":eo("settingsConfig.verbosity")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.personality"),description:eo("settingsConfig.personalityDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.personality??"default",onChange:e=>ti({personality:e}),required:!0,options:["default","friendly","pragmatic","none"],"aria-label":eo("settingsConfig.personality")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.hideThinking"),description:eo("settingsConfig.hideThinkingDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.hideThinkingBlock??!1,onChange:e=>ti({hideThinkingBlock:e}),"aria-label":eo("settingsConfig.hideThinking")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.externalThinking"),description:eo("settingsConfig.externalThinkingDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.externalThinking??!1,onChange:e=>ti({externalThinking:e}),"aria-label":eo("settingsConfig.externalThinking")})})]})]}),(eg.has("providers")||eg.has("models"))&&(0,n.jsx)("div",{role:"tabpanel",id:"settings-panel-providers","aria-labelledby":"settings-tab-providers",style:{display:"providers"===el?"flex":"none",height:"100%",minHeight:0,flexDirection:"column"},children:(0,n.jsx)($,{onSaved:()=>{eb(!1),S()},onDirtyChange:eb},ey)}),"intelligence"===el&&(0,n.jsxs)("div",{role:"tabpanel",id:"settings-panel-intelligence","aria-labelledby":"settings-tab-intelligence",style:{padding:20,display:"flex",flexDirection:"column",gap:18},children:[(0,n.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:10},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,fontSize:"var(--text-md)",fontWeight:600},children:[(0,n.jsx)(p.A,{size:14,"aria-hidden":"true",style:{color:"var(--accent)"}})," ",eo("settingsConfig.advisorReview")]}),(0,n.jsx)("p",{style:{margin:0,color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:eo("settingsConfig.advisorReviewDesc")}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.enableAdvisor"),description:eo("settingsConfig.enableAdvisorDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.advisor?.enabled??t,onChange:e=>{i(e),tn("advisor",{enabled:e})},"aria-label":eo("settingsConfig.enableAdvisor")})}),(eU?.advisor?.enabled??t)&&(0,n.jsx)(Z,{label:eo("settingsConfig.advisorBacklog"),description:eo("settingsConfig.advisorBacklogDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.advisor?.syncBacklog??"off",onChange:e=>tn("advisor",{syncBacklog:e}),required:!0,options:[{value:"off",label:eo("settingsConfig.backlogOff")},{value:"1",label:eo("settingsConfig.backlog1")},{value:"3",label:eo("settingsConfig.backlog3")},{value:"5",label:eo("settingsConfig.backlog5")}],"aria-label":eo("settingsConfig.advisorBacklog")})})]}),(eU?.advisor?.enabled??t)&&(0,n.jsx)(Z,{label:eo("settingsConfig.reviewSubagents"),description:eo("settingsConfig.reviewSubagentsDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.advisor?.subagents??!1,onChange:e=>tn("advisor",{subagents:e}),"aria-label":eo("settingsConfig.reviewSubagents")})})]}),(0,n.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:10,borderTop:"1px solid var(--border)",paddingTop:16},children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:600},children:eo("settingsConfig.contextCompaction")}),(0,n.jsx)("p",{style:{margin:0,color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:eo("settingsConfig.contextCompactionDesc")}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.autoCompaction"),description:eo("settingsConfig.autoCompactionDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.compaction?.enabled??!0,onChange:e=>tn("compaction",{enabled:e}),"aria-label":eo("settingsConfig.autoCompaction")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.autoContinueCompaction"),description:eo("settingsConfig.autoContinueCompactionDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.compaction?.autoContinue??!0,onChange:e=>tn("compaction",{autoContinue:e}),"aria-label":eo("settingsConfig.autoContinueCompaction")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.compactionStrategy"),description:eo("settingsConfig.compactionStrategyDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.compaction?.strategy??"snapcompact",onChange:e=>tn("compaction",{strategy:e}),required:!0,options:[{value:"snapcompact",label:"Snapcompact"},{value:"handoff",label:"Handoff"},{value:"context-full",label:"Context full"},{value:"shake",label:"Shake"},{value:"off",label:"Off"}],"aria-label":eo("settingsConfig.compactionStrategy")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.compactMidTurn"),description:eo("settingsConfig.compactMidTurnDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.compaction?.midTurnEnabled??!0,onChange:e=>tn("compaction",{midTurnEnabled:e}),"aria-label":eo("settingsConfig.compactMidTurn")})})]})]}),(0,n.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:10,borderTop:"1px solid var(--border)",paddingTop:16},children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:600},children:eo("settingsConfig.memoryAndAutoLearn")}),(0,n.jsx)("p",{style:{margin:0,color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:eo("settingsConfig.memoryAndAutoLearnDesc")}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.memoryBackend"),description:eo("settingsConfig.memoryBackendDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.memory?.backend??"mnemopi",onChange:e=>tn("memory",{backend:e}),required:!0,options:[{value:"off",label:eo("settingsConfig.backlogOff")},{value:"local",label:eo("settingsConfig.memoryLocal")},{value:"mnemopi",label:eo("settingsConfig.memoryMnemopi")},{value:"hindsight",label:eo("settingsConfig.memoryHindsight")}],"aria-label":eo("settingsConfig.memoryBackend")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.enableAutolearn"),description:eo("settingsConfig.enableAutolearnDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.autolearn?.enabled??!0,onChange:e=>tn("autolearn",{enabled:e}),"aria-label":eo("settingsConfig.enableAutolearn")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.privateCaptureTurn"),description:eo("settingsConfig.privateCaptureTurnDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.autolearn?.autoContinue??!0,onChange:e=>tn("autolearn",{autoContinue:e}),"aria-label":eo("settingsConfig.privateCaptureTurn")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.memoryScope"),description:eo("settingsConfig.memoryScopeDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:eU?.mnemopi?.scoping??"per-project",onChange:e=>tn("mnemopi",{scoping:e}),required:!0,options:[{value:"per-project",label:eo("settingsConfig.scopePerProject")},{value:"per-project-tagged",label:eo("settingsConfig.scopePerProjectTagged")},{value:"global",label:eo("settingsConfig.scopeGlobal")}],"aria-label":eo("settingsConfig.memoryScope")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.autoRecall"),description:eo("settingsConfig.autoRecallDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.mnemopi?.autoRecall??!0,onChange:e=>tn("mnemopi",{autoRecall:e}),"aria-label":eo("settingsConfig.autoRecall")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.autoRetain"),description:eo("settingsConfig.autoRetainDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.mnemopi?.autoRetain??!0,onChange:e=>tn("mnemopi",{autoRetain:e}),"aria-label":eo("settingsConfig.autoRetain")})})]})]}),(0,n.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:10,borderTop:"1px solid var(--border)",paddingTop:16},children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:600},children:eo("settingsConfig.autoRetry")}),(0,n.jsx)("p",{style:{margin:0,color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:eo("settingsConfig.autoRetryDesc")}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.enableRetry"),description:eo("settingsConfig.enableRetryDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:ta.enabled??!0,onChange:e=>tn("retry",{enabled:e}),"aria-label":eo("settingsConfig.enableRetry")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.maxAttempts"),description:eo("settingsConfig.maxAttemptsDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:String(ta.maxRetries??10),onChange:e=>tn("retry",{maxRetries:Number(e)}),required:!0,options:K.map(String),"aria-label":eo("settingsConfig.maxAttempts")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.modelFallback"),description:eo("settingsConfig.modelFallbackDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:ta.modelFallback??!0,onChange:e=>tn("retry",{modelFallback:e}),"aria-label":eo("settingsConfig.modelFallback")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.fallbackRevertPolicy"),description:eo("settingsConfig.fallbackRevertPolicyDesc"),scope:"New sessions",children:(0,n.jsx)(v.l6,{value:ta.fallbackRevertPolicy??"cooldown-expiry",onChange:e=>tn("retry",{fallbackRevertPolicy:e}),required:!0,options:[{value:"cooldown-expiry",label:eo("settingsConfig.fallbackRevertCooldown")},{value:"never",label:eo("settingsConfig.fallbackRevertNever")}],"aria-label":eo("settingsConfig.fallbackRevertPolicy")})})]}),(0,n.jsxs)("section",{"data-search-id":Y("Fallback chain"),style:{display:"flex",flexDirection:"column",gap:10,marginTop:4,border:"1px solid var(--border)",borderRadius:"var(--radius-card)",overflow:"hidden"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap",padding:"10px 12px",background:"var(--bg-panel)",borderBottom:"1px solid var(--border)"},children:[(0,n.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:8,color:"var(--text)",fontSize:"var(--text-base)",fontWeight:600},children:[eo("settingsConfig.fallbackChainFor"),(0,n.jsx)("span",{style:_,children:eo("settingsConfig.newSessions")})]}),(0,n.jsx)(v.l6,{"aria-label":eo("settingsConfig.fallbackChainRole"),value:eX,onChange:e=>{eZ(e),e1("")},required:!0,options:G,style:{width:"auto",minWidth:120}})]}),(0,n.jsxs)("div",{style:{display:"flex",gap:8,padding:"10px 12px"},children:[(0,n.jsx)(v.l6,{"aria-label":eo("settingsConfig.selectFallbackModel"),value:e0,onChange:e=>e1(e),placeholder:eo("settingsConfig.selectFallbackModel"),options:tl.filter(e=>!tr.includes(e)),style:{flex:1,minWidth:0}}),(0,n.jsx)("button",{type:"button",disabled:!e0,onClick:()=>{td([...tr,e0]),e1("")},style:{padding:"6px 10px",border:"none",borderRadius:"var(--radius-control)",background:"var(--accent)",color:"var(--on-accent)",cursor:e0?"pointer":"not-allowed",opacity:e0?1:.5,fontSize:"var(--text-sm)",whiteSpace:"nowrap"},children:eo("settingsConfig.addFallback")})]}),0===tr.length?(0,n.jsx)("div",{style:{padding:"0 12px 12px",color:"var(--text-dim)",fontSize:"var(--text-sm)"},children:eo("settingsConfig.noFallbackChain")}):(0,n.jsx)("div",{style:{borderTop:"1px solid var(--border)"},children:tr.map((e,t)=>(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"7px 12px",color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:[(0,n.jsx)("span",{style:{width:18,color:"var(--text-dim)",fontFamily:"var(--font-mono)"},children:t+1}),(0,n.jsx)("code",{style:{flex:1},children:e}),(0,n.jsx)("button",{type:"button","aria-label":eo("settingsConfig.moveFallbackUp",{model:e}),title:eo("settingsConfig.moveFallbackUp",{model:e}),disabled:0===t,onClick:()=>{let e=[...tr],i=e[t-1];e[t-1]=e[t],e[t]=i,td(e)},className:"ui-focus-ring",style:{width:24,height:24,padding:0,display:"inline-flex",alignItems:"center",justifyContent:"center",border:"none",borderRadius:"calc(var(--radius-control) / 2)",background:"transparent",color:"var(--text-muted)",cursor:0===t?"default":"pointer"},children:(0,n.jsx)("span",{"aria-hidden":"true",children:"↑"})}),(0,n.jsx)("button",{type:"button","aria-label":eo("settingsConfig.moveFallbackDown",{model:e}),title:eo("settingsConfig.moveFallbackDown",{model:e}),disabled:t===tr.length-1,onClick:()=>{let e=[...tr],i=e[t+1];e[t+1]=e[t],e[t]=i,td(e)},className:"ui-focus-ring",style:{width:24,height:24,padding:0,display:"inline-flex",alignItems:"center",justifyContent:"center",border:"none",borderRadius:"calc(var(--radius-control) / 2)",background:"transparent",color:"var(--text-muted)",cursor:t===tr.length-1?"default":"pointer"},children:(0,n.jsx)("span",{"aria-hidden":"true",children:"↓"})}),(0,n.jsx)("button",{type:"button","aria-label":eo("settingsConfig.removeFallback",{model:e}),title:eo("settingsConfig.removeFallback",{model:e}),onClick:()=>td(tr.filter((e,i)=>i!==t)),className:"ui-focus-ring",style:{width:24,height:24,padding:0,display:"inline-flex",alignItems:"center",justifyContent:"center",border:"none",borderRadius:"calc(var(--radius-control) / 2)",background:"transparent",color:"var(--text-muted)",cursor:"pointer"},children:(0,n.jsx)("span",{"aria-hidden":"true",children:"\xd7"})})]},`${e}-${t}`))})]})]})]}),"extensions"===el&&(0,n.jsxs)("div",{role:"tabpanel",id:"settings-panel-extensions","aria-labelledby":"settings-tab-extensions",style:{display:"flex",height:"100%",minHeight:0,flexDirection:"column",overflowY:"hidden",padding:20,gap:16},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{style:{fontSize:"var(--text-base)",fontWeight:600,margin:0},children:eo("settingsTabs.extensions")}),(0,n.jsx)("p",{style:{margin:"4px 0 0",fontSize:"var(--text-sm)",color:"var(--text-muted)"},children:eo("settingsTabs.extensionsDesc")})]}),(0,n.jsx)(z,{active:ec,onSelect:tg}),"tools"===ec&&(0,n.jsx)("div",{role:"tabpanel",id:"settings-extension-panel-tools","aria-labelledby":"settings-extension-tab-tools",style:{display:"flex",flex:1,minHeight:0,flexDirection:"column",overflowY:"auto"},children:(0,n.jsx)(U,{settings:eU,onPatch:ti})}),"mcp"===ec&&(0,n.jsxs)("div",{role:"tabpanel",id:"settings-extension-panel-mcp","aria-labelledby":"settings-extension-tab-mcp",style:{display:"flex",flex:1,minHeight:0,flexDirection:"column",overflowY:"auto",gap:12},children:[(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:er?"1fr":"repeat(2, minmax(0, 1fr))",gap:10},children:[(0,n.jsx)(Z,{label:eo("settingsConfig.loadProjectMcp"),description:eo("settingsConfig.loadProjectMcpDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.mcp?.enableProjectConfig??!0,onChange:e=>tn("mcp",{enableProjectConfig:e}),"aria-label":eo("settingsConfig.loadProjectMcp")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.renderMcpMarkdown"),description:eo("settingsConfig.renderMcpMarkdownDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.mcp?.renderMarkdownResults??!0,onChange:e=>tn("mcp",{renderMarkdownResults:e}),"aria-label":eo("settingsConfig.renderMcpMarkdown")})}),(0,n.jsx)(Z,{label:eo("settingsConfig.mcpResourceUpdates"),description:eo("settingsConfig.mcpResourceUpdatesDesc"),scope:"New sessions",children:(0,n.jsx)(v.dO,{checked:eU?.mcp?.notifications??!1,onChange:e=>tn("mcp",{notifications:e}),"aria-label":eo("settingsConfig.mcpResourceUpdates")})})]}),(0,n.jsx)(B,{cwd:y??null,sessionId:C??void 0}),!y&&(0,n.jsx)("p",{role:"status",style:{margin:0,color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:eo("settingsConfig.noWorkspaceMcpHint")})]}),"skills"===ec&&(0,n.jsx)("div",{role:"tabpanel",id:"settings-extension-panel-skills","aria-labelledby":"settings-extension-tab-skills",style:{display:"flex",flex:1,minHeight:0,flexDirection:"column",overflowY:"auto"},children:y?(0,n.jsx)(H,{cwd:y}):(0,n.jsx)("div",{role:"status",style:{padding:16,border:"1px solid var(--border)",borderRadius:"var(--radius-card)",color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:eo("settingsConfig.workspaceRequired")})}),"plugins"===ec&&(0,n.jsx)("div",{role:"tabpanel",id:"settings-extension-panel-plugins","aria-labelledby":"settings-extension-tab-plugins",style:{display:"flex",flex:1,minHeight:0,flexDirection:"column",overflowY:"auto"},children:y?(0,n.jsx)(q,{cwd:y,sessionId:C??null,onReloaded:R,runtimeReady:ea}):(0,n.jsx)("div",{role:"status",style:{padding:16,border:"1px solid var(--border)",borderRadius:"var(--radius-card)",color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:eo("settingsConfig.workspaceRequired")})})]}),"system"===el&&(0,n.jsxs)("div",{role:"tabpanel",id:"settings-panel-system","aria-labelledby":"settings-tab-system",style:{padding:20,display:"flex",flexDirection:"column",gap:18},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h3",{style:{fontSize:"var(--text-base)",fontWeight:600,margin:0},children:eo("settingsConfig.systemUpdates")}),(0,n.jsx)("p",{style:{margin:"4px 0 0",fontSize:"var(--text-sm)",color:"var(--text-muted)"},children:eo("settingsConfig.systemUpdatesDescription")})]}),(0,n.jsxs)("section",{"data-search-id":Y("Active session system prompt"),style:{padding:"var(--space-5)",border:"1px solid var(--border)",borderRadius:"var(--radius-card)",background:"var(--bg-panel)",display:"flex",flexDirection:"column",gap:"var(--space-4)",...e_===Y("Active session system prompt")?{borderColor:"var(--accent)",boxShadow:"0 0 0 2px var(--accent)"}:{}},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-4)",flexWrap:"wrap"},children:[(0,n.jsxs)("div",{style:{minWidth:0,flex:1},children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:650},children:eo("settingsConfig.sessionSystemPrompt")}),(0,n.jsx)("div",{style:{marginTop:"var(--space-1)",color:"var(--text-muted)",fontSize:"var(--text-sm)",lineHeight:1.45},children:eo("settingsConfig.sessionSystemPromptDescription")})]}),(0,n.jsxs)("button",{type:"button",onClick:j,disabled:!C||w,"aria-label":eo("settingsConfig.systemPromptActionAria"),style:{display:"inline-flex",alignItems:"center",gap:"var(--space-2)",flexShrink:0,padding:"var(--space-3) var(--space-4)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg)",color:"var(--text)",cursor:!C||w?"not-allowed":"pointer",opacity:!C||w?.65:1,fontSize:"var(--text-sm)"},children:[(0,n.jsx)(g.A,{size:13,"aria-hidden":"true",className:w?"icon-spin":void 0}),w?eo("settingsConfig.systemPromptLoading"):null===k?eo("settingsConfig.loadSystemPrompt"):eo("settingsConfig.reloadSystemPrompt")]})]}),(0,n.jsx)("div",{"aria-live":"polite","aria-busy":w,style:{minHeight:"var(--control-height-lg)",maxHeight:"45dvh",overflowY:"auto",padding:"var(--space-4)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg)",color:"var(--text-muted)",fontSize:"var(--text-sm)",lineHeight:1.5},children:w?(0,n.jsx)("div",{role:"status",children:eo("settingsConfig.systemPromptLoading")}):C?null===k?(0,n.jsx)("div",{style:{fontStyle:"italic"},children:eo("settingsConfig.systemPromptUnavailable")}):0===k.length?(0,n.jsx)("div",{style:{fontStyle:"italic"},children:eo("settingsConfig.systemPromptEmpty")}):(0,n.jsx)("pre",{"aria-label":eo("settingsConfig.sessionSystemPrompt"),style:{margin:0,color:"var(--text)",fontFamily:"var(--font-mono)",fontSize:"var(--text-sm)",lineHeight:1.5,whiteSpace:"pre-wrap",overflowWrap:"anywhere"},children:k}):(0,n.jsx)("div",{style:{fontStyle:"italic"},children:eo("settingsConfig.systemPromptNoSession")})})]}),(0,n.jsxs)("section",{style:{padding:14,border:"1px solid var(--border)",borderRadius:"var(--radius-card)",background:"var(--bg-panel)",display:"flex",flexDirection:"column",gap:10},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:12},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:600},children:eo("settingsConfig.appLabel")}),(0,n.jsx)("div",{style:{marginTop:4,color:eA?.updateAvailable?"var(--accent)":"var(--text-muted)",fontFamily:"var(--font-mono)",fontSize:"var(--text-sm)"},children:eR?eo("settingsConfig.checkingUpdates"):eA?.updateAvailable?eo("appShell.updateVersion",{current:eA.currentVersion??"?",available:eA.availableVersion??"?"}):eP||eA?.lookupFailed?eo("settingsConfig.appUpdateCheckFailed"):eA?.currentVersion&&eA?.availableVersion?eo("settingsConfig.upToDate",{version:eA.currentVersion}):eo("settingsConfig.versionUnavailable")})]}),(0,n.jsxs)("button",{type:"button",onClick:()=>void tb(!0),disabled:eR,"aria-label":eo("settingsConfig.checkAppUpdates"),style:{padding:"6px 10px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"transparent",color:"var(--text)",cursor:eR?"wait":"pointer",fontSize:"var(--text-sm)",display:"inline-flex",alignItems:"center",gap:5},children:[(0,n.jsx)(g.A,{size:13,"aria-hidden":"true"})," ",eo("settingsConfig.refresh")]})]}),eA?.updateAvailable&&(0,n.jsxs)("div",{style:{marginTop:6,padding:"10px 12px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg)",display:"flex",flexDirection:"column",gap:6},children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)"},children:eo("settingsConfig.runAppUpdateCommand")}),(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,n.jsx)("code",{style:{flex:1,fontFamily:"var(--font-mono)",fontSize:"var(--text-sm)",color:"var(--accent)",wordBreak:"break-all"},children:eA.updateCommand||"ompgui update"}),(0,n.jsxs)("button",{type:"button",onClick:()=>{(0,I.D)(eA.updateCommand||"ompgui update").then(()=>eN(eo("appShell.commandCopied"))).catch(()=>eN(eo("appShell.commandCopyFailed")))},style:{display:"inline-flex",alignItems:"center",gap:5,padding:"4px 8px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg-subtle)",color:"var(--text)",cursor:"pointer",fontSize:"var(--text-xs)"},children:[(0,n.jsx)(u.A,{size:12,"aria-hidden":"true"})," ",eo("appShell.copyCommand")]})]})]})]}),(0,n.jsxs)("section",{style:{padding:14,border:"1px solid var(--border)",borderRadius:"var(--radius-card)",background:"var(--bg-panel)",display:"flex",flexDirection:"column",gap:10},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:12},children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:600},children:eo("settingsConfig.ompLabel")}),(0,n.jsx)("div",{style:{marginTop:4,color:ek?.updateAvailable?"var(--accent)":"var(--text-muted)",fontFamily:"var(--font-mono)",fontSize:"var(--text-sm)"},children:ej?eo("settingsConfig.checkingUpdates"):ek?.updateAvailable?eo("appShell.updateVersion",{current:ek.currentVersion??"?",available:ek.availableVersion??"?"}):ek?.currentVersion?eo("settingsConfig.upToDate",{version:ek.currentVersion}):eo("settingsConfig.versionUnavailable")})]}),(0,n.jsxs)("button",{type:"button",onClick:()=>void tf(!0),disabled:ej,"aria-label":eo("settingsConfig.checkOmpUpdates"),style:{padding:"6px 10px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"transparent",color:"var(--text)",cursor:ej?"wait":"pointer",fontSize:"var(--text-sm)",display:"inline-flex",alignItems:"center",gap:5},children:[(0,n.jsx)(g.A,{size:13,"aria-hidden":"true"})," ",eo("settingsConfig.refresh")]})]}),ek?.updateAvailable&&(0,n.jsxs)("div",{style:{marginTop:6,padding:"10px 12px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg)",display:"flex",flexDirection:"column",gap:6},children:[(0,n.jsx)("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)"},children:eo("settingsConfig.runOmpUpdateCommand")}),(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,n.jsx)("code",{style:{flex:1,fontFamily:"var(--font-mono)",fontSize:"var(--text-sm)",color:"var(--accent)",wordBreak:"break-all"},children:ek.updateCommand||"omp update"}),(0,n.jsxs)("button",{type:"button",onClick:()=>{(0,I.D)(ek.updateCommand||"omp update").then(()=>eN(eo("appShell.commandCopied"))).catch(()=>eN(eo("appShell.commandCopyFailed")))},style:{display:"inline-flex",alignItems:"center",gap:5,padding:"4px 8px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg-subtle)",color:"var(--text)",cursor:"pointer",fontSize:"var(--text-xs)"},children:[(0,n.jsx)(u.A,{size:12,"aria-hidden":"true"})," ",eo("appShell.copyCommand")]})]})]}),(0,n.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:8,marginTop:6},children:[(0,n.jsxs)("button",{type:"button",onClick:()=>void tx(),disabled:eT,style:{display:"inline-flex",alignItems:"center",gap:6,padding:"7px 12px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg-subtle)",color:"var(--text)",cursor:eT?"wait":"pointer",fontSize:"var(--text-sm)"},children:[(0,n.jsx)(f.A,{size:13,"aria-hidden":"true"})," ",eT?eo("settingsConfig.restarting"):eo("settingsConfig.restartSessions")]}),(0,n.jsxs)("a",{href:"https://github.com/can1357/oh-my-pi/releases",target:"_blank",rel:"noreferrer",style:{display:"inline-flex",alignItems:"center",gap:6,padding:"7px 12px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-muted)",textDecoration:"none",fontSize:"var(--text-sm)"},children:[(0,n.jsx)(x,{size:13,"aria-hidden":"true"})," ",eo("settingsConfig.changelog")]})]}),eI&&(0,n.jsx)("p",{role:"status",style:{margin:"4px 0 0",color:"var(--text-muted)",fontSize:"var(--text-sm)",lineHeight:1.5},children:eI})]})]})]})]})})]})}),(0,n.jsx)(v.TM,{open:em,onOpenChange:e=>{ev(e),e||eh(null)},title:eo("settingsConfig.unsavedChangesTitle"),description:eo("settingsConfig.unsavedChangesDescription"),confirmLabel:eo("settingsConfig.discardChanges"),cancelLabel:eo("settingsConfig.cancel"),danger:!0,onConfirm:tu})]})}},86272:(e,t,i)=>{i.d(t,{A:()=>n});let n=(0,i(99537).A)("sparkles",[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]])},89034:(e,t,i)=>{i.d(t,{A:()=>n});let n=(0,i(99537).A)("eye-off",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]])},90071:(e,t,i)=>{function n(){return globalThis.__ompClientModelStore||(globalThis.__ompClientModelStore={globalGeneration:0,entries:new Map,inFlight:new Map,listeners:new Map}),globalThis.__ompClientModelStore}i.d(t,{aQ:()=>r,dU:()=>o});function s(e,t){t.snapshot={status:t.status,data:t.data,error:t.error,cwd:e,expiresAt:t.expiresAt};let i=n().listeners.get(e);if(i)for(let e of[...i])try{e(t.snapshot)}catch{}return t.snapshot}function a(e,t){let i=e.entries.get(t);if(i)return i;let n={data:null,error:null,status:"idle",expiresAt:null,generation:0,snapshot:{status:"idle",data:null,error:null,cwd:t,expiresAt:null}};return e.entries.set(t,n),n}function o(e){let t=n();if(void 0===e){for(let[e,i]of(t.globalGeneration+=1,t.entries))i.generation+=1,i.data=null,i.error=null,i.status="idle",i.expiresAt=null,s(e,i);t.inFlight.clear();return}let i=e??"",o=a(t,i);o.generation+=1,o.data=null,o.error=null,o.status="idle",o.expiresAt=null,t.inFlight.delete(i),s(i,o)}function r(e,t){let i=e??"";t?.force&&o(i);let r=n(),l=a(r,i),d=Date.now();if(l.data&&null!==l.expiresAt&&l.expiresAt>d&&!t?.force)return Promise.resolve(l.data);let c=r.inFlight.get(i);if(c)return c;let p=l.generation,g=r.globalGeneration;"ready"!==l.status&&(l.status="loading",l.error=null,s(i,l));let u=(async()=>{let e=await fetch(i?`/api/models?cwd=${encodeURIComponent(i)}`:"/api/models",{cache:"no-store"});if(!e.ok)throw Error(`HTTP ${e.status}`);var t=await e.json();if(!t||"object"!=typeof t)throw Error("invalid models response");return{models:t.models&&"object"==typeof t.models?t.models:{},modelList:Array.isArray(t.modelList)?t.modelList:[],defaultModel:t.defaultModel??null,thinkingLevels:t.thinkingLevels&&"object"==typeof t.thinkingLevels?t.thinkingLevels:{},...t.thinkingLevelMaps?{thinkingLevelMaps:t.thinkingLevelMaps}:{},...t.connectedProviders?{connectedProviders:t.connectedProviders}:{},..."string"==typeof t.modelError?{modelError:t.modelError}:{}}})().then(e=>{let t=n(),a=t.entries.get(i);return a&&a.generation===p&&t.globalGeneration===g&&(a.data=e,a.error=null,a.status="ready",a.expiresAt=Date.now()+3e4,s(i,a)),e}).catch(e=>{let t=n(),a=t.entries.get(i);throw a&&a.generation===p&&t.globalGeneration===g&&(a.status="error",a.error=e instanceof Error?e.message:String(e),a.expiresAt=null,s(i,a)),e}).finally(()=>{let e=n();e.inFlight.get(i)===u&&e.inFlight.delete(i)});return r.inFlight.set(i,u),u}},90710:(e,t,i)=>{i.d(t,{A:()=>n});let n=(0,i(99537).A)("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]])},99314:(e,t,i)=>{i.d(t,{A:()=>n});let n=(0,i(99537).A)("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]])}}]);
|