ompchamber 2.0.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -11
- package/bunfig.toml +11 -0
- package/dist/client/index.html +16 -5
- package/dist/client/index.js +1393 -0
- package/dist/client/static/js/index-8t70jhyj.js +5149 -0
- package/dist/client/static/js/index-n4wkqj7t.css +1 -0
- package/index.html +54 -0
- package/package.json +9 -10
- package/public/apple-touch-icon.png +0 -0
- package/public/icon-192x192.png +0 -0
- package/public/icon.svg +60 -0
- package/public/manifest.webmanifest +38 -0
- package/src/cli/lib/commands/serve.js +9 -5
- package/src/cli/lib/runtime.js +18 -7
- package/src/client/components/common/code-editor/handler.test.ts +274 -0
- package/src/client/components/common/code-editor/handler.ts +175 -0
- package/src/client/components/common/code-editor/index.tsx +185 -220
- package/src/client/components/common/code-surface/index.tsx +109 -12
- package/src/client/components/common/lazy-panels.tsx +5 -1
- package/src/client/components/common/provider-icon/glyphs.ts +118 -0
- package/src/client/components/common/provider-icon/index.tsx +85 -0
- package/src/client/components/common/viewport.ts +5 -3
- package/src/client/components/layout/RightActivityBar.tsx +2 -1
- package/src/client/components/layout/desktop-layout/TopNavbar.tsx +21 -4
- package/src/client/components/layout/desktop-layout/WorkspacePanels.tsx +4 -0
- package/src/client/components/layout/desktop-layout/index.tsx +26 -4
- package/src/client/components/mobile/LayoutWrapper.tsx +16 -0
- package/src/client/components/mobile/RightSidebar.tsx +11 -4
- package/src/client/components/mobile/SessionSidebar.tsx +10 -0
- package/src/client/components/mobile/mobile-right-sidebar/FullEditor.tsx +0 -1
- package/src/client/components/mobile/mobile-session-sidebar/Item.tsx +16 -1
- package/src/client/components/mobile/mobile-session-sidebar/List.tsx +3 -0
- package/src/client/components/settings/categories/ProviderSettings.tsx +45 -4
- package/src/client/components/settings/categories/UsageSettings.tsx +22 -7
- package/src/client/components/settings/categories/provider-settings/AddModelModal.tsx +322 -0
- package/src/client/components/settings/categories/provider-settings/AddProviderModal.tsx +152 -56
- package/src/client/components/settings/categories/provider-settings/AuthSection.tsx +52 -1
- package/src/client/components/settings/categories/provider-settings/DeleteProviderModal.tsx +133 -0
- package/src/client/components/settings/categories/provider-settings/DialectFields.tsx +136 -0
- package/src/client/components/settings/categories/provider-settings/EffortLadder.tsx +89 -0
- package/src/client/components/settings/categories/provider-settings/Header.tsx +2 -2
- package/src/client/components/settings/categories/provider-settings/LoginModal.tsx +2 -2
- package/src/client/components/settings/categories/provider-settings/ModelsList.tsx +22 -2
- package/src/client/components/settings/categories/provider-settings/PresetPicker.tsx +82 -0
- package/src/client/components/settings/categories/provider-settings/PriceFields.tsx +107 -0
- package/src/client/components/settings/categories/provider-settings/ReconnectModal.tsx +43 -22
- package/src/client/components/settings/categories/provider-settings/SidebarList.tsx +2 -2
- package/src/client/components/settings/categories/usage-settings/LimitsSection.tsx +115 -0
- package/src/client/components/settings/categories/usage-settings/ProviderCard.tsx +19 -26
- package/src/client/components/settings/categories/usage-settings/ProviderDetail.tsx +29 -22
- package/src/client/components/settings/categories/usage-settings/SidebarList.tsx +60 -48
- package/src/client/components/settings/categories/usage-settings/format.ts +36 -0
- package/src/client/components/settings/categories/usage-settings/providers.ts +52 -28
- package/src/client/components/workspace/browser-panel/AddressBar.tsx +1 -10
- package/src/client/components/workspace/browser-panel/Screencast.tsx +4 -5
- package/src/client/components/workspace/browser-panel/index.tsx +6 -6
- package/src/client/components/workspace/browser-toolbar/index.tsx +22 -12
- package/src/client/components/workspace/chat-timeline/AiMessageFooter.tsx +1 -1
- package/src/client/components/workspace/chat-timeline/GeneratingIndicator.tsx +1 -1
- package/src/client/components/workspace/chat-timeline/ToolCallCard.tsx +1 -1
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Todo.tsx +1 -1
- package/src/client/components/workspace/diff-panel/Toolbar.tsx +71 -38
- package/src/client/components/workspace/diff-panel/index.tsx +139 -53
- package/src/client/components/workspace/editor/CommandPalette.test.ts +242 -0
- package/src/client/components/workspace/editor/CommandPalette.tsx +138 -0
- package/src/client/components/workspace/editor/FindWidget.test.ts +261 -0
- package/src/client/components/workspace/editor/FindWidget.tsx +219 -0
- package/src/client/components/workspace/editor/Tabs.tsx +2 -2
- package/src/client/components/workspace/editor/Toolbar.tsx +129 -26
- package/src/client/components/workspace/editor/index.tsx +180 -62
- package/src/client/components/workspace/file-explorer/Modals.tsx +79 -2
- package/src/client/components/workspace/file-explorer/TreeItem.tsx +43 -113
- package/src/client/components/workspace/model-dropdown/Item.tsx +13 -23
- package/src/client/components/workspace/model-dropdown/Panel.tsx +1 -1
- package/src/client/components/workspace/model-dropdown/Section.tsx +13 -4
- package/src/client/components/workspace/model-dropdown/index.tsx +7 -3
- package/src/client/components/workspace/todo-panel/PhaseGroup.tsx +76 -0
- package/src/client/components/workspace/todo-panel/Row.tsx +69 -0
- package/src/client/components/workspace/todo-panel/index.tsx +161 -0
- package/src/client/components/workspace/usage-panel/ProviderSelect.tsx +10 -5
- package/src/client/components/workspace/usage-panel/index.tsx +36 -18
- package/src/client/data/samples/dialogue-session.ts +1 -1
- package/src/client/data/samples/sample-tools/other.ts +1 -1
- package/src/client/data/settings/provider.ts +141 -9
- package/src/client/hooks/editor/find-harness.test-util.ts +170 -0
- package/src/client/hooks/editor/scroll-container.test.ts +102 -0
- package/src/client/hooks/editor/scroll-container.ts +26 -0
- package/src/client/hooks/editor/use-code-window.ts +2 -20
- package/src/client/hooks/editor/use-editor-find-write.test.ts +170 -0
- package/src/client/hooks/editor/use-editor-find.test.ts +118 -0
- package/src/client/hooks/editor/use-editor-find.ts +321 -0
- package/src/client/hooks/editor/use-editor-history.test.ts +216 -0
- package/src/client/hooks/editor/use-editor-history.ts +134 -0
- package/src/client/hooks/editor/use-file-editor.ts +24 -27
- package/src/client/hooks/editor/use-occurrences.test.ts +236 -0
- package/src/client/hooks/editor/use-occurrences.ts +98 -0
- package/src/client/hooks/models/use-provider-names.ts +1 -1
- package/src/client/hooks/settings/providers/actions.ts +337 -0
- package/src/client/hooks/settings/providers/api.ts +69 -0
- package/src/client/hooks/settings/providers/index.ts +138 -0
- package/src/client/hooks/settings/providers/messages.ts +77 -0
- package/src/client/hooks/settings/useUsageReport.ts +8 -3
- package/src/client/hooks/ui/theme.ts +3 -3
- package/src/client/hooks/workspace/file-tabs.ts +62 -11
- package/src/client/hooks/workspace/file-tree-actions.test.ts +348 -0
- package/src/client/hooks/workspace/file-tree-actions.ts +250 -0
- package/src/client/hooks/workspace/session-todos.ts +102 -0
- package/src/client/stubs/elkjs.ts +6 -1
- package/src/client/tailwind.css +30 -0
- package/src/server/index.ts +20 -2
- package/src/server/lib/assets/font-css.server.ts +86 -0
- package/src/server/lib/assets/fonts.server.ts +117 -0
- package/src/server/lib/bundler/css.ts +116 -0
- package/src/server/lib/lifecycle/shell-route.ts +17 -0
- package/src/server/lib/models/provider-listing.server.ts +257 -0
- package/src/server/lib/models/provider-registry.server.test.ts +122 -0
- package/src/server/lib/models/provider-registry.server.ts +76 -25
- package/src/server/lib/omp/config/models-config.ts +11 -0
- package/src/server/lib/omp/config/models-validation.test.ts +137 -0
- package/src/server/lib/omp/config/models-validation.ts +111 -2
- package/src/server/lib/omp/config/provider-seeds.test.ts +167 -0
- package/src/server/lib/omp/config/provider-seeds.ts +176 -0
- package/src/server/lib/omp/config/providers.ts +94 -100
- package/src/server/lib/omp/core/auth-credentials.ts +45 -0
- package/src/server/lib/omp/session/todos.ts +100 -0
- package/src/server/lib/omp/session/{usage.ts → usage/aggregate.ts} +1 -118
- package/src/server/lib/omp/session/usage/shaping.ts +130 -0
- package/src/server/lib/usage/deepseek.ts +4 -5
- package/src/server/lib/usage/kenari.ts +7 -6
- package/src/server/lib/usage/omp-usage.server.test.ts +126 -0
- package/src/server/lib/usage/omp-usage.server.ts +194 -0
- package/src/server/lib/usage/provider-key.ts +81 -3
- package/src/server/lib/usage/providers.server.test.ts +47 -0
- package/src/server/lib/usage/providers.server.ts +208 -0
- package/src/server/lib/usage/vendor-balance.server.test.ts +104 -0
- package/src/server/lib/usage/vendor-balance.server.ts +284 -0
- package/src/server/plugins/shell.server.ts +56 -0
- package/src/server/plugins/ssr.ts +24 -36
- package/src/server/plugins/static.test.ts +26 -29
- package/src/server/plugins/static.ts +40 -19
- package/src/server/routes/fs/action-create.test.ts +90 -0
- package/src/server/routes/fs/action.ts +23 -0
- package/src/server/routes/omp/index.ts +2 -0
- package/src/server/routes/omp/session-todos.ts +80 -0
- package/src/server/routes/settings/index.ts +2 -0
- package/src/server/routes/settings/provider-model.ts +107 -0
- package/src/server/routes/settings/provider-models.ts +65 -202
- package/src/server/routes/settings/providers.ts +22 -7
- package/src/server/routes/settings/usage.ts +125 -45
- package/src/server/routes/telemetry/tokens.ts +2 -1
- package/src/shared/lib/chat/{todo-parser.ts → todo/parser.ts} +17 -0
- package/src/shared/lib/chat/todo/progress.ts +97 -0
- package/src/shared/lib/chat/todo/snapshot.test.ts +156 -0
- package/src/shared/lib/chat/todo/snapshot.ts +215 -0
- package/src/shared/lib/code/editor/commands.test.ts +155 -0
- package/src/shared/lib/code/editor/commands.ts +260 -0
- package/src/shared/lib/code/editor/edits.test.ts +100 -0
- package/src/shared/lib/code/editor/edits.ts +122 -0
- package/src/shared/lib/code/editor/find-status.test.ts +50 -0
- package/src/shared/lib/code/editor/find-status.ts +36 -0
- package/src/shared/lib/code/editor/find.test.ts +203 -0
- package/src/shared/lib/code/editor/find.ts +224 -0
- package/src/{client/components/common/code-editor → shared/lib/code/editor}/history.test.ts +1 -1
- package/src/shared/lib/code/editor/keymap.test.ts +109 -0
- package/src/shared/lib/code/editor/keymap.ts +151 -0
- package/src/shared/lib/code/editor/layers.test.ts +77 -0
- package/src/shared/lib/code/editor/layers.ts +67 -0
- package/src/shared/lib/code/editor/line-edits.test.ts +131 -0
- package/src/shared/lib/code/editor/line-edits.ts +159 -0
- package/src/shared/lib/code/editor/lines.test.ts +81 -0
- package/src/shared/lib/code/editor/lines.ts +83 -0
- package/src/shared/lib/code/editor/marks.test.ts +86 -0
- package/src/shared/lib/code/editor/marks.ts +106 -0
- package/src/shared/lib/code/editor/occurrences.test.ts +117 -0
- package/src/shared/lib/code/editor/occurrences.ts +111 -0
- package/src/shared/lib/code/editor/palette.test.ts +91 -0
- package/src/shared/lib/code/editor/palette.ts +92 -0
- package/src/shared/lib/code/editor/reset-css.test.ts +35 -0
- package/src/shared/lib/code/editor/reset-css.ts +32 -0
- package/src/shared/lib/code/editor/text-commands.test.ts +178 -0
- package/src/shared/lib/code/editor/text-commands.ts +154 -0
- package/src/shared/lib/code/syntax-highlight.test.ts +75 -0
- package/src/shared/lib/code/syntax-highlight.ts +29 -17
- package/src/shared/lib/code/windowed-highlight.ts +52 -1
- package/src/shared/lib/fs/diff-parser.test.ts +116 -0
- package/src/shared/lib/fs/diff-parser.ts +86 -33
- package/src/shared/lib/models/{provider-connection.ts → provider/connection.ts} +37 -0
- package/src/shared/lib/models/provider/dialect.ts +179 -0
- package/src/shared/lib/models/provider/glyph.test.ts +116 -0
- package/src/shared/lib/models/provider/glyph.ts +200 -0
- package/src/shared/lib/models/{provider-models.ts → provider/models.ts} +91 -6
- package/src/shared/lib/models/provider/presets.test.ts +172 -0
- package/src/shared/lib/models/provider/presets.ts +83 -0
- package/src/shared/lib/ui/key-binding.test.ts +115 -0
- package/src/shared/lib/ui/key-binding.ts +143 -0
- package/src/shared/lib/util/platform.test.ts +87 -0
- package/src/shared/lib/util/platform.ts +30 -0
- package/src/shared/lib/workspace/file-tab-id.ts +29 -0
- package/src/shared/lib/workspace/keymap.test.ts +82 -0
- package/src/shared/lib/workspace/keymap.ts +30 -0
- package/src/shared/lib/workspace/refresh-cadence.ts +9 -0
- package/src/shared/lib/workspace/right-panels.ts +8 -0
- package/src/shared/lib/workspace/session-state/store.ts +0 -1
- package/src/shared/types/index.ts +1 -0
- package/src/shared/types/settings/provider.ts +81 -0
- package/src/shared/types/settings/usage.ts +88 -14
- package/src/shared/types/todo.ts +108 -0
- package/tsconfig.json +3 -1
- package/dist/client/static/css/index.5f630421b7.css +0 -2
- package/dist/client/static/font/KaTeX_AMS-Regular.a79f1c3119.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Caligraphic-Bold.ec17d13264.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Caligraphic-Regular.55fac25845.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Fraktur-Bold.d42a5579b0.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Fraktur-Regular.d3c882a649.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Main-Bold.c3fb5ac22f.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Main-BoldItalic.6f2bb1dff2.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Main-Italic.8916142bec.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Main-Regular.0462f03bdf.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Math-BoldItalic.572d331f69.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Math-Italic.f28c23acad.woff2 +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Bold.8c5b5494b6.woff2 +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Italic.3b1e59b3ba.woff2 +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Regular.ba21ed5f84.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Script-Regular.03e9641d6f.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Size1-Regular.eae34984b3.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Size2-Regular.5916a24fa3.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Size4-Regular.10d95fd3a2.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Typewriter-Regular.a8709e3622.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-400-normal.2655b10c55.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-500-normal.92a991f204.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-600-normal.43788eb7f1.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-700-normal.2667215d33.woff2 +0 -0
- package/dist/client/static/js/77.0d81c74cf0.js +0 -139
- package/dist/client/static/js/77.0d81c74cf0.js.LICENSE.txt +0 -8
- package/dist/client/static/js/async/0.8e59f2eb5b.js +0 -1
- package/dist/client/static/js/async/0k.5852e6b4fa.js +0 -1
- package/dist/client/static/js/async/0w.9ed36d5860.js +0 -1
- package/dist/client/static/js/async/1.f387c12b63.js +0 -1
- package/dist/client/static/js/async/12.d091f91c99.js +0 -1
- package/dist/client/static/js/async/13.8f810a8a6c.js +0 -1
- package/dist/client/static/js/async/19.6fe909d55a.js +0 -160
- package/dist/client/static/js/async/1b.23f1141a38.js +0 -1
- package/dist/client/static/js/async/1k.973e8e21fc.js +0 -2
- package/dist/client/static/js/async/1k.973e8e21fc.js.LICENSE.txt +0 -11
- package/dist/client/static/js/async/1p.0d5cddda96.js +0 -1
- package/dist/client/static/js/async/2.b589f1733b.js +0 -1
- package/dist/client/static/js/async/2v.96165101de.js +0 -1
- package/dist/client/static/js/async/3.0cacc08423.js +0 -1
- package/dist/client/static/js/async/37.b28b2f61cd.js +0 -1
- package/dist/client/static/js/async/3d.5085fb913f.js +0 -1
- package/dist/client/static/js/async/3j.357c80ff38.js +0 -2
- package/dist/client/static/js/async/3j.357c80ff38.js.LICENSE.txt +0 -11
- package/dist/client/static/js/async/3p.bcf32a0983.js +0 -1
- package/dist/client/static/js/async/3r.3a69e98ee0.js +0 -64
- package/dist/client/static/js/async/3u.1228460e2a.js +0 -1
- package/dist/client/static/js/async/3y.3530b824ad.js +0 -198
- package/dist/client/static/js/async/3y.3530b824ad.js.LICENSE.txt +0 -5
- package/dist/client/static/js/async/4.9442eeb472.js +0 -1
- package/dist/client/static/js/async/4e.678285ca55.js +0 -1
- package/dist/client/static/js/async/4k.33a0c7eeb4.js +0 -1
- package/dist/client/static/js/async/4m.928a1dde85.js +0 -31
- package/dist/client/static/js/async/4m.928a1dde85.js.LICENSE.txt +0 -11
- package/dist/client/static/js/async/4q.aad20dab25.js +0 -1
- package/dist/client/static/js/async/5.ebaf8b89cc.js +0 -36
- package/dist/client/static/js/async/51.95bcae98af.js +0 -2
- package/dist/client/static/js/async/51.95bcae98af.js.LICENSE.txt +0 -6
- package/dist/client/static/js/async/5b.d88304bc13.js +0 -1
- package/dist/client/static/js/async/5j.d6407c4248.js +0 -287
- package/dist/client/static/js/async/5o.88316d4460.js +0 -62
- package/dist/client/static/js/async/6.f034c9b528.js +0 -1
- package/dist/client/static/js/async/66.5dfa29f957.js +0 -93
- package/dist/client/static/js/async/6o.5b1a06a382.js +0 -1
- package/dist/client/static/js/async/7.e4a9288dd0.js +0 -1
- package/dist/client/static/js/async/73.308dff4da8.js +0 -1
- package/dist/client/static/js/async/7e.a1cc9bfd88.js +0 -1
- package/dist/client/static/js/async/7g.a7814350c3.js +0 -1
- package/dist/client/static/js/async/7l.fadbbc0583.js +0 -1
- package/dist/client/static/js/async/8.5067439d8c.js +0 -1
- package/dist/client/static/js/async/8j.ea110663fb.js +0 -1
- package/dist/client/static/js/async/a.bce4542392.js +0 -1
- package/dist/client/static/js/async/aa.65d3852576.js +0 -1
- package/dist/client/static/js/async/ar.9303e5f2e8.js +0 -2
- package/dist/client/static/js/async/ar.9303e5f2e8.js.LICENSE.txt +0 -11
- package/dist/client/static/js/async/az.d656062b0f.js +0 -1
- package/dist/client/static/js/async/b.b4f6f06515.js +0 -1
- package/dist/client/static/js/async/bi.09688ba75c.js +0 -1
- package/dist/client/static/js/async/bq.586bc738d1.js +0 -1
- package/dist/client/static/js/async/c.797d933882.js +0 -1
- package/dist/client/static/js/async/c0.0af1e640d3.js +0 -24
- package/dist/client/static/js/async/ca.8a52cfd447.js +0 -1
- package/dist/client/static/js/async/cf.d34fff5d67.js +0 -1
- package/dist/client/static/js/async/ct.b74928f7a3.js +0 -1
- package/dist/client/static/js/async/cx.3cb0242a3a.js +0 -226
- package/dist/client/static/js/async/d.a5fc8fe1b3.js +0 -1
- package/dist/client/static/js/async/da.f62c70f6c8.js +0 -1
- package/dist/client/static/js/async/dp.1725d6432c.js +0 -1
- package/dist/client/static/js/async/e.93214d622b.js +0 -79
- package/dist/client/static/js/async/f.ab50467719.js +0 -19
- package/dist/client/static/js/async/f.ab50467719.js.LICENSE.txt +0 -12
- package/dist/client/static/js/async/f7.46971e9d6d.js +0 -2
- package/dist/client/static/js/async/f7.46971e9d6d.js.LICENSE.txt +0 -6
- package/dist/client/static/js/async/f8.bbf0dbae70.js +0 -1
- package/dist/client/static/js/async/g.cb81980498.js +0 -2
- package/dist/client/static/js/async/g.cb81980498.js.LICENSE.txt +0 -11
- package/dist/client/static/js/async/h.4e790471e4.js +0 -27
- package/dist/client/static/js/async/h1.393f066d09.js +0 -1
- package/dist/client/static/js/async/h3.216e9798ab.js +0 -148
- package/dist/client/static/js/async/hd.0da931b622.js +0 -1
- package/dist/client/static/js/async/hk.ba7fb04d41.js +0 -1
- package/dist/client/static/js/async/hn.b645041e00.js +0 -1
- package/dist/client/static/js/async/ho.475a5e1ae4.js +0 -1
- package/dist/client/static/js/async/hp.e9fe2e395a.js +0 -2
- package/dist/client/static/js/async/hp.e9fe2e395a.js.LICENSE.txt +0 -17
- package/dist/client/static/js/async/hs.e7c59d8090.js +0 -41
- package/dist/client/static/js/async/i.7c148e8440.js +0 -1
- package/dist/client/static/js/async/id.573df20f29.js +0 -1
- package/dist/client/static/js/async/j.ab925882d8.js +0 -1
- package/dist/client/static/js/async/jd.63886a1f09.js +0 -1
- package/dist/client/static/js/async/jg.d86ebd4013.js +0 -86
- package/dist/client/static/js/async/jl.874d352278.js +0 -1
- package/dist/client/static/js/async/jll.11313b455a.js +0 -1
- package/dist/client/static/js/async/js.67182759ef.js +0 -1
- package/dist/client/static/js/async/jsc.23b70d6f40.js +0 -1
- package/dist/client/static/js/async/jse.334588ff5d.js +0 -1
- package/dist/client/static/js/async/jz.72eb929106.js +0 -77
- package/dist/client/static/js/async/k.3210286401.js +0 -217
- package/dist/client/static/js/async/ka.c1990ecaa3.js +0 -115
- package/dist/client/static/js/async/katex-vendor.de6a87c308.js +0 -1
- package/dist/client/static/js/async/ku.29c8a59d0c.js +0 -1
- package/dist/client/static/js/async/ky.8dab1dade0.js +0 -1
- package/dist/client/static/js/async/l.12dd34e1be.js +0 -1
- package/dist/client/static/js/async/l9.949710adaf.js +0 -83
- package/dist/client/static/js/async/l9.949710adaf.js.LICENSE.txt +0 -13
- package/dist/client/static/js/async/ls.9d9a01026c.js +0 -104
- package/dist/client/static/js/async/m.eb2e6752e2.js +0 -28
- package/dist/client/static/js/async/m.eb2e6752e2.js.LICENSE.txt +0 -11
- package/dist/client/static/js/async/m3.d2b05f9604.js +0 -2
- package/dist/client/static/js/async/m3.d2b05f9604.js.LICENSE.txt +0 -6
- package/dist/client/static/js/async/ma.2c261b04dd.js +0 -2
- package/dist/client/static/js/async/ma.2c261b04dd.js.LICENSE.txt +0 -6
- package/dist/client/static/js/async/me.8ace414f80.js +0 -23
- package/dist/client/static/js/async/ms.98960af4eb.js +0 -67
- package/dist/client/static/js/async/ms.98960af4eb.js.LICENSE.txt +0 -12
- package/dist/client/static/js/async/mt.0352e976d8.js +0 -1
- package/dist/client/static/js/async/n.a9f1c51701.js +0 -1
- package/dist/client/static/js/async/na.a36cd532d6.js +0 -1
- package/dist/client/static/js/async/nk.fc7e58325e.js +0 -1
- package/dist/client/static/js/async/o.36353dfb88.js +0 -1
- package/dist/client/static/js/async/oc.b73042e8bd.js +0 -8
- package/dist/client/static/js/async/og.8eb577893a.js +0 -193
- package/dist/client/static/js/async/p.48ecfcd14e.js +0 -1
- package/dist/client/static/js/async/px.fc6877924b.js +0 -1
- package/dist/client/static/js/async/q.22588845a9.js +0 -21
- package/dist/client/static/js/async/q.22588845a9.js.LICENSE.txt +0 -6
- package/dist/client/static/js/async/q5.97dc1481b6.js +0 -286
- package/dist/client/static/js/async/qs.2a9ddb3c72.js +0 -1
- package/dist/client/static/js/async/r.51010ad87c.js +0 -1
- package/dist/client/static/js/async/rd.cb6bf495bb.js +0 -2
- package/dist/client/static/js/async/rd.cb6bf495bb.js.LICENSE.txt +0 -4
- package/dist/client/static/js/async/s.0f395cdda5.js +0 -94
- package/dist/client/static/js/async/t.4dca0e2ba8.js +0 -1
- package/dist/client/static/js/async/t9.d44f57d518.js +0 -1
- package/dist/client/static/js/async/ta.973534bbec.js +0 -1
- package/dist/client/static/js/async/tr.e878658140.js +0 -309
- package/dist/client/static/js/async/u.0871ac5b22.js +0 -1
- package/dist/client/static/js/async/ud.3065bfee31.js +0 -2
- package/dist/client/static/js/async/ud.3065bfee31.js.LICENSE.txt +0 -4
- package/dist/client/static/js/async/up.ea990da0ff.js +0 -32
- package/dist/client/static/js/async/uw.8890abbabc.js +0 -1
- package/dist/client/static/js/async/v.7d28d3c241.js +0 -34
- package/dist/client/static/js/async/vp.9b13bf8610.js +0 -1
- package/dist/client/static/js/async/vt.42416b707d.js +0 -1
- package/dist/client/static/js/async/w.08ac210f60.js +0 -1
- package/dist/client/static/js/async/wt.ad92393a90.js +0 -1
- package/dist/client/static/js/async/x.563f72ca6b.js +0 -1
- package/dist/client/static/js/async/x0.475516418f.js +0 -1
- package/dist/client/static/js/async/x1.da8687159b.js +0 -90
- package/dist/client/static/js/async/xe.da8dcc2015.js +0 -2
- package/dist/client/static/js/async/xe.da8dcc2015.js.LICENSE.txt +0 -11
- package/dist/client/static/js/async/xl.a3c562a58c.js +0 -1
- package/dist/client/static/js/async/xn.6510c0abe2.js +0 -2
- package/dist/client/static/js/async/xn.6510c0abe2.js.LICENSE.txt +0 -6
- package/dist/client/static/js/async/xn1.83a7784fe1.js +0 -10
- package/dist/client/static/js/async/xn1.83a7784fe1.js.LICENSE.txt +0 -11
- package/dist/client/static/js/async/xnl.feb0021e50.js +0 -2
- package/dist/client/static/js/async/xnl.feb0021e50.js.LICENSE.txt +0 -12
- package/dist/client/static/js/async/y.1a9ed7a5d8.js +0 -1
- package/dist/client/static/js/async/y6.43c57defe4.js +0 -1
- package/dist/client/static/js/async/yb.8c1342401d.js +0 -1
- package/dist/client/static/js/async/ybq.4491f2f2dc.js +0 -1
- package/dist/client/static/js/async/yg.35bebd6d0c.js +0 -149
- package/dist/client/static/js/async/yq.917ddd7ba2.js +0 -1
- package/dist/client/static/js/async/ys.00687cf82d.js +0 -38
- package/dist/client/static/js/async/yv.d99d829136.js +0 -1
- package/dist/client/static/js/async/z.56f61a4374.js +0 -1
- package/dist/client/static/js/async/zi.5fdb07b86a.js +0 -24
- package/dist/client/static/js/async/zj.654f37e8ff.js +0 -1
- package/dist/client/static/js/async/zn.966d6f1cc6.js +0 -1
- package/dist/client/static/js/async/zo.26213b40c0.js +0 -1
- package/dist/client/static/js/async/zx.e9f4105e00.js +0 -1
- package/dist/client/static/js/index.e6a257402a.js +0 -38
- package/dist/client/static/js/index.e6a257402a.js.LICENSE.txt +0 -4
- package/dist/client/static/js/markdown-vendor.71e43278b3.js +0 -144
- package/dist/client/static/js/shiki-vendor.cb8452ddcd.js +0 -1
- package/src/client/components/settings/categories/provider-settings/Icons.tsx +0 -35
- package/src/client/hooks/settings/providers.ts +0 -326
- package/src/server/plugins/dev-assets.ts +0 -49
- package/src/shared/lib/code/editor-utils.ts +0 -16
- package/src/shared/lib/models/provider-presets.ts +0 -29
- /package/dist/client/{apple-touch-icon.png → static/apple-touch-icon-dskx5sr3.png} +0 -0
- /package/dist/client/{icon-192x192.png → static/icon-192x192-6gn5cr2f.png} +0 -0
- /package/dist/client/{icon.svg → static/icon-d07z9dtz.svg} +0 -0
- /package/dist/client/{manifest.webmanifest → static/manifest-bnyy75kt.webmanifest} +0 -0
- /package/{dist/client → public}/icon-512x512.png +0 -0
- /package/{dist/client → public}/icon-maskable-512x512.png +0 -0
- /package/{dist/client → public}/sw.js +0 -0
- /package/src/{client/components/common/code-editor → shared/lib/code/editor}/history.ts +0 -0
- /package/src/shared/lib/models/{provider-cleanup.ts → provider/cleanup.ts} +0 -0
- /package/src/shared/lib/models/{provider-label.ts → provider/label.ts} +0 -0
|
@@ -1,326 +0,0 @@
|
|
|
1
|
-
import { useEffect, useMemo, useState } from 'preact/hooks';
|
|
2
|
-
import type { PresetProviderOption, ProviderItem, ProviderModel } from '@/shared/types';
|
|
3
|
-
import { PRESET_NEW_PROVIDERS } from '@/client/data/settings/provider';
|
|
4
|
-
import { fetchProviderModelsRemote, mergeProviderModels, syncProviderModelsToCatalog } from '@/shared/lib/models/provider-models';
|
|
5
|
-
import { buildAvailableProviderPresets } from '@/shared/lib/models/provider-presets';
|
|
6
|
-
import { removeLegacyKenariModels } from '@/shared/lib/models/provider-cleanup';
|
|
7
|
-
import { notifyModelsUpdated } from '@/shared/lib/models/client';
|
|
8
|
-
import { saveProviderOverlay, setProviderEnabled } from '@/shared/lib/models/provider-connection';
|
|
9
|
-
import { useToasts } from '@/client/hooks/ui/toasts';
|
|
10
|
-
|
|
11
|
-
interface UseProviderSettingsOptions {
|
|
12
|
-
autoOpenAdd?: boolean;
|
|
13
|
-
onAddModalClose?: () => void;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* State and actions behind Settings → Providers. Every mutation lands in one of
|
|
18
|
-
* two stores: the chamber-local overlay (per-model visibility and sampling
|
|
19
|
-
* config) or omp's own config.yml disabledProviders (connect / disconnect).
|
|
20
|
-
* Disconnect has to use the latter — the overlay is re-merged away on load,
|
|
21
|
-
* which is why a disconnected provider used to come back as connected.
|
|
22
|
-
*/
|
|
23
|
-
export function useProviderSettings({
|
|
24
|
-
autoOpenAdd = false,
|
|
25
|
-
onAddModalClose,
|
|
26
|
-
}: UseProviderSettingsOptions = {}) {
|
|
27
|
-
const [providers, setProviders] = useState<ProviderItem[]>([]);
|
|
28
|
-
const [presetProviders, setPresetProviders] = useState<PresetProviderOption[]>(PRESET_NEW_PROVIDERS);
|
|
29
|
-
const [selectedProviderId, setSelectedProviderId] = useState<string>('provider-deepseek');
|
|
30
|
-
const [currentProject, setCurrentProject] = useState('ompchamber');
|
|
31
|
-
const [isFetchingModels, setIsFetchingModels] = useState(false);
|
|
32
|
-
const { toasts, pushToast, dismissToast } = useToasts();
|
|
33
|
-
|
|
34
|
-
const [isAddModalOpen, setIsAddModalOpen] = useState(autoOpenAdd);
|
|
35
|
-
const [isReconnectModalOpen, setIsReconnectModalOpen] = useState(false);
|
|
36
|
-
const [isLoginModalOpen, setIsLoginModalOpen] = useState(false);
|
|
37
|
-
const [configModel, setConfigModel] = useState<ProviderModel | null>(null);
|
|
38
|
-
const [capabilitiesModel, setCapabilitiesModel] = useState<ProviderModel | null>(null);
|
|
39
|
-
|
|
40
|
-
useEffect(() => {
|
|
41
|
-
if (autoOpenAdd) setIsAddModalOpen(true);
|
|
42
|
-
}, [autoOpenAdd]);
|
|
43
|
-
|
|
44
|
-
useEffect(() => {
|
|
45
|
-
let active = true;
|
|
46
|
-
fetch('/api/settings/providers')
|
|
47
|
-
.then(res => res.json())
|
|
48
|
-
.then(data => {
|
|
49
|
-
if (!active) return;
|
|
50
|
-
if (data?.providers && Array.isArray(data.providers)) {
|
|
51
|
-
setProviders(data.providers);
|
|
52
|
-
const connected = data.providers.filter((p: ProviderItem) => p.status === 'connected');
|
|
53
|
-
setSelectedProviderId(connected.length > 0 ? connected[0].id : '');
|
|
54
|
-
}
|
|
55
|
-
if (data?.presetProviders) setPresetProviders(data.presetProviders);
|
|
56
|
-
})
|
|
57
|
-
.catch(err => console.error('Failed to load providers from API:', err));
|
|
58
|
-
return () => { active = false; };
|
|
59
|
-
}, []);
|
|
60
|
-
|
|
61
|
-
// The sidebar lists connected providers plus every provider the user disabled:
|
|
62
|
-
// a disabled provider reports `disconnected`, so filtering on status alone
|
|
63
|
-
// would make the switch that hid it unreachable.
|
|
64
|
-
const connectedProviders = useMemo(
|
|
65
|
-
() => providers.filter(
|
|
66
|
-
(provider) => provider.status === 'connected' || provider.disabled === true,
|
|
67
|
-
),
|
|
68
|
-
[providers],
|
|
69
|
-
);
|
|
70
|
-
const availablePresetProviders = useMemo(
|
|
71
|
-
() => buildAvailableProviderPresets(providers, presetProviders),
|
|
72
|
-
[providers, presetProviders],
|
|
73
|
-
);
|
|
74
|
-
const selectedProvider = connectedProviders.find((p) => p.id === selectedProviderId) || connectedProviders[0];
|
|
75
|
-
|
|
76
|
-
const persistProviders = async (updated: ProviderItem[]) => {
|
|
77
|
-
setProviders(updated);
|
|
78
|
-
try {
|
|
79
|
-
const merged = await saveProviderOverlay(updated);
|
|
80
|
-
if (merged) setProviders(merged);
|
|
81
|
-
} catch (err) {
|
|
82
|
-
console.error('Failed to save providers via API:', err);
|
|
83
|
-
pushToast('Failed to save provider settings.', 'error');
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const toggleProviderEnabled = async (
|
|
88
|
-
slug: string,
|
|
89
|
-
enabled: boolean,
|
|
90
|
-
): Promise<ProviderItem[] | null> => {
|
|
91
|
-
try {
|
|
92
|
-
const merged = await setProviderEnabled(slug, enabled);
|
|
93
|
-
if (merged) setProviders(merged);
|
|
94
|
-
return merged;
|
|
95
|
-
} catch (err) {
|
|
96
|
-
console.error('Failed to update provider connection:', err);
|
|
97
|
-
pushToast('Failed to update the provider connection.', 'error');
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
const handleAddProvider = async (newProvider: ProviderItem, options: { fetchedCount: number }) => {
|
|
103
|
-
await persistProviders([...providers, newProvider]);
|
|
104
|
-
const merged = await toggleProviderEnabled(newProvider.slug, true);
|
|
105
|
-
const registered = merged?.find(
|
|
106
|
-
(provider) => provider.slug.trim().toLowerCase() === newProvider.slug.trim().toLowerCase(),
|
|
107
|
-
);
|
|
108
|
-
setSelectedProviderId(registered?.id || newProvider.id);
|
|
109
|
-
setIsAddModalOpen(false);
|
|
110
|
-
onAddModalClose?.();
|
|
111
|
-
|
|
112
|
-
if (options.fetchedCount > 0) {
|
|
113
|
-
pushToast(
|
|
114
|
-
`Fetched ${options.fetchedCount} new model${options.fetchedCount === 1 ? '' : 's'} from the provider.`,
|
|
115
|
-
'success',
|
|
116
|
-
);
|
|
117
|
-
} else if (options.fetchedCount === -1) {
|
|
118
|
-
pushToast('Auto-fetch models failed — provider added with default models.', 'error');
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
void syncProviderModelsToCatalog(newProvider.name, newProvider.models);
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
const handleReconnect = async (updates: Partial<ProviderItem>) => {
|
|
125
|
-
if (!selectedProvider) return;
|
|
126
|
-
const target = selectedProvider;
|
|
127
|
-
await persistProviders(providers.map((p) => (
|
|
128
|
-
p.id === target.id ? { ...p, ...updates, status: 'connected' as const } : p
|
|
129
|
-
)));
|
|
130
|
-
if (target.status !== 'connected') {
|
|
131
|
-
await toggleProviderEnabled(target.slug, true);
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
const handleFetchModels = async (credentials: { apiKey?: string; baseUrl?: string }) => {
|
|
136
|
-
if (!selectedProvider || isFetchingModels) return;
|
|
137
|
-
const baseUrl = credentials.baseUrl || selectedProvider.baseUrl;
|
|
138
|
-
if (!baseUrl) {
|
|
139
|
-
pushToast('Base URL is required to fetch models.', 'error');
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
setIsFetchingModels(true);
|
|
143
|
-
try {
|
|
144
|
-
const result = await fetchProviderModelsRemote(
|
|
145
|
-
baseUrl,
|
|
146
|
-
credentials.apiKey || selectedProvider.apiKey,
|
|
147
|
-
selectedProvider.slug,
|
|
148
|
-
true,
|
|
149
|
-
);
|
|
150
|
-
if (!result.ok || !result.models) {
|
|
151
|
-
pushToast(result.error || 'Failed to fetch models from the provider.', 'error');
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
const cleanedExistingModels = removeLegacyKenariModels(selectedProvider, selectedProvider.models);
|
|
155
|
-
const removedCount = selectedProvider.models.length - cleanedExistingModels.length;
|
|
156
|
-
const { merged, addedCount } = mergeProviderModels(cleanedExistingModels, result.models);
|
|
157
|
-
if (addedCount > 0 || removedCount > 0) {
|
|
158
|
-
await handleReconnect({ models: merged });
|
|
159
|
-
}
|
|
160
|
-
if (result.omp?.written) {
|
|
161
|
-
notifyModelsUpdated();
|
|
162
|
-
}
|
|
163
|
-
if (addedCount > 0) {
|
|
164
|
-
pushToast(`Fetched ${addedCount} new model${addedCount === 1 ? '' : 's'} from the provider.`, 'success');
|
|
165
|
-
} else if (removedCount > 0) {
|
|
166
|
-
pushToast('Removed legacy fallback models from the provider.', 'success');
|
|
167
|
-
} else {
|
|
168
|
-
pushToast('No new models found — all fetched models already exist.', 'success');
|
|
169
|
-
}
|
|
170
|
-
if (result.omp?.written) {
|
|
171
|
-
const parts: string[] = [];
|
|
172
|
-
if (result.omp.addedCount > 0) parts.push(`${result.omp.addedCount} new model${result.omp.addedCount === 1 ? '' : 's'} registered`);
|
|
173
|
-
if (result.omp.backfilledCount > 0) parts.push(`${result.omp.backfilledCount} model${result.omp.backfilledCount === 1 ? '' : 's'} enriched`);
|
|
174
|
-
pushToast(`omp models.yml updated${parts.length > 0 ? `: ${parts.join(', ')}` : ''}.`, 'success');
|
|
175
|
-
} else if (result.omp && !result.omp.written && result.omp.reason) {
|
|
176
|
-
pushToast(`omp models.yml not updated: ${result.omp.reason}`, 'error');
|
|
177
|
-
}
|
|
178
|
-
} finally {
|
|
179
|
-
setIsFetchingModels(false);
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
const handleFetchModelsFromList = async () => {
|
|
184
|
-
if (!selectedProvider) return;
|
|
185
|
-
await handleFetchModels({
|
|
186
|
-
apiKey: selectedProvider.apiKey,
|
|
187
|
-
baseUrl: selectedProvider.baseUrl,
|
|
188
|
-
});
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
const handleOmpAuthSuccess = () => {
|
|
192
|
-
if (!selectedProvider) return;
|
|
193
|
-
const target = selectedProvider;
|
|
194
|
-
void persistProviders(providers.map((p) => (
|
|
195
|
-
p.id === target.id ? { ...p, status: 'connected' as const } : p
|
|
196
|
-
)));
|
|
197
|
-
void toggleProviderEnabled(target.slug, true);
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
const handleToggleDisconnect = async () => {
|
|
201
|
-
if (!selectedProvider) return;
|
|
202
|
-
const target = selectedProvider;
|
|
203
|
-
const disconnecting = target.status === 'connected';
|
|
204
|
-
if (disconnecting) {
|
|
205
|
-
setSelectedProviderId(
|
|
206
|
-
connectedProviders.find((provider) => provider.id !== target.id)?.id || '',
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
const merged = await toggleProviderEnabled(target.slug, !disconnecting);
|
|
210
|
-
if (!merged) return;
|
|
211
|
-
pushToast(
|
|
212
|
-
disconnecting
|
|
213
|
-
? `${target.name} disconnected — its models are no longer offered in the chat picker.`
|
|
214
|
-
: `${target.name} reconnected.`,
|
|
215
|
-
'success',
|
|
216
|
-
);
|
|
217
|
-
};
|
|
218
|
-
|
|
219
|
-
const updateSelectedModels = (transform: (models: ProviderModel[]) => ProviderModel[]) => {
|
|
220
|
-
if (!selectedProvider) return;
|
|
221
|
-
void persistProviders(providers.map((p) => (
|
|
222
|
-
p.id === selectedProvider.id ? { ...p, models: transform(p.models) } : p
|
|
223
|
-
)));
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Disable/enable from omp's own config.yml `disabledProviders`. This is the
|
|
228
|
-
* coarse switch that removes the provider — and every model it serves — from
|
|
229
|
-
* the chat picker; the per-model eye toggle is the fine-grained one.
|
|
230
|
-
*/
|
|
231
|
-
const handleToggleProviderDisabled = async () => {
|
|
232
|
-
if (!selectedProvider) return;
|
|
233
|
-
const target = selectedProvider;
|
|
234
|
-
const disabling = target.disabled !== true;
|
|
235
|
-
const merged = await toggleProviderEnabled(target.slug, !disabling);
|
|
236
|
-
if (!merged) return;
|
|
237
|
-
pushToast(
|
|
238
|
-
disabling
|
|
239
|
-
? `${target.name} disabled — it no longer appears in the model list.`
|
|
240
|
-
: `${target.name} enabled — its models are offered again.`,
|
|
241
|
-
'success',
|
|
242
|
-
);
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
const handleHideAll = () => updateSelectedModels(
|
|
246
|
-
(models) => models.map((m) => ({ ...m, isVisible: false })),
|
|
247
|
-
);
|
|
248
|
-
|
|
249
|
-
const handleShowAll = () => updateSelectedModels(
|
|
250
|
-
(models) => models.map((m) => ({ ...m, isVisible: true })),
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
const handleToggleModelVisibility = (modelId: string) => updateSelectedModels(
|
|
254
|
-
(models) => models.map((m) => (m.id === modelId ? { ...m, isVisible: !m.isVisible } : m)),
|
|
255
|
-
);
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Save the per-model knobs omp honours (`models.yml` modelOverrides). The
|
|
259
|
-
* overlay still stores the display value so the dialog reopens where the user
|
|
260
|
-
* left it, but omp only reads the override — writing just the overlay was the
|
|
261
|
-
* bug that made these controls inert.
|
|
262
|
-
*/
|
|
263
|
-
const handleSaveModelConfig = async (modelId: string, updates: Partial<ProviderModel>) => {
|
|
264
|
-
if (!selectedProvider) return;
|
|
265
|
-
const provider = selectedProvider;
|
|
266
|
-
updateSelectedModels((models) => models.map((m) => (m.id === modelId ? { ...m, ...updates } : m)));
|
|
267
|
-
|
|
268
|
-
const body: Record<string, unknown> = { provider: provider.slug, modelId };
|
|
269
|
-
if ('maxTokens' in updates) body.maxTokens = updates.maxTokens ?? null;
|
|
270
|
-
if ('reasoningEffort' in updates) body.reasoningEffort = updates.reasoningEffort ?? null;
|
|
271
|
-
if (Object.keys(body).length === 2) return;
|
|
272
|
-
|
|
273
|
-
try {
|
|
274
|
-
const response = await fetch('/api/settings/model-override', {
|
|
275
|
-
method: 'PUT',
|
|
276
|
-
headers: { 'Content-Type': 'application/json' },
|
|
277
|
-
body: JSON.stringify(body),
|
|
278
|
-
});
|
|
279
|
-
const data = await response.json() as { success?: boolean; written?: boolean; reason?: string; error?: string };
|
|
280
|
-
if (!response.ok) {
|
|
281
|
-
pushToast(data.error || 'Failed to save the model configuration.', 'error');
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
if (data.written) notifyModelsUpdated();
|
|
285
|
-
else if (data.reason) pushToast(data.reason, 'error');
|
|
286
|
-
} catch (error) {
|
|
287
|
-
console.error('Failed to save model override:', error);
|
|
288
|
-
pushToast('Failed to save the model configuration.', 'error');
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
return {
|
|
293
|
-
providers,
|
|
294
|
-
connectedProviders,
|
|
295
|
-
availablePresetProviders,
|
|
296
|
-
selectedProvider,
|
|
297
|
-
currentProject,
|
|
298
|
-
setCurrentProject,
|
|
299
|
-
isFetchingModels,
|
|
300
|
-
toasts,
|
|
301
|
-
pushToast,
|
|
302
|
-
dismissToast,
|
|
303
|
-
isAddModalOpen,
|
|
304
|
-
setIsAddModalOpen,
|
|
305
|
-
isReconnectModalOpen,
|
|
306
|
-
setIsReconnectModalOpen,
|
|
307
|
-
isLoginModalOpen,
|
|
308
|
-
setIsLoginModalOpen,
|
|
309
|
-
configModel,
|
|
310
|
-
setConfigModel,
|
|
311
|
-
capabilitiesModel,
|
|
312
|
-
setCapabilitiesModel,
|
|
313
|
-
setSelectedProviderId,
|
|
314
|
-
handleAddProvider,
|
|
315
|
-
handleReconnect,
|
|
316
|
-
handleFetchModels,
|
|
317
|
-
handleFetchModelsFromList,
|
|
318
|
-
handleOmpAuthSuccess,
|
|
319
|
-
handleToggleDisconnect,
|
|
320
|
-
handleToggleProviderDisabled,
|
|
321
|
-
handleHideAll,
|
|
322
|
-
handleShowAll,
|
|
323
|
-
handleToggleModelVisibility,
|
|
324
|
-
handleSaveModelConfig,
|
|
325
|
-
};
|
|
326
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dev-only asset fallback for the rsbuild dev server.
|
|
3
|
-
*
|
|
4
|
-
* `writeToDisk` puts every emitted asset in `dist/client`, so `tryServeStatic`
|
|
5
|
-
* covers normal requests. HMR artifacts do not reach disk: per-update
|
|
6
|
-
* `*.hot-update.*` chunks and manifests are emitted in-memory only, and they
|
|
7
|
-
* are requested on the page origin (port 3000) even though only the rsbuild
|
|
8
|
-
* dev server (port 3100) can answer them. Without this proxy the manifest
|
|
9
|
-
* fetch returns the HTML shell, `response.json()` throws, and the HMR runtime
|
|
10
|
-
* falls back to a full page reload — forever.
|
|
11
|
-
*
|
|
12
|
-
* A 404 from rsbuild is relayed as-is: the runtime treats it as "no update
|
|
13
|
-
* available" and stays idle, which is the correct steady state. This runs
|
|
14
|
-
* after the disk lookup, so a missing rsbuild dev server costs one failed
|
|
15
|
-
* connection per absent asset and nothing else.
|
|
16
|
-
*/
|
|
17
|
-
const DEV_SERVER = Bun.env.OMPCHAMBER_DEV_SERVER ?? 'http://localhost:3100';
|
|
18
|
-
|
|
19
|
-
const isDev = Bun.env.NODE_ENV !== 'production';
|
|
20
|
-
|
|
21
|
-
const isHmrArtifact = (pathname: string) => pathname.endsWith('.hot-update.json') || pathname.endsWith('.hot-update.js');
|
|
22
|
-
|
|
23
|
-
/** Streamed dev asset for `pathname`, or null when the app should handle it. */
|
|
24
|
-
export async function tryProxyDevAsset(request: Request, pathname: string): Promise<Response | null> {
|
|
25
|
-
const proxied = isDev && (isHmrArtifact(pathname) || pathname.startsWith('/static/'));
|
|
26
|
-
if (!proxied) return null;
|
|
27
|
-
|
|
28
|
-
const { search } = new URL(request.url);
|
|
29
|
-
let upstream: Response;
|
|
30
|
-
try {
|
|
31
|
-
upstream = await fetch(`${DEV_SERVER}${pathname}${search}`, {
|
|
32
|
-
method: request.method,
|
|
33
|
-
headers: { accept: request.headers.get('accept') ?? '*/*' },
|
|
34
|
-
});
|
|
35
|
-
} catch {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
if (!upstream.body) return null;
|
|
39
|
-
|
|
40
|
-
// Relay the upstream status: rsbuild's 404 for a stale manifest is the HMR
|
|
41
|
-
// runtime's "no update" signal and must not become a 200 HTML shell.
|
|
42
|
-
return new Response(upstream.body, {
|
|
43
|
-
status: upstream.status,
|
|
44
|
-
headers: {
|
|
45
|
-
'content-type': upstream.headers.get('content-type') ?? 'application/octet-stream',
|
|
46
|
-
'cache-control': 'no-store',
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export function getDefaultContent(name: string) {
|
|
2
|
-
if (name.endsWith('.md')) {
|
|
3
|
-
return `# ${name.replace('.md', '')}\n\nThis is a mock markdown file.\n\n- You can edit this text\n- Click the eye icon above to toggle preview`;
|
|
4
|
-
}
|
|
5
|
-
if (name.endsWith('.tsx') || name.endsWith('.ts')) {
|
|
6
|
-
const compName = name.split('.')[0].replace(/[^a-zA-Z0-9]/g, '');
|
|
7
|
-
return `import React from 'react';\n\nexport default function ${compName || 'Component'}() {\n return (\n <div>\n Hello World\n </div>\n );\n}`;
|
|
8
|
-
}
|
|
9
|
-
if (name.endsWith('.json')) {
|
|
10
|
-
return `{\n "name": "omp-project",\n "version": "1.0.0"\n}`;
|
|
11
|
-
}
|
|
12
|
-
if (name.endsWith('.css')) {
|
|
13
|
-
return `.container {\n display: flex;\n flex-direction: column;\n}`;
|
|
14
|
-
}
|
|
15
|
-
return `Content for ${name}`;
|
|
16
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { PresetProviderOption, ProviderItem } from '@/shared/types/settings/provider';
|
|
2
|
-
|
|
3
|
-
export function buildAvailableProviderPresets(
|
|
4
|
-
providers: ProviderItem[],
|
|
5
|
-
presets: PresetProviderOption[],
|
|
6
|
-
): PresetProviderOption[] {
|
|
7
|
-
const connectedSlugs = new Set(
|
|
8
|
-
providers
|
|
9
|
-
.filter((provider) => provider.status === 'connected')
|
|
10
|
-
.map((provider) => provider.slug.trim().toLowerCase()),
|
|
11
|
-
);
|
|
12
|
-
const seenSlugs = new Set<string>();
|
|
13
|
-
const disconnectedProviders = providers
|
|
14
|
-
.filter((provider) => provider.status !== 'connected')
|
|
15
|
-
.map((provider) => ({
|
|
16
|
-
id: provider.slug,
|
|
17
|
-
name: provider.name,
|
|
18
|
-
slug: provider.slug,
|
|
19
|
-
icon: provider.icon,
|
|
20
|
-
defaultUrl: provider.baseUrl || 'https://',
|
|
21
|
-
}));
|
|
22
|
-
|
|
23
|
-
return [...presets, ...disconnectedProviders].filter((preset) => {
|
|
24
|
-
const slug = preset.slug.trim().toLowerCase();
|
|
25
|
-
if (connectedSlugs.has(slug) || seenSlugs.has(slug)) return false;
|
|
26
|
-
seenSlugs.add(slug);
|
|
27
|
-
return true;
|
|
28
|
-
});
|
|
29
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|